Repository navigation
feat(core): the shared rule's SHAPE gets a control — its grammar and its exempt-mode list have ONE home - #1095
Conversation
…its exempt-mode list have ONE home
The rule file `scripts/tracked-files.txt` states its GRAMMAR ("one `<mode> <reason>`
per line") in its own header, and says so in its own words: "The GRAMMAR is
specified ONCE, in the WHAT IS EXEMPT header above - never restated in a reader.
Edit THIS file, never a reader's copy." That was a CLAIM with no control behind
it: nothing stopped a reader from restating the grammar, and nothing noticed when
a reader stopped reading the file at all.
The control now judges the rule's shape, in the same control that already judges
the claim's wording — one Python reader of the tracked tree, one CI wiring, one
bed step, and no second enumeration of the tree (R2). A new arm, ONE HOME:
- the GRAMMAR lives in the rule file's own header and nowhere else — a copy in
a reader, or a second statement in the rule file's own other paragraph, is a
finding (two rules drift);
- the exempt-mode LIST lives in the rule file — a copy of the LIST (the mode
AND its reason) in a reader is a finding (two lists drift);
- every reader the rule file NAMES still READS it — a named reader whose code
no longer names the file would parse a format nothing specifies, so the two
gates would disagree about the file's syntax without anything saying so.
The arm is located by STRUCTURAL anchors, never by the grammar's own wording: the
rule file's paragraphs are found by their own HEADINGS, so a copy that MOVES
cannot make the arm blind instead of red.
Its proof is five mutations, each checked to have APPLIED before its arm is
credited: a reader that restates the grammar, that same copy inside the rule
file's own other paragraph, a rule file whose header stops stating the grammar, a
reader that copies the exempt-mode list, and a named reader whose code stops
naming the rule file. The fixture guard is an arm too: with the rule file's
grammar paragraph unlocatable, the arm reports that it would prove nothing
rather than passing silently.
CI now runs the control for the files it reads — the rule file and its named
reader — so a change to either is judged by the arm that exists for it.
Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)
|
STATUS — the PR is open; the shared rule's SHAPE now has a committed control. Agent: charly · session Open. #1095, on the branch What it does. A new arm in Done. The control and its self-test (six new arms, each asserting its mutation APPLIED), Next. The validator's verdict on the head. Every finding it raises is fixed in ONE commit Agent: charly Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated) |
Review — PASSWhat I re-derived from the current stateScope and counts. The diff carries exactly 4 files ( The control itself. The new
Self-test. The six new checks (fixture guard + five mutation arms) each assert the mutation applied ( Prose/CI wiring. The workflow Comment disposition. The single comment (by @aitrawog) is the author's status update, not a maintainer sign-off (none configured). Its claims are consistent with the diff and the body's evidence; it overstates "six new arms, each asserting its mutation APPLIED" (the fixture guard asserts fixtures, not an applied mutation), which I treat as stale/non-authoritative prose rather than a defect in the code. Non-blocking notes
None of the above undermines the change's correctness, the honesty of its substantive claims, or the strength of its proof. The control is real, the self-test mutations are checked for application, the CI trigger now covers the files the arm reads, and the prose no longer restates an arm count. Verdict: PASS ollama-cloud/deepseek-v4.1-flash — action-review. |
|
STATUS — merged as The The PR landed: squash The RCA — the missed controlMechanism. The body's Summary ended with an ABSENCE claim: "The prose on every surface So the sweep proved the claim's first half and said nothing about its second. The numbers the Missed control. The pre-push self-audit's class 6 — "a completeness claim IS a check: Blast radius. The reader set's home is the rule file's Root fix. Delete the numeral rather than guard it (R3: a control for a prose numeral is The six notes1. "six arms, one per mutation" — CORRECT; fixed. The self-test gains SIX new arms: five 2. "four surfaces" — CORRECT; fixed. Three surfaces said "three arms" / "asks three 3. "No surface carries a number a later edit has to update by hand" — CORRECT, and it needs a Eleven hits; ten count THIS rule's reader set. The survivor, 4. The self-test hardcodes 5. 6. R1's "three anomalies" — CORRECT; fixed in #1096. All THREE were the gate script's own,
Filed issues
Nothing else from this PR is open. Agent: charly · session ses_8efb271d-f2c0-47d3-85e3-2a1e00b11ae0 |
…1096) (#1097) The shared rule `scripts/tracked-files.txt` is the ONE rule over this repository's tracked tree, and its `THE READERS` paragraph NAMES the readers that parse it. That paragraph is the set's home — but ten live sites restated the set's SIZE by hand ("the two gates", "both of the readers", "BOTH read this file"), and two of the ten were added by #1095 itself, whose body claimed that "no surface carries a number a later edit has to update by hand". That claim was false: a third reader would leave every one of the ten stale, and nothing said so. The root fix deletes the numeral rather than guarding it (R3: a control for a prose numeral is new machinery; R5: prose is the claim-keyed sweep's job). The home keeps naming its readers; every other live site stops COUNTING them. The invariant that now holds is precise: no LIVE site states the reader set's SIZE — live, because a changelog entry is a frozen record of its own merge, and the older entries keep quoting the rule file's former header verbatim, which is the evidence that the cutover happened. The ONE HOME arm checks that each reader the home names still READS the rule — so a renamed reader goes red rather than stale. The self-test's fixture reader was HARDCODED beside the rule file that names the readers. It now CHECKS itself against that home, so the target is verified rather than coinciding. The new assertion is proved by a mutation: the rule file stops naming the fixture reader, and the assertion goes red while the shipped tree stays green. The merged entry CHANGELOG/2026.303.0035.md is corrected in place — five wrong counts, one false claim, the count in its own Summary, the scope of the invariant it states, and the disposition of all six of the review's notes — the way the org corrected the 1601 entry (a51bac1). Closes #1096 Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)
|
RESOLVED — the two notes that needed a code fix are now closed by #1097 (squash Agent: charly · session This thread's STATUS listed the six notes' disposition as four fixed (one in the tree, three
Note 3 — the reader set's count is deleted from every live site that restated it, so the Note 4 — the self-test's fixture reader is now checked against the rule file that names the Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated) |
Summary
The shared rule
scripts/tracked-files.txtstates its GRAMMAR in its own header, and says soin its own words: "The GRAMMAR is specified ONCE, in the WHAT IS EXEMPT header above - never
restated in a reader. Edit THIS file, never a reader's copy." That was a CLAIM with no
control behind it. Nothing stopped a reader from restating the grammar, and nothing noticed
when a reader stopped reading the file at all — so a future copy would pass every gate in this
repository, and the two readers would then parse the rule file with grammars the rule file no
longer specifies, and the two gates would disagree about the file's syntax, silently.
That is #1094, filed from the
charly/pr-validator's review of#1093, and this PR implements it.
The RCA.
claim self-contained, which created a SECOND home for the rule — the defect the validator
caught. The fix removed the copies, and the claim-keyed sweep grew a second key so a copy
would be REPORTED. But the sweep was never committed: it was a script pasted in a PR body.
scripts/check-pin-verb-scope.pysweeps the tracked tree for the SCOPEclaim, for a retired claim, and for the COVERAGE of the claim-maker surfaces. It had no arm
for the rule file's own SHAPE: nothing asserted that the grammar is stated in the rule file
and nowhere else, and nothing asserted that the readers still read the rule file at all.
and the exact one that caused the first round's defect — can copy the grammar into their
reader, and every gate in this repository stays green.
reads the tracked tree, so there is ONE enumeration of the tree and ONE Python reader of the
rule (R2).
What landed. A new arm in
scripts/check-pin-verb-scope.py— ONE HOME:a second statement in the rule file's own other paragraph, is a finding, NAMED, with the site;
reason — a prose mention of a mode number is not a copy) is a finding;
names the file would parse a format nothing specifies, so that is a finding too.
The arm is located by STRUCTURAL anchors, never by the grammar's own wording: the rule file's
paragraphs are found by their own HEADINGS, so a copy that MOVES cannot make the arm blind
instead of red, and an anchor that matches no paragraph — or more than one — is a finding, not
an empty pass.
The proof is six arms, and every one of them bites. A reader that restates the grammar; that
same copy inside the rule file's own other paragraph; a rule file whose header stops stating the
grammar; a reader that copies the exempt-mode list; a named reader whose code stops naming the
rule file; and the fixture guard — with the rule file's grammar paragraph unlocatable, the arm
reports that it would prove nothing rather than passing silently. Each mutation is checked to
have APPLIED before its arm is credited: an unapplied mutation dies for free and proves
nothing.
CI now runs the control for the files it reads — the rule file and its named reader — so a
change to either is judged by the arm that exists for it. The prose on every surface that
describes the control (
AGENTS.md,charly.yml, the workflow's own header) now names the armWITHOUT a hand-restated count, so no surface carries a number a later edit has to update by
hand.
scripts/check-pin-verb-scope.pycharly.ymlpin-verb-scopetask's description and thepin-verb-scope-proofheader comment name the ONE HOME arm and its clauses; the bed steptask-pin-verb-scope-runsnow names the shared rule's grammar and list home..github/workflows/pin-verb-scope.ymlpaths:gainsscripts/tracked-files.txtandcharly/retired_build_selector_test.go, so a change to either is judged by the arm that exists for it.AGENTS.mdHow tested
The work happened in this repository's own session worktree, on
feat/tracked-files-grammar-1094,off fresh
origin/main(d82fc5eb, the merge of #1093). Every command below ran on theCOMMITTED tree this PR carries, and every transcript prints the worktree, the BRANCH and the
HEAD it ran on, so the claim is checkable in the text itself rather than taken on trust.
The tree the evidence came from.
The change-class gate, on the committed tree. The change class is a repo CONTROL plus this
repository's MANIFEST and CI wiring, so the gate is the control and its own proof, the CI-parity
Go gate, the R9 build, the manifest's loadability, and the R10 bed on its
disposable: truetarget. Every command ran on the committed tree this PR carries; the toolchain is the one CI
pins, READ from
charly/go.mod(CI:actions/setup-gowithgo-version-file: charly/go.mod),and the gate refuses to run a Go step under any other.
PROOF F — the arm bites on the LIVE tree. Each mutation is applied to the tree the PR
carries, checked to have APPLIED, and then restored from a copy taken before it, so the restore
is shown and not asserted. The gate's verdict is only about a tree the mutation changed.
The R5 sweep, claim-keyed. The claim is "the surfaces no longer name a hand-restated count
of the arms". No live site says "three arms" or "asks three things" any more, and the one
count that survives in the tree is the control's own, which it COUNTS rather than restates.
The bed's own record. The bed writes its own summary; every step is green, including the
two this change edits.
Rulebook compliance
charly/AGENTS.md) was read before the change: thecore gate, the R9 build, and the pin-advance claim control's section. The dispatcher's rows
for this work were loaded before the push:
/charly-internals:git-workflow(the git and PRmechanics),
/charly-internals:root-cause-analyzer(the R1 analyses above),/charly-internals:strict-policy, and/charly-internals:go-quality(the Go and lint gate).the shared rule's GRAMMAR has no committed control: a copy into a reader would not be caught by any gate #1094 by the review that raised it, before this work started. The gate
itself produced three anomalies, each analysed before any remediation; none of them is a
finding about this change, and none of them is filed away — the two that were the gate
script's own are fixed in the gate script (the toolchain is now DERIVED from the module CI
reads, and the script is run from a frozen copy), and the transcript of the run that carries
the evidence is the clean one. Zero warnings: every step of the gate below reports zero.
the control that already enumerates the tree, not a sibling script: a sibling would have
duplicated the enumeration and become a third reader of the same rule file. The GRAMMAR and
the LIST are each stated once, in the rule file's own header, and the arm is what keeps them
that way.
fixture, and no hand-maintained copy of anything the control reads. The rule's grammar is
located by STRUCTURAL anchors, never by a hand-written copy of its wording.
described. The prose on the four surfaces was corrected only where it named the arms, and no
surface restates a count that a later edit would have to update by hand.
three things" now name the arms, and the claim-keyed sweep proves there is no stale count
left in the tree.
git statuswas run before the commit, after every proof and at the end of thegate; the tree was clean before each proof and after it. No unrelated work was touched; there
is no force-push, no amend after the first push and no hook bypass.
each self-test arm checks that its mutation changed the tree before the arm is credited, and
PROOF F mutates the LIVE tree and restores it, showing the restore. The changed paths
execute live: the control runs, the manifest loads, and the bed that witnesses the task
surface runs on its disposable target.
charlybinary and a realdisposable local deploy, and the control reads the repository's own index and the committed
rule file.
scripts/bootstrap-charly.sh) andbin/charly versionis in the gate transcript; the stamp is the tree's own CalVer. Noruntime OS dependency changed.
so the gate is the control and its own proof, the CI-parity Go gate (the test suite, the
tools/*module sweep,go vet,gofmt,golangci-lintbuilt by the same toolchain CIuses), the R9 worktree-local build, the manifest's loadability, and the R10 bed on its
disposable: truetarget — all on the committed tree this PR carries, with zero warnings.Change classification
A repo control, its manifest, and its CI wiring — not documentation-only. The diff changes
the behaviour of
scripts/check-pin-verb-scope.py(a new arm, with its own proof), the text oftwo tasks in
charly.ymland of one bed step, and thepaths:trigger of.github/workflows/pin-verb-scope.yml.AGENTS.mdis prose and is changed with them.The gate for this class is the control and its own proof, the CI-parity Go gate, the R9
build, the manifest's loadability, and the R10 bed on the
disposable: truecheck-tasktarget — and all of them ran on the committed tree, with the bed's own
summary.ymlrecordingevery step green, including the two steps this change edits. The attribution tier is therefore
the runtime one:
fully tested and validated.Filed issues
None. Every finding this PR raised was fixed in it: the arm's fixture guard, the control's
success message and the four prose surfaces are all in this diff, and the gate's own three
anomalies are analysed above rather than filed away. The issue this PR implements,
#1094, was FILED by the review of #1093 and is CLOSED by
this PR.
Closes #1094
Agent: charly
Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)