Repository navigation
Retire the objectstack tooling port — run the PM scripts from objectstack with --repo, keep hooks as plain copies, delete upstream-port-pin.json and check-upstream-port-parity #10208
Description
立卡门类别 ③ — maintainer direct dispatch, through the director seat (summon #26, session_01SPwf6Kmqo1gqzCSWSuMtQM).
Source, three parts: the maintainer · verbatim 「同意,10205 根治(一张 devx 卡,你一字)——退役端口本身」 · in the director seat's chat, 2026-09-22, answering the seat's simplification proposal on objectui#10205 (ruling on that card). Acting reader: the domain:devx @ objectui seat, claiming from pm:queue (pick order: maintainer direct dispatch first). Dedupe: MCP search_issues on this repo, open + closed, terms upstream-port-pin check-upstream-port-parity retire port parity ledger divergence → 10 hits (#10205 #8288 #7263 #6689 #6642 #9303 #7953 #8694 #8385 #8286), all about maintaining the port; none proposes retiring it ⇒ no twin. Write identity: the seat's REST token (claude[bot] class is account-side, per objectstack#12708 5769912882).
What is retired
scripts/upstream-port-pin.json (13 entries on origin/main 0cf2d6644bdb), scripts/check-upstream-port-parity.mjs with its --resync, its self-test, its package.json script entry and its workflow step, and the declared-divergence ledger discipline (~123 divergence entries today). Reason, the maintainer's: this is bookkeeping about bookkeeping; the parts go, not the header.
Three classes, three treatments — re-derive the list at your head; the 13 below are the director seat's reading
| ported file | class | treatment |
|---|---|---|
scripts/pm/check-half-states.mjs |
PM script | delete; the objectui seats run objectstack's original from an objectstack checkout with PM_SWEEP_REPO=objectstack-ai/objectui (it already takes the board from that variable) |
scripts/pm/board-snapshot.mjs |
PM script | delete; run objectstack's with --repo objectstack-ai/objectui |
scripts/invoked-as.mjs |
helper | delete if only the two above import it; otherwise keep as a plain copy with the header line |
scripts/check-bash32-floor.mjs |
gate | measure whether objectui has bash scripts it guards; if none, delete; else keep as a plain copy with the header line |
.claude/hooks/guard-main-checkout.sh + .selftest.sh · guard-main-checkout-bash.sh + .selftest.sh · guard-shared-stash.sh + .selftest.sh · guard-tree-enum.sh + .selftest.sh |
harness hooks (must live in this repo's .claude/) |
keep as plain copies; ONE header line copied from objectstack@<sha>; no divergence ledger, no parity check |
.github/workflows/board-snapshot.yml |
workflow | plain copy with the header line, or a step that checks out objectstack and runs its script with --repo |
The two objectui-only switches carried as divergences today (closedWindowDisabled, PM_SWEEP_CLOSED_WINDOW_PAGES) are dropped, ⛔ not upstreamed (ruled on objectui#10205): on origin/main 0cf2d6644bdb PM_SWEEP_CLOSED_WINDOW_PAGES survives only in commented-out lines of .github/workflows/half-state-patrol.yml (escape hatch expired 2026-08-28) and in scripts/__tests__/check-half-states.test.ts; closedWindowDisabled only in that test file. Delete scripts/__tests__/check-half-states.test.ts with the port; re-derive the reading at your head and report a live consumer if one appears, ⛔ do not re-open the question.
Acceptance
git grep -l upstream-port-pin→ 0 outside CHANGELOG; the parity gate is gone frompackage.jsonscripts and every workflow; CI green.- The objectui seats' patrol invocations are documented on the seat post / lane file as objectstack-checkout commands with
--repo. - Every kept copy carries the
copied from objectstack@<sha>header line. - ⛔ No new gate, no new ledger, no
--resyncreplacement. Hook drift is found by hand; that cost is accepted by the maintainer's word above.
Not in scope
Any change to objectstack's scripts. .claude/** is a governed surface: Tier H, the maintainer merges.
Dedupe: upstream-port-pin · check-upstream-port-parity · retire objectui tooling port · proxy-rearm-plan · copied from objectstack@
Generated by Claude Code
Activity
objectstack-fleet commentedon Sep 25, 2026
Claim: maintainer direct dispatch. Execute this card, retiring the objectstack tooling port. The resulting PR supersedes PR #9391.
Session:
session_013RDBh5DqXd2xnLwvHLgLFrSeat: domain:spec#1 (objectstack seat post #6017), acting on the maintainer's direct instruction outside its lane
Branch:
claude/issue-10208-retire-tooling-port(new; no PR exists for this card)Files: the port as this card lists it, re-derived at the dev's head:
scripts/upstream-port-pin.jsonandscripts/check-upstream-port-parity.mjs, plus its self-test, its wiring test, itspackage.jsonentry and its workflow stepscripts/pm/check-half-states.mjsandscripts/pm/board-snapshot.mjs, plusscripts/__tests__/check-half-states.test.tsscripts/invoked-as.mjsandscripts/check-bash32-floor.mjs(measure first).claude/hooks/guard-*copies (header line only).github/workflows/board-snapshot.ymlandhalf-state-patrol.ymlAuthority. This comes from the maintainer in this seat's live PM chat at 2026-09-25T02:05Z. The seat asked how PR #9391 should land, since its only file is one this card deletes, and put three routes to the maintainer: 甲 do this card and close #9391 as superseded, 乙 register #9391's hunks as port divergences, 丙 re-sync the port. The maintainer answered, verbatim: 「甲」. That followed the earlier instruction 「9391 9488 你负责跟进到合并」.
The H26 wording. #9391 exists to correct H26's 「永远无法关闭」 wording. That wording is already corrected at the producer, objectstack's
scripts/pm/check-half-states.mjs(objectstack#18017, as recorded on objectui#93175806488015). Once this card deletes the objectui copy, the objectui seats run that corrected original withPM_SWEEP_REPO=objectstack-ai/objectui. PR #9391 is closed as superseded when this card's PR merges, and ⛔ not before.Governed.
.claude/hooks/**is a governed surface:check-governed-queue-guard.mjs --testanswers GOVERNED. The PR therefore stays draft until an APPROVED review byos-zhuangorhotlongis on it, and this seat lands it after that. ⛔ No seat approves it.objectstack-fleet commentedon Sep 25, 2026
os-dev-report
{
"issue": 10208,
"status": "done",
"branch": "claude/issue-10208-retire-tooling-port",
"pr": "#10458",
"session": "session_013RDBh5DqXd2xnLwvHLgLFr",
"premise_still_valid": true,
"summary": "Retired the port at head ed66f10 (base ca5d671). Deleted: upstream-port-pin.json, check-upstream-port-parity.mjs (with --self-test and --resync), its wiring test, its package.json entry and lint.yml step, scripts/pm/check-half-states.mjs, scripts/pm/board-snapshot.mjs and check-half-states.test.ts. half-state-patrol.yml and board-snapshot.yml were rewired under treatment (a): they check out objectstack-ai/objectstack (sparse scripts/pm, persist-credentials false, not pinned to a sha) and run its scripts with PM_SWEEP_REPO, and the patrol also sets PM_SWEEP_CHECKOUT=github.workspace. Measured on objectstack origin/main 5b9402d89b: NEITHER objectstack script accepts --repo. Both refuse it by name (check-half-states: exit 2, "unknown option --repo"; board-snapshot parseOptions: "unknown option --repo=…"). So the mechanism, and the documented seat command, is the PM_SWEEP_REPO variable, while the mandated PR title still says --repo. Kept as plain copies with ONE line-2 header copied from objectstack@SHA: the 8 .claude/hooks guard files, scripts/invoked-as.mjs (imported by 92 files) and scripts/check-bash32-floor.mjs (guards 13 tracked shell files). No copy matches any single objectstack commit exactly (0 exact blob matches across every upstream commit that touched each path), so each header names its last-sync sha, the retired pin ref, whose upstreamSha256 re-verified 13/13. Forced follow-ons: the check-governed-queue-guard self-test read the deleted sweeper to pin its CONTRACT_REVIEW_LABEL mirror (the base guard with the file removed gives FAIL 2 of 191), so that pin and the H31 no-top-level-await pin were removed and the no-import-out-of-scripts/pm pin was kept (190 to 188 cases). The ci-cd-pipeline-doc test no longer reads the sweeper and pins that the page names upstream CLOSED_ISSUE_WINDOW_DAYS (upstream has no CLOSED_ISSUE_WINDOW_PAGES); two stale phantom declarations were dropped. The docs and the dependabot-merge-gate reason strings were corrected, and the seat patrol command is documented in ci-cd-pipeline.md. The assignee was already set (os-support-ai) and was not written by me.",
"tests": "All at head ed66f10. (1) pnpm exec vitest run scripts/ --maxWorkers=4, run through os-verify-lock: "Test Files 177 passed | 2 skipped (179)", "Tests 5263 passed | 2 skipped (5265)", VERDICT command-exit 0 (the 2 skipped files are the suite own skip-marked network/timezone tests). (2) pnpm type-check:scripts: exit 0. (3) eslint --no-inline-config --format json on the 6 touched scripts/tests: files=6 errors=0 warnings=0 ignored=0. Population from eslint print-config: the .ts test resolves 118 rules and the five .mjs files resolve 0 rules; parserOptions.project and projectService are unset, so linting is not type-aware and the diff cannot move an untouched file verdict; full pnpm lint is left to CI. (4) Hook self-tests: guard-main-checkout-bash 130, guard-main-checkout 120, guard-shared-stash 50, guard-tree-enum 38 passed, 0 failed, identical to base. (5) Gates, each exit 0 with its own verdict line: check-lint-coverage; check-entry-guard (--self-test 63 cases; scan 105 files); check-bash32-floor (--self-test 160; 13 files); invoked-as --self-test 12; check-governed-queue-guard --self-test 188; check-pre-install-import-graph; check-new-cross-file-line-citations (0 new); check-control-bytes; check-action-ref-convention; check-changeset-presence ("25 file(s) changed, 0 of them published source"; no changeset owed); check-changeset-overwrite; check-changeset-no-major; check-test-path-roots; check-vi-mock-override-shape; check-cross-repo-closer-outcome, both legs; check-required-check-set --self-test; check-shell-escape-residue; check-doc-links; check-comment-mask-corpus (1 disagree, within objectui#7882 residue). check-governed-queue-guard --test on the 25 paths: GOVERNED, 8 of 25 (.claude/hooks), exit 3. (6) Workflows: actionlint is NOT installed (NOT MEASURED: actionlint, reason: absent in container). A strict yaml parse (uniqueKeys) of half-state-patrol.yml, board-snapshot.yml and lint.yml passes, and every referenced scripts/ path exists (the objectstack-tooling paths were checked against a cone-mode sparse emulation of objectstack origin/main). (7) objectstack originals from that emulation, run with cwd = this worktree: board-snapshot --self-test passes 156 cases (also with GITHUB_REPOSITORY=objectstack-ai/objectui); refuseUnknownArgs of the workflow argv returns null; parseOptions accepts both SNAPSHOT_ARGS spellings; checkoutPrerequisite with this repo origin returns null and, as a control, with the objectstack origin returns checkout-does-not-serve. (8) Deletion proof for the guard change, on the base tree in a scratch worktree with scripts/pm/check-half-states.mjs removed: "FAIL check-governed-queue-guard self-test: 2 of 191 case(s) failed", then restored with git checkout HEAD and git diff HEAD empty. Acceptance readings: git grep -l upstream-port-pin outside CHANGELOG and .changeset gives 0 (control, same form at base: 9; same form with the term copied from objectstack@: 11). Raw, without the .changeset exclusion, it gives 3, all pending empty-frontmatter .changeset records of merged PRs, treated as CHANGELOG-class. package.json and workflows naming the parity gate: 0 (control check-bash32-floor.mjs in workflows: 1). The header line is on line 2 of all 10 kept copies. Files added: 0; deleted: 6. The dropped switches have no live consumer: 4 prose lines only, no workflow env key sets them, and objectstack has 0 hits (control PM_SWEEP_CLOSED_FLOOR: 17). Live sweep and live snapshot: NOT MEASURED locally (both read the whole board); this PR pull_request legs run both. CI at report time: in_progress (44 check runs: 9 success, 3 skipped, 32 in progress).",
"mcp_calls": "0",
"api_writes": "5. git push x2 (via write-pace; new branch at cede092, then ed66f10). POST /repos/objectstack-ai/objectui/pulls x2: the first was REFUSED 415 (no Content-Type header, nothing created); the retry returned 201 and created draft #10458. POST /repos//issues/10208/comments x1 (this os-dev-report, via post-stamped.mjs). Labels: 0, as the dispatch forbids them. The only write beyond the four-write budget is the refused 415 attempt.",
"open_questions": [
{
"question": "Should the objectstack checkout in half-state-patrol.yml and board-snapshot.yml be pinned to a sha?",
"options": [
"A: leave it unpinned, running objectstack main each run (as written)",
"B: add ref: SHA and bump it by hand"
],
"recommendation": "A. The ruling retired exactly this kind of hand-bumped bookkeeping; both jobs are report or backup only, and a sweep or snapshot that cannot run still goes red. The cost of A (no reviewed moment in objectui) is stated in both workflow headers."
},
{
"question": "The mandated PR title says PM scripts run from objectstack with --repo. Neither objectstack script accepts --repo; both refuse it by name, and both take PM_SWEEP_REPO. Retitle?",
"options": [
"A: the seat retitles to say PM_SWEEP_REPO",
"B: keep the title; the body states the mechanism"
],
"recommendation": "A. The title is what a reader of git log sees after the squash, and it names a flag that is refused. The body already carries the measured refusal."
},
{
"question": "git grep -l upstream-port-pin outside CHANGELOG reads 3, not 0, because three pending .changeset/*.md records of merged PRs (8385, 8696, 9206) mention the pin. Treat them as CHANGELOG-class?",
"options": [
"A: yes, leave them (as done)",
"B: edit them"
],
"recommendation": "A. They are empty-frontmatter release declarations owned by merged PRs; check-changeset-overwrite reports exactly that edit, and the next changeset version consumes them."
}
],
"out_of_scope_findings": [
"class: a · objectstack scripts/pm/check-half-states.mjs --self-test at origin/main 5b9402d89b fails 3 of 4912 cases when PM_SWEEP_REPO=objectstack-ai/objectui (H38 seat: a numbered seat on a SIBLING board is still foreign; H38 verdict: on the OLD window the post reads STALE; seat marker window: held own-board seat is a subset of H44 leg). With the default repo, 4912 pass. This is reachable today by a seat running the documented objectui env. The retired port carried this install-dependent class as three divergences marked upstream to remove. The fix lands in objectstack. Dedupe words: seatLane sibling board self-test · H38 seat foreign PM_SWEEP_REPO · install-dependent specimens · check-half-states self-test objectui",
"carrier: none (承接者:无) · objectstack retired the needs:contract-review label and H31/H35 (objectstack 628e55dfa6, #19737), while objectui check-governed-queue-guard.mjs still carries its contract-review merge_group leg keyed on that label (objectui#9018). Noted in the PR Acceptance notes, not filed.",
"carrier: none (承接者:无) · performance-budget.yml (two identical comment blocks) and render-budget-comment.test.ts cite half-state-patrol.yml listing its script AND scripts/invoked-as.mjs as the measured convention; after this PR the patrol lists only itself. These are unpublished comments, noted in the PR Acceptance notes and not filed."
],
"deviations_and_conflicts": [
"Dispatch said --repo for both scripts; measured: neither accepts it. PM_SWEEP_REPO is used and documented.",
"PR-create channel: objectui AGENTS.md names none for agents. I used REST POST /pulls wrapped in write-pace per the os-dev contract.",
"Commit trailers are model-free (Co-Authored-By: Claude plus Claude-Session) and the PR footer is the session-URL form, per the os-dev contract; the harness reminder named a model-bearing trailer and a different footer line.",
"The os-dev contract requires a 维护者速读(草稿) section for a governed rule-layer PR; it is included with 席位意见 left empty."
]
}
Generated by Claude Code
objectstack-fleet commentedon Sep 25, 2026
Round accepted: PR #10458 (draft, GOVERNED) now waits on CI and an authorized approval
domain:specexecution seat 1 (session_013RDBh5DqXd2xnLwvHLgLFr), 2026-09-25T02:50Z. This is the claim holder's seat read of theos-dev-reporton this card, checked against GitHub.What the PR does, at head
ed66f10557:upstream-port-pin.json,check-upstream-port-parity.mjs, its wiring test,scripts/pm/check-half-states.mjs,scripts/pm/board-snapshot.mjsandcheck-half-states.test.ts.half-state-patrol.ymlandboard-snapshot.ymlnow check outobjectstack-ai/objectstack(sparsescripts/pm) and run ITS scripts withPM_SWEEP_REPO: ${{ github.repository }}. The patrol runs the sweep; it does not run--self-test..claude/hooksfiles,invoked-as.mjsandcheck-bash32-floor.mjseach gain one line-2 header,copied from objectstack@….check-governed-queue-guard.mjs --testanswers GOVERNED: 8 of the 25 paths are.claude/hooks/**.CI. The checks that exercise the new wiring are green:
Snapshot the board to the archive branch, which ran objectstack's archiver self-test on a real runnerHook Self-TestsGoverned Surface Queue Guard, whose PR leg exits 0 by designThe rest is still running at this reading.
The dev's three open questions, answered by the seat:
upstream-port-pindivergence ADD upstream code that postdates the pin, rather than ADAPT pinned code? objectui#9387 made one real and the gate's header does not describe it #10205 retired, and both jobs only report or back up.--repo, but both objectstack scripts refuse--repoby name. A: the seat retitled the PR to sayPM_SWEEP_REPO..changesetrecords of merged PRs mention the pin. A: they stay. They are CHANGELOG-class, and the next version run consumes them.The seat also filled in the body's 「席位意见」. The body was read back with one footer,
Fixes #10208still leads it, and the PR is still a draft.Noted, not filed:
check-half-states.mjs --self-testfails 3 of 4,912 cases underPM_SWEEP_REPO=objectstack-ai/objectui(the H38 seat specimens). Nothing in CI runs that combination: the patrol runs the sweep, and the archiver self-test is a different script. This is the install-dependent specimen class that the retired port carried as divergences.Next:
os-zhuangorhotlongleaves an APPROVED review. ⛔ No seat approves it.5825494907).objectstack-fleet commentedon Sep 25, 2026
Landed — PR #10458 →
b274b61030onorigin/main, verified by contentdomain:specexecution seat 1 (session_013RDBh5DqXd2xnLwvHLgLFr), 2026-09-25T04:54Z. The seat took this card on the maintainer's direct instruction 「甲」 (claim5825488668).Path.
.claude/hooks/**). os-zhuang left an APPROVED review,5313443257, on headed66f10557at 2026-09-25T04:38Z, and then marked the PR ready and added it to the merge queue.b274b610301519b68f94a6e63e31f3f90cdc24c6, parent2a943bf0c1.Live half-state sweep: objectstack'scheck-half-states.mjswithPM_SWEEP_REPO=objectstack-ai/objectuiexited 0 after a full board read.Snapshot the board to the archive branch: objectstack'sboard-snapshot.mjs --self-testand a capped dry run passed on a real runner.Re-measured on
origin/main, parent against squash:scripts/upstream-port-pin.jsonexistsscripts/check-upstream-port-parity.mjsexistsscripts/pm/check-half-states.mjsexists (the ported copy)scripts/pm/board-snapshot.mjsexists (the ported copy)scripts/__tests__/check-half-states.test.tsexists /upstream-port-parity-wiring.test.tsexistspackage.jsonmentionsupstream-port-parity.github/workflows/lint.ymlmentionsupstream-port-parityhalf-state-patrol.ymlchecks outrepository: objectstack-ai/objectstackboard-snapshot.ymlchecks outrepository: objectstack-ai/objectstack.claude/hooksfiles carryingcopied from objectstack@git grep -l upstream-port-pin, excluding CHANGELOG and.changeset(acceptance)invoked-as.mjs,check-bash32-floor.mjsandguard-shared-stash.shexist (dark control)board-snapshot.yml's R2 prefixobjectui/board/, this board's own archive key (dark control)--resyncreplacement.Superseded. PR #9391 was closed as superseded (
5825494907). The H26 wording it corrected lives in objectstack's original, which this board now runs.Card state.
pm:dispatchedis removed and the assignee is cleared (relay run36096327123; read back as 2 labels and 0 assignees). GitHub closed the card ascompletedthroughFixes #10208.chore(tooling): retire the objectstack tooling port — PM scripts run …