Skip to content

tooling(ui-wiring): objectstack-side inert wiring for the ui/ workspace — workspace globs, root turbo tasks, path-filtered ui test/typecheck/lint/E2E jobs, spec change compiles the Console; pin gates retire at cutover (parent #25677, 3/6) #25697

Open

Description

@objectstack-fleet

Filing gate ④: sub-issue 3/6 of the epic #25677 (pm:epic; epic PM session_01RSDL3SFtJaKzcymvCD8RsU). Part of #25677. ⛔ Not a claim.

Blocked-by: none for PR A — nothing in it needs a change from #25685, everything it adds is inert while ui/ is absent, and it is verified against a throwaway import (below). PR B is drafted here but merges only in the cutover window (sub-issue 5), right after the subtree PR.

Who does it, where it lands: the epic PM dispatches it (os-dev, objectstack checkout). Two PRs to objectstack-ai/objectstack main. Both touch .github/workflows/**, so both are Tier H: draft until CI is green, the maintainer approves and merges, the seat never enqueues them. Why two PRs: PR A can land weeks before cutover and is exercised on every PR without effect; PR B deletes the two-repo pin gates and is only correct from the moment ui/ exists, so it is drafted now and merged in the freeze window.

维护者速读

子卡 1 的 spike 证明,ui/ 接进来后 objectstack 这边要做的只有三类事:pnpm workspace 认得 ui/ 下的包、根 turbo.json 认得 objectui 的任务名、CI 给 ui 开按 ui/** 路径过滤的测试/类型检查/lint/Playwright 作业,并在 spec 改动的 PR 里直接编译 Console(这正是今天 Spec Shape Gate 每小时对着 clone 做 13 分钟的事,合并后同一次 CI 顺手做掉)。这些都能在 ui/ 还不存在时先落 main:目录不在,通配匹配不到任何包,新作业全部跳过。切换日再合第二个 PR:删 Spec Shape Gate、Console Pin Gate、prerelease-pin-watch 和 .objectui-sha 过滤。两个 PR 都碰 .github/workflows/**,按 Tier H 由维护者批准、人工合并。

Scope

PR A — inert wiring, lands before cutover

  1. Workspace. pnpm-workspace.yaml adds ui, ui/packages/*, ui/apps/*, ui/examples/* to packages: and the union of objectui's onlyBuiltDependencies. Verified 2026-10-24: pnpm 10.28 accepts globs that match nothing — pnpm install and pnpm -r ls are unchanged. NOT moved here: objectui's pnpm.overrides (security floors for qs, shell-quote, tmp, uuid, the react 19.3.0 line) and the @radix-ui/react-focus-scope@1.1.16 patch — an unused patchedDependencies entry fails install and an override rewrites today's lockfile. Those travel with the subtree in sub-issue 5; the spike's ec74d9ecfa / 4f3149d015 on claude/project-thread-dwhq6r are the recipe.
  2. Root turbo. turbo.json absorbs the four task names objectui's packages use and the root lacks — type-check, lint, test:dist, test:watch — with the inputs/outputs/dependsOn objectui's turbo.json declares for them (read it at ui/turbo.objectui.json on the spike branch; the spike parked it because turbo 2.11 rejects a nested turbo.json without extends, finding 7). Its globalDependencies (.objectstack-sha, the shape-gate stamp, the stamp cache) are pin plumbing and are not ported. A task defined for a script no objectstack package has is inert; the dev proves turbo run build --dry=json on main lists the same tasks before and after.
  3. CI jobs for ui/**. In ci.yml: a ui output on the filter job (ui/**), and jobs Test UI (n/N) (objectui's vitest projects partitioned by package, N chosen from measured timings the way scripts/partition-test-shards.mjs does for core — objectui runs 16 shards today), Type Check UI, Lint UI (or in lint.yml, wherever the existing split puts it) and Build & E2E UI (Console build + Playwright, objectui ci.yml's Build & E2E job ported; Node heap per tooling(objectui-readiness): make the objectui tree merge-ready in its own repo before cutover — one react line, one zod range, uiRoot() helper, tsc heap, workspace-aware Console chunk tests, typecheck alias (parent #25677, 2/6) #25685 item 4). Every new job is guarded by BOTH the filter output AND hashFiles('ui/package.json') != '', because the filter's "everything changed" fallback on push (|| 'true', THE FILTER CONTRACT filter job 一旦失败,Test Core / Build Core / Dogfood 会全部 skipped 而分支保护判为通过 —— 隐式 success() 今天已第三次咬人 #4928) would otherwise start them on a tree without ui/. None joins the required set until cutover (the ruleset is the maintainer's, sub-issue 5); required-set-patrol and check:shard-attestation must keep passing with the new jobs skipped.
  4. A spec change compiles the Console. Type Check UI also runs when any of the seven packages objectui installs changes (packages/spec, client, core, formula, lint, sdui-parser, types), so the compile Spec Shape Gate does hourly against a clone of objectui main happens in the PR that moves the shape, naming the ui/ file. The dev reports the measured cold and turbo-warm minutes against today's ~13 min hourly gate.
  5. Roster audit. A table over objectui's 28 workflows — "ported in PR A / already covered by an objectstack workflow / dropped", one line each — posted on this card. Correctness gates (ci, lint, live-e2e, performance-budget, published-dist-gate, node-esm-load-gate, shadcn-check, lockfile-dedupe, lockfile-integrity, spec-range-floors) are decided and, where kept, ported in this card; governance workflows (changeset-*, governed-surface-guard, half-state-patrol, merge-queue-head-patrol, required-check-set-patrol, board-snapshot, labeler, line-citation-gate, hook-selftests, repo-gates, test-shard-timings-refresh, cross-repo-issue-closer, dependabot-auto-merge, docs-deploy, check-links, changelog) go to sub-issue 4 with the table as its input.

PR B — retire the two-repo pin gates, drafted now, merged in the cutover window after the subtree PR

  1. Delete .github/workflows/spec-shape-gate.yml with scripts/ci/spec-shape-gate.mjs and scripts/ci/spec-shape-retirements.json; delete the console-pin job (Console Pin Gate) and the console entries of the filter job; delete .github/workflows/prerelease-pin-watch.yml; drop Spec Shape Gate from RELEASE_GATE_WORKFLOWS in scripts/ci/scheduled-full-run.mjs and from any release.yml / cut-rc.yml read of it. The scripts those jobs call (build-console.sh, check-console-sha.mjs, check-console-injection.mjs, console-spec-probes.mjs, assert-console-spec-injection.mjs) stay until sub-issue 4 removes them with the pin field and the packages/console build switch; PR B only stops the workflows from being the thing that proves the pin.

Verification (the dev's, before each PR leaves draft)

Done when

  • PR A merged on main (maintainer, Tier H) with the two runs linked here and the roster table posted.
  • PR B open as draft, green on the throwaway branch, marked Blocked-by: sub-issue 5 in its body and handed to the cutover card.
  • Spec Shape Gate's hourly run is unchanged until PR B merges — this card never weakens a gate before its replacement has run green.

Size: L (PR A is the bulk: ~5 jobs ported with their caches and shard plumbing). Clause-②: no. Metadata-protocol: none.

风险

  • CI minutes: Build & E2E UI and Type Check UI add the Console build to spec-touching PRs; the spike measured Console 2 m 01 s warm, 7 m 31 s with 72 deps cold. If the warm number does not hold under turbo remote cache, the dev reports it here before PR A leaves draft and the PM decides between path-narrowing and a nightly tier.
  • Required set drift: a skipped job that a later PR accidentally lists as required blocks every PR until cutover; required-set-patrol covers the ruleset side, the dev adds the new job names to its expectations only as "optional until cutover".

Dedupe

search_issues 2026-10-24 17:30Z, objectstack 「ui workspace CI shards Playwright path filter objectui monorepo wiring」 7 hits: this epic's own #25677 / #25678 / #25685; closed #24306, #23720, #22429 (build-console and pin bumps, the mechanism this card retires); #17250 (closed decision on where pure-objectui cards live). No card wires ui/ into this repo's CI. New.

Activity

  1. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: epic #25677 round 3
    Session: session_01RSDL3SFtJaKzcymvCD8RsU
    Account: os-tesla
    Branch: claude/project-thread-dwhq6r-25697 for PR A and PR B (objectstack-ai/objectstack; mode:thread — the thread's designated branch claude/project-thread-dwhq6r carries the #25678 spike import that this card's PRs must not contain, so a second branch is requested from the maintainer at 17:35Z; until it is granted the work stays in a local worktree off origin/main and nothing is pushed). The throwaway verification run uses claude/project-thread-dwhq6r-25697-verify, closed after the run.
    Worktree: objectstack-issue-25697 (fresh from origin/main; the spike checkout is read, never built on)
    Domain: domain:devx
    Seat: epic:#25677
    File surface: pnpm-workspace.yaml (packages globs, onlyBuiltDependencies only — no overrides, no patches), turbo.json (four task names), .github/workflows/ci.yml and lint.yml (new ui filter output and ui jobs; PR B deletes console-pin and spec-shape-gate.yml, prerelease-pin-watch.yml), scripts/ci/scheduled-full-run.mjs (PR B: RELEASE_GATE_WORKFLOWS), scripts/ci/spec-shape-gate.mjs + scripts/ci/spec-shape-retirements.json (PR B: deleted), the workflow self-tests under scripts/__tests__/ and scripts/ci/__tests__/ that pin job rosters; no AGENTS.md, no docs/adr/**, no .changeset/config.json, no release.yml
    Container & model: L, mode:subagent, model: opus (default; dispatch-gates --tier --repo objectstack-ai/objectstack is run by the dev on its own paths before the PR — .github/workflows/** is Tier H, so both PRs stay draft until the maintainer approves and merges; the seat never enqueues them), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: none
    Serial constraints cleared: objectstack open PRs on 2026-10-24 17:30Z — no open PR of this epic touches ci.yml, turbo.json or pnpm-workspace.yaml; other open PRs on .github/workflows/** are serialized by the Governed Surface Queue Guard at enqueue, and the dev re-reads the open set on those three files before PR A leaves draft and rebases on anything that merged first. PR B is held (Blocked-by: sub-issue 5) and lands in the cutover window after the subtree PR.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Item 5 — objectui workflow roster audit

    Input: the 28 files in ui/.github/workflows/ on the #25678 spike branch (objectui main at 0984c77e1).
    Dispositions: ported in PR A · covered by objectstack workflow X · dropped · kept, follow-up port (a correctness gate this card keeps but PR A does not carry; ported once the throwaway import run can exercise it) · → sub-issue 4 (governance, with this table as its input).

    # objectui workflow Jobs (check names) Kind Disposition Notes
    1 board-snapshot.yml Snapshot the board to the archive branch governance → sub-issue 4 objectstack has its own board-snapshot.yml; decide whether one board archive covers both.
    2 changelog.yml changelog governance → sub-issue 4
    3 changeset-guard.yml Changeset Bump Policy · Changeset Overwrite Report governance → sub-issue 4 Goes with the changeset fixed-group merge.
    4 changeset-presence.yml Changeset Declaration · Changeset Claim Re-read governance → sub-issue 4 objectstack's pr-automation.yml Check Changeset is the root counterpart.
    5 changeset-release.yml Decide lane · Changeset Release governance → sub-issue 4 objectstack release.yml publishes; one release lane after the merge.
    6 check-links.yml check-links governance → sub-issue 4 objectstack check-links.yml (lychee) exists; widen it to ui/ or keep objectui's.
    7 ci.yml Type Check correctness ported in PR A → Type Check UI Pin plumbing removed; affected scope via turbo ...[base]; also runs on the seven consumed packages/* (item 4).
    7 ci.yml Test (shard n/16) correctness ported in PR A → Test UI (n/16) N = 16 kept (see the comment above the job). Full suite on every event; objectui's affected-test selector waits for sub-issue 2's uiRoot(). Timings reporter and upload wait for the refresh workflow (row 28).
    7 ci.yml Build & E2E correctness ported in PR A → Build & E2E UI Console vite build and Playwright chromium; Node heap 4 GB; also runs on the seven consumed packages/*.
    7 ci.yml Changeset Fixed Group Check governance → sub-issue 4 Fixed-group shape changes when the changeset groups merge.
    7 ci.yml Test (dist pins) correctness kept, follow-up port Runs pnpm test:dist (turbo test:dist on @object-ui/components); the only caller of the test:dist task PR A defines.
    7 ci.yml Test (the shard aggregate) correctness (aggregate) dropped until cutover It exists to be the required context; the required set is the maintainer's at cutover (sub-issue 5). Port with objectstack's shard-attestation pattern then.
    7 ci.yml Test (coverage shard n/8) · Test (coverage) correctness (push-only) kept, follow-up port objectstack has coverage-nightly.yml; decide push-lane vs nightly tier.
    7 ci.yml Build Docs (@object-ui/site) correctness kept, follow-up port Builds objectui's docs site; objectstack's Build Docs builds apps/docs only.
    8 cross-repo-issue-closer.yml Close issues referenced in other repositories governance → sub-issue 4 objectstack has its own; the cross-repo case largely disappears once both trees are one repo.
    9 dependabot-auto-merge.yml dependabot governance → sub-issue 4
    10 docs-deploy.yml Deploy docs to Vercel (production) governance / deploy → sub-issue 4 objectstack docs-deploy.yml deploys apps/docs; objectui's site is a separate Vercel project.
    11 governed-surface-guard.yml Governed Surface Queue Guard governance covered by objectstack governed-surface-guard.yml → sub-issue 4 The register (GOVERNED_SURFACES) must decide which ui/** paths are governed.
    12 half-state-patrol.yml Live half-state sweep governance covered by objectstack half-state-patrol.yml → sub-issue 4
    13 hook-selftests.yml Hook Self-Tests governance covered by objectstack lint.yml (hook self-tests step over .claude/hooks) → sub-issue 4 ui/.claude/hooks (8 hooks) is not swept by it; merge or retire them.
    14 labeler.yml label governance covered by objectstack pr-automation.yml (Auto Label) → sub-issue 4
    15 line-citation-gate.yml Line Citation Gate governance → sub-issue 4
    16 lint.yml Lint correctness ported in PR A → Lint UI (in ci.yml, beside the filter job it needs) //#lint:root became its own step; the cross-repo closer contract step → sub-issue 4.
    17 live-e2e.yml Live E2E (informational) correctness (informational) kept, follow-up port Its backend start script boots objectstack at the pin; after the import it should boot the in-tree server.
    18 lockfile-dedupe.yml Lockfile Dedupe Check correctness kept, follow-up port Must be re-aimed at the single root pnpm-lock.yaml; objectstack has no dedupe gate (validate-deps.yml checks frozen install and OSV only).
    19 lockfile-integrity.yml Lockfile Integrity Check correctness kept, follow-up port Same re-aim as row 18.
    20 merge-queue-head-patrol.yml Merge queue head patrol governance → sub-issue 4 objectstack merge-queue-triage.yml is the counterpart.
    21 node-esm-load-gate.yml Node ESM Load Scan correctness (push/schedule) kept, follow-up port Published @object-ui/* ESM load scan; nothing in objectstack covers @object-ui/*.
    22 performance-budget.yml Bundle Analysis correctness kept, follow-up port Rebuilds the Console; fold into Build & E2E UI to avoid a second Console build.
    23 published-dist-gate.yml Published Dist Tooling Scan correctness (push/schedule) kept, follow-up port
    24 repo-gates.yml Repo Gates mixed (doc/skill gates) → sub-issue 4 Per the card's governance list; its doc/skill type gates may move into Lint UI there.
    25 required-check-set-patrol.yml Required check set patrol governance covered by objectstack required-set-patrol.yml → sub-issue 4 The new * UI names join the required set only at cutover (sub-issue 5).
    26 shadcn-check.yml Check for Shadcn Component Updates correctness (schedule-only report) kept, follow-up port Maintenance report, never a PR gate.
    27 spec-range-floors.yml Spec Range Floor Scan correctness dropped Under workspace:^ the floor is the workspace version by construction (spike finding 1); sub-issue 2 item 6 makes the scripts accept workspace:, sub-issue 4 deletes them.
    28 test-shard-timings-refresh.yml Regenerate the per-file test timings governance / data → sub-issue 4 objectstack has shard-timings-refresh.yml for core; when ported, restore Test UI's timings reporter and upload.

    Count: 28 workflows. PR A ports lint.yml and the three named jobs of ci.yml. 10 correctness items are kept for a follow-up port (row 7 ×3, rows 17, 18, 19, 21, 22, 23, 26). spec-range-floors.yml is dropped, and ci.yml's Test aggregate waits for the cutover required set. 18 governance workflows go to sub-issue 4 (rows 1–6, 8–15, 20, 24, 25, 28); 5 of them are already covered by an objectstack workflow (rows 11–14, 25).

    PR A status and PM rulings on the dev's open questions

    PR A (inert wiring) is built and verified locally: 4 commits, 10 files, +931/−33 — pnpm-workspace.yaml ui globs, 4 root turbo tasks, ci.yml jobs Type Check UI / Test UI (n/16) / Lint UI / Build & E2E UI gated on a ui_tree filter output (skipped, not failed, while ui/ is absent; none required), and 7 gate scripts that mirror the workspace globs or hold until ui/package.json exists. Lockfile byte-identical under --frozen-lockfile; turbo run build --dry=json same 84 tasks; all 121 derived gate commands exit 0; actionlint exit 0. A throwaway import of the spike's ui/ tree installs in 48 s with 45 @object-ui/* members and the spec→ui type-check selection works (44 ui packages selected by a spec edit).

    The branch is not pushed yet: this thread's objectstack branch carries the sub-issue 1 spike subtree, so the PM asked the maintainer for a second branch name for this card. The draft PR opens as soon as that is granted; .github/workflows/** makes it Tier H, so it waits for a human approval in any case.

    Rulings (PM, so the dev's report is closed):

    1. Gate holds stay in PR A (option A); both void themselves when ui/ arrives.
    2. Remote turbo cache for the UI jobs: deferred until the throwaway run measures cold/warm minutes; local actions/cache only for now.
    3. Test UI runs on ui changes only (option A); spec changes reach Type Check UI and Build & E2E UI. Revisit after the first measured runs.
    4. None of the 10 kept correctness gates goes into PR A; they are a follow-up port after the throwaway run, listed above.
    5. skip-changeset on the PR (nothing published changes).
    6. The 5 gates that go red at the import commit (listed in the PR body's acceptance notes) are carried to sub-issue 5 (cutover) with this card as their source.

    Note for the cutover script: objectui origin/main fetched locally as a3c0da9 while the spike tree is 0984c77; the import must take the sha from git ls-remote, not a local checkout.

  3. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    PR A opened as a draft: #25710 (branch claude/project-thread-dwhq6r-25697, head 597471c, +931/−33, skip-changeset). Tier H (.github/workflows/**): waits for one APPROVED review from GOVERNED_APPROVERS, then the dispatch seat lands it through the queue. Its body carries the 维护者速读 and the acceptance notes for the cutover card; the full roster table is the comment above.

    Next on this card: the throwaway DO NOT MERGE verification branch (this head + the subtree import) to measure the four UI jobs with ui/ present and run the spec counter-probe; then PR B (retire the two-repo pin gates), drafted for the cutover window.

  4. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Verification branch up: #25718 (DO NOT MERGE, draft, needs-user-decision + skip-changeset, never enqueued; branch claude/project-thread-dwhq6r-25697-verify = PR A head + objectui main @ cd70b7818d as the ui/ subtree + the spike adaptations + PR A's 7ca50a8a7b). Its body lists the 17 gates the import commit turns red on this tree (the cutover card's bill) and the counter-probe to push after the first run is read.

    PR A itself: #25710 was approved by os-zhuang and auto-merge armed; two workspace-glob gates CI caught (check:dispatcher-error-vocabulary, check:duration-unit-keys) were fixed in 7ca50a8a7b (comment 6391016137); it merges through the queue when green.

    New finding for the cutover bill, from the verify tree: check:duration-unit-keys walks ui/**/src once ui/ exists and reports 9 ms-described keys without a unit in the name, all in ui/packages/types/src/zod (autoPlay, autoResponseDelay, timeout, delay, duration, delayDuration, openDelay, closeDelay, refreshInterval). Those are published prop names, so the answer is a declared exemption or a scope decision, not a rename — sub-issue 5 decides with the maintainer.

  5. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Verification run 1 of #25718 read — summary with the measured causes and the owner of each red is on the PR (the comment titled "Run 1 read"). In one line: the four UI jobs ran, Lint UI is green cold in 12 min, and every other red traces to (1) objectui readers of pnpm-workspace.yaml / turbo.json / pnpm-lock.yaml / root overrides at the objectui root → new sub-issue 2b #25723 (dispatched); (2) the ui root's turbo-recursive scripts nesting a second turbo run inside root turbo run build → cutover adaptation (verify commit 1a76fa5 previews it, run 2 in flight); (3) objectstack-side inert follow-ups for PR A2 on this card: Test Core partitioner excludes members under ui/; dispatch-gates.mjs runGit buffer; (4) the already-listed cutover bill (fixed group → 4a, lint-lane gates, QUICK_REFERENCE.md). Dom/unit failures not attributed to a reader are measured again on run 3.

    Cutover bill additions for the adaptation commit (sub-issue 5), carried here until that card is filed:


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    PR A (#25710) is on main as 769ac80 (merged 2026-10-25 00:58Z, approved by os-zhuang). Inert while ui/ is absent: ui/* workspace glob, the four ui turbo task names, the ui CI jobs behind ui_tree, the spec→Console typecheck edge, the roster table. Parent #25677 item 3 text updated (PR B still pending — cutover window).

    Next on this card, in order:

    1. Verify PR DO NOT MERGE — verification run for #25697: PR A + the ui/ subtree import of objectui main cd70b7818d #25718 run 3 (head 1cade69 = PR A + subtree + adaptation + objectui#25723 patch) is running; its Type Check UI / Build & E2E UI / Test UI readings decide what remains on the cutover bill and feed the objectui catch-up sub-issue (spec drift: .objectstack-sha e649c2d vs main, TS1360 in TranslationPreview on run 2).
    2. PR A2 (inert, objectstack-side, on claude/project-thread-dwhq6r-25697 restarted from main): Test Core partitioner excludes workspace members under ui/ (run 1: shards 2–6 enumerated @object-ui/* and failed under OS_SKIP_DTS); scripts/pm/dispatch-gates.mjs runGit maxBuffer (ENOBUFS on the imported tree); root build task excludes @object-ui/site (next build) or it gets its own job. Filed as a PR on this card once run 3 is read.
    3. PR B (retire Spec Shape Gate / Console Pin Gate / prerelease-pin-watch) stays parked for the cutover window.

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Verify run 3 read (#25718, head 1cade69, objectui#25723's patch on top) — pointer. Build & E2E UI is green for the first time (7:33); Type Check UI passes 15 ui gates and stops at check:icon-record-names; Test UI's reader class is gone. Summary: #25718 (comment).

    New cutover-bill item — dependency resolution. The verify branch's lockfile was recomputed from ranges (not carried from objectui's lock), and the git-root pnpm-workspace.yaml overrides (48) now govern ui/*. Against objectui main's lockfile, 138 importer×dependency rows moved across 69 packages; the remaining Test UI reds (radix Select/Tooltip minors) and the lucide name drift come from this, and the root override react-router@<8.3.0 → ^8.3.0 puts react-router 8.5.0 under objectui's react-router-dom 7.18. Sub-issue 5a filed: the import splices objectui's resolutions into the merged lockfile and scopes the overrides that would rewrite a line objectui owns.

    Resolution diff, objectui lock → merged lock (ui importers only)
    Package objectui lock merged lock ui importers
    vite 8.3.5 8.3.4 30
    @vitejs/plugin-react 6.0.5 6.1.2 27
    lucide-react 1.43.0 1.61.0 22
    vite-plugin-dts 5.0.3 5.1.2 22
    vitest 4.1.10 4.1.12 18
    @types/node 26.2.0 26.6.3 11
    postcss 8.5.31 8.5.28 8
    react-router-dom 7.18.2 7.18.4 8
    autoprefixer 10.5.4 10.6.1 6
    @testing-library/react 16.3.2 16.3.3 2
    @testing-library/user-event 14.6.4 14.6.8 2
    @vitest/ui 4.1.10 4.1.12 2
    chalk 6.0.0 6.0.1 2
    happy-dom 20.11.2 21.0.4 2
    react-i18next 17.0.11 17.1.8 2
    react-map-gl 8.1.2 8.1.3 2
    @ai-sdk/react 4.0.68 4.0.156 1
    @changesets/cli 3.0.1 3.0.3 1
    @playwright/test 1.62.1 1.63.0 1
    @radix-ui/react-alert-dialog 1.1.23 1.2.1 1
    @radix-ui/react-aspect-ratio 1.1.15 1.2.0 1
    @radix-ui/react-avatar 1.2.6 1.3.1 1
    @radix-ui/react-checkbox 1.3.11 1.4.1 1
    @radix-ui/react-context-menu 2.3.7 2.4.1 1
    @radix-ui/react-dropdown-menu 2.1.24 2.2.1 1
    @radix-ui/react-hover-card 1.1.23 1.2.1 1
    @radix-ui/react-label 2.1.15 2.1.17 1
    @radix-ui/react-menubar 1.1.24 1.2.1 1
    @radix-ui/react-progress 1.1.16 1.2.1 1
    @radix-ui/react-radio-group 1.4.7 1.5.1 1
    @radix-ui/react-select 2.3.7 2.4.1 1
    @radix-ui/react-separator 1.1.15 1.2.0 1
    @radix-ui/react-slider 1.4.7 1.6.1 1
    @radix-ui/react-switch 1.3.7 1.4.1 1
    @radix-ui/react-toggle 1.1.18 1.2.1 1
    @radix-ui/react-toggle-group 1.1.19 1.2.1 1
    @radix-ui/react-tooltip 1.2.16 1.4.1 1
    @sentry/react 10.70.0 10.76.2 1
    @tanstack/react-virtual 3.14.9 3.14.22 1
    @types/vscode 1.125.0 1.140.0 1
    @vitest/coverage-v8 4.1.10 4.1.12 1
    ai 7.0.65 7.0.118 1
    axe-core 4.13.0 4.14.0 1
    better-auth 1.7.2 1.7.12 1
    concurrently 10.0.4 10.0.6 1
    eslint 10.8.1 10.11.0 1
    eslint-plugin-react-refresh 0.5.4 0.5.7 1
    express 4.22.2 4.22.3 1
    express-rate-limit 8.6.2 8.7.1 1
    fs-extra 11.4.0 11.4.1 1
    globals 17.11.0 17.13.0 1
    i18next 26.4.0 26.5.10 1
    input-otp 1.4.2 1.5.0 1
    js-yaml 5.4.1 5.4.2 1
    maplibre-gl 6.4.1 6.15.0 1
    motion 13.2.0 13.5.1 1
    playwright 1.62.1 1.63.0 1
    react-day-picker 10.0.1 10.0.2 1
    react-grid-layout 2.2.4 2.3.0 1
    react-hook-form 7.85.0 7.91.0 1
    react-resizable-panels 4.12.2 4.14.8 1
    shadcn 4.18.0 4.22.1 1
    streamdown 2.5.0 2.7.1 1
    tsx 4.23.12 4.23.15 1
    turbo 2.10.9 2.11.5 1
    typedoc-plugin-markdown 4.12.0 4.14.1 1
    typescript-eslint 8.67.0 8.72.0 1
    wait-on 9.1.0 9.5.1 1
    yaml 2.9.0 2.9.1 1

    Still open on this card: run 4 (d17ed5e, lucide names regenerated) for the Type Check UI tsc step and the full spec-drift list → sub-issue 2c (objectui catches up to objectstack main); then the counter-probe and closing #25718.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: epic #25677 round 6 — PR A2 of this card (card threads; Tesla 2026-10-25 「你应该使用 pm-dispatch 技能派发」「并发可以到6」). Supersedes the epic PM's own claude/project-thread-dwhq6r-25697 branch for PR A2; PR B (pin-gate retirement, cutover window) and the verification branch claude/project-thread-dwhq6r-25697-verify (#25718) stay with the epic PM.
    Session: session_01RSDL3SFtJaKzcymvCD8RsU
    Account: os-tesla
    Branch: claude/project-thread-i7mwht (the card thread's designated branch in objectstack-ai/objectstack — the thread can push only this branch, a measured platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-25697
    Domain: domain:devx
    Seat: epic:#25677
    File surface (PR A2, inert while ui/ is absent): scripts/partition-test-shards.mjs (+ its tests), root package.json build script and/or turbo.json filter, scripts/check-type-check-coverage.mjs, scripts/check-published-readme-exports.mjs (+ their self-tests); ⛔ nothing under .github/workflows/** (Tier H) — a fix that needs a workflow change is reported, not made. The dispatch-gates maxBuffer item is already in #25732.
    Container & model: M, mode:thread (thread session session_01Y9KdeUcccMQ3ReF85Xyf5o; order: /mnt/project-files/d1-merge/dispatch/3-25697-pr-a2-objectstack-inert-gates.md in the project, FRAME.md applies), model: opus, effort: high (coordinator default)
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: none
    PR body: Part of #25697 (this card stays open for PR B), Part of objectstack#25677; ⛔ no Fixes.
    Serial constraints: none — PR A #25710 is on main; #25732 (4b PR 1, scripts/pm/**) touches none of these files.


    Generated by Claude Code

  9. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
     "issue": 25697,
     "status": "done",
     "branch": "claude/project-thread-i7mwht",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/25738",
     "session": "session_01Y9KdeUcccMQ3ReF85Xyf5o",
     "premise_still_valid": true,
     "summary": "PR A2 (inert): the Test Core partitioner drops workspace members under ui/ by path (the ui root included); the root build excludes ./ui*/apps/site; check-type-check-coverage reads tsconfigs with TypeScript's JSONC parser (refusals kept); check-published-readme-exports scopes its population to members outside ui/. Byte-identical on main; on the verify head cfa1676afc the four reproductions move as the order asked, with the coverage gate now giving 489 ui-only findings instead of a crash (cutover decision, acceptance note 1).",
     "tests": "head 898990ec: partition-test-shards --self-test exit 0 (new battery 6 cases), check-type-check-coverage --self-test exit 0 (new battery 8), check-published-readme-exports --self-test exit 0 (new battery 5, with control); same three green on the verify tree with the diff applied. Inert: partitioner stdout+stderr byte-identical on 6 shards of main's turbo ls; root build dry-run 83 = 83 task ids; coverage and readme-exports output byte-identical base vs new on main. Effect (verify tree): 47 -> 0 ui shard items; coverage throw -> reads ui/tsconfig.json (exit 1, 489 findings all under ui/); readme-exports exit 3 -> 0 on the lane's built closure; dry-run 130 -> 129 tasks, only @object-ui/site#build removed. No ablation: scripts only.",
     "gates": "dispatch-gates --commands: 46 derived, all 46 exit 0 (record /mnt/project-files/d1-merge/out/3-25697-a2-gates-ran.txt); --ran reconcile: 46 run, 0 NOT-MEASURED (derived zero). check-governed-merges --branch HEAD: NOT governed, 344 lines. eslint on the three scripts exit 0. CI on #25738: in_progress at report time.",
     "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
     "mcp_calls": "0",
     "api_writes": "1 relay stroke: pr_create (create + assignees + labels legs, run 40158788478); this report comment is the 2nd",
     "open_questions": [
      {
       "question": "Coverage gate on the merged tree: 489 findings, all on ui/ members (47 lack a typecheck script because objectui spells it type-check). Which way at cutover?",
       "options": [
        "A: ui packages gain typecheck scripts or ledger rows in the adaptation commit",
        "B: exclude members under ui/ by path from this gate too, as PR A2 did for the readme gate"
       ],
       "recommendation": "PM/maintainer call; A keeps the ratchet's coverage over ui/, B keeps cutover small"
      }
     ],
     "out_of_scope_findings": [
      "class: measurement contradicting the order. objectui's check:readme-exports runs in its repo-gates.yml (governance roster, sub-issue 4), not in Type Check UI, so after cutover no gate judges ui/ README exports until that port. carrier: sub-issue 4 (#25712) or the cutover card. noted, not filed"
     ]
    }

    Generated by Claude Code

  10. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT PR A2 — dispatch seat. #25738 (head 898990ec, branch claude/project-thread-i7mwht, +324/−20, 4 files) is accepted as PR A2 of this card. The card stays open: PR B (Spec Shape Gate / Console Pin Gate / prerelease-pin-watch retirement) lands in the cutover window, and the verification branch #25718 stays with the PM.

    Checked against the order (/mnt/project-files/d1-merge/dispatch/3-25697-pr-a2-objectstack-inert-gates.md):

    • All four gates repaired by path (a member whose directory is ui or under it), never by the @object-ui/ scope; nothing under .github/workflows/**; the dispatch-gates maxBuffer item correctly left to tooling(pm): dispatch-gates git maxBuffer for the merged tree; register matchers proven on the nested ui/ rows (4b PR 1, inert) #25732.
    • Inert on main, measured: partitioner stdout/stderr byte-identical on all 6 shards; root build dry-run the same 83 task ids and hashes; check-type-check-coverage and check-published-readme-exports byte-identical output. Effect on the verify tree cfa1676afc + diff: ui/ items in Test Core 47 → 0 (max/mean 1.00x); coverage gate reads ui/tsconfig.json (JSONC via TypeScript's own parser, refusals kept); README-exports gate exit 3 → 0 on the lane's built closure; dry-run drops exactly @object-ui/site#build.
    • Three new self-test batteries (6 + 8 + 5 cases, with a control for the README population) green on main and on the verify tree; roster floors 14→15, 65→66, 26→27.
    • 46/46 derived gates exit 0, reconciled with --ran (0 NOT-MEASURED). eslint 0.
    • CI on the PR head: 50/50 check runs completed, none failed (34 success; the 16 skipped are the ui/**-filtered UI lanes and opt-in jobs, as expected on a tree without ui/). Test Core 1/6 took 9 min (run 5 on the verify branch took 29 min for the same shard carrying the ui root).
    • check-governed-merges --pr objectstack-ai/objectstack#25738: NOT governed (0 of 4 paths hit the register), 344 changed lines ≤ 3000 — ordinary queue landing.
    • Writes: 2 relay writes (pr_create, report), 0 MCP writes, no review requested.

    Deviations, read and accepted:

    1. Root build filter --filter=!./ui*/apps/site (turbo 2.11.5 refuses !./ui/apps/site and !@object-ui/site on a tree without ui/). Accepted; tightening to !./ui/apps/site is on the cutover bill as optional.
    2. Coverage gate still exits 1 on the merged tree, now with 489 findings all under ui/ (47 "no typecheck script" because objectui spells it type-check, the rest downstream of that). Accepted as out of this patch: a coverage-semantics decision, carried to child 5 (seat's proposed route: accept type-check as a second spelling for members under ui/, then seed ledger rows for what remains; path exclusion only as the fallback).
    3. objectui's README-export gate runs in objectui's repo-gates.yml, not Type Check UI as the order said. The order was wrong; the correction goes to the 4b PR 2 bill (port README Export Check with its build prerequisite).
    4. Local README gate refused 33 unbuilt @object-ui entries vs 19 in run 4's lane: informational; the lane's reading comes from run 6.

    Bill notes: /mnt/project-files/d1-merge/out/5-cutover-bill-notes.md.

    Landing: the seat flips the PR ready and arms auto-merge via the relay now. Follow-on: verify run 6 on #25718 after the objectui main refresh (2c round 1 + 2d merged; 2e in flight) plus this patch, expecting Test Core 6/6 and the consumer-gates lane green, and the source-gates / debt-ledger lanes red with a verdict (deviation 2) until child 5.


    Generated by Claude Code

  11. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 2 (item 6, PR B — retire the two-repo pin gates; PR A #25710 is merged)
    Session: session_01H835wAyqCCeF7jiYq7XSxi
    Account: os-tesla (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-90y5m2
    Worktree: objectstack-issue-25697
    Domain: domain:devx
    Seat: domain:devx#1
    File surface: .github/workflows/spec-shape-gate.yml, .github/workflows/prerelease-pin-watch.yml, scripts/ci/spec-shape-gate.mjs, scripts/ci/spec-shape-retirements.json (deleted); .github/workflows/ci.yml (console-pin job + filter console entries); scripts/ci/scheduled-full-run.mjs (roster + its self-test cases); release.yml / cut-rc.yml reads of the gate; the ledgers, census gates and prose that name the deleted gates (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: opus (default judgment tier), effort: xhigh
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — epic step (#25752 step 5, PR 3 of 4 at the sitting)
    Thread-read: none
    Premise: holds — origin/main 52f3f51 carries all four files and the console-pin job; the console scripts and the pin field stay (#25712)
    Serial constraints cleared: draft only, merged by the maintainer at the 2026-10-26 09:00Z sitting after the cutover PR and 4a #25745; never ready, never auto-merge; no claude/project-thread-dwhq6r* branch is touched
    Resume-from: none

    Dispatched by the epic seat (session_01RSDL3SFtJaKzcymvCD8RsU) under the pm-dispatch frame; order: /mnt/project-files/d1-merge/dispatch/3B-25697-retire-pin-gates.md. Part of #25677.


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Measurement: item 6 (PR B) census · 2026-10-25T16:10Z · branch claude/project-thread-90y5m2, base 52f3f518e1

    git grep -n -E 'spec-shape-gate|Spec Shape Gate|spec-shape-retirements|prerelease-pin-watch|Console Pin Gate|console-pin' over the tree at the base: 169 hits in 33 files. Every hit class and what PR B does with it:

    Class Files (hits) Treatment in PR B
    The retired gates themselves spec-shape-gate.yml (15), scripts/ci/spec-shape-gate.mjs (21), scripts/ci/spec-shape-retirements.json (1), prerelease-pin-watch.yml (6) deleted
    ci.yml job and filter ci.yml (7) console-pin job, console filter list and output deleted; the comments that pointed at them re-worded
    Release-gate roster scripts/ci/scheduled-full-run.mjs (19) Spec Shape Gate row dropped from RELEASE_GATE_WORKFLOWS (roster is now CI + Lint & Type Check); its self-tests rewritten to the two-row roster with the same assertion shape; two dated diagnosis fixtures kept
    Gates that encode the deleted job or script check-ci-filter-parity.mjs (5), check-expected-skips.mjs (5), dispatch-gates.self-test.mjs (20), dispatch-gates.mjs (7) filter-parity console subject retired (battery floor 10 → 9); the Console Pin Gate expected-skip row removed and its recordings re-spelled; live-tree job-filter cases re-pointed at Build Core; synthetic specimens kept; tense fixes
    Orphan the deletion forces scripts/check-prerelease-pin-watch.mjs (15), package.json (2) deleted with the check:spec-shape-gate and check:prerelease-pins aliases (deviation: check-self-test-wired reds the orphan)
    Instruction prose naming a deleted gate as live AGENTS.md (2), docs/releases-maintenance.md (2) one-line prose fixes, no line added
    Comments naming a retired gate as live cut-rc.yml, docs-deploy.yml, lint.yml (2), release-coverage-patrol.yml, release.yml:1510, check-release-section-coverage.mjs (2), check-self-test-workflow-commands.mjs, check-vendor-version-stamps.mjs (2), check-required-contexts.mjs past tense, or a one-paragraph addendum to the existing tombstone
    Left for 4a #25745, which deletes or rewrites them release.yml:1874/1917, cut-rc.yml:383, packages/console/README.md:54, check-console-injection.mjs (6) untouched (avoids a conflict; the console scripts stay per the order)
    Dated history and fixtures docs/audits/* (5), scripts/docs-audit/README.md, scripts/fixtures/merge-queue-triage/*.json (2), fleet-write/validate.mjs fixture, packages/spec/liveness/dashboard.json:146, pnpm-workspace.yaml:184, the #9533 tombstone in check-required-contexts.mjs kept as written

    Measurements that contradict the order:

    1. Neither retired name is a required context. GET /repos/objectstack-ai/objectstack/rules/branches/main (read 2026-10-25T15:50Z) requires TypeScript Type Check, Test Core, Build Core, Lint & Repo Gates, Governed Surface Queue Guard; classic branch protection requires TypeScript Type Check, Build Core, Test Core, Dogfood Regression Gate. No required context vanishes when PR B merges, and the sitting needs no ruleset step for it. (Console Pin Gate left the registry with finding: required-context registry pins Build Docs and Console Pin Gate, absent from the maintainer's 2026-08-18 six-item required-set reading #9533 and appears in no reading of the required set; Spec Shape Gate is in neither reading today.)
    2. No release.yml or cut-rc.yml step reads Spec Shape Gate directly. Both reach it only through scheduled-full-run.mjs --release-gate, so dropping the roster row is the whole change.
    3. prerelease-pin-watch.yml does not watch the objectui pin. It watches better-auth prerelease overrides in pnpm-workspace.yaml, and its watch list is already empty. Deleted as ordered.
    4. PR B cannot be green on its own branch while 4a is not on main. The order keeps check-console-injection.mjs / console-spec-probes.mjs until 4a and deletes Console Pin Gate, their only PR-time runner. Two live-tree cases of the dispatch-gates fast tier then red: the silent load-break pair check:console-injection <- console-spec-probes.mjs, and the pull_request-only narrowing of the scheduled-only zero. That step is a member of Lint & Repo Gates. On a local merge of main + 4a (4ac569dc00) + PR B the same fast tier passes 1917/1917, so the reds belong to the landing order (4a first), not to either PR. Neither case was weakened.
    5. PR B and 4a overlap in two files: package.json (both delete check:prerelease-pins) and one comment in dispatch-gates.self-test.mjs. Resolve both by taking main (4a); both conflicts are verified on the local merge above.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions