Skip to content

feat: a matrix disposes of one file, and a skill ships none it cannot grade (#99) - #118

Merged
rookslog merged 3 commits into
mainfrom
feat/99-grade-references
Aug 14, 2026
Merged

rookslog merged 3 commits into
mainfrom
feat/99-grade-references

Conversation

@rookslog

Copy link
Copy Markdown
Owner

Closes #99.

ground --check disposed of every unit in SKILL.md and opened no other file,
so the two files under
skills/standards/simplified-technical-english/references/ installed on every
pathway with nothing disposing of a line in either. rule-navigation.md maps
real Rule N.N identifiers to topic labels, which are claims about the source
that no G row answered for.

The four questions the issue asks

Which file a row belongs to. Its matrix's own path. Our anchor names a
heading, and two files in one skill can carry the same heading, so a shared row
space let a row claim an occurrence in the file nobody wrote it for while every
cell still matched. An eighth column and a qualified anchor were the other two
answers, and ADR-0030 says why each loses: one changes the render contract and
leaves the row space shared, the other makes the anchor comparison parse a path
out of a cell.

One matrix or one per file. One per file. SKILL.md keeps
grounding/<tier>/<skill>.md. A reference file mirrors its own path, under a
directory named for the skill. No column moved, no digest changed, and no
recorded audit was touched.

What the checker reads. checkAll already walked the skill directory to
refuse a file nothing governs. It grades every file that walk returns which
isGraded names, each against the matrix matrixPathFor derives. Every finding
carries the file it came from, and the command prints it beside the skill.

The blockquote. The walk read a quote's lines as the prose around them, so
the container and its contents merged and > - one gasket reached a row as a
paragraph carrying its own markers. It reads one BLOCK now, named by a digest of
what the quote holds, which is the disposition a table and a fenced block
already have. Giving the walk a reading a reader agrees with removes the
column-0 exception, and that is ADR-0016 applied forwards rather than a rule
naming the shape. A line directly under a quote is refused, because a reader
continues a quote over a line that carries prose and ends it at one that
interrupts a paragraph, and which of those depends on the block open inside the
quote.

Measured

examples.md: 113 units and 41 refusals before, 113 units and no refusal after.
The count is unchanged because each quote already collapsed into one merged
unit. What changed is what the unit is. rule-navigation.md: 11 units and no
refusal, before and after.

The two matrices carry 124 rows, six of them G rows. Every one reads
unquoted and unaudited, both files forbid quotation in the words the skill's
own matrix uses, and nobody read the standard on this date. The source record
says so, and it says the rule identifiers came from the reading of 2026-07-26
already recorded there.

What else moved

ADR-0025's count is an error now, per file, naming the matrix to write. That ADR
told a later reader not to promote the count and not to remove it, and both
instructions carried the same reason: nothing could grade those files. This is
the issue they were waiting on, so ADR-0025 is amended at its own end.

A file under references/ that is not Markdown is refused, because the walk
reads Markdown alone. A matrix under a skill's grounding directory that grades
no file is refused, which is the mirror of a file with no matrix. A graded file
the check has already refused for not being a plain file is not read, because
readFile resolves a link and a FIFO at such a path would hang the run.

Checks

npm run check runs all eight and they are green. npm test reports 808 tests
passing. test/gfm-render.test.js holds every claim about how a blockquote
renders against micromark, including the over-refusal, which is pinned rather
than left in prose.

ADR-0030 records the matrix decision. ADR-0031 records the grammar decision.

… grade (#99)

`ground --check` disposed of every unit in `SKILL.md` and opened no other
file. Four of the six install pathways copy a skill directory whole, so
the two files under
`skills/standards/simplified-technical-english/references/` reached a
user with no row disposing of a line in either. One of them maps real
`Rule N.N` identifiers to topic labels, which are claims about the source
that no `G` row answered for. ADR-0025 settled that those files are
graded rather than evicted and could not do the work, so it printed a
count instead.

A matrix disposes of ONE file now. `SKILL.md` keeps
`grounding/<tier>/<skill>.md`, and every Markdown file under
`references/` answers to a matrix that mirrors its own path. The row
space is what forces that: `Our anchor` names a heading, two files in one
skill can carry the same heading, and a shared space let a row claim an
occurrence in the file nobody wrote it for while every cell still
matched. The file identity sits in the matrix's path, where a filesystem
holds it rather than a cell, so no column moved and no digest changed.

A graded file with no matrix is an error naming the matrix to write, and
so is a matrix that grades no file. A file under `references/` that is
not Markdown is refused, because the walk reads Markdown alone and
nothing can grade a file it cannot read. Every finding carries the file
it came from, and the command prints it. ADR-0030 records the decision,
and it amends ADR-0025's count from a note to an error.

A blockquote is a unit the checker reads rather than a construct it
refuses. `examples.md` is written in blockquotes, and the walk refused
41 of its lines. The refusal was never about the marker: the walk merged
the quote with its contents, so a quoted list reached a row as a
paragraph carrying its own markers. The quote is one block now, named by
a digest of what it holds, which is the disposition a table and a fenced
block already have. A reading a reader agrees with removes the
exception, and that is ADR-0016 applied forwards rather than a rule
naming a shape.

A line directly under a quote is refused instead. A reader continues a
quote over a line that carries prose and ends it at one that interrupts a
paragraph, and which of those depends on the block open inside the quote,
which this walk holds no state for. The remedy is the blank line every
shipped file already has, and `test/gfm-render.test.js` pins the
over-refusal beside the render that measures it. ADR-0031.

`examples.md` went from 113 units and 41 refusals to 113 units and none.
The two files carry 124 rows between them, six of them `G` rows, and
every one reads `unquoted` and `unaudited`. Both matrices forbid
quotation in the words the skill's own matrix uses. Nobody read the
standard on this date, and the source record says so.

Closes #99
@github-actions github-actions Bot added documentation Improvements or additions to documentation engine The CLI, install, update, uninstall, doctor grounding Grounding matrices and the ground check labels Aug 14, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d482596b90

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread grounding/standards/simplified-technical-english/references/examples.md Outdated
Comment thread src/ground.js Outdated
Comment thread src/ground.js
Comment thread src/ground.js Outdated
Comment thread grounding/standards/simplified-technical-english/references/rule-navigation.md Outdated
…from (#99)

Review of #118 found five defects, and three of them are one root cause: the
checker was written for exactly one graded file per skill, and three of its
assumptions came along unexamined when a second file kind arrived.

Front matter is metadata because a harness reads it, which is true of
`SKILL.md` and of no reference file. A closed `---` block in one was removed
from the units and reported by nothing, while `micromark` renders a thematic
break and a setext heading carrying every line of it. It is refused now, in any
subject but `SKILL.md`, and still removed from the units rather than graded,
because reading three lines as prose would ground a paragraph no reader sees.
`checkSkill` takes the file it grades as `subject`, with no default, so a
caller that does not name the file cannot be handed the exemption.

The grounding tree is not reachable from the catalogue. A matrix whose skill
was deleted or renamed sits under a directory no catalogue entry names, so
walking out from each skill never visited the one case the check exists for.
The scan walks `grounding/` and derives the skill from the path, which also
catches the leftover `<tier>/<name>.md` one level up, and a stray is reported
under the name its path implies.

A path names a file only after `lstat` says so. Following a link at a matrix
path lets two graded files share one physical audit record, or lets the check
read a record from outside the tree, and the stray scan sees neither, because
the link stands at exactly the pathname the scan holds.

Each of those three was flipped off and watched to fail before the fix was
restored, so the tests are evidence rather than decoration.

The other two are classification. A heading is graded by what it says, and not
by being a heading: `One instruction per sentence` states the constraint its
section teaches, so an `N` row over it retired a rule from review by calling it
a title. Seven headings in `examples.md` state a constraint, six citing the
rule the skill's own matrix already cites, and the seventh carrying our
authority because Issue 9 has no numbered pronoun rule. The seven contents
entries that repeat those constraints are `E` rows, because under-claiming on a
pointer is the safe direction.

A table is one unit, so a table is one authority class. `rule-navigation.md`
carried one table whose `Read when` column is our own advice, and a `G` row
over that designator attributed every recommendation in it to Rules 1.1
through 9.4. A designator cannot be split, so the file was: it carries a table
of source locations graded `G`, and a table of our advice graded `E`.

The two matrices carry 127 rows now, twelve of them `G` rows, and every one
still reads `unaudited` and `unquoted`. Nobody read the standard on this date.
@github-actions github-actions Bot added the skill content The wording of a shipped skill label Aug 14, 2026
…ve (#99)

Review of c864215 returned eight findings, two of them blocking, and both
blocking ones are in the previous round's own fix batch.

`checkAll` keyed its report on a plain object. A stray matrix takes its name
from a path, so `grounding/standards/constructor/` read back a FUNCTION rather
than nothing, and appending to it threw a TypeError that took the report for
every other skill with it. A skill directory called `__proto__` is the same
defect pointing the other way: assigning that on an ordinary object invokes the
inherited setter, so the skill would have left the report in silence. The
report is a `Map` now, converted through `Object.fromEntries` onto a null
prototype, which is how the install statement's `keep` has been built since
ADR-0019. The command line asks `Object.hasOwn` rather than `in`, so a name the
object merely inherits is unknown there whatever the callee returns.

Four documents stated as parser-backed fact that a reference file's front
matter renders as a thematic break and a setext heading. That is one shape's
render. A list inside the block renders as a list, a fenced block as code, and
a table as a table, so the sentence was false in three of the four shapes
nobody had asked the parser about. This is the comment that explains away what
the oracle was never shown, which this repository forbids by name. The oracle
carries five shapes now, and all four places state the property they share: a
reader sees the block's contents, and the walk reads no unit from any line of
it. The message an author reads leads with what the check cannot read, because
that clause is true of THEIR file whatever shape their block takes.

The refusal itself was sound in every shape and did not move.

Three smaller readings were wrong for the same reason the majors were: a path
was trusted to answer a question the filesystem answers. A directory at a
matrix path got a message about symbolic links, so the type found is named. A
case-folding filesystem resolves two spellings to one file, so a miscased
matrix was read as the matrix AND reported as a stray whose remedy said delete
it, and the scan now asks for identity where the spelling misses. The `lstat`
answers for the last path component alone, and a linked intermediate directory
still resolves out of the tree, which the stray scan catches as a red run
rather than a wrong reading — that limit is stated in ADR-0030 rather than
closed, because closing it needs `realpath` on both sides of a containment test
and would refuse a checkout reached through a linked path.

Two documents kept the pre-delta scope of the stray refusal, and the installed
navigation file carried a sentence of audit-record rationale that belongs in
the matrix. The `G` row over the location table claims the location and not the
label, and both the ADR and the matrix now say so, because the question column
is our own paraphrase and no paraphrase becomes the standard's by sitting
beside a rule number.

Each code fix was flipped off and watched to fail before it was restored. The
counts did not move: 127 rows across the two matrices, twelve of them `G` rows,
every one still `unaudited` and `unquoted`.
@rookslog
rookslog merged commit e4ec6ec into main Aug 14, 2026
8 checks passed
@rookslog
rookslog deleted the feat/99-grade-references branch August 14, 2026 22:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation engine The CLI, install, update, uninstall, doctor grounding Grounding matrices and the ground check skill content The wording of a shipped skill

Projects

None yet

Development

Successfully merging this pull request may close these issues.

A reference file ships installed and is graded by nothing

1 participant