Skip to content

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

Closed

Description

@os-support-ai

立卡门类别 ③ — 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 from package.json scripts 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 --resync replacement. 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

  1. added
    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
    on Sep 22, 2026
  2. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    Claim: maintainer direct dispatch. Execute this card, retiring the objectstack tooling port. The resulting PR supersedes PR #9391.
    Session: session_013RDBh5DqXd2xnLwvHLgLFr
    Seat: 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.json and scripts/check-upstream-port-parity.mjs, plus its self-test, its wiring test, its package.json entry and its workflow step
    • the ported PM scripts scripts/pm/check-half-states.mjs and scripts/pm/board-snapshot.mjs, plus scripts/__tests__/check-half-states.test.ts
    • scripts/invoked-as.mjs and scripts/check-bash32-floor.mjs (measure first)
    • the .claude/hooks/guard-* copies (header line only)
    • .github/workflows/board-snapshot.yml and half-state-patrol.yml

    Authority. 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#9317 5806488015). Once this card deletes the objectui copy, the objectui seats run that corrected original with PM_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 --test answers GOVERNED. The PR therefore stays draft until an APPROVED review by os-zhuang or hotlong is on it, and this seat lands it after that. ⛔ No seat approves it.

  3. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    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

  4. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    Round accepted: PR #10458 (draft, GOVERNED) now waits on CI and an authorized approval

    domain:spec execution seat 1 (session_013RDBh5DqXd2xnLwvHLgLFr), 2026-09-25T02:50Z. This is the claim holder's seat read of the os-dev-report on this card, checked against GitHub.

    What the PR does, at head ed66f10557:

    • 25 files, +245/−18,881. Six files are removed: upstream-port-pin.json, check-upstream-port-parity.mjs, its wiring test, 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 now check out objectstack-ai/objectstack (sparse scripts/pm) and run ITS scripts with PM_SWEEP_REPO: ${{ github.repository }}. The patrol runs the sweep; it does not run --self-test.
    • The 8 .claude/hooks files, invoked-as.mjs and check-bash32-floor.mjs each gain one line-2 header, copied from objectstack@….
    • check-governed-queue-guard.mjs --test answers 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 runner
    • Hook Self-Tests
    • Governed Surface Queue Guard, whose PR leg exits 0 by design

    The rest is still running at this reading.

    The dev's three open questions, answered by the seat:

    1. Pin the objectstack checkout to a sha? A: it stays unpinned. A hand-bumped sha is exactly the bookkeeping the ruling on [decision-shaped] may an upstream-port-pin divergence 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.
    2. The title said --repo, but both objectstack scripts refuse --repo by name. A: the seat retitled the PR to say PM_SWEEP_REPO.
    3. Three pending .changeset records 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 #10208 still leads it, and the PR is still a draft.

    Noted, not filed:

    • objectstack's check-half-states.mjs --self-test fails 3 of 4,912 cases under PM_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.
    • The other two out-of-scope readings are in the PR's Acceptance notes.

    Next:

  5. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    Landed — PR #10458 → b274b61030 on origin/main, verified by content

    domain:spec execution seat 1 (session_013RDBh5DqXd2xnLwvHLgLFr), 2026-09-25T04:54Z. The seat took this card on the maintainer's direct instruction 「甲」 (claim 5825488668).

    Path.

    • Governed. The PR is GOVERNED (.claude/hooks/**). os-zhuang left an APPROVED review, 5313443257, on head ed66f10557 at 2026-09-25T04:38Z, and then marked the PR ready and added it to the merge queue.
    • Merge. It merged at 2026-09-25T04:53Z as squash b274b610301519b68f94a6e63e31f3f90cdc24c6, parent 2a943bf0c1.
    • CI on the head before the queue. 42 success, 3 skipped, 0 failure.
      • Before the merge, the PR's own legs ran objectstack's originals against this board.
      • Live half-state sweep: objectstack's check-half-states.mjs with PM_SWEEP_REPO=objectstack-ai/objectui exited 0 after a full board read.
      • Snapshot the board to the archive branch: objectstack's board-snapshot.mjs --self-test and a capped dry run passed on a real runner.

    Re-measured on origin/main, parent against squash:

    reading parent squash
    scripts/upstream-port-pin.json exists 1 0
    scripts/check-upstream-port-parity.mjs exists 1 0
    scripts/pm/check-half-states.mjs exists (the ported copy) 1 0
    scripts/pm/board-snapshot.mjs exists (the ported copy) 1 0
    scripts/__tests__/check-half-states.test.ts exists / upstream-port-parity-wiring.test.ts exists 1 / 1 0 / 0
    package.json mentions upstream-port-parity 1 0
    .github/workflows/lint.yml mentions upstream-port-parity 3 0
    half-state-patrol.yml checks out repository: objectstack-ai/objectstack 0 1
    board-snapshot.yml checks out repository: objectstack-ai/objectstack 0 1
    .claude/hooks files carrying copied from objectstack@ 0 8
    git grep -l upstream-port-pin, excluding CHANGELOG and .changeset (acceptance) 9 0
    kept copies invoked-as.mjs, check-bash32-floor.mjs and guard-shared-stash.sh exist (dark control) 1 1
    board-snapshot.yml's R2 prefix objectui/board/, this board's own archive key (dark control) 3 3
    • For the acceptance row, the control is the same query on the parent, which reads 9.
    • ⛔ No new gate, no new ledger, and no --resync replacement.

    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:dispatched is removed and the assignee is cleared (relay run 36096327123; read back as 2 labels and 0 assignees). GitHub closed the card as completed through Fixes #10208.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repotooling

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions