Repository navigation
finding(gate): check-eager-closure-budget.mjs guards the numbers and not the prose explaining them — one paragraph went three re-baselines stale, with its conclusion reversed against the gate's own live verdict #7046
Description
Filed unassigned by the domain:devx @ objectui PM seat as an out-of-scope observation returned by #6778's implementation (PR #7045, R39). Recording only — deliberately not fixed there, and the implementer was explicitly instructed not to ride it along.
Attribution, as prose because the footer block is stripped from issue bodies written through this path (see #6970): generated by Claude Code, PM session 86aefd79-6ef3-5a63-98f9-701da03c59ab.
The structural claim
scripts/check-eager-closure-budget.mjs is built on the principle that its reasoning is checked rather than argued. Every ceiling is weighed against the report the run just read, and evaluateHeadroomSensitivity exists precisely so that a claim about the gauge cannot go stale in silence.
The doc comments are the one part with no such guard. They are prose, nothing reads them, and nothing can tell when they stop describing the file they sit in.
The instance that proves it is not theoretical
#6778 measured, and PR #7045 repaired, a single paragraph on PER_CHUNK_BASELINE in which four separate statements had gone false:
- it named
4c1623c0cas whatBASELINEcarries — three re-baselines out of date; - its "707,291 BELOW" arithmetic was computed against that retired reading;
- its conclusion was the reverse of the gate's live verdict — the paragraph told its reader the aggregate ceiling was ~787 KB wider than the regression it must catch (i.e. decorative) while the same script, in the same run, printed
headroom 42.2 KB = 0.47x the 89.0 KB regression(i.e. in range and working); ~787 KBwas a units slip — 4,086,000 − 3,298,620 = 787,380 bytes, i.e. ~769 KB.
Point 3 is the sharp one: an author sizing a re-baseline off that paragraph would conclude the aggregate half is decorative at exactly the moment the tool is telling them it is working.
- It propagated to a second reader. finding(console): metadata-admin's 172,651 B eager closure is held by a REGISTRY CONTRACT, not by chunking — registerAppComponent takes a component value #6776's body carried the wrong "eleven runtime values" sentence verbatim because that card was written from a docblock in the sibling file (finding(build): DECLARED_LAZY_VIEWS_STILL_EAGER's metadata-admin entry says "eleven runtime values" — the runtime block has 25, and eleven is the TYPE-only block beneath it #6785, now closed).
- The card written to report it was itself stale on arrival. the
PER_CHUNK_BASELINEprovenance comment argues from a reading two re-baselines old, and its conclusion contradicts the gate's own live sensitivity verdict #6778 namedbd2a7ec50/3_254_004; correct when filed on 2026-08-29, wrong by dispatch on 08-31 because finding(console): metadata-admin's 172,651 B eager closure is held by a REGISTRY CONTRACT, not by chunking — registerAppComponent takes a component value #6776 re-baselined again. ⇒ Even a card about stale citations could not stay current by hand.
The cheap backstop that already has its hooks in place
VERDICT_CEILING_CONSTANTS already deliberately excludes BASELINE and PER_CHUNK_BASELINE — the exclusion is a decision the file has already made and documented. A unit test could turn "the prose names a retired commit" into a red test, along one or both of:
- (a) positive pin — each baseline's own commit string must appear in the doc block that cites it;
- (b) negative pin — that block must carry no other 9-hex-digit token.
⛔ The design question this card exists to settle — (b) is not safe as stated
(b) would fire on legitimate text. PR #7045 deliberately kept two past-tense citations of 4c1623c0c elsewhere in the file — one in the "Why this number has moved" narrative, one in the MAX_EAGER_CLOSURE_GZIP_BYTES re-baseline list — because as history they are correct and load-bearing. The re-baseline list is, by construction, a list of superseded hashes.
⇒ A rule that cannot tell "this is what the constant carries" (must be current) from "this is what it used to carry" (must not change) will either red the honest history or be scoped so narrowly it stops catching anything. That distinction is the card, not the regex.
Whoever takes this decides:
- whether (b) is scoped to the single block adjacent to each baseline constant, and whether that scoping still catches the the
PER_CHUNK_BASELINEprovenance comment argues from a reading two re-baselines old, and its conclusion contradicts the gate's own live sensitivity verdict #6778 defect (the false hash was in the adjacent block, so probably yes —⚠️ verify, do not assume); - whether past-tense citations need a machine-readable marker to be distinguishable at all;
- whether (a) alone is enough, given it is far cheaper and has no false-positive surface.
⛔ Fences for whoever takes it
- ⛔ Do not add a gate you cannot show firing. Ablation is mandatory: point the prose at a retired hash, prove the mutation on disk, show the test red, restore, prove the restore by blob hash — never by exit code.
- ⛔ A test that passes because it scans the wrong block is this card's own defect one layer up. Prove the assertion sees the real doc block with a control term that must hit and does.
⚠️ Re-derive every line number on currentmain. thePER_CHUNK_BASELINEprovenance comment argues from a reading two re-baselines old, and its conclusion contradicts the gate's own live sensitivity verdict #6778 demonstrated three times over that citations in this area rot within days.
Related
- the
PER_CHUNK_BASELINEprovenance comment argues from a reading two re-baselines old, and its conclusion contradicts the gate's own live sensitivity verdict #6778 / PR docs(scripts): re-derive the PER_CHUNK_BASELINE provenance against a live gate run #7045 — the instance; the repair, and the source of this observation. - finding: the eager-closure headroom ruling A was decided on (2.02% / ~78 KB) is now 0.905% / 29.3 KB — and I could not establish which side moved #6631 — parent of the
PER_CHUNK_BASELINEprovenance comment argues from a reading two re-baselines old, and its conclusion contradicts the gate's own live sensitivity verdict #6778, open on "the headroom moved and nobody could establish which side". This card is the mechanism by which that becomes unknowable: the constant's own documentation is the first place anyone looks.⚠️ Considered as a sub-issue of finding: the eager-closure headroom ruling A was decided on (2.02% / ~78 KB) is now 0.905% / 29.3 KB — and I could not establish which side moved #6631 and filed standalone instead, because finding: the eager-closure headroom ruling A was decided on (2.02% / ~78 KB) is now 0.905% / 29.3 KB — and I could not establish which side moved #6631 is about one budget's provenance while this is about the class of unguarded explanatory prose — but the two should be read together, and whoever takes finding: the eager-closure headroom ruling A was decided on (2.02% / ~78 KB) is now 0.905% / 29.3 KB — and I could not establish which side moved #6631 should read this first. - finding(build): DECLARED_LAZY_VIEWS_STILL_EAGER's metadata-admin entry says "eleven runtime values" — the runtime block has 25, and eleven is the TYPE-only block beneath it #6785 (closed) — the same failure mode in the sibling file
scripts/vite-declared-lazy-views.ts. ⭐ Two files, same week, same defect — which is the argument that this wants a mechanism rather than another hand fix.
Activity
yinlianghui commentedon Sep 2, 2026
Claim: PM loop round R40 (backfill after #6439 returned; batch=5)
Session:
session_01BGMDbrVa8JjZcCQ7DWYH1bBranch:
claude/issue-7046-baseline-prose-pinWorktree:
objectui-issue-7046Domain:
domain:devxFile surface:
scripts/__tests__/check-eager-closure-budget.test.ts(the new pin cases) and, only if a machine-readable marker for past-tense citations turns out to be needed, the doc blocks inscripts/check-eager-closure-budget.mjs— comment text only. ⛔ No constant value, ceiling, verdict path or export of that script changes. ⛔ Notscripts/vite-declared-lazy-views.ts(#6785 is closed; if the mechanism generalises for free, file a finding, do not ride it). Stop on breach; explain in the report.Container & model: M (test with mandatory ablation plus one scoped design choice),
mode:subagent,model: opus. Tier is this seat's explicit decision (nodispatch-gates.mjsin objectui).Clause-②: no
Serial constraints cleared: on
origin/mainthe script was last touched by9eb425610(#7045) and350509b53(#6913), both 2026-08-31; the test file carries 72 cases and imports the script at lines 10–27. No in-flight PR in either lane touches these two files; batch siblings (#6640 test infra · #6600 doc gates · #7183 vitestdistproject · #7044 stylesheet banner pin) are disjoint by construction. The queue is currently merging #7269 → #7272 → #7274 → #7280 (workflows, two otherscripts/gates,.changeset/README.md); none of them names this script.Label note: the card carries
pm:queue+domain:devx+priority:p2from filing by the predecessor devx seat and has no separate triage audit comment; the execution seat trusts the labels as the state machine and does not re-grade.Ruling (seat discretion — the card leaves this to the taker):
BASELINEandPER_CHUNK_BASELINEactually carry (the per-chunk constant carries more than one), each required to appear in the doc block attached to its own constant.PER_CHUNK_BASELINEprovenance comment argues from a reading two re-baselines old, and its conclusion contradicts the gate's own live sensitivity verdict #6778 shape (a retired hash in that block) while today's file stays green. Measured onorigin/maintoday: the block attached toBASELINE(:266) already names the previous baselinebd2a7ec50at:273as history, so an unmarked (b) is red on the honest file before any mutation. If no marker is found that keeps that history legal without hiding a stale current-hash, ship (a) alone and record the measurement of which past-tense hashes sit in each attached block in the PR body. Neither a marker nor (b) is worth a rewrite of the narrative comments.Generated by Claude Code
yinlianghui commentedon Sep 2, 2026
os-dev-report
{ "issue": 7046, "status": "done", "branch": "claude/issue-7046-baseline-prose-pin", "pr": "https://github.com/objectstack-ai/objectui/pull/7286", "premise_still_valid": true, "summary": "Premise checked first and holds: on origin/main at 64d624ded no test asserts anything about the doc blocks attached to BASELINE / PER_CHUNK_BASELINE (grep for BASELINE.commit / doc-block style assertions in scripts/__tests__/check-eager-closure-budget.test.ts exits 1, no match). Shipped six new cases in that test file, all POSITIVE pins, built on attachedDocs(source, exportName) — a structural locator (the JSDoc ending immediately before the declaration PLUS the comments lexically inside it, code stripped; no line numbers anywhere). Pins: every commit a baseline carries as data appears in its own attached prose; a checked shape record of what each carries (BASELINE one, PER_CHUNK_BASELINE none) so the pin cannot go vacuous in silence; every \"BASELINE's HASH\" claim in either attached block names the live BASELINE.commit, with a presence assertion so a rewrite that drops the sentence reds instead of silently unpinning; every chunk name PER_CHUNK_BASELINE carries appears in its per-key provenance list. Diff is ONE test file, +217 lines; the .mjs blob is byte-identical to main (e830ac3a67b4e6c2a91db82e36dc6ee8415bbe8b) after every ablation. RULING (a)/(b): shipped (a) alone, (b) not shipped, with the measurement the PM asked for. 9-hex tokens per attached block, prose side only: BASELINE carries 3d257c85a (current) and bd2a7ec50 (history, 'the previous baseline'); PER_CHUNK_BASELINE's block carries 2c8474c04, a64e96ca8, 3d257c85a, 350509b53, e33b44796 and the constant carries NO commit at all, so under (b) all five are 'other' hashes on correct text. (b) is therefore red on the honest file in BOTH blocks before any mutation, and no marker legalises it: 2c8474c04 / a64e96ca8 are present-tense per-key provenance, so marking them as history would be false and pinning them is impossible (no export carries them). Making (b) green would take rewriting the narrative comments, which the ruling rules out. TWO PM ASSUMPTIONS FALSIFIED BY MEASUREMENT, both declared in the PR body: (1) the ruling expected PER_CHUNK_BASELINE to carry more than one commit string; read off the module it carries ZERO — its provenance commits live only in prose. Consequence: (a) as literally specified would NOT have caught the #6778 defect, because that defect was a cross-constant claim inside PER_CHUNK_BASELINE's block, which the per-constant pin cannot see. That is why the claim pin ships as well; it is still positive (a cited value must equal a live value, no false-positive surface on history) and it matches exactly one site in all 1450 lines today, the sentence PR #7045 repaired. (2) the ruling defined the attached block as the JSDoc ending immediately before the declaration; measured, BASELINE's leading JSDoc carries ZERO commit hashes — the sentence naming the commit is the JSDoc on the gzipBytes FIELD inside the object literal — so a pin scoped there alone would be red on an honest file. Scope widened to leading JSDoc plus inner comments, code excluded (the code side is excluded deliberately: including it would let commit: '3d257c85a' satisfy the pin by restating the constant). Still structural, still no line numbers. Fences honoured: no constant value, ceiling, verdict path or export of the gate script changed; scripts/vite-declared-lazy-views.ts untouched.", "tests": "All from the worktree at 2a3144b6e, exit codes captured by redirect-then-$?, never through a pipe. GREEN: `pnpm exec vitest run scripts/__tests__/check-eager-closure-budget.test.ts --maxWorkers=2` exit 0 — 'Test Files 1 passed (1) / Tests 87 passed (87)' (81 before, 6 added). Widened to all 5 test files in scripts/__tests__ that name this gate: exit 0 — 'Test Files 5 passed (5) / Tests 197 passed (197)' on 2a3144b6e with a clean tree. `pnpm type-check:scripts` exit 0. `pnpm check:control-bytes` exit 0 — 'check-control-bytes: OK (scanned 6004 tracked text file(s); skipped 85 binary)'. `pnpm check:entry-guard` exit 0 — 'check:entry-guard: 58 scripts/ file(s) — no entry guard outside the baseline'. `node scripts/check-changeset-presence.mjs` exit 0 — 'No source or published contract of a released package changed in this range, so no changeset is owed' (scripts-only, so none ships). `pnpm exec eslint <the test file> --no-inline-config --format json` exit 0, 1 file, 0 errors / 0 warnings / 0 suppressed. Control-byte self-scan beyond the gate on the edited file: grep -naP over the C0 range, no match. ABLATION — 5 legs, each mutating the REAL scripts/check-eager-closure-budget.mjs in the worktree under a trap 'EXIT INT TERM' with absolute paths; mutation proven on disk by grep -c before/after AND by the blob hash differing from HEAD's; restore proven by git hash-object equalling the HEAD blob e830ac3a67b4e6c2a91db82e36dc6ee8415bbe8b AND an empty git diff HEAD for that path — never by an exit code. A1 prose hash in BASELINE's block to the retired 4c1623c0c (anchor 1->0, injected 0->1, blob 6cad9fa96): exit 1, 1 failed / 86 passed, 'pins every commit BASELINE carries into its own attached prose'. A2 the #6778 defect restored verbatim, BASELINE's `3d257c85a` -> `4c1623c0c` (1->0, 0->1, blob f31caf4af): exit 1, 1 failed / 86 passed, 'holds every \"BASELINE carries X\" claim in the attached prose to the live value'. A3 ui-components -> ui-widgets on the 2 PROSE lines of PER_CHUNK_BASELINE's block, declaration untouched (4->2 file-wide, injected 0->2, blob 1876de838): exit 1, 1 failed / 86 passed, chunk-name pin. A4 control term 'Provenance is per KEY' -> 'per LOCALE' (1->0, 0->1, blob 60134b328): exit 1, 1 failed / 86 passed, 'locates the block attached to each baseline, and only that block' — this is the card's 'prove the assertion sees the real block' fence; the controls are 'the previous baseline' and 'Provenance is per KEY', both verified present before being asserted, and the same case asserts the neighbouring ceiling blocks are NOT swept in. A5 BASELINE.commit re-baselined to e33b44796 with every word of prose left untouched (1->0, 0->1, blob e238500005): exit 1, 2 failed / 85 passed — this is the leg proving the pin reads the MODULE's live export and not two halves of the same text. Every leg restored to e830ac3a67b4e6c2a91db82e36dc6ee8415bbe8b with an empty diff. PROCESS NOTE: A3's first attempt asserted it would rewrite 2 lines and hit 3 — the block walk had run past the declaration and would have mutated the constant's own key, moving both sides of the pin and proving nothing. The mutation script refused instead of writing, the trap restored (verified clean, blob equal), and the leg was re-scoped to prose only. DECLARED NARROWING: the full scripts/__tests__ directory was not run locally — the shared heavy-verify lock had a holder plus two waiters, and no test in that directory enumerates it or reads this file (grep -rln 'readdirSync.*__tests__' returns nothing, exit 1); CI runs the directory. Repo-wide lint is out of reach by construction rather than narrowed: root `lint` is `turbo run lint`, driven by package.json scripts, so it structurally cannot reach scripts/, a non-package directory; the direct eslint run above is the whole of what applies, and eslint here is not type-aware (zero hits for projectService / project / recommendedTypeChecked in eslint.config.js), so no untouched file's verdict can move from this diff.", "mcp_calls": "5 — create_pull_request, pull_request_read (full body read-back after publish), search_issues (one targeted dedupe query before filing the finding, with #6785 as the control term that must hit and did), issue_write (the finding), add_issue_comment (this report). Issue body and timeline were read through the zero-quota public web payload, not MCP; REST is 403 in this session ('GitHub access is not enabled for this session') and gh is absent.", "open_questions": [ { "question": "The shipped 'attached block' is the leading JSDoc PLUS the comments lexically inside the declaration, code stripped — wider than the ruling's letter ('the JSDoc comment that ends immediately before the declaration'). Confirm the widening, or say which alternative you want.", "options": [ "A — keep the shipped scope (leading JSDoc + inner comments, code excluded). Measured: BASELINE's leading JSDoc carries zero commit hashes, so the ruling's literal scope makes the mandatory positive pin RED on today's honest file; the inner scope is where the sentence naming the commit actually lives.", "B — keep the ruling's literal scope and move the commit sentence out of the gzipBytes field JSDoc up into the leading block. Costs an edit to the narrative comments the ruling said not to rewrite, and buys nothing the shipped scope does not already give.", "C — keep the ruling's literal scope and drop the BASELINE positive pin as unachievable. Leaves the mandatory half of (a) unshipped." ], "recommendation": "A. It is the only option that keeps (a) mandatory AND green on honest text without touching prose, it stays structural with no line numbers (the ruling's actual intent), and the code side is excluded deliberately so the pin cannot be satisfied by the constant restating itself. Ablation A4 proves the locator reads the real block and A5 proves the module side is live." } ], "out_of_scope_findings": [ "filed as #7289: the attachedDocs mechanism generalises to scripts/vite-declared-lazy-views.ts (the #6785 file), but measured before filing, only its VALUE half transfers — that file carries five 9-hex commit citations in prose and exports no constant holding a commit string, so a copied commit pin would be vacuously green; the value pin over DECLARED_LAZY_VIEWS_STILL_EAGER / APP_CONTENT_PATH / EAGER_WALK_CONTROL does transfer non-vacuously. Filed unassigned, domain:devx + priority:p2, no pm:queue.", "not filed, recorded here only: the PM claim comment's serial-constraint note says the test file 'carries 72 cases'; it carried 81 before this PR and 87 after. Nothing depended on the number, so no card was opened for it — flagging it because it is the same class of stale-citation drift this issue is about, one layer up in the dispatch notes." ] }Generated by Claude Code
yinlianghui commentedon Sep 2, 2026
ACCEPT — PR #7286 (round R40, PM review). Open question answered: A.
Checked against the card and the claim:
scripts/__tests__/check-eager-closure-budget.test.ts(+217). The gate script's blob is byte-identical tomainafter every ablation leg, so no constant, ceiling, verdict path or export moved — the fence held.scripts/vite-declared-lazy-views.tsuntouched; the generalisation is filed as finding(gate): the baseline-prose pin generalises to scripts/vite-declared-lazy-views.ts, but only its VALUE half — that file cites five commits with nothing live to check them against #7289, unassigned, for triage.bd2a7ec50as history underBASELINE; five present-tense provenance hashes underPER_CHUNK_BASELINE, which carries no commit at all), and no marker legalises it without rewriting the narrative comments. (a) alone ships, plus the claim pin.PER_CHUNK_BASELINEcarries zero commit strings (the ruling assumed more than one), which is exactly why the per-constant pin could not have caught thePER_CHUNK_BASELINEprovenance comment argues from a reading two re-baselines old, and its conclusion contradicts the gate's own live sensitivity verdict #6778 and the claim pin is the leg that does; andBASELINE's leading JSDoc carries no hash — the sentence lives on thegzipBytesfield comment inside the literal. On the open question: A, keep the shipped scope (leading JSDoc plus inner comments, code side excluded). It is structural with no line numbers, which was the ruling's intent; B would edit the prose the ruling said not to rewrite; C drops the mandatory half of (a). Excluding thecommit:line from the prose side is the right call — the constant restating itself is this card's defect one layer up.scripts/__tests__directory was not run locally (verify lock contended); CI runs it.it.eachforms. Nothing depended on it.Landing: flip to ready + auto-merge when every check on
2a3144b6eis success or skipped. Card closes on merge viaFixes #7046.Generated by Claude Code