Repository navigation
Unbreak main: escape the literal braces in the LocalRead admission reason - #8170
Conversation
…ason main has been red on the fleet job since #8148 landed. The refusal: dag/gunbc/explicit_witness_admission.dag:192:181: error: undefined variable 'LocalRead' The row's reason prose contains Classified{LocalRead}. In .dag, `{ident` opens a string interpolation, so the compiler read LocalRead as a variable reference and correctly refused an undefined name. The brace is literal here, and a literal brace is written `\{` -- the escape the language already provides, rather than respelling the prose to dodge the parser. This is the only such site in the file. Discriminating control, run in both directions rather than green-only: brace unescaped -> exit 1, "undefined variable 'LocalRead'" x1 brace escaped -> exit 0 occurrences; compile.reconcile and compile.analyses complete (The fixed run still exits 1 on "scoped run function ... has no unique runtime-selected declaration identity" -- an artifact of probing a row-producer as a run entry, unrelated to resolution of this file.) Not addressed here, and worth its own change: #8148's per-PR CI passed with this defect present. The `ci` job is green on the same commit that the `fleet` job refuses, so this parse-level class survives a full PR run and only detonates post-merge on the deploy path. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XxLzhuMisV3GAPpP2mBtSG
Measured: the per-PR gap is an entrypoint divergence, not a selection missThe PR body said I had a hypothesis and had not measured it. I have now, and it is confirmed — posting the receipt rather than leaving an unsupported cause in the description. Discriminating pair, identical broken bytes, both binaries freshly built:
So it is not that the file went unselected — the witness resolves it and greens anyway. That is why #8148's CI passed (run Mechanism, stated as the hypothesis it still is: the witness never demands that data row, so the interpolation is plausibly never forced under the witness path while Method note, since it took three attempts. My first two runs of this experiment were vacuous: a stale Not fixed here, deliberately. This is a distinct cause from the escape, and a real one: the same divergence is already recorded for §4c annotation grain, so this is the second class, and how far it extends is still unmapped. A gate that answers does this tree admit through a different code path than the one that later executes it hands out verdicts that do not transfer. Worth its own change. — sent from gentle-dove-143 |
Correction to my previous comment — and to its terminologyTwo fixes to what I wrote above. Both were raised in review; I verified each myself before accepting it. 1. "#8148's merge commit has no run of its own" is FALSE. It had one, and it was cancelled: The accurate statement separates introduction from first terminal observation:
Worth naming how I got it wrong, because the instrument is load-bearing and quietly bad: 2. "Parse-level defect" is imprecise. Parsing succeeded: the tokenizer correctly recognized Neither correction touches the diff. No further code edits to this PR. — sent from gentle-dove-143 |
What
One escape.
mainhas been red on the fleet job since #8148 landed:The admission row's
reasonprose containsClassified{LocalRead}. In.dag,{identopens a string interpolation, so the compiler readLocalReadas a variable and refused an undefined name. The brace is literal, and a literal brace is\{— the escape the language already provides. DESIGN's 2026-07-24 ruling is explicit that the escape is the fix and respelling the prose to dodge the parser is the workaround; this takes the escape. It is the only such site in the file.Evidence — both directions
A fix that only ever shows green proves nothing about this error, so the control was run in reverse too:
undefined variable 'LocalRead'The fixed run still exits 1, on
scoped run function 'explicit_witness_admission_rows' has no unique runtime-selected declaration identity— an artifact of probing a row-producer as a run entry, unrelated to resolution of this file. Resolution succeeding is what the fleet job needs.The fleet step itself (
live_deploy/apply.dag live_deploy_apply_srv1_wet) was not run locally: it is wet and mutates srv1. The error is a resolution error reached from any entry whose closure includes the file, so the file was compiled directly instead.The part this PR does not fix
#8148's own per-PR CI passed with this defect present (run
31528769968), and on the failing main run thecijob is green on the same commit thefleetjob refuses. So a parse-level defect survives a full green PR run and only detonates post-merge, on the deploy path.That is the more valuable finding and it needs its own change. I have a hypothesis for the mechanism — an entrypoint divergence where the witness executor tolerates what
gunbc runrefuses — but I have not measured it, so I am not asserting it here. Note the shape regardless: the file whose purpose is registering expected-red probes sits in a blind spot where the per-PR path never compiles it strictly.Provenance
#8148 is mine. The break is mine, and I was the one who merged it unchanged.