test: the last figures come off the run, and a typed one is refused - #452
Merged
Conversation
The tree answered this both ways — four suites counted their own positive control in the figure beside them and two did not — so no single derivation reproduced the summary and the last four figures in it had to stay literals. The rule is chosen for one reason: the tally can only count printed lines, so a convention that subtracts something the run printed cannot be derived at all and needs a hand-kept exception table beside it. The run's total count of positive controls is deleted rather than derived. "Positive control" is a role and not a token on the line: M16 and M19 carry the word only because a control bone is a rig concept, while T04 and PS25 are positive controls whose names say nothing. Six, seventeen and twenty-nine were each a reading of it and none of them was the number. Refs #451. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The three figures the ruling settles go on the tally: static-rig 4 -> 5,
draw-order 6 -> 7, path/slider 45 -> 47. The fourth is deleted rather than
derived, because "positive control" is a role and not a token on the line —
17 case names begin CONTROL_, 29 contain the word, two of those 29 are mutants
carrying it because a control bone is a rig concept, and T04 and PS25 are
genuine controls whose names say nothing. It is replaced by a pointer with no
count in it.
Two suites the summary was silent about: runMeshOutlineSuite ran ten controls
with no clause at all and has one now, and runAtlasReaderSuite returned before
printing a header so its absence was invisible. TY09 makes the second one a
fault by name rather than a fixed symptom.
TY10 and TY11 refuse a figure typed into the summary instead of counted. The
rule is structural rather than lexical, because the summary legitimately holds
many numbers that are not figures: it is a +-joined list, and a run-produced
figure arrives through a hole between two literal chunks while a typed one sits
inside one. 548 literal runs, 48 clause openings, 46 value-filled, 0 written,
39 n() calls all at an opening, and no exception table.
BONEDIST_CONTROLS is gone; it was n('bonedist') one hop outside the text, where
raising it to 9 produced a green run printing a figure its suite contradicts.
DIFF_IDENTITY_CONTROLS stays: 6 is half a decomposition of the 15 its suite
prints, and a split the tally cannot produce would be the same defect wearing a
derivation.
Removing the dead arm around the bonedist clause leaves the rendered summary
byte-identical in both directions. The identical-looking arm at 24399 is live,
proven by parking one directory rather than argued from the paths.
Closes #451.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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 #451.
bun run typecheckclean,bun run lintclean,bun run selftest562 PASS / 0 FAIL / 0 SKIP / 0 HOLE, exit 0 (559 onmain).The ruling
A suite's figure counts every case it prints, its own positive control included. It is in
CLAUDE.mdbeside the floor rule, and it was needed because the tree answered the question both ways — four suites counted their control and two did not, so no single derivation reproduced the summary and #439 correctly left the last four figures standing rather than editing prose to match a script.The reason for choosing inclusion is the only one available: the tally can only count printed lines. A convention that subtracts something the run printed cannot be derived at all and needs a hand-kept exception table beside it.
The four literals
n('static-rig')→ 5n('draw-order')→ 7n('path-slider')→ 47The fourth is deleted rather than derived, and that is the sharper half of the card. "Positive control" is a role, not a token on the line. Measured on the finished run: 17 case names begin
CONTROL_, 29 contain "control" case-insensitively, and two of those 29 —M16_rim_vertex_pinned_to_the_control_bone,M19_idle_keys_the_mesh_control_bone— are mutants carrying the word because a control bone is a rig concept. In the other directionT04_GREYSCALE_ALPHA_STILL_PASSESandPS25are genuine positive controls whose names say nothing at all.⇒ Six, seventeen and twenty-nine were each a reading of it and none of them was the number. A derived-looking figure here would have been worse than the hand-written one, because it would have carried the derivation's credibility over an undefined quantity. It is replaced by a pointer with no count in it, which cannot go stale: "Each suite's own positive control is printed by name in its section above."
Every one of the 44 clauses was cross-checked against PASS/FAIL lines counted between section headers, and the six that already included their control were verified rather than assumed. None was off.
Two suites the summary was silent about
runMeshOutlineSuiteran ten controls and had no clause at all — not a wrong number, a missing one. It has one now, and the figure is on the tally.runAtlasReaderSuitewas the only corpus-dependent suite that returned before printing a section header, so its absence was invisible where the other five print a header plus aSKIP. It now says so out loud.🔒 And printing the header only fixed the symptom.
tallyFaultshad no clause that could have caught it, because every clause it carried was about what a section said and this suite opened none — so a suite that reports it did not run and opened no section is now a fault by name (TY09).The scanner (
TY10,TY11)#439 rejected this check as unbuildable while four literals legitimately stood. With none left, it is buildable, and the trap it had to get past is that the summary is full of literal numbers that are not figures:
2 of them a spine-core round trip,26.25 degrees,[0, 360),0 / 255,99.5%, and the one that breaks a naive rule, the slider clause's verbatim`v + 360 === 360`.So the rule is structural rather than lexical, taken from the summary's own grammar: it is a
+-joined list, every clause opens with+(the head withgreen —), and the figure is whatever fills that opening. A run-produced figure arrives through a hole between two literal chunks; a typed one sits inside a chunk. Prose numbers are never in that position — they sit mid-sentence, after a word.On the finished file: 548 literal runs, 48 clause openings, 46 filled by a run-produced value, 0 written into the text, and 39
n('…')calls all sitting at an opening. No exception table.🔒 Two-sided, for the reason
TY01andCUR01are:TY10also requires that openings were found at all, that some are value-filled, and that everyn('key')sits at one — so a summary rewritten into an unrecognised shape goes red rather than quiet.TY11runs the same scanner over a miniature carrying all three ambiguities at once, and its load-bearing clause is the negative one: the same text with the figure interpolated must fault in no way, without which a scanner that refused every clause opening would pass.Mutants, planted in the real file and restored
the suite "atlas-reader" did not run and opened no section at all, so nothing this run printed says it was skipped— exit 21 figure(s) are written into the text rather than counted: …+ 5 static-rig controls……39 n('…') call(s) all sitting at one EXCEPT draw-order; none is written into the text1 figure(s) are written into the text rather than counted: …+ 10 mesh-outline controls…the summary's own source was not found between … — the scan has nothing to read and cannot report a clean one+ 6 static-rig controls, 0 FAIL, exit 0Negative controls for each refusal are listed in the suite: a suite that did not run but opened a section and said
SKIP(held live by six such suites on a corpus-absent run), every prose number in the real summary, a comment quoting a stale figure, and all 39 realn()calls including the one nested inside a${}.🐛 A file that scans itself finds itself first
The first working
TY10reported four written figures and every one of them was this suite's own test data:SUMMARY_START, spelled whole, is the earliest match for itself, so the scan read the block comment above — includingTY11's deliberately planted miniature — instead of the summary.⭐ This is a new shape of a check that agrees with itself, and the distinguishing feature is that the check's subject matter was its own source. The anchor is now spelled in two pieces with the reason commented in place, and the fifth mutant exists to prove the failure is red rather than quiet.
The blind spot, and the half of it that closed
Two suite figures were hand-written outside the summary, where the scanner cannot see them, and the commander verified that this is not theoretical:
BONEDIST_CONTROLS = 4→9produced a green run, 0 FAIL, exit 0, with the summary printing9 stage-3 bonedist controlsover a suite that printed 4.BONEDIST_CONTROLSis gone — it was literallyn('bonedist')one hop out of the text, and the clause now asks the tally at the point of use. Two structural facts make that safe rather than lucky: the clause sits in an else-branch only reached when all three corpus suites ran, andtallyFaults'exit 2runs above the line that definesn, so the other waycountOfthrows has already exited.⭐ The mutant for it was run with the corpus parked on purpose, so the clause carrying the lie was never printed at all — and
TY10refused it anyway, because it reads the source rather than the output. That is the difference between closed and closed-on-machines-that-happen-to-have-a-corpus.DIFF_IDENTITY_CONTROLS = 6stays, and stays deliberately: it is half a decomposition (6 identity + 9 measure = the 15 the suite prints, verified this run), son('diff')would give 15 and a split the tally cannot produce would be the same defect wearing a derivation. The blind spot is narrowed to one named constant, not closed, and it is filed rather than papered over.🔒 A scanner for "a numeric constant whose only reader is the summary region" was rejected on measurement, not taste: it is buildable, and it goes red on
DIFF_IDENTITY_CONTROLSon its first run. The only way to keep it green is an exception table naming that constant.🐛 A dead branch, and the identical-looking one that is alive
Putting
n('bonedist')at the call site exposed that the arm it went into was unreachable:The outer condition already excludes
boneDistBad === null, so the inner empty arm could never be taken. Removed with the reason in place, under#374's judgment that a branch nothing reaches is not a control. The rendered summary is byte-identical in both directions over the whole 44 KB paragraph, which is what proves it was dead.selftest.ts:24399has the same silhouette —X === null ? '' : …nested inside a ternary — and it is live. Its inner condition is on a different variable with a different predicate:runMeshRungSuitekeys onexamples/6-arcs/export/…json,runMeshCheckSuiteonexamples/6-arcs/imagesandbench/reference/6-arcs/frames.json. Parking only the images reaches the empty arm: mesh-rung ran, mesh-check skipped, the summary printed+ 1 rung-6 mesh renderwith no fidelity clause after it, run green.⇒ The rule is not "delete
X === null ? '' : …inside a branch". It is whether the enclosing condition already decides the inner one — and the two cases are indistinguishable by shape. The live one was proven by construction rather than argued from the paths, which is the standardcheckis held to.Also measured and reported rather than assumed: inside the⚠️ arm are all live; a corpus-absent run prints all three names.
corpuselse-branch thediff,diff measureandcheckclauses carry no conditional at all — there was never an arm to be dead. Only bonedist had the shape. The three.filter(Boolean)ternaries in theRejected, with the measurement that killed each
n()" — the rule that would have caught mesh-outline having no clause. Needs a hand-kept exemption list:rig-spec,diff,bonedist,motion-parse,gallery-example,registered-cutand the threeSUITES-loop keys all legitimately have none, and no derivation of that set was found. Left undone and reported.+ 6 diff identity controls(derived) and+ 4 static-rig controls(typed) are the same characters once rendered. The distinction exists only in the source./\+\s*\d/over the source's string literals — measured before the edits: 5 hits, 3 true, 2 false. The clause-opening rule scores 3 hits, 0 false on the same text.${}bodies wholesale — measured: loses the mesh-rung clause's nested', + ' + n('mesh-check')and reports it misplaced. Replaced with a stack that descends.lastIndexOffor the start anchor — a third occurrence would silently change which region is read; the split literal fails loudly instead.