feat: a matrix disposes of one file, and a skill ships none it cannot grade (#99) - #118
Merged
Merged
Conversation
… 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
There was a problem hiding this comment.
💡 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".
…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.
…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`.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #99.
ground --checkdisposed of every unit inSKILL.mdand opened no other file,so the two files under
skills/standards/simplified-technical-english/references/installed on everypathway with nothing disposing of a line in either.
rule-navigation.mdmapsreal
Rule N.Nidentifiers to topic labels, which are claims about the sourcethat no
Grow answered for.The four questions the issue asks
Which file a row belongs to. Its matrix's own path.
Our anchornames aheading, 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.mdkeepsgrounding/<tier>/<skill>.md. A reference file mirrors its own path, under adirectory named for the skill. No column moved, no digest changed, and no
recorded audit was touched.
What the checker reads.
checkAllalready walked the skill directory torefuse a file nothing governs. It grades every file that walk returns which
isGradednames, each against the matrixmatrixPathForderives. Every findingcarries 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 gasketreached a row as aparagraph 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 norefusal, before and after.
The two matrices carry 124 rows, six of them
Grows. Every one readsunquotedandunaudited, both files forbid quotation in the words the skill'sown 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 walkreads 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
readFileresolves a link and a FIFO at such a path would hang the run.Checks
npm run checkruns all eight and they are green.npm testreports 808 testspassing.
test/gfm-render.test.jsholds every claim about how a blockquoterenders against
micromark, including the over-refusal, which is pinned ratherthan left in prose.
ADR-0030 records the matrix decision. ADR-0031 records the grammar decision.