fix(pm): derive check-half-states' H32 seat specimens from the resolved sweep repo - #13006
Merged
os-litant merged 1 commit intoAug 28, 2026
Merged
Conversation
…ed sweep repo seatLane() judges an `@ <repo>` seat-title suffix against the LIVE resolved sweep repo (SWEEP_REPO), so self-test rows spelling `objectui` as the sibling board and `objectstack` as the own board asserted THIS BOARD rather than the property, and inverted wholesale in any install that is not objectstack. Run verbatim in objectui on 2026-08-28 the suite failed exactly four cases, forcing three name-swap-only entries into that repo's upstream-port parity pin. Both names are now derived: OWN_BOARD is the resolved repo's name half, and SIBLING_BOARD is a real neighbouring board picked so the two can never coincide. Specimen spelling only -- no predicate changes, suite count unchanged at 1551. own board (objectstack) 1551 pass (was 1551 pass) PM_SWEEP_REPO=.../objectui 1551 pass (was 4 of 1551 failed) PM_SWEEP_REPO=.../cloud 1551 pass (a board neither name anticipates) Co-Authored-By: Claude <noreply@anthropic.com>
os-litant
marked this pull request as ready for review
August 28, 2026 14:30
os-litant
enabled auto-merge
August 28, 2026 14:30
os-litant
deleted the
claude/issue-12994-h32-board-independent-specimens
branch
August 28, 2026 15:04
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.
Fixes #12994
seatLane()judges a seat title's at-repo suffix against the live resolved sweep repo —at[2] !== SWEEP_REPO.repo.split('/')[1]— never a constant. Six H32 self-test specimens spelled the board names literally, so four of them asserted this board rather than the property, and invert wholesale in any install that is not objectstack. That is the one thing a file adopted BY COPY (the whole design ofresolveSweepRepo) may not do.What changed
Both board names are now derived, in the H32 block of the self-test:
OWN_BOARDis the resolved repo's name half — the same half the predicate compares, re-derived here rather than shared through a helper, so a predicate that switched to the OWNER half still goes red.SIBLING_BOARDis a real neighbouring board picked by a ternary that makes the two provably distinct on every board, which is what stops the FOREIGN rows from going vacuously green on an install named after the specimen.Specimen table
H32 lane: an `@ sibling` suffix is FOREIGN@ objectuisiblingLaneSeat()H32 lane: an `@ own-repo` suffix is NOT foreign@ objectstackownLaneSeat()H32: a FOREIGN lane is out of scope@ objectuisiblingLaneSeat()H32 gate: a foreign-lane seat buys no fetch@ objectuisiblingLaneSeat()H32 lane: …and keeps the bare lane label@ objectstackownLaneSeat()H32 held: ⏳ vacant is NOT held@ objectuisiblingLaneSeat('⏳ vacant')seatIsHeldreads no repo)The last two never failed, so they are not part of the measured four; they are rebuilt because the same grep catches them and because on the objectui board their titles read as the opposite of what the surrounding prose calls them.
The two-board proof
The resolver reads
PM_SWEEP_REPOfirst, thenGITHUB_REPOSITORY, at module load — so the suite runs against a chosen board with no code change.--self-testis deliberately exempt from the malformed-repo exit-2 refusal, so every leg below really ran.✓ 1551 cases pass.(exit 0)✓ 1551 cases pass.(exit 0)PM_SWEEP_REPO=objectstack-ai/objectui✗ 4 of 1551 case(s) failed.(exit 1)✓ 1551 cases pass.(exit 0)PM_SWEEP_REPO=objectstack-ai/cloud✓ 1551 cases pass.(exit 0)4 failures on the foreign board, 0 after. The four were exactly the rows named above. Suite count is unchanged at 1551 before and 1551 after — same rows, board-independent spelling. The third leg is a board neither literal anticipates, which is the actual claim being made.
Ablation — the rebuilt rows can still fail
A derived specimen could be green everywhere because it stopped asserting anything. Inverting the predicate's comparison (
!==to===) on the committed tree, mutation confirmed on disk by anchor counts (removed=1 injected=0before,removed=0 injected=1after) and by a blob hash differing from the HEAD blob:Both legs name the same four rows. Restoration was proved byte-identical to the HEAD blob (
9ffcdb76…), withgit diff HEADandgit status --porcelainboth empty and the restored tree re-run green at 1551. There is no build or dist leg to rebuild here: this file is executed directly by node as source, with no packageexportsresolution.Gates
Derived union from
dispatch-gates.mjs --repo objectstack-ai/objectstack(change set taken from the merge base by the tool itself), run underos-verify-lock.shwith slotissue-12994-h32; exit codes captured before any pipe, verdict lines quoted from each gate's own output.check:pm-half-states✓ check-half-states self-test: 1551 cases pass.check:pm-dispatch-gates✓ dispatch-gates self-test: 834 cases pass.bare-root-worklist.mjs --self-testOK self-test: 47 live row(s) … none stale, none missing, none contradicted.check:partof-closing-keyword✓ check-partof-closing-keyword self-test: 28 cases pass.check:entry-guard✓ 175 scripts/ file(s) — every entry guard goes through invoked-as.mjscheck:cross-package-test-inputsOK: 23 package(s) read outside themselves, all declaredcheck-closing-keyword-parity.mjsOK (3 parsers agree on all 9 keywords …)check-ci-filter-parity.mjsOK: all 117 declared cross-package glob(s) … coveredcheck:agent-test-spelling,check:bash32-floor,check:cli-command-ids,check:parse-guard,check:pnpm-filter-targets,check:watch-hint-literal,check-cross-package-test-inputs.mjscheck-governed-merges.mjs --self-test✓ 206 assertionsci-failure.mjs --self-testThe two convention-triggered obligations are included because this diff edits a gate script; the last two are the suites of scripts that read this file, which no path derivation names.
One entry needs its reading stated: bare
node scripts/check-partof-closing-keyword.mjswith noPR_BODYexits 2 as a usage refusal, not a gate failure — its CI form takes the PR body. Re-run with this very body supplied, it is green.Scope and observations
selfTest().sweep repo:rows that pin the objectstack leg againstDEFAULT_SWEEP_REPOare coupled to that constant, not to the resolved repo — they were green in every leg above, including the foreign-board one. Different divergence class; untouched here, as the card directs.PM_SWEEP_REPO(a bare name), the own-board row fails — identically before and after this PR. The property has no witness in that state: the name half isundefinedand no title suffix can equal it. Parity, not a regression, and not something this card's shape can fix without changing the case count.scripts/pm/**publishes nothing user-visible.skip-changesetapplied at PR-open.h32-lane-own-board,h32-foreign-out-of-scope,h32-foreign-no-fetch). Deleting them is that repo's standard--resyncact on the parity gate — owed there after merge, deliberately not a rider on this PR.Draft on purpose: the PM self-reviews at collection and lands it.
Generated by Claude Code
Generated by Claude Code