Skip to content

fix(pm): derive check-half-states' H32 seat specimens from the resolved sweep repo - #13006

Merged
os-litant merged 1 commit into
mainfrom
claude/issue-12994-h32-board-independent-specimens
Aug 28, 2026
Merged

fix(pm): derive check-half-states' H32 seat specimens from the resolved sweep repo#13006
os-litant merged 1 commit into
mainfrom
claude/issue-12994-h32-board-independent-specimens

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes #12994

seatLane() judges a seat title's at-repo suffix against the live resolved sweep repoat[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 of resolveSweepRepo) may not do.

What changed

Both board names are now derived, in the H32 block of the self-test:

const OWN_BOARD = SWEEP_REPO.repo.split('/')[1];
const SIBLING_BOARD = OWN_BOARD === 'objectui' ? 'objectstack' : 'objectui';
const ownLaneSeat = (status = '🟢 os-x') => seat(`[PM seat] domain:devx @ ${OWN_BOARD}${status}`);
const siblingLaneSeat = (status = '🟢 os-x') => seat(`[PM seat] domain:devx @ ${SIBLING_BOARD}${status}`);

OWN_BOARD is 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_BOARD is 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

self-test row before after verdict on a foreign board, before
H32 lane: an `@ sibling` suffix is FOREIGN @ objectui siblingLaneSeat() inverted — failed
H32 lane: an `@ own-repo` suffix is NOT foreign @ objectstack ownLaneSeat() inverted — failed
H32: a FOREIGN lane is out of scope @ objectui siblingLaneSeat() inverted — failed
H32 gate: a foreign-lane seat buys no fetch @ objectui siblingLaneSeat() inverted — failed
H32 lane: …and keeps the bare lane label @ objectstack ownLaneSeat() passed, but measured the foreign path under an own-board name
H32 held: ⏳ vacant is NOT held @ objectui siblingLaneSeat('⏳ vacant') passed; spelling only (seatIsHeld reads 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_REPO first, then GITHUB_REPOSITORY, at module load — so the suite runs against a chosen board with no code change. --self-test is deliberately exempt from the malformed-repo exit-2 refusal, so every leg below really ran.

leg before this PR after
own board, no env ✓ 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 not measured ✓ 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=0 before, removed=0 injected=1 after) and by a blob hash differing from the HEAD blob:

ABLATED, own board                       ✗ 4 of 1551 case(s) failed.
ABLATED, PM_SWEEP_REPO=.../objectui      ✗ 4 of 1551 case(s) failed.

Both legs name the same four rows. Restoration was proved byte-identical to the HEAD blob (9ffcdb76…), with git diff HEAD and git status --porcelain both 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 package exports resolution.

Gates

Derived union from dispatch-gates.mjs --repo objectstack-ai/objectstack (change set taken from the merge base by the tool itself), run under os-verify-lock.sh with slot issue-12994-h32; exit codes captured before any pipe, verdict lines quoted from each gate's own output.

gate exit verdict
check:pm-half-states 0 ✓ check-half-states self-test: 1551 cases pass.
check:pm-dispatch-gates 0 ✓ dispatch-gates self-test: 834 cases pass.
bare-root-worklist.mjs --self-test 0 OK self-test: 47 live row(s) … none stale, none missing, none contradicted.
check:partof-closing-keyword 0 ✓ check-partof-closing-keyword self-test: 28 cases pass.
check:entry-guard 0 ✓ 175 scripts/ file(s) — every entry guard goes through invoked-as.mjs
check:cross-package-test-inputs 0 OK: 23 package(s) read outside themselves, all declared
check-closing-keyword-parity.mjs 0 OK (3 parsers agree on all 9 keywords …)
check-ci-filter-parity.mjs 0 OK: all 117 declared cross-package glob(s) … covered
check: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.mjs 0 all green
check-governed-merges.mjs --self-test 0 ✓ 206 assertions
ci-failure.mjs --self-test 0 green (it imports this file's transport classifier)

The 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.mjs with no PR_BODY exits 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

  • No predicate changed; no edit outside the self-test specimens. Diff is +24/-6 in one file, entirely inside the H32 block of selfTest().
  • Observed, not widened: the two sweep repo: rows that pin the objectstack leg against DEFAULT_SWEEP_REPO are 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.
  • Observed, unchanged: with a malformed 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 is undefined and no title suffix can equal it. Parity, not a regression, and not something this card's shape can fix without changing the case count.
  • No changeset: scripts/pm/** publishes nothing user-visible. skip-changeset applied at PR-open.
  • Once this lands, objectui's parity pin still carries three name-swap-only divergence entries (h32-lane-own-board, h32-foreign-out-of-scope, h32-foreign-no-fetch). Deleting them is that repo's standard --resync act 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

…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 os-litant added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 28, 2026 — with Claude
@os-litant
os-litant marked this pull request as ready for review August 28, 2026 14:30
@os-litant
os-litant enabled auto-merge August 28, 2026 14:30
@os-litant
os-litant added this pull request to the merge queue Aug 28, 2026
Merged via the queue into main with commit bf10deb Aug 28, 2026
35 checks passed
@os-litant
os-litant deleted the claude/issue-12994-h32-board-independent-specimens branch August 28, 2026 15:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] check-half-states' H32 self-test rows are coupled to the resolved sweep repo, so the file cannot be ported verbatim

2 participants