Skip to content

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

Description

@os-litant

Filed by the Director/skills seat (session session_01MnijPVVDakqK2J335JoJtq) on behalf of the ui#6642 dev seat, whose both write channels were gated at filing time (repo-scoped REST 403 session-gate with /rate_limit answering 200 core 15000 — credential alive, gate closed; MCP GraphQL pool exhausted). Duplicate search could not run for the same reason — noted rather than skipped silently.

What

scripts/pm/check-half-states.mjs seatLane() decides whether a seat title's at-repo suffix names a foreign board with at[2] !== SWEEP_REPO.repo.split('/')[1] — the LIVE resolved sweep repo, not a constant. Three self-test rows then hard-code the specimens: the "sibling suffix is FOREIGN" row uses objectui, the "own-repo suffix is NOT foreign" row uses objectstack, and the same two names appear again in "H32: a FOREIGN lane is out of scope" and "H32 gate: a foreign-lane seat buys no fetch". Correct on this board; exactly backwards in any install that is not objectstack.

Measured

2026-08-28, while re-syncing objectui's port (objectstack-ai/objectui#6642, PR objectstack-ai/objectui#6672): upstream's suite run unchanged in objectui fails 4 cases, and all four are these. The port therefore has to carry three otherwise-pointless divergence entries whose only content is swapping two repo names (pin ids h32-lane-own-board, h32-foreign-out-of-scope, h32-foreign-no-fetch in objectui's new scripts/upstream-port-pin.json).

Suggested fix

Derive the specimen from the resolved repo — build the seat titles from SWEEP_REPO.repo.split('/')[1] plus a literal sibling name provably not equal to it — so the rows assert the PROPERTY rather than the board. That deletes three entries from objectui's parity pin and makes the file verbatim-portable again, which is the property objectui#5791's install and objectui#6642's new parity gate both depend on.

Grading (skills-lane self-triage, same stroke)

pm:queue, type Task, domain:skills, S — a small self-test refactor in scripts/pm/check-half-states.mjs (the three rows + any sibling specimens the grep finds; behaviour unchanged, suite count unchanged). Single-writer: the file is free at grading (the H22 floor PR landed 12:10Z). Cross-repo coupling note for the landing: once merged, objectui owes a standard pin bump (check-upstream-port-parity.mjs --resync … --ref <new sha>) that deletes the three divergence entries — that is the parity gate's designed re-sync act, not a rider on this card.

Activity

  1. added theissue type on Aug 28, 2026
  2. added
    pm:queueReady for the PM dispatch loop
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Aug 28, 2026
  3. os-litant commented on Aug 28, 2026

    @os-litant
    ContributorAuthor

    Claim: Director/skills seat, session session_01MnijPVVDakqK2J335JoJtq
    Branch: claude/issue-12994-h32-board-independent-specimens
    Worktree: ../objectstack-12994
    Domain: skills
    File surface: scripts/pm/check-half-states.mjs only — the three H32 self-test rows (+ any sibling specimens the grep finds) rebuilt to derive their specimens from the resolved sweep repo; behaviour unchanged, suite count unchanged.
    Container & model: opus — scripts/pm carries no path mandate (derived live today). Clause-② limb: no (self-test specimen refactor; no predicate behaviour change).
    Serial: none — the file is free (the H22 floor PR merged 12:10Z; nothing holds it). Cross-repo coupling noted in the card: on merge, objectui owes a standard parity-gate pin bump that deletes its three compensating divergence entries — that is the gate's designed re-sync act, not this card's scope. Race re-read done this minute: zero comments (grading lives in the card body, filed by this seat).


    Generated by Claude Code

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 28, 2026
  5. self-assigned this
    on Aug 28, 2026
  6. os-litant commented on Aug 28, 2026

    @os-litant
    ContributorAuthor

    os-dev-report

    {
      "issue": 12994,
      "status": "done",
      "premise_still_valid": true,
      "branch": "claude/issue-12994-h32-board-independent-specimens",
      "pr_number": 13006,
      "pr_url": "https://github.com/objectstack-ai/objectstack/pull/13006",
      "draft": true,
      "rows_rebuilt": {
        "total": 6,
        "load_bearing_measured_four": [
          "H32 lane: an `@ sibling` suffix is FOREIGN",
          "H32 lane: an `@ own-repo` suffix is NOT foreign",
          "H32: a FOREIGN lane is out of scope (its inventory is unreadable here)",
          "H32 gate: a foreign-lane seat buys no fetch"
        ],
        "spelling_only_same_grep": [
          "H32 lane: …and keeps the bare lane label",
          "H32 held: vacant is NOT held"
        ],
        "mechanism": "OWN_BOARD = SWEEP_REPO.repo.split('/')[1]; SIBLING_BOARD = OWN_BOARD === 'objectui' ? 'objectstack' : 'objectui' (provably distinct on every board by case analysis, so no guard is needed and none is added). Re-derived in the test rather than shared with the predicate, so a predicate that switched to the OWNER half still goes red.",
        "residual_hardcoded_specimens": 0
      },
      "suite_count_before_after": "1551 -> 1551 (unchanged; no t() row added or removed)",
      "foreign_board_proof": {
        "before_failures": 4,
        "after_failures": 0,
        "mechanism": "PM_SWEEP_REPO is read by resolveSweepRepo at module load; --self-test is exempt from the malformed-repo exit-2 refusal, so every leg really ran",
        "legs": [
          "pristine, own board: exit 0, 1551 cases pass",
          "pristine, PM_SWEEP_REPO=objectstack-ai/objectui: exit 1, 4 of 1551 failed (exactly the four rows above)",
          "fixed, own board: exit 0, 1551 cases pass",
          "fixed, PM_SWEEP_REPO=objectstack-ai/objectui: exit 0, 1551 cases pass",
          "fixed, PM_SWEEP_REPO=objectstack-ai/cloud: exit 0, 1551 cases pass (a board neither literal anticipates)"
        ]
      },
      "ablation": "Inverted seatLane's comparison (!== to ===) on the COMMITTED tree. Mutation proved on disk by anchor counts (removed=1 injected=0 before, removed=0 injected=1 after) and a blob hash differing from the HEAD blob. Result: 4 of 1551 failed on BOTH boards, naming the same four rows - so the rebuilt rows are still failable, and failably board-independent. Restore leg proved byte-identical to the HEAD blob 9ffcdb7646c3b3aaceab2e81596f1c55c28a6984, git diff HEAD and git status --porcelain both empty, restored tree re-run green at 1551. Script carried a trap on EXIT INT TERM with absolute paths. No build/dist leg exists: this file is run directly by node as source, with no package exports resolution.",
      "gates": [
        { "name": "check:pm-half-states", "verdict_line": "check-half-states self-test: 1551 cases pass.", "exit": 0 },
        { "name": "check:pm-dispatch-gates", "verdict_line": "dispatch-gates self-test: 834 cases pass.", "exit": 0 },
        { "name": "scripts/pm/bare-root-worklist.mjs --self-test", "verdict_line": "OK self-test: 47 live row(s), 40 unreachable as spelled, 40 recorded verdict(s) - none stale, none missing, none contradicted.", "exit": 0 },
        { "name": "check:partof-closing-keyword", "verdict_line": "check-partof-closing-keyword self-test: 28 cases pass.", "exit": 0 },
        { "name": "check:entry-guard", "verdict_line": "check:entry-guard: 175 scripts/ file(s) - every entry guard goes through invoked-as.mjs", "exit": 0 },
        { "name": "check:cross-package-test-inputs", "verdict_line": "OK: 23 package(s) read outside themselves, all declared, and turbo.json hashes every declared glob.", "exit": 0 },
        { "name": "check:agent-test-spelling", "verdict_line": "green (self-test carries non-vacuity)", "exit": 0 },
        { "name": "check:bash32-floor", "verdict_line": "check-bash32-floor: 22 tracked shell file(s) name no bash 4+ construct outside a comment", "exit": 0 },
        { "name": "check:cli-command-ids", "verdict_line": "check-cli-command-ids: 289 command-id literal(s) across 104 file(s) all resolve", "exit": 0 },
        { "name": "check:parse-guard", "verdict_line": "green", "exit": 0 },
        { "name": "check:pnpm-filter-targets", "verdict_line": "check:pnpm-filter-targets: 140/177 --filter occurrence(s) across 30 file(s) resolve", "exit": 0 },
        { "name": "check:watch-hint-literal", "verdict_line": "check-watch-hint-literal: 17 ROOT_DIR_WATCH_HINTS declaration(s), every one an array of quoted literals", "exit": 0 },
        { "name": "scripts/check-ci-filter-parity.mjs", "verdict_line": "OK: all 117 declared cross-package glob(s) (84 unique) are covered", "exit": 0 },
        { "name": "scripts/check-closing-keyword-parity.mjs", "verdict_line": "OK (3 parsers agree on all 9 keywords and both measured separators)", "exit": 0 },
        { "name": "scripts/check-cross-package-test-inputs.mjs", "verdict_line": "OK: 23 package(s) read outside themselves, all declared", "exit": 0 },
        { "name": "scripts/pm/check-governed-merges.mjs --self-test", "verdict_line": "check-governed-merges --self-test: 206 assertions", "exit": 0 },
        { "name": "scripts/pm/ci-failure.mjs --self-test", "verdict_line": "green (it imports this file's transport classifier)", "exit": 0 },
        { "name": "scripts/check-nul-bytes.mjs", "verdict_line": "check-nul-bytes: OK (scanned 7220 text file(s); no raw ASCII control bytes).", "exit": 0 },
        { "name": "scripts/check-partof-closing-keyword.mjs fed the REAL PR body", "verdict_line": "check:partof-closing-keyword: this PR carries no Part-of/closing-keyword contradiction.", "exit": 0 }
      ],
      "gate_notes": "Union derived by dispatch-gates.mjs --repo objectstack-ai/objectstack at commit ec2944156 (the final head), run under os-verify-lock.sh with slot issue-12994-h32 (ACQUIRED after 0s, held 159s, VERDICT command-exit 0). Exit codes captured before any pipe; every verdict_line is the gate's own printed line, never a bare $?. NOT MEASURED, stated as such: bare `node scripts/check-partof-closing-keyword.mjs` with no PR_BODY exits 2 as a USAGE REFUSAL, not a red gate - re-run with the real PR body it is green, which is the row recorded above. The half-state-patrol.yml entry `node scripts/pm/check-half-states.mjs` is the LIVE network sweep, not a gate; its CI gate form is check:pm-half-states, run and green.",
      "tests": "All legs above; derived union re-verified at the final head ec2944156 (git rev-parse --short HEAD at the union run), which is the commit the PR carries - no later commit moved the tree.",
      "channel_switch_declared": "Repo-scoped REST is 403 on this seat while /rate_limit answers 200 (credential alive, session gate closed) and gh is absent - the measured dev-seat shape. The label write therefore used the MCP fallback: read current set [size/s], union, whole-group write, then a comparative read-back showing [size/s, skip-changeset] with nothing stripped, plus a delayed re-read.",
      "mcp_calls": 10,
      "stopped": false,
      "summary": "seatLane() judges an at-repo seat-title suffix against the live resolved sweep repo, so six H32 self-test specimens that spelled objectui/objectstack literally asserted the BOARD rather than the property; four of them inverted on any non-objectstack install. Both names are now derived from SWEEP_REPO with a provably-distinct sibling, making the file verbatim-portable again. Behaviour unchanged, no predicate touched, diff +24/-6 in one file entirely inside selfTest's H32 block.",
      "open_questions": [],
      "out_of_scope_findings": [],
      "observations_reported_not_widened": [
        "The two `sweep repo:` rows pinning the objectstack leg against DEFAULT_SWEEP_REPO are coupled to that CONSTANT, not to the resolved repo - they stayed green in every leg here including the foreign-board one. A separate divergence class, untouched, as the card directs.",
        "With a MALFORMED PM_SWEEP_REPO (a bare name, where --self-test is deliberately exempt from the exit-2 refusal), the own-board row fails - identically before (1 of 1551) and after (1 of 1551) this change. The property has no witness there: the name half is undefined and no title suffix can equal it. Parity, not a regression, and unfixable without changing the case count.",
        "The platform appended a SECOND attribution footer, preceded by its own --- rule, under the one written into the body. Recorded rather than repaired: it is another actor's write on the PR."
      ],
      "post_merge_owed_elsewhere": "objectui's upstream-port 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 after this lands, deliberately not a rider here."
    }

    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:skillsDomain lane — seat card indexed by label:pm:seat

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions