Uh oh!
There was an error while loading. Please reload this page.
docs(check-cross-repo-closer-outcome): repair two evidence citations, and stop hand-counting the battery - #10441
Conversation
… and stop hand-counting the battery (#9917) Both items are evidence citations inside comments. No behaviour, no assertion, no scenario and no mutation changes. 1. L9's fixture and `makeDoubles`' `issues.get` default cited objectui#4478 as a closed ISSUE answering `state_reason: null`. That number is a pull request, i.e. exactly the object L13 exists to refuse, so the file offered one observation as evidence for two opposite scenarios. Both sites now model the null from the endpoint's contract and cite nothing; L9 records why a sampled specimen is the wrong kind of evidence for this fixture in particular, and leaves L13's measured pull request (#9143) as the only cited object. 2. lint.yml's step comment hand-counted "Ten scenarios" and "seven ways" against a measured eighteen and fifteen. Both counts are replaced by the mutation CLASSES, the shape the objectui port chose; the totals now live only where they are computed -- the check's own OK line and `--self-test`'s. The same stale enumeration in this script's own header is repaired the same way. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
os-zhuang
commented
Aug 20, 2026
CI triage (PM): This PR's diff is Root cause is filed and now dispatched as #10449 — the ratchets run ESLint in-process (
⇒ Both blockers are in flight. Holding this PR as-is; nothing about the two comment edits needs changing. Will re-check once #10449 lands. Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes: #9917
Two evidence citations in the cross-repo-closer harness were wrong or stale. Both are comments. No behaviour, no assertion, no scenario and no mutation changes — the extracted subject is byte-identical, which the check reports itself (
19729-char script, same as onorigin/main).1. A pull request was cited as the closed-ISSUE example
scripts/check-cross-repo-closer-outcome.mjscarried, at two sites, the claim thatobjectstack-ai/objectui#4478is a closed issue answeringstate_reason: null. That number is a pull request, and it answersnullbecause it is one — so the file offered a single observation as evidence for two opposite scenarios: L9 ("a closed issue really does answer null") and L13, which exists to pin that a merged pull request answeringstate: 'closed'/state_reason: nullis refused before the already-closed branch.Repaired by taking the contract option rather than re-sampling:
state: 'closed'withstate_reason: nullare pull requests, so hunting a specimen for this fixture walks into L13's subject. It ends with an instruction not to "improve" it by finding a real issue to name.makeDoubles'issues.getdefault (the same citation, second site) likewise models the null from the contract.This was chosen over sampling a real closed issue deliberately: a sampled citation goes stale the moment the sampled object changes, and this one already had.
objectstack-ai/objectuiis out of this session's repo scope and the repair does not depend on re-measuring #4478 — the number now appears only as the withdrawn claim, labelled a pull request, so the next reader cannot reinstate it by accident.L13's own citation was checked and holds:
objectstack-ai/objectstack#9143is a pull request in this repo,state: closed,closed_at 2026-08-16T14:56:58Z— the exactmerged_atits fixture pins. It is left as the only cited object in the pair.2. Both hand-counts in
lint.yml's step comment were wrongThe
Cross-repo closer outcome contractstep claimed "Ten scenarios" and "seven ways". Measured 2026-08-20 from the check's own output: eighteen scenarios and fifteen mutations.Rather than refreshing 18/15 into the comment — which repairs today's instance of a defect whose class is "these numbers are hand-maintained" — both counts are replaced by the mutation classes, the shape the objectui port chose: a verdict downgraded, the loop's bookkeeping deleted, isolation abandoned mid-loop, the target parse narrowed, a guard removed, idempotency eroded. Prose classes survive an
M16; a count does not. The totals now live only where they are computed —${SCENARIOS.length}on the OK line and${MUTATIONS.length}on the--self-testline — and the comment says so, pointing readers at--list.The one number kept is a dated historical statement of the drift itself ("measured 2026-08-20 ... eighteen and fifteen against a comment claiming ten and seven"), which cannot rot for the same reason the
52/105records below cannot.Bounded in-place fix, declared
The same stale enumeration sits in this script's own header (
--self-testmutates "the extracted source -- drop thesetFailed, ... stop recording which half was lost", naming ten of the fifteen and reading as exhaustive). Same defect class, same file, same gate family, mechanical, no new verification surface — repaired the same way rather than left to contradict the comment one file over. No new file enters the diff.Deliberately NOT touched
:71/:276all 52 assertions stayed greenand:416all 105 assertions stayed green— historical records of the cross-repo-issue-closer.yml: an already-closed foreign issue is skipped whole, so it never gets the backlink the workflow exists to leave #9643 and The repo's two closing-keyword parsers disagree aboutFixes:— duplicate-fix-guard accepts the colon, cross-repo-issue-closer silently does not #9755 incidents, each already tense-anchored to the change it was measured on ("addinglistComments…", "adding:?…"). Refreshing them would falsify the record that justifies the unstubbed-API guard. Verified untouched:git diffmatches nothing on those lines.cross-repo-issue-closer.yml— the subject under test, unchanged.Verification at
ec095fb99Gate families derived from the real changeset,
node scripts/pm/dispatch-gates.mjswith no paths passed (it reads the merge base itself): 12 families, all run. Exit codes captured before any pipe.check-cross-repo-closer-outcome.mjs --self-test✓ 81 assertions, 15 mutations of the shipped script each driven to red.check-cross-repo-closer-outcome.mjsOK (107 assertions over 18 scenarios, driving the 19729-char script …)check-closing-keyword-parity.mjsOK (3 parsers agree on all 9 keywords and both measured separators …)check-nul-bytes.mjsOK (scanned 6124 text file(s) … no raw ASCII control bytes)check:cross-package-test-inputsOK: 12 package(s) read outside themselves, all declared …check:node-versioncheck:required-contextscheck:shard-attestation✓ 2 aggregate gate(s) count 3 declared leg(s) …check:workflow-status-functionsOK (scanned 26 workflow file(s), 45 job(s) …)check:type-check-coverageOK — 64/77 workspace packages type-checked …eslint scripts/check-cross-repo-closer-outcome.mjsEvery number written into a comment by this PR came from running the thing, not from counting entries. Counting by hand is what produced the defect:
grep -c "id: 'L"yields 13 for a population of 18 (the array also holdsP0 P1 N1 N2 N3), and reading the highest mutation id is wrong by construction —M15sits betweenM5andM6, andM7is last. Both traps were reproduced here before writing anything.One declared narrowing:
check:type-check-debtwas not run to completion. It refuses to run without a built workspace closure and says so loudly (--re-measure cannot run: 55 workspace dependenc(ies) … have no built type entry point on disk, remedy named in its own error). That is an environment precondition, not a verdict on this diff, which contains zero TypeScript; its siblingcheck:type-check-coverageis green at this HEAD. CI runs it with the closure built.skip-changeset: the diff isscripts/**+.github/workflows/**, which publish nothing. Re-derived at diff time — no published file entered the diff.Fence check: neither file is on the governed surface, and
.github/workflows/lint.ymlis outside epic #9465's declared territory (.changeset/**, changeset scripts,cut-rc.yml,release.yml,pr-automation.ymlchangeset steps, rootpackage.json). PR #10429's new block-comment rule does not reach these edits — they are//line comments and#YAML comments, not block-comment spans; eslint is clean regardless.Generated by Claude Code