Repository navigation
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
Description
Filing gate ④: sub-issue 2/6 of the epic #25677 (pm:epic; epic PM session_01RSDL3SFtJaKzcymvCD8RsU). Part of #25677. ⛔ Not a claim.
Blocked-by: none — #25678 (sub-issue 1, the spike) is done; its report (#25678, comment 6386424164) is the evidence for every line below.
Who does it, where it lands: the epic PM dispatches it (os-dev, objectui checkout). Deliverables are ordinary PRs to objectstack-ai/objectui main, each small enough to review on its own, each with a changeset where a published package changes; the domain:ui lane's PR rules apply to them. The card lives here because the subtree is indexed on this parent. No governed surface is touched. Why in objectui and not on the merge branch: objectui keeps developing until cutover day, so anything changed on a prep branch of the merged tree would conflict with objectui main moving; landing it in objectui first means the cutover import (sub-issue 5) brings it in for free and the freeze window stays at 1–2 days.
维护者速读
子卡 1 的 spike 证明合并可行,但 objectui 这棵树里有 6 件事是"默认自己是独立仓"的假设,在并入 ui/ 后会直接让构建或测试失败。本卡把这 6 件事在 objectui 自己的仓里先修掉(每件一个小 PR,单独都无害),这样切换日只剩 git subtree add + 重算 lockfile。不碰受管面;切换前 objectui 照常开发。
Scope (each item one PR, in this order)
- One react line. Lift
react/react-domfrom 19.2.8 to 19.3.0 and@types/react19.2.18 → 19.3.0 (@types/react-dom19.2.4 → 19.3.0) in every manifest that pins them (12 manifests pin react, 29 pin@types/react, plus the rootpnpm.overrides). Why:@objectstack/client-reactrequires ^19.3.0; two@types/reactcopies broke@object-ui/plugin-view's declaration build in the merged tree (report finding 3). Keep the root overrides for now; they go with the pin field at cutover. - One zod range.
@object-ui/app-shell,components,types,test-support,plugin-timeline:^4.4.3/^4.6.1→^4.6.5, matching objectstack. Lock stays single-instance in the Console (the canary passed), this just removes the second version from the merged lockfile (finding 4). uiRoot()helper. 71 files underscripts/,packages/*,apps/*locate the repo root via.git,git rev-parse --show-toplevel,pnpm-workspace.yamlor find-up; in the merged tree that is the objectstack root andfilter-icontains-alignment-8976.test.tsalready reads<root>/packages/core/...and fails (finding 6). Add one helper (scripts/ui-root.mjs+ a TS twin for tests) that resolves the objectui tree root fromimport.meta.dirnameand works both standalone and underui/; migrate the 71 call sites; add a gate that refuses newshow-toplevel/.gitroot lookups outside the helper.- tsc heap.
@object-ui/app-shelland@object-ui/consoletscneed 2.3 GB (3 574 files, 1.15 M lines of.d.ts) and OOM at Node's default heap in the merged tree (finding 2). PutNODE_OPTIONS=--max-old-space-size=4096into those two packages'build/type-checkscripts (cross-platform viacross-envor a tiny node wrapper, not a bash prefix) so CI and local builds carry it everywhere. - Workspace-aware Console chunk tests. Port the 14-line change from the spike commit
3efb112efb(ui/apps/console/vite.config.ts:VENDOR_OBJECTSTACK_TEST,SPEC_MODULE_TEST, the lazy-linterLINTtest accept<repo root>/packages/<name>/beside the node_modules spellings;lintstill excluded) and checkscripts/vite-objectstack-client-dist.tsfor the same node_modules assumption (finding 5). Standalone, the new alternative matches nothing, so behaviour is unchanged. - Task names and floor checks. Add a root
typecheckscript aliasingtype-checkso the merged rootturbo run typecheckreaches ui packages (finding 7; the full turbo merge is sub-issue 3's). Makescripts/objectstack-floor.mjs,scripts/check-spec-range-floors.mjsand thedeclaredSpecFloortests read aworkspace:protocol as "floor = the workspace version" instead of failing (finding 1; 12 files); their deletion is sub-issue 4's.
Done when
- Six PRs merged on objectui
main, each green on objectui's own CI, with changesets where a published manifest changed. - Re-running the spike import (
git subtree addof the new objectuimainonto objectstackmain, the wiring of tooling(monorepo): 在试验分支上把 objectui 并入ui/workspace(subtree add、单 lockfile、turbo 构建图),交冲突清单、必改脚本清单与各类 PR 的 CI 时长读数 — 不落 main(父单 1/6) #25678'sec74d9ecfa) builds@object-ui/console^...and the Console at the default workspace settings with no root react/@types override, andvitest run --project unit packages/core packages/i18nfromui/is green. grep -rE "show-toplevel|'\.git'" scripts packages appsoutside the helper returns 0.
Size: L (six small PRs; item 3 is the bulk). Clause-②: no (no accept set or public surface widens). Metadata-protocol: none.
Dedupe
search_issues 2026-10-24 16:10Z: objectui 「bump react to 19.3 @types/react one version line pins 19.2.8」0 hits; objectui 「repo root helper show-toplevel monorepo nested workspace」4 hits, all closed and about other things (#9355 BASELINE sha, #7987 setup.sh, #5700 worktree refs, #3515 vitest.setup programs); objectstack 「objectui merge readiness ui/ workspace tsc heap」14 hits, the live ones are this epic's own #25677/#25678, the rest closed pin bumps. New.
Activity
objectstack-fleet commentedon Oct 24, 2026
Claim: epic #25677 round 2
Session:
session_01RSDL3SFtJaKzcymvCD8RsUAccount:
os-teslaBranch:
claude/project-thread-dwhq6r(objectstack-ai/objectui; mode:thread — the thread pushes only its designated branch, so the two PRs land one after the other on it: PR A = items 1, 2, 4, 5, 6; PR B = item 3)Worktree:
objectui(the thread's own objectui checkout)Domain:
domain:devx(card) — the PRs land in objectui under thedomain:uilane's PR rules (changesets, draft until CI, governed-surface check)Seat:
epic:#25677File surface: objectui
package.json,packages/*/package.json,apps/*/package.json(react/@types/zod lines,typecheckalias, heap in two build scripts),apps/console/vite.config.ts,scripts/vite-objectstack-client-dist.ts,scripts/objectstack-floor.mjs,scripts/check-spec-range-floors.mjs, thedeclaredSpecFloortests, a newscripts/ui-root.mjs(+ TS twin) and the 71 root-locating call sites it replaces; no.github/**, noAGENTS.mdContainer & model: L,
mode:subagent,model: opus(default;dispatch-gates --tier --repo objectstack-ai/objectuiis run by the dev on its own paths before the PR — the card's surface is manifests, scripts and tests, no governed path),effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: none
Serial constraints cleared: objectui open PRs on 2026-10-24 16:15Z: #13289 (Version Packages, maintainer's) touches only CHANGELOGs and versions — the dev rebases on it if it merges first; no open claim on
apps/console/vite.config.tsor the manifests; rootpackage.jsonis shared with every objectui card, so PR A carries the manifest edits in one commit and merges before PR B.Generated by Claude Code
objectstack-fleet commentedon Oct 24, 2026
os-dev-report
{ "issue": 25685, "status": "done", "branch": "claude/project-thread-dwhq6r", "pr": "https://github.com/objectstack-ai/objectui/pull/13472", "session": "session_01RSDL3SFtJaKzcymvCD8RsU", "premise_still_valid": true, "summary": "Draft PR objectstack-ai/objectui#13472 (6 commits in card order, 82 files, base a3c0da922, head 11bc20922, assignee os-tesla, drafted and read back byte-identical by the relay). Item 1 pins react/react-dom/@types/react* to 19.3.0 in 34 manifests plus the CLI scaffold, lockfile regenerated; item 2 declares zod ^4.6.5 in the five packages that list it; item 3 adds scripts/ui-root.mjs, migrates 20 package tests and 4 scripts off .git / pnpm-workspace.yaml / git rev-parse lookups, adds the AST gate check-ui-root-lookups (pnpm check:ui-root-lookups) and teaches check-test-path-roots the new root; item 4 adds scripts/with-heap.mjs, wires app-shell and console tsc through it, lists it as a turbo build input and teaches the build-inputs guard to look through the wrapper; item 5 ports spike 3efb112efb as scripts/vite-objectstack-workspace.ts with the unit test it lacked and wires apps/console/vite.config.ts; item 6 adds the root `typecheck` alias and workspace: range handling to check-spec-range-floors.mjs, objectstack-floor.mjs and the declaredSpecFloor-9012 test. Mechanism assumptions: A1 stand-in pin via OBJECTSTACK_ROOT (sibling objectstack at 3efb112efb, one day newer than the pin; identical dependency names/exports, .objectstack-pin and file: lockfile snapshots unchanged, --write-manifests not passed); A2 react 19.3.0 installs, builds the console closure, app-shell type-check and console build; A3 tsc --extendedDiagnostics heap: app-shell Memory used 2234110K, console 2355117K; A4 crude grep re-derived to 55 unique files (card said 71), residue is comments, data reads and skip lists, the gate is the instrument; A5 spike ported with test (standalone node_modules id matched, packages-root/packages/spec/dist/x.mjs matched, packages-root/packages/lint excluded from vendor and matched by lint).", "tests": "Under the lock (VERDICT command-exit 0 each): `turbo run build --filter='@object-ui/console^...' --filter='@object-ui/cli^...' --filter='@object-ui/app-shell^...' --concurrency=2` -> `Tasks: 34 successful, 34 total` (held 253s); `pnpm --filter @object-ui/app-shell type-check` exit 0, `pnpm --filter @object-ui/console build` exit 0, `pnpm --filter @object-ui/cli type-check` 0, `test` 0, `build` 0; `pnpm exec vitest run` over 24 touched package test files (21 migrated + declaredSpecFloor-9012 + cli app-generator + console-vite-alias-closure-4925 + doc-version-claims) -> `Test Files 24 passed (24) / Tests 325 passed (325)`. Unlocked: `pnpm type-check:scripts` exit 0; `pnpm exec vitest run` over scripts/__tests__ {ui-root, with-heap, check-ui-root-lookups, check-test-path-roots, vite-objectstack-workspace, objectstack-floor, check-spec-range-floors, react-peer-range-norm-3741, quick-reference-commands-4149, turbo-type-check-inputs, turbo-build-inputs, scripts-type-check} -> first run `Tests 2 failed | 213 passed` (turbo-build-inputs demanded with-heap.mjs as a build input; fixed by adding it and teaching helpers/build-program.ts the wrapper), re-run of {with-heap, turbo-build-inputs, turbo-type-check-inputs, turbo-test-inputs, turbo-lint-inputs} -> `Test Files 5 passed (5) / Tests 203 passed (203)`. `node scripts/check-ui-root-lookups.mjs --self-test` 13/13; tree scan `OK (7801 file(s) scanned, 54 parsed, 5 probe(s) all on the allowlist, 4 allowlist entries live)`. `eslint` over the 41 changed .ts/.tsx/.mjs files: exit 0, 0 errors, 4 pre-existing no-explicit-any warnings on untouched lines. Ablation: with-heap smoke (flag appended to existing --use-openssl-ca, 8192 kept, child exit 7 propagated) is pinned in scripts/__tests__/with-heap.test.ts.", "gates": "Local subset, exit codes captured before any pipe: check:lockfile-integrity 0, check:lockfile-dedupe 0, check:phantom-deps 0, check:unused-deps 0, check:installed-pin-claims 0, check:test-path-roots 0 (1264 self / 579 unclassified, was 1264 / 590), check:ui-root-lookups 0, check:entry-guard 0, check:pre-install-import-graph 0, check:control-bytes 0, type-check:coverage 0, check:new-line-citations 0, check-changeset-presence 0 (2 changesets for 11 released packages' source changes), check-changeset-no-major 0, check-changeset-fixed 0. check:spec-floors 1 after the build: two floor-too-low findings (@object-ui/auth MEMBERSHIP_ROLE_EXTERNAL; @object-ui/types navItemVisibleDataNeedsDataSource vs the FETCHED @objectstack/spec@18.0.0-next.x) -- identical verdict with the unmodified main gate script on the same dists and both symbols are referenced by main's source, so pre-existing, not introduced; CI runs it with --cross-check. NOT MEASURED: the PR's check-runs (not polled per dispatch), full turbo test/lint/type-check, check:published-dist, performance budgets, Windows branch of the wrapper.", "dogfood_battery": "n/a — no `!` in the PR title and no narrowing arm", "mcp_calls": "4 — GitHub READ tools only: issue_read get (25685) x1, issue_read get_comments (25685) x2, pull_request_read get (objectui#13472) x1. get_me was loaded but not called. No MCP write tool used.", "api_writes": "2 — (1) repository_dispatch fleet-write fw-20261024T171016Z-6ef723 via scripts/pm/fleet-write/dispatch.mjs: pr_create objectstack-ai/objectui#13472 (run 40114899139 success, 12054 bytes sent = stored); (2) this os-dev-report comment on objectstack-ai/objectstack#25685 via scripts/pm/post-stamped.mjs. Plus one `git push -u origin claude/project-thread-dwhq6r` (not a REST write). No PR body PATCH, no issue writes.", "deviations": [ "One draft PR for the whole card instead of the two the claim mentioned (per ruling); one commit per scope item, in card order.", "The shared checkout /home/claude/objectui was on the platform branch claude/project-thread-dwhq6r (at 2958f17e9, an ancestor of origin/main) and had to be detached so the worktree could hold the branch; the branch was reset to origin/main a3c0da922 before any edit. After cleanup the shared checkout is returned to that branch.", "A1 stand-in pin: OBJECTSTACK_ROOT pointed at the sibling objectstack checkout (3efb112efb, ~1 day newer than the pin SHA e649c2d91e27) instead of a real pin build; measured no dependency-name or export difference, .objectstack-pin and the file: lockfile snapshots unchanged.", "Item 2's lockfile effect lands in commit 1 (one pnpm install regenerated the whole lockfile); commit 2 holds the manifests and the changeset.", "scripts/with-heap.mjs is a turbo `build` input (the build-inputs guard demanded it) but NOT a `type-check` input: that guard derives tsconfig root files only and would report the entry as unearned. Also edited scripts/__tests__/helpers/build-program.ts (wrapper look-through) and turbo.json, which were not on the claimed file list.", "A4: the crude grep re-derives to 55 unique files, not 71; the un-migrated residue (data reads of pnpm-workspace.yaml globs in scripts/objectstack-pin.mjs, release-github-releases.mjs and workspace-reading tests; '.git' in two directory skip lists at scripts/__tests__/vitest-invocation-guard.test.ts and packages/react/src/context/__tests__/useRecordContext.bindingCast.pin.test.ts; allowlisted CLI cwd predicates) is deliberate.", "No permission-classifier refusal occurred; no environment variable value was printed." ], "open_questions": [], "out_of_scope_findings": [ "carrier: objectstack#25677 sub-issue 3 (the ui/ import carrier) · ~15 scripts/tests READ pnpm-workspace.yaml as data (workspace globs: scripts/objectstack-pin.mjs, scripts/release-github-releases.mjs, scripts/__tests__/helpers/turbo-inputs.ts and the package-walking tests); once ui/ has no workspace file of its own they need the merged root's file or a ui-local manifest list. Not a root lookup, so not migrated here. dedupe words: pnpm-workspace.yaml, workspacePackageDirs, ui/ cutover, data read", "carrier: none · noted, not filed · scripts/check-changeset-no-major.mjs (majorOfRange) and scripts/sync-quick-reference-release.mjs also read @objectstack/spec ranges and were left unchanged; neither fails on workspace: today but neither understands it either.", "class: b · reach: exception: release-text — `pnpm check:spec-floors` is red on main's own source against the fetched @objectstack/spec prereleases (auth: MEMBERSHIP_ROLE_EXTERNAL not exported by 18.0.0-next.1; types: navItemVisibleDataNeedsDataSource not exported by @objectstack/spec/ui 18.0.0-next.5); identical with the unmodified gate script. CI's spec-range-floors.yml runs --cross-check, so this may be benign there; evidence is the local gate log. dedupe words: spec-floors, floor-too-low, MEMBERSHIP_ROLE_EXTERNAL, navItemVisibleDataNeedsDataSource", "carrier: none · noted, not filed · doc-version-claims prose still mentions react 19.2.8 in places the test does not pin; the suite passed at 19.3.0." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 24, 2026
ACCEPT → PR objectstack-ai/objectui#13472 comment 6387876141
Six items delivered in one PR, CI green on
ae7fcc585(35/35, 3 expected skips). Not governed by path; the 4342-line size (2674 of thempnpm-lock.yaml) crosses the human-merge line, so the PR waits as a draft for an APPROVED review from GOVERNED_APPROVERS, then the seat lands it.needs-user-decisionon the PR, review requested from os-zhuang and hotlong. Checklist item 2 on #25677 ticks when it is MERGED.os-zhuang commentedon Oct 24, 2026
本 issue 在本次合并之前就已经是 closed 状态,这里只补上修复它的 PR:objectstack-ai/objectui 的 https://github.com/objectstack-ai/objectui/pull/13472。本工作流没有改动它的状态。
(跨仓库的关闭关键字不会自动生效,本条由
cross-repo-issue-closer工作流代为收口。)Generated by Claude Code
objectstack-fleet commentedon Oct 24, 2026
Landed. Two readings at 2026-10-24 23:10Z:
origin/main(git ls-remote)cd70b7818= the merge commit of objectui#13472 (merged 23:00:57Z by os-zhuang, approved by os-zhuang)gh-readonly-queue/main/pr-13472-*State change:
pm:dispatchedremoved from this closed card (closed by the PR'sFixesat 23:00:59Z, state_reason completed); item 2 ticked on #25677. The verification branch of #25697 takes itsui/tree from this sha or later.tooling(objectui-readiness): make the objectui tree merge-ready in it…