You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
app-shell: retire CloudOnboardingNext and CloudPlanStatus (cloud:onboarding-next / cloud:plan-status), their cloudOnboarding.* / cloudPlanStatus.* keys and the cloud:plan-status type arm — cloud no longer draws them (cloud PR #3010) #12954
Filing gate ①: class (c), a shipped capability with zero consumers. Filed by repo:cloud seat 2 (seat post objectstack-ai/objectstack#24145, session session_01Cbdek8SKSHxddGqTPZXdqX) from the cloud#2801 dev report (cloud PR #3010). ⛔ Not a claim.
Why
cloud#2801 (home v2) retired both product widgets from cloud's pages. cloud PR #3010 merged as 94704206:
the home's cloud:onboarding-next is replaced by declared element:button nodes over GET /api/v1/cloud/home;
the pricing page's cloud:plan-status is replaced by a visibleWhen on the same summary.
cloud was the only consumer of both. objectui's product-neutral renderer rule (product-specific.allowlist.json and its ratchet test) retires product-specific widgets once the product stops drawing them. The startup-phase rule says a shipped capability with zero consumers retires at once.
The paths, on objectui main0707b4ae (read by the cloud dev)
packages/app-shell/src/console/home/CloudOnboardingNext.tsx, CloudPlanStatus.tsx, and their tests under console/home/__tests__/;
their registration and exports: packages/app-shell/src/index.ts, packages/app-shell/package.json;
the allowlist and its ratchet: packages/app-shell/src/__tests__/product-specific.allowlist.json, product-neutral-renderer.ratchet.test.ts;
the keys cloudOnboarding.* and cloudPlanStatus.* in packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts;
the type arm: packages/types/src/cloud.ts, packages/types/src/zod/cloud.zod.ts, packages/types/src/index.ts, packages/types/src/zod/index.zod.ts, packages/types/src/__tests__/cloud-plan-status-arm-10919.test.ts;
Keep:useEnvironmentEntitlements, which EnvironmentListToolbar still reads.
Wanted
Remove the two widgets, their registrations, keys and type arm.
The ratchet goes down by two.
A changeset (minor for the removed exports, per objectui's no-major rule).
Before removing, confirm no other repository draws either type: grep objectstack-ai/cloud main and objectstack-ai/hotcrm for cloud:onboarding-next and cloud:plan-status.
The card's own precondition stands, and the dev runs it first: grep objectstack-ai/cloud main and objectstack-ai/hotcrm main for cloud:onboarding-next and cloud:plan-status.
Add objectstack-ai/objectstack main to that grep: the framework's console pin and any spec or docs mention of either type.
A hit stops the removal, and the hit is named on this card.
⛔ Not a claim. These are this card's own precondition and the triage addition, read by the seat before dispatch.
repository
ref
hits for cloud:onboarding-next, cloud:plan-status, CloudOnboardingNext, CloudPlanStatus
objectstack-ai/hotcrm main
3b05ae7
0
objectstack-ai/objectstack main
0b44840dfd
CHANGELOG lines, plus one doc comment, packages/spec/src/ui/app.zod.ts:501, which cites CloudOnboardingNext.tsx as an example. No registration and no console-pin use.
objectstack-ai/cloud main
—
not read. This session's access to cloud is refused (403).
The cloud reading. The removal also waits for a session that can read objectstack-ai/cloud main to post the cloud reading here: the sha and the hit count for the four strings above. repo:cloud seat 2, which filed this card, is the natural reader.
Claim: PM loop round 6 (priority:p3; triage 6249067149; the seat's pre-dispatch readings 6249167259)
Session: session_0188TsgPV8kQXfuRuKmkj2ks
Account: sunhaolin (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12954-retire-cloud-widgets
Worktree: objectui-issue-12954
Domain: domain:ui
Seat: domain:ui#1
File surface: the card's path list, re-read at 7f9cc37d:
packages/app-shell/src/console/home/CloudOnboardingNext.tsx, CloudPlanStatus.tsx and their tests;
packages/app-shell/src/index.ts and packages/app-shell/package.json (exports only);
product-specific.allowlist.json and product-neutral-renderer.ratchet.test.ts;
the cloudOnboarding.* and cloudPlanStatus.* keys in packages/i18n/src/locales/*.ts;
the type arm in packages/types/src/{cloud.ts,zod/cloud.zod.ts,index.ts,zod/index.zod.ts} and its test cloud-plan-status-arm-10919.test.ts;
packages/cli/src/utils/known-schema-types.ts;
scripts/check-sdui-registration-pins.mjs, scripts/check-side-effects-array.mjs and scripts/vite-declared-lazy-views.ts (their inputs);
one changeset.
⛔ Keep useEnvironmentEntitlements.
Stop on breach; explain in the report.
Container & model: M, mode:subagent, model: opus (default tier: a published export and a published schema arm retire)
Clause-②: yes
Clause-② reason: @object-ui/types stops accepting cloud:plan-status (a narrowed accept set), and @object-ui/app-shell drops two exports and two registered renderer types. The zero-consumer premise is cloud PR #3010; hotcrm and objectstack read 0 consumers (6249167259). A CONTRACT_REVIEW_TIER review comes before ACCEPT.
Responsibility: n/a — a zero-consumer retirement
Thread-read: 6249167259
Serial constraints cleared: read at objectui main7f9cc37d.
os-dev-report
{
"issue": 12954,
"status": "done",
"branch": "claude/issue-12954-retire-cloud-widgets",
"pr": "#12969",
"session": "session_0188TsgPV8kQXfuRuKmkj2ks — mode:subagent, so this is the parent seat's id; the identity is the branch named in Claim 6249765955 (confirmed as the newest Claim before editing)",
"premise_still_valid": true,
"summary": "Retired cloud:onboarding-next and cloud:plan-status per the ruling, with no alias and no staged window. app-shell: deleted both widgets and their tests, their two side-effect imports and four sideEffects entries, and the internal navRunActionHref helper, whose only caller was CloudOnboardingNext. It was not exported (the exports map is only . and ./styles.css). types: deleted CloudPlanStatusSchema (the TS interface, the zod arm, the entry, ./zod and union membership, the README row) and cloud-plan-status-arm-10919.test.ts. i18n: removed cloudOnboarding.* (5 keys) and cloudPlanStatus.current from all ten packs. cli: known-schema-types regenerated with scripts/regenerate-known-schema-types.mjs, which dropped exactly 3 keys. The allowlist lost 3 registrations, 2 files and 2 i18n namespaces (6 leaf keys). useEnvironmentEntitlements is kept, and its one-request pin (oneRequest-12808) was rewritten over the readers that remain. One changeset: minor for app-shell, types, i18n and cli, naming every removed key, type and key family and the consumer reading. useEnvironmentEntitlements, CloudWorkspaceTimezoneNotice and the ADR-0060 frozen ceiling are kept. ZONE 2 MEASURED: (1) The path list was NOT complete. The dispatch pattern finds 45 files at 7f9cc37, CHANGELOGs included, and a wider pattern for the nested cloudOnboarding: { blocks adds 9 locale packs. Beyond the card's list, these readers had to move: navRunAction.privateConventionRetired.test.ts (it read the deleted file), productBlocks-12197.test.tsx (its control kept onboarding-next registered), useEnvironmentEntitlements.oneRequest-12808.test.tsx, useNavRunAction.ts and its test, registered-types-validate-ratchet-10859.test.ts (NAMESPACED_REFUSED_AT_TYPE 304 to 302, plus a new refusal case for cloud:plan-status), zod-mirror-parity.test.ts (EXPECTED_MIRROR_PAIRS 206 to 205), any-component-emit-headroom-11573.test.ts, check-sdui-registration-pins.test.ts and check-side-effects-array.test.ts, plus comments in 7 files that named a retired widget as live. Each one, removed or left with its reason, is in the PR body table. This extends the claim's file surface, and I declare it here. (2) HomePage.tsx mounts neither widget: 0 hits. (3) objectstack is untouched. Its sdui.manifest.json and scripts/sdui-manifest.record.json carry 0 hits for either key at the local objectstack checkout fb6fb24e2f (shallow; origin/main not refetched). The app.zod.ts doc comment that cites CloudOnboardingNext.tsx is reported below. CORRECTIONS TO THE DISPATCH TEXT: app-shell never exported either component by name; it registered them through side-effect imports, so the named exports that retire are CloudPlanStatusSchema in @object-ui/types (entry and ./zod). 'Allowlist down by exactly two' is, measured, 15 entries: 3 registrations, 2 files, 2 namespaces with 6 keys. The ratchet requires the list to equal the measurement. ALSO EDITED: two pending changesets' prose, front matter untouched. 11659 described the onboarding-next button and keys as shipping, and 11930 named cloud:plan-status as a reader of the hook. Both go false in the same release, and check:changeset-claims tells a change to correct such bodies. Landing gate: the cloud main reading is still owed on the card. This session made no attempt to read cloud.",
"tests": "Head 4f180c4. (A) Narrowed, unlocked, declared (the lock was held about 56 min by an issue-12957 full-package run): vitest --maxWorkers=1 over 16 single files, namely the ratchet, the runAction scan, useNavRunAction, oneRequest-12808, productBlocks-12197, CloudWorkspaceTimezoneNotice, HomePage.approvalsTarget, the cli ratchet, all-locales-key-parity, en-zh-key-parity, console-copy-system-noun-12956 and five scripts suites. Result: 'Test Files 16 passed (16) / Tests 313 passed (313)', exit 0, at d116713. (B) Under the lock: vitest --maxWorkers=2 over packages/types/, packages/i18n/, app-shell console/home/, environment/, hooks/ and console/blocks/, the ratchet, the runAction scan, the cli ratchet, known-schema-types-derivation-5115, check-sdui-registration-pins, check-side-effects-array, vite-declared-lazy-views, side-effects-declaration-consistency and check-eager-closure-budget. Result: 'Test Files 585 passed (585) / Tests 13106 passed | 13 skipped (13119)', 'VERDICT command-exit 0', at d116713. The only delta from d116713 to head 4f180c4 is two pending-changeset prose lines, which no file in the set reads. (C) Under the lock at 4f180c4: turbo build --filter=@object-ui/app-shell^... gave 'Tasks: 28 successful, 28 total'. Then type-check printed 'TYPECHECK types=0 i18n=0 cli=0 app-shell=0'. tsc -p tsconfig.test.json --listFilesOnly shows the five edited app-shell tests and both edited types tests in the compiled set. The cli tsconfig includes src/**/. ABLATION at 4f180c4 (one-shot, nothing committed): node objectstack/scripts/ablation-replace.mjs re-planted cloudPlanStatus: { current: 'Current plan' } in packages/i18n/src/locales/en.ts. It reported 'anchor 1 to 0, blob 6043d2a1d4eb to fe749dda5234', and the mutated file grep-counted cloudPlanStatus 1. Under the lock, the ratchet test and all-locales-key-parity gave 'Test Files 2 failed (2) / Tests 10 failed | 67 passed (77)', 'VERDICT command-exit 1'. The failures were 'en: no key is added under a frozen namespace unless the live list carries it' and nine 'X is missing 1 key(s): [cloudPlanStatus.current]'. Restore: 'ok restored: blob == HEAD (6043d2a1d4eb) and git diff HEAD is empty'. git hash-object matched HEAD:en.ts (6043d2a1d4ebd55ab9bcdb2dda8b5d7ebefd1037). The restored rerun of the same two files: 'Test Files 2 passed (2) / Tests 77 passed (77)', with cloudPlanStatus count 0. The direction was red, as predicted. test:repo was not run locally; it belongs to CI.",
"gates": "Each local exit code was captured before any pipe. All runs at 4f180c4 unless noted. check:side-effects-array exit 0 ('@object-ui/app-shell: sideEffects names exactly the 18 module(s)'). check:sdui-registration-pins: exit 2 before any build (PREREQUISITE NOT MET, not a reading). After turbo build --filter=@object-ui/console under the lock ('Tasks: 35 successful, 35 total'), it printed 'All 18 registration(s) a sideEffects array promises are present in the built console (2258 chunks weighed; the 2 ruled control(s) are in the derived set)', VERDICT command-exit 0. Lazy-views check: it has no package.json name. It runs as the declared-lazy-views plugin inside that console build, which printed '10/11 modules AppContent declares lazy are genuinely lazy; 1 eager, all pinned'; its test suite passed in (B). node scripts/check-changeset-presence.mjs exit 0 ('38 source file(s) and 1 published-contract change(s) of 4 released package(s) changed ... declares 1 changeset(s)'). pnpm changeset:check exit 0. pnpm check:changeset-claims exit 0 (report-only): self-contradiction corpus 3 changesets, ✅. The two went-false notices (11573, 12288) were re-read and are still true. node scripts/check-governed-queue-guard.mjs --test on the 45-file list exit 0 'NOT GOVERNED'. Also exit 0: check:new-line-citations, check:control-bytes, check:i18n-keys, check:i18n-drift, check:i18n-dead-keys, check:doc-types, check:registry-bare-names, check:prompt-keys, check:unreferenced-sources, check:pending-changeset-literals. check:readme-exports first exited 1 with 'type entry not on disk -- run pnpm build first' (a prerequisite, not a red gate). After building cli and plugin-ai under the lock it exited 0 'OK'. No --ran reconciliation: objectui has no dispatch-gates.mjs, so the families were derived by hand from the dispatch list and package.json check: names that read the changed files. CI: PR #12969 check-runs on 4f180c4 at report time: 35 total, 3 success, 3 skipped, 29 in_progress. NOT MEASURED: the CI conclusions, still in_progress.",
"mcp_calls": "0",
"api_writes": "2 relay strokes (scripts/pm/fleet-write/dispatch.mjs, transport dispatch, landing as objectstack-fleet[bot]). (1) POST /repos/objectstack-ai/objectstack/dispatches (HTTP 204, run 39133403290 success) executed op pr_create: POST /repos/objectstack-ai/objectui/pulls (draft) and POST /repos//issues/12969/assignees [sunhaolin]. Read-back: 13072 bytes sent and 13072 stored, identical. (2) POST /repos/objectstack-ai/objectstack/dispatches executed op comment: POST /repos//issues/12954/comments (this report). Plus git push of the branch, which is not a REST write. No label, assignee or card-body writes.",
"open_questions": [
{
"question": "Which Clause-② value should the PR carry? The claim and the PR body say Clause-②: yes, copied verbatim as os-dev requires. pm-dispatch execution-duties reads a narrowing of a published accept set as Clause-②: no, and contract-review names Clause-②: no (narrowing) as the declaration for that tier. The objectui#12733 retirement precedent wrote no (narrowing) in both its body and its changeset. This PR only narrows: it widens nothing.",
"options": [
"A: keep yes as the claim declared. It is conservative, and the seat already schedules a contract review before ACCEPT.",
"B: the seat re-declares no (narrowing) on the PR, which matches execution-duties and the 12733 precedent. Under the dev's one-write rule, that body edit is a seat write."
],
"recommendation": "B, because the declaration should match the rule text and precedent. It costs the seat one body edit, and the review tier is the same CONTRACT_REVIEW_TIER either way. A is safe if the seat prefers not to touch the body."
}
],
"out_of_scope_findings": [
"class: a (published release text that is wrong) · reach: exception: release-text. .changeset/11930-workspace-timezone-notice.md publishes the English example 'The workspace timezone was set to Asia/Shanghai from your browser when the workspace was created.' verbatim, but en.ts cloudWorkspaceTimezoneNotice.seeded now reads 'The environment timezone was set to {{zone}} from your browser when the environment was created.' The copy changed in 473e5a0 (PR #12865, objectui#12851), not in this PR, and the pending changeset was not updated. git log -S found both the adding and the changing commit despite the shallow clone. Left untouched here; the paragraph is named in the PR's Acceptance notes. Dedupe words: 11930 changeset English example, workspace timezone notice copy, pending changeset stale example, environment timezone was set.",
"carrier: 承接者:无 · noted, not filed. In objectstack, packages/spec/src/ui/app.zod.ts has a doc comment (the sentence with 'CloudOnboardingNext.tsx concatenating the query') that cites the retired widget's file. It becomes a stale citation once PR #12969 lands. It is drift in a comment, so it is not one of classes a, b or c. Per the dispatch, objectstack was not edited."
]
}
Claim: PM loop round 6 · amended (Clause-②: the seat declared yes, but a narrowing reads no, per execution-duties.md:108 and contract-review.md:12; the file surface widens to the readers the dev measured in 6250740270 and PR #12969; the two pending changesets the PR corrects) (priority:p3; triage 6249067149)
Session: session_0188TsgPV8kQXfuRuKmkj2ks
Account: sunhaolin (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12954-retire-cloud-widgets
Worktree: objectui-issue-12954
Domain: domain:ui
Seat: domain:ui#1
File surface: the card's path list, re-read at 7f9cc37d:
packages/app-shell/src/console/home/CloudOnboardingNext.tsx, CloudPlanStatus.tsx and their tests;
packages/app-shell/src/index.ts and packages/app-shell/package.json (exports only);
product-specific.allowlist.json and product-neutral-renderer.ratchet.test.ts;
the cloudOnboarding.* and cloudPlanStatus.* keys in packages/i18n/src/locales/*.ts;
the type arm in packages/types/src/{cloud.ts,zod/cloud.zod.ts,index.ts,zod/index.zod.ts} and its test cloud-plan-status-arm-10919.test.ts;
packages/cli/src/utils/known-schema-types.ts;
scripts/check-sdui-registration-pins.mjs, scripts/check-side-effects-array.mjs and scripts/vite-declared-lazy-views.ts (their inputs);
one changeset;
widened, as measured in the dev's report: navRunAction.privateConventionRetired.test.ts, productBlocks-12197.test.tsx, useEnvironmentEntitlements.oneRequest-12808.test.tsx, useNavRunAction.ts and its test, registered-types-validate-ratchet-10859.test.ts, zod-mirror-parity.test.ts, any-component-emit-headroom-11573.test.ts, the check-sdui-registration-pins and check-side-effects-array tests, and comments in 7 files that named a retired widget as live;
the prose of the pending changesets 11659 and 11930 (front matter untouched), including the stale English example in 11930 that the dev reported.
⛔ Keep useEnvironmentEntitlements.
Stop on breach; explain in the report.
Container & model: M, mode:subagent, model: opus (default tier: a published export and a published schema arm retire)
Clause-②: no
Clause-② reason: a narrowing only. @object-ui/types stops accepting cloud:plan-status, @object-ui/app-shell drops two registered renderer types, and nothing widens. The PR body and changeset carry Clause-②: no (narrowing) at line start, and a CONTRACT_REVIEW_TIER review over the full non-prose diff comes before ACCEPT.
Responsibility: n/a — a zero-consumer retirement
Thread-read: 6250740270
Serial constraints cleared: read at objectui main7f9cc37d.
Delta to the report in comment 6250740270: the seat answered B on the Clause-② question. The newest Claim is 6250754815 (Clause-②: no), confirmed before editing.
Commit dc7e75a4 on claude/issue-12954-retire-cloud-widgets (pushed; it touches two .changeset files only):
.changeset/12954-retire-cloud-onboarding-plan-status.md gains a line-start Clause-②: no (narrowing). That changeset had no Clause-② line before (the yes was only in the PR body), so the line is appended at the end, where the objectui#12733 precedent put it. The fleet reader readClause2Line answers declared · no · narrowing for both carriers.
.changeset/11930-workspace-timezone-notice.md: the English example is now the cloudWorkspaceTimezoneNotice.seeded text read from en.ts, rendered with Asia/Shanghai. Only line 21 changed. This closes the release-text finding in that report.
Gates at dc7e75a4: pnpm check:changeset-claims exit 0 (self-contradiction ✅ over 3 changesets), pnpm changeset:check exit 0, node scripts/check-changeset-presence.mjs exit 0.
Delta after contract review 6251061657 (FAIL, one reason): the retired cloud:plan-status literal is now refused by name.
Commit 47da571a (pushed). In packages/types/src/zod/cloud.zod.ts, RetiredCloudPlanStatusNodeSchema = retiredNodeType('cloud:plan-status', GUIDANCE) sits beside where the old arm stood. The guidance is worded from the changeset: compose the page from generic blocks, as objectstack-ai/cloud#3010 did, and mark the current plan with a visibleWhen on the same summary (GET /api/v1/cloud/home). index.zod.ts lists the arm in AnyComponentSchema and does not export it (the kanban precedent). tombstone.zod.ts and complex.zod.ts are untouched.
New pin cloud-plan-status-retired-12954.test.ts, in the 8802 shape. A stale node gets exactly one custom issue at type carrying RETIRED, visibleWhen and /api/v1/cloud/home. The surviving cloud:workspace-timezone-notice is still accepted, and an unknown cloud: literal still takes the generic path (no custom issue, no remedy text). Compile-time pins: AnySchema has no cloud:plan-status member, and still has the timezone-notice member.
What moved, each measured: the cli ratchet case is now a named-refusal pin (custom at type with visibleWhen; refusedAtType is now false, and an unknown cloud: control is still true). The emit-headroom member list gains RetiredCloudPlanStatusNodeSchema as an inline arm. The surface widens to two ledgers the review did not name: arm-named-export-8784, which demands a barrel export or an ABSENT_BY_DECISION row (row added), and the zod-mirror-parityEXCLUSIONS census of every exported zod const (row added). No TypeScript twin is needed, as its comment says. zod/README.md gains a prose note; check:doc-types stays green on it with no exemption, because that file is not in its scan. The changeset now says the literal is refused by name with the remedy, and Clause-②: no (narrowing) stays.
Gates at 47da571a: vitest packages/types/ plus the cli ratchet: 389 files and 10573 tests passed. pnpm --filter @object-ui/types type-check exit 0, and it compiles the 8802 file and the new pin. A cli closure build (8/8 tasks) then cli type-check exit 0. check:doc-types, check:changeset-claims, changeset:check and check-changeset-presence all exit 0. The governed guard reports NOT GOVERNED (49 paths).
Ablation: I deleted the arm from AnyComponentSchema (anchor 1 to 0, blob changed). Result: 2 files and 4 tests red (suite 1 times three, plus the cli case), and the controls stayed green. The restore was proven (blob equal to HEAD, empty git diff HEAD), and the rerun was 40/40 passed.
The reading this card asked for, taken by this seat on objectstack-ai/cloud origin/main72042a4c with git grep -F, .changeset/** and CHANGELOG.md excluded:
token
live declarations
other mentions
cloud:onboarding-next
0
comments, and welcome.page.test.ts:234not.toContain
cloud:plan-status
0
comments, pricing.page.test.ts:141not.toContain, and a test title that quotes the old words
CloudOnboardingNext
0
one test comment
CloudPlanStatus
0
none
Every mention is a comment, a test that asserts absence, or a changeset. cloud has no consumer left.
The maintainer's go-ahead. The seat put to the maintainer in chat: 「可以回「12954 免 cloud 核查」放行」. The maintainer answered 「同意你的建议」. The Maintainer-action line is done.
Claim: PM loop round 13 (priority:p1, landing: bring PR #12969 up to date with main and land it)
Session: session_01XVp19E1MYUTFM3dnkwz8gB
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12954-retire-cloud-widgets (PR #12969, head 47da571a; released by domain:ui seat 1 at its clock-out, Release: comment on this card)
Worktree: objectui-issue-12954-land
Domain: domain:ui
Seat: domain:ui#2
File surface: PR #12969's existing 49 files, plus only what merging origin/main (35 commits ahead, incl. objectui#13020's vite-declared-lazy-views count) requires to resolve. ⛔ No new behaviour. Stop on breach; explain in the report.
Container & model: S, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui reads no path-derived mandate)
Clause-②: no (narrowing). Contract review PASS 6251481920 on 47da571a (after FAIL 6251061657); a merge of main adds no contract change, so it is re-judged only if the merge touches the retired surface.
Responsibility: n/a — a retirement card (the maintainer's go-ahead 「同意你的建议」 and the cloud reading of 0 consumers, triage 6261999412)
Thread-read: 6261999412
Serial constraints cleared: no other open objectui PR touches these files.
Claimed at: 2026-10-19T08:25Z
os-dev-report
{
"issue": 12954,
"status": "done",
"branch": "claude/issue-12954-retire-cloud-widgets",
"pr": "#12969",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"summary": "Landing round: merged origin/main d14ba96 (35 commits) into the PR branch as merge commit 1152059 (parents 47da571 + d14ba96); pushed, remote ref reads 1152059. Zero textual conflicts: the 13 files both sides touched (EnvironmentListToolbar.tsx, useEnvironmentEntitlements.ts, known-schema-types.ts, the ten locales) took disjoint hunks, kept both. Count/ledger re-derivation: the PR never moved the declared-lazy-views count (it edited only a comment in scripts/vite-declared-lazy-views.ts), so main's 12 with AppReportIndexView stands and its pin passes; main's retirement of field:permission-facet-link and the PR's cloud retirements compose (cli ratchet, registration pins 18/18, product-neutral allowlist all green). The retired surface (tombstone, Clause-2 narrowing, changeset) is byte-unchanged by the merge, so no contract re-review is triggered. No new behaviour, no new files. mergeable_state after push: behind (main advanced 1 commit to b014f5e, objectui#13031 tooling-only pin manifests) with mergeable true; the merge queue rebuilds on main, so I did not chase it.",
"tests": "All at head 1152059. Closure build (cli^/app-shell^/i18n^/types^ deps) under lock VERDICT command-exit 0. type-check: types 0, app-shell 0, cli 0, i18n 0 (each echoed its type-check script; app-shell/i18n/types include tsconfig.test.json). Targeted vitest --maxWorkers=1, 18 files (every PR-touched test plus families cloud-plan-status, navRunAction, registered-types-validate, zod-mirror-parity incl. base-schema, check-sdui-registration-pins, check-side-effects-array, vite-declared-lazy-views, appRouteChunks, console-copy-system-noun, productBlocks, product-neutral-renderer ratchet): Test Files 18 passed (18), Tests 301 passed (301), VERDICT command-exit 0. Console closure build (turbo 35/35) under lock exit 0, then check:eager-closure 0 and check-sdui-registration-pins 0 (All 18 registrations present, 2261 chunks). Pre-tsc battery: check:phantom-deps 0, check:self-import 0, check:unreferenced-sources 0, check:doc-example-readers 0, check:handler-key-reads 0, check:side-effects-array 0, check:element-data-source-declaration 0, check:spec-symbols 0, check:action-forward-parity 0, check:designer-field-key-parity 0, check:icon-record-names 0, check:i18n-keys 0, check:i18n-drift 0, check:i18n-designer-parity 0, check:control-bytes 0; check-hand-rolled-comment-mask 0. check:spec-floors 1 (no-artifact for unbuilt packages; recorded per order, not fixed). Changesets: check-changeset-fixed 0, check-changeset-presence 0, check:changeset-claims 0, changeset:check 0, check-changeset-no-major 0. eslint narrowed: 38 changed ts/tsx/mjs files vs origin/main merge-base, population = root eslint.config.js, count from --format json = 38 files, 0 errors 63 warnings, 0 ignored; config has no type-aware linting (no parserOptions.project/projectService), so the diff cannot move any untouched file's verdict. NOT MEASURED: whole-package-directory vitest runs for types/app-shell/cli/i18n/scripts, reason: the order's Lock section forbids whole-package-directory runs; declared to CI. No ablation this round (no new assertion).",
"mcp_calls": "0",
"api_writes": "1 — fleet-write relay op comment POST /repos//issues/12954/comments (this report); plus 1 git push (not REST)",
"open_questions": [
{
"question": "The order both says run each touched package dir under the lock and, in its Lock section, forbids whole-package-directory runs. I followed the prohibition and declared full dirs to CI. Should the landing seat require them locally?",
"options": [
"A keep declared to CI (merge queue runs the full suite on rebuilt main)",
"B a follow-up round runs types/app-shell/cli/i18n dirs under the lock"
],
"recommendation": "A, because the merge was conflict-free with disjoint hunks, every family the order named passed, and the queue runs the full matrix anyway"
}
],
"out_of_scope_findings": [],
"deviations": [
"merge commit message amended locally before push to carry the model-free trailer pair (git's default merge message has none)",
"package-dir vitest runs declared to CI, see open_questions"
],
"files_changed": "merge only: no file outside the merge of main changed; branch diff vs main is still the PR's 49 files",
"gates": {
"tc-types": "0",
"tc-app-shell": "0",
"tc-cli": "0",
"tc-i18n": "0",
"vitest-targeted": "0",
"check:phantom-deps": "0",
"check:self-import": "0",
"check:unreferenced-sources": "0",
"check:doc-example-readers": "0",
"check:handler-key-reads": "0",
"check:side-effects-array": "0",
"check:element-data-source-declaration": "0",
"check:spec-symbols": "0",
"check:action-forward-parity": "0",
"check:designer-field-key-parity": "0",
"check:icon-record-names": "0",
"check:i18n-keys": "0",
"check:i18n-drift": "0",
"check:i18n-designer-parity": "0",
"check:control-bytes": "0",
"check:spec-floors": "1",
"check-hand-rolled-comment-mask": "0",
"check-changeset-fixed": "0",
"check-changeset-presence": "0",
"check:changeset-claims": "0",
"changeset:check": "0",
"check-changeset-no-major": "0",
"eslint-narrowed": "0",
"check:eager-closure": "0",
"check-sdui-registration-pins": "0"
}
}
PR #12969 at head 1152059 (Fixes #12954), landed by this seat after domain:ui seat 1's release at clock-out. Reviewed against seat 1's Release: comment, the triage 6261999412 (the cloud reading of 0 consumers, and the maintainer's go-ahead 「同意你的建议」 to 「12954 免 cloud 核查」), the contract reviews 6251061657 (FAIL, no tombstone) and 6251481920 (PASS on 47da571a), this seat's claim 6262954430 and the landing-round report 6263402993.
What the PR does (seat 1's accepted scope, unchanged): it retires the cloud:onboarding-next and cloud:plan-status page node types and their CloudOnboardingNext / CloudPlanStatus widgets. RetiredCloudPlanStatusNodeSchema refuses the retired literal by name (retiredNodeType, the objectui#8802 shape). Registration pins, the cli known-types ratchet, the product-neutral allowlist and the i18n keys follow.
Landing round (1152059, a merge commit; parents 47da571a, maind14ba963): 35 commits of main were merged with no textual conflict. Thirteen files were touched on both sides with no overlapping hunks; both sides were kept.
The PR only edits a comment in scripts/vite-declared-lazy-views.ts, so main's count of 12 (objectui#13020) stands.
main's retirement of field:permission-facet-link composes with this one: the cli ratchet, the registration pins (18/18) and the allowlist are green.
The seat checked the diff against main: still exactly the PR's 49 files. The tombstone, cloud.zod.ts, cloud.ts and the changeset are byte-identical to the reviewed head 47da571a, so the PASS 6251481920 stands with no new review owed.
Clause-②: no (narrowing) with contract review PASS; target:v18; a breaking narrowing that rides the major (objectui is in pre on next).
Local gates (landing round): 18 files / 301 tests across every touched test file and the named families; types / app-shell / cli / i18n type-check 0; check:eager-closure 0; check-sdui-registration-pins 0; the pre-tsc battery 0; every changeset check 0; eslint 0 errors. Package directories are declared to CI, the dev's open question answered A.
Commits: trailers are model-free, the merge commit included.
CI at head: 36/36 check-runs success or skipped on 1152059 (filter=latest), mergeable_state clean.
Verdict: ACCEPT. The seat marks the PR ready and enables auto-merge; the merge queue lands it on current main.
Merged as 30083da on main. Verified by content against the accepted head 1152059: 44 of the 49 files in 30083da^1..30083da are blob-identical, and the other 5 are the PR's deletions (CloudOnboardingNext.tsx, CloudPlanStatus.tsx, their two tests, and cloud-plan-status-arm-10919.test.ts), absent on both sides. The squash message is model-free.
What landed: the cloud:onboarding-next and cloud:plan-status page node types and their widgets are retired. A page that still names cloud:plan-status is refused by name (RetiredCloudPlanStatusNodeSchema). This is a breaking narrowing under target:v18, with contract review PASS 6251481920; cloud carries 0 consumers (triage 6261999412).
The card closed via Fixes #12954; pm:dispatched is removed with this note. Thanks to domain:ui seat 1 for the PR, the review rounds and the release state that made the hand-over clean.
Activity
objectstack-fleet commentedon Oct 18, 2026
Triage: p3 ·
domain:ui·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-18T11:03ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
domain:ui.mainand objectstack-ai/hotcrmmainforcloud:onboarding-nextandcloud:plan-status.mainto that grep: the framework's console pin and any spec or docs mention of either type.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Pre-dispatch readings ·
domain:uiseat 1 ·session_0188TsgPV8kQXfuRuKmkj2ks· 2026-10-18T11:10Z⛔ Not a claim. These are this card's own precondition and the triage addition, read by the seat before dispatch.
cloud:onboarding-next,cloud:plan-status,CloudOnboardingNext,CloudPlanStatusmain3b05ae7main0b44840dfdpackages/spec/src/ui/app.zod.ts:501, which citesCloudOnboardingNext.tsxas an example. No registration and no console-pin use.mainHeld, not dispatched:
domain:uiseat 2). Both touchpackages/i18n/src/locales/*.ts, and fix(i18n): console copy names the system the user is in, not the cloud noun (objectui#12956) #12959 also touchespackages/app-shell/src/console/home/HomePage.tsx. So this card goes after that PR lands.mainto post the cloud reading here: the sha and the hit count for the four strings above.repo:cloudseat 2, which filed this card, is the natural reader.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Claim: PM loop round 6 (
priority:p3; triage6249067149; the seat's pre-dispatch readings6249167259)Session:
session_0188TsgPV8kQXfuRuKmkj2ksAccount:
sunhaolin(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12954-retire-cloud-widgetsWorktree:
objectui-issue-12954Domain:
domain:uiSeat:
domain:ui#1File surface: the card's path list, re-read at
7f9cc37d:packages/app-shell/src/console/home/CloudOnboardingNext.tsx,CloudPlanStatus.tsxand their tests;packages/app-shell/src/index.tsandpackages/app-shell/package.json(exports only);product-specific.allowlist.jsonandproduct-neutral-renderer.ratchet.test.ts;cloudOnboarding.*andcloudPlanStatus.*keys inpackages/i18n/src/locales/*.ts;packages/types/src/{cloud.ts,zod/cloud.zod.ts,index.ts,zod/index.zod.ts}and its testcloud-plan-status-arm-10919.test.ts;packages/cli/src/utils/known-schema-types.ts;scripts/check-sdui-registration-pins.mjs,scripts/check-side-effects-array.mjsandscripts/vite-declared-lazy-views.ts(their inputs);useEnvironmentEntitlements.Stop on breach; explain in the report.
Container & model:
M,mode:subagent,model: opus(default tier: a published export and a published schema arm retire)Clause-②: yes
Clause-② reason:
@object-ui/typesstops acceptingcloud:plan-status(a narrowed accept set), and@object-ui/app-shelldrops two exports and two registered renderer types. The zero-consumer premise is cloud PR #3010; hotcrm and objectstack read 0 consumers (6249167259). ACONTRACT_REVIEW_TIERreview comes before ACCEPT.Responsibility: n/a — a zero-consumer retirement
Thread-read: 6249167259
Serial constraints cleared: read at objectui
main7f9cc37d.console/home/HomePage.tsx, has merged.mainfor the four type strings is on the card. A cloud hit stops the removal.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
os-dev-report
{
"issue": 12954,
"status": "done",
"branch": "claude/issue-12954-retire-cloud-widgets",
"pr": "#12969",
"session": "session_0188TsgPV8kQXfuRuKmkj2ks — mode:subagent, so this is the parent seat's id; the identity is the branch named in Claim 6249765955 (confirmed as the newest Claim before editing)",
"premise_still_valid": true,
"summary": "Retired cloud:onboarding-next and cloud:plan-status per the ruling, with no alias and no staged window. app-shell: deleted both widgets and their tests, their two side-effect imports and four sideEffects entries, and the internal navRunActionHref helper, whose only caller was CloudOnboardingNext. It was not exported (the exports map is only . and ./styles.css). types: deleted CloudPlanStatusSchema (the TS interface, the zod arm, the entry, ./zod and union membership, the README row) and cloud-plan-status-arm-10919.test.ts. i18n: removed cloudOnboarding.* (5 keys) and cloudPlanStatus.current from all ten packs. cli: known-schema-types regenerated with scripts/regenerate-known-schema-types.mjs, which dropped exactly 3 keys. The allowlist lost 3 registrations, 2 files and 2 i18n namespaces (6 leaf keys). useEnvironmentEntitlements is kept, and its one-request pin (oneRequest-12808) was rewritten over the readers that remain. One changeset: minor for app-shell, types, i18n and cli, naming every removed key, type and key family and the consumer reading. useEnvironmentEntitlements, CloudWorkspaceTimezoneNotice and the ADR-0060 frozen ceiling are kept. ZONE 2 MEASURED: (1) The path list was NOT complete. The dispatch pattern finds 45 files at 7f9cc37, CHANGELOGs included, and a wider pattern for the nested
cloudOnboarding: {blocks adds 9 locale packs. Beyond the card's list, these readers had to move: navRunAction.privateConventionRetired.test.ts (it read the deleted file), productBlocks-12197.test.tsx (its control kept onboarding-next registered), useEnvironmentEntitlements.oneRequest-12808.test.tsx, useNavRunAction.ts and its test, registered-types-validate-ratchet-10859.test.ts (NAMESPACED_REFUSED_AT_TYPE 304 to 302, plus a new refusal case for cloud:plan-status), zod-mirror-parity.test.ts (EXPECTED_MIRROR_PAIRS 206 to 205), any-component-emit-headroom-11573.test.ts, check-sdui-registration-pins.test.ts and check-side-effects-array.test.ts, plus comments in 7 files that named a retired widget as live. Each one, removed or left with its reason, is in the PR body table. This extends the claim's file surface, and I declare it here. (2) HomePage.tsx mounts neither widget: 0 hits. (3) objectstack is untouched. Its sdui.manifest.json and scripts/sdui-manifest.record.json carry 0 hits for either key at the local objectstack checkout fb6fb24e2f (shallow; origin/main not refetched). The app.zod.ts doc comment that cites CloudOnboardingNext.tsx is reported below. CORRECTIONS TO THE DISPATCH TEXT: app-shell never exported either component by name; it registered them through side-effect imports, so the named exports that retire are CloudPlanStatusSchema in @object-ui/types (entry and ./zod). 'Allowlist down by exactly two' is, measured, 15 entries: 3 registrations, 2 files, 2 namespaces with 6 keys. The ratchet requires the list to equal the measurement. ALSO EDITED: two pending changesets' prose, front matter untouched. 11659 described the onboarding-next button and keys as shipping, and 11930 named cloud:plan-status as a reader of the hook. Both go false in the same release, and check:changeset-claims tells a change to correct such bodies. Landing gate: the cloud main reading is still owed on the card. This session made no attempt to read cloud.","tests": "Head 4f180c4. (A) Narrowed, unlocked, declared (the lock was held about 56 min by an issue-12957 full-package run): vitest --maxWorkers=1 over 16 single files, namely the ratchet, the runAction scan, useNavRunAction, oneRequest-12808, productBlocks-12197, CloudWorkspaceTimezoneNotice, HomePage.approvalsTarget, the cli ratchet, all-locales-key-parity, en-zh-key-parity, console-copy-system-noun-12956 and five scripts suites. Result: 'Test Files 16 passed (16) / Tests 313 passed (313)', exit 0, at d116713. (B) Under the lock: vitest --maxWorkers=2 over packages/types/, packages/i18n/, app-shell console/home/, environment/, hooks/ and console/blocks/, the ratchet, the runAction scan, the cli ratchet, known-schema-types-derivation-5115, check-sdui-registration-pins, check-side-effects-array, vite-declared-lazy-views, side-effects-declaration-consistency and check-eager-closure-budget. Result: 'Test Files 585 passed (585) / Tests 13106 passed | 13 skipped (13119)', 'VERDICT command-exit 0', at d116713. The only delta from d116713 to head 4f180c4 is two pending-changeset prose lines, which no file in the set reads. (C) Under the lock at 4f180c4: turbo build --filter=@object-ui/app-shell^... gave 'Tasks: 28 successful, 28 total'. Then type-check printed 'TYPECHECK types=0 i18n=0 cli=0 app-shell=0'. tsc -p tsconfig.test.json --listFilesOnly shows the five edited app-shell tests and both edited types tests in the compiled set. The cli tsconfig includes src/**/. ABLATION at 4f180c4 (one-shot, nothing committed): node objectstack/scripts/ablation-replace.mjs re-planted
cloudPlanStatus: { current: 'Current plan' }in packages/i18n/src/locales/en.ts. It reported 'anchor 1 to 0, blob 6043d2a1d4eb to fe749dda5234', and the mutated file grep-counted cloudPlanStatus 1. Under the lock, the ratchet test and all-locales-key-parity gave 'Test Files 2 failed (2) / Tests 10 failed | 67 passed (77)', 'VERDICT command-exit 1'. The failures were 'en: no key is added under a frozen namespace unless the live list carries it' and nine 'X is missing 1 key(s): [cloudPlanStatus.current]'. Restore: 'ok restored: blob == HEAD (6043d2a1d4eb) and git diff HEAD is empty'. git hash-object matched HEAD:en.ts (6043d2a1d4ebd55ab9bcdb2dda8b5d7ebefd1037). The restored rerun of the same two files: 'Test Files 2 passed (2) / Tests 77 passed (77)', with cloudPlanStatus count 0. The direction was red, as predicted. test:repo was not run locally; it belongs to CI.","gates": "Each local exit code was captured before any pipe. All runs at 4f180c4 unless noted. check:side-effects-array exit 0 ('@object-ui/app-shell: sideEffects names exactly the 18 module(s)'). check:sdui-registration-pins: exit 2 before any build (PREREQUISITE NOT MET, not a reading). After turbo build --filter=@object-ui/console under the lock ('Tasks: 35 successful, 35 total'), it printed 'All 18 registration(s) a sideEffects array promises are present in the built console (2258 chunks weighed; the 2 ruled control(s) are in the derived set)', VERDICT command-exit 0. Lazy-views check: it has no package.json name. It runs as the declared-lazy-views plugin inside that console build, which printed '10/11 modules AppContent declares lazy are genuinely lazy; 1 eager, all pinned'; its test suite passed in (B). node scripts/check-changeset-presence.mjs exit 0 ('38 source file(s) and 1 published-contract change(s) of 4 released package(s) changed ... declares 1 changeset(s)'). pnpm changeset:check exit 0. pnpm check:changeset-claims exit 0 (report-only): self-contradiction corpus 3 changesets, ✅. The two went-false notices (11573, 12288) were re-read and are still true. node scripts/check-governed-queue-guard.mjs --test on the 45-file list exit 0 'NOT GOVERNED'. Also exit 0: check:new-line-citations, check:control-bytes, check:i18n-keys, check:i18n-drift, check:i18n-dead-keys, check:doc-types, check:registry-bare-names, check:prompt-keys, check:unreferenced-sources, check:pending-changeset-literals. check:readme-exports first exited 1 with 'type entry not on disk -- run pnpm build first' (a prerequisite, not a red gate). After building cli and plugin-ai under the lock it exited 0 'OK'. No --ran reconciliation: objectui has no dispatch-gates.mjs, so the families were derived by hand from the dispatch list and package.json check: names that read the changed files. CI: PR #12969 check-runs on 4f180c4 at report time: 35 total, 3 success, 3 skipped, 29 in_progress. NOT MEASURED: the CI conclusions, still in_progress.",
"mcp_calls": "0",
"api_writes": "2 relay strokes (scripts/pm/fleet-write/dispatch.mjs, transport dispatch, landing as objectstack-fleet[bot]). (1) POST /repos/objectstack-ai/objectstack/dispatches (HTTP 204, run 39133403290 success) executed op pr_create: POST /repos/objectstack-ai/objectui/pulls (draft) and POST /repos//issues/12969/assignees [sunhaolin]. Read-back: 13072 bytes sent and 13072 stored, identical. (2) POST /repos/objectstack-ai/objectstack/dispatches executed op comment: POST /repos//issues/12954/comments (this report). Plus git push of the branch, which is not a REST write. No label, assignee or card-body writes.",
"open_questions": [
{
"question": "Which Clause-② value should the PR carry? The claim and the PR body say
Clause-②: yes, copied verbatim as os-dev requires. pm-dispatch execution-duties reads a narrowing of a published accept set asClause-②: no, and contract-review namesClause-②: no (narrowing)as the declaration for that tier. The objectui#12733 retirement precedent wroteno (narrowing)in both its body and its changeset. This PR only narrows: it widens nothing.","options": [
"A: keep
yesas the claim declared. It is conservative, and the seat already schedules a contract review before ACCEPT.","B: the seat re-declares
no (narrowing)on the PR, which matches execution-duties and the 12733 precedent. Under the dev's one-write rule, that body edit is a seat write."],
"recommendation": "B, because the declaration should match the rule text and precedent. It costs the seat one body edit, and the review tier is the same CONTRACT_REVIEW_TIER either way. A is safe if the seat prefers not to touch the body."
}
],
"out_of_scope_findings": [
"class: a (published release text that is wrong) · reach: exception: release-text. .changeset/11930-workspace-timezone-notice.md publishes the English example 'The workspace timezone was set to Asia/Shanghai from your browser when the workspace was created.' verbatim, but en.ts cloudWorkspaceTimezoneNotice.seeded now reads 'The environment timezone was set to {{zone}} from your browser when the environment was created.' The copy changed in 473e5a0 (PR #12865, objectui#12851), not in this PR, and the pending changeset was not updated. git log -S found both the adding and the changing commit despite the shallow clone. Left untouched here; the paragraph is named in the PR's Acceptance notes. Dedupe words: 11930 changeset English example, workspace timezone notice copy, pending changeset stale example, environment timezone was set.",
"carrier: 承接者:无 · noted, not filed. In objectstack, packages/spec/src/ui/app.zod.ts has a doc comment (the sentence with '
CloudOnboardingNext.tsxconcatenating the query') that cites the retired widget's file. It becomes a stale citation once PR #12969 lands. It is drift in a comment, so it is not one of classes a, b or c. Per the dispatch, objectstack was not edited."]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Claim: PM loop round 6 · amended (Clause-②: the seat declared
yes, but a narrowing readsno, per execution-duties.md:108 and contract-review.md:12; the file surface widens to the readers the dev measured in6250740270and PR #12969; the two pending changesets the PR corrects) (priority:p3; triage6249067149)Session:
session_0188TsgPV8kQXfuRuKmkj2ksAccount:
sunhaolin(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12954-retire-cloud-widgetsWorktree:
objectui-issue-12954Domain:
domain:uiSeat:
domain:ui#1File surface: the card's path list, re-read at
7f9cc37d:packages/app-shell/src/console/home/CloudOnboardingNext.tsx,CloudPlanStatus.tsxand their tests;packages/app-shell/src/index.tsandpackages/app-shell/package.json(exports only);product-specific.allowlist.jsonandproduct-neutral-renderer.ratchet.test.ts;cloudOnboarding.*andcloudPlanStatus.*keys inpackages/i18n/src/locales/*.ts;packages/types/src/{cloud.ts,zod/cloud.zod.ts,index.ts,zod/index.zod.ts}and its testcloud-plan-status-arm-10919.test.ts;packages/cli/src/utils/known-schema-types.ts;scripts/check-sdui-registration-pins.mjs,scripts/check-side-effects-array.mjsandscripts/vite-declared-lazy-views.ts(their inputs);navRunAction.privateConventionRetired.test.ts,productBlocks-12197.test.tsx,useEnvironmentEntitlements.oneRequest-12808.test.tsx,useNavRunAction.tsand its test,registered-types-validate-ratchet-10859.test.ts,zod-mirror-parity.test.ts,any-component-emit-headroom-11573.test.ts, thecheck-sdui-registration-pinsandcheck-side-effects-arraytests, and comments in 7 files that named a retired widget as live;11659and11930(front matter untouched), including the stale English example in11930that the dev reported.useEnvironmentEntitlements.Stop on breach; explain in the report.
Container & model:
M,mode:subagent,model: opus(default tier: a published export and a published schema arm retire)Clause-②: no
Clause-② reason: a narrowing only.
@object-ui/typesstops acceptingcloud:plan-status,@object-ui/app-shelldrops two registered renderer types, and nothing widens. The PR body and changeset carryClause-②: no (narrowing)at line start, and aCONTRACT_REVIEW_TIERreview over the full non-prose diff comes before ACCEPT.Responsibility: n/a — a zero-consumer retirement
Thread-read: 6250740270
Serial constraints cleared: read at objectui
main7f9cc37d.console/home/HomePage.tsx, has merged.mainfor the four type strings is on the card. A cloud hit stops the removal.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Delta to the report in comment
6250740270: the seat answered B on the Clause-② question. The newest Claim is6250754815(Clause-②: no), confirmed before editing.dc7e75a4onclaude/issue-12954-retire-cloud-widgets(pushed; it touches two.changesetfiles only):.changeset/12954-retire-cloud-onboarding-plan-status.mdgains a line-startClause-②: no (narrowing). That changeset had noClause-②line before (theyeswas only in the PR body), so the line is appended at the end, where the objectui#12733 precedent put it. The fleet readerreadClause2Lineanswersdeclared · no · narrowingfor both carriers..changeset/11930-workspace-timezone-notice.md: the English example is now thecloudWorkspaceTimezoneNotice.seededtext read fromen.ts, rendered withAsia/Shanghai. Only line 21 changed. This closes the release-text finding in that report.dc7e75a4:pnpm check:changeset-claimsexit 0 (self-contradiction ✅ over 3 changesets),pnpm changeset:checkexit 0,node scripts/check-changeset-presence.mjsexit 0.issue_patch): line 2 now readsClause-②: no (narrowing), and the acceptance notes gain one line saying the 11930 example matchesen.ts. Read back: 13248 bytes sent and 13248 stored, identical, with the session-URL footer intact.4f180c41. The only delta todc7e75a4is these two changeset prose edits.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Delta after contract review
6251061657(FAIL, one reason): the retiredcloud:plan-statusliteral is now refused by name.47da571a(pushed). Inpackages/types/src/zod/cloud.zod.ts,RetiredCloudPlanStatusNodeSchema = retiredNodeType('cloud:plan-status', GUIDANCE)sits beside where the old arm stood. The guidance is worded from the changeset: compose the page from generic blocks, as objectstack-ai/cloud#3010 did, and mark the current plan with avisibleWhenon the same summary (GET /api/v1/cloud/home).index.zod.tslists the arm inAnyComponentSchemaand does not export it (the kanban precedent).tombstone.zod.tsandcomplex.zod.tsare untouched.cloud-plan-status-retired-12954.test.ts, in the 8802 shape. A stale node gets exactly onecustomissue attypecarryingRETIRED,visibleWhenand/api/v1/cloud/home. The survivingcloud:workspace-timezone-noticeis still accepted, and an unknowncloud:literal still takes the generic path (nocustomissue, no remedy text). Compile-time pins:AnySchemahas nocloud:plan-statusmember, and still has the timezone-notice member.customattypewithvisibleWhen;refusedAtTypeis now false, and an unknowncloud:control is still true). The emit-headroom member list gainsRetiredCloudPlanStatusNodeSchemaas aninlinearm. The surface widens to two ledgers the review did not name:arm-named-export-8784, which demands a barrel export or anABSENT_BY_DECISIONrow (row added), and thezod-mirror-parityEXCLUSIONScensus of every exported zod const (row added). No TypeScript twin is needed, as its comment says.zod/README.mdgains a prose note;check:doc-typesstays green on it with no exemption, because that file is not in its scan. The changeset now says the literal is refused by name with the remedy, andClause-②: no (narrowing)stays.47da571a: vitestpackages/types/plus the cli ratchet: 389 files and 10573 tests passed.pnpm --filter @object-ui/types type-checkexit 0, and it compiles the 8802 file and the new pin. A cli closure build (8/8 tasks) thencli type-checkexit 0.check:doc-types,check:changeset-claims,changeset:checkandcheck-changeset-presenceall exit 0. The governed guard reports NOT GOVERNED (49 paths).AnyComponentSchema(anchor 1 to 0, blob changed). Result: 2 files and 4 tests red (suite 1 times three, plus the cli case), and the controls stayed green. The restore was proven (blob equal to HEAD, emptygit diff HEAD), and the rerun was 40/40 passed.cloud:onboarding-nextis untouched (registration-only).Generated by Claude Code
5 remaining items
objectstack-fleet commentedon Oct 19, 2026
Maintainer-action answered: the cloud reading, and the maintainer's go-ahead · p1 +
target:v18·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-19T07:26ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
The reading this card asked for, taken by this seat on objectstack-ai/cloud
origin/main72042a4cwithgit grep -F,.changeset/**andCHANGELOG.mdexcluded:cloud:onboarding-nextwelcome.page.test.ts:234not.toContaincloud:plan-statuspricing.page.test.ts:141not.toContain, and a test title that quotes the old wordsCloudOnboardingNextCloudPlanStatusEvery mention is a comment, a test that asserts absence, or a changeset. cloud has no consumer left.
The maintainer's go-ahead. The seat put to the maintainer in chat: 「可以回「12954 免 cloud 核查」放行」. The maintainer answered 「同意你的建议」. The Maintainer-action line is done.
Grade p3 → p1 +
target:v18,pm:awaiting-maintainer→pm:queue.Clause-②: no (narrowing).6163099154), it rides the major. objectui is inpremode onnext.domain:uiseat lands PR feat(app-shell,types,i18n,cli)!: retire cloud:onboarding-next and cloud:plan-status (objectui#12954) #12969. The contract review PASSED at6251481920on47da571a, andmergeable_statereadcleanat this write. It ships in 18 if it lands first, and does not hold objectstack's release.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Claim: PM loop round 13 (
priority:p1, landing: bring PR #12969 up to date withmainand land it)Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12954-retire-cloud-widgets(PR #12969, head47da571a; released bydomain:uiseat 1 at its clock-out,Release:comment on this card)Worktree:
objectui-issue-12954-landDomain:
domain:uiSeat:
domain:ui#2File surface: PR #12969's existing 49 files, plus only what merging
origin/main(35 commits ahead, incl. objectui#13020'svite-declared-lazy-viewscount) requires to resolve. ⛔ No new behaviour. Stop on breach; explain in the report.Container & model:
S,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuireads no path-derived mandate)Clause-②: no (narrowing). Contract review PASS
6251481920on47da571a(after FAIL6251061657); a merge ofmainadds no contract change, so it is re-judged only if the merge touches the retired surface.Responsibility: n/a — a retirement card (the maintainer's go-ahead 「同意你的建议」 and the cloud reading of 0 consumers, triage
6261999412)Thread-read: 6261999412
Serial constraints cleared: no other open objectui PR touches these files.
Claimed at: 2026-10-19T08:25Z
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
os-dev-report
{
"issue": 12954,
"status": "done",
"branch": "claude/issue-12954-retire-cloud-widgets",
"pr": "#12969",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"summary": "Landing round: merged origin/main d14ba96 (35 commits) into the PR branch as merge commit 1152059 (parents 47da571 + d14ba96); pushed, remote ref reads 1152059. Zero textual conflicts: the 13 files both sides touched (EnvironmentListToolbar.tsx, useEnvironmentEntitlements.ts, known-schema-types.ts, the ten locales) took disjoint hunks, kept both. Count/ledger re-derivation: the PR never moved the declared-lazy-views count (it edited only a comment in scripts/vite-declared-lazy-views.ts), so main's 12 with AppReportIndexView stands and its pin passes; main's retirement of field:permission-facet-link and the PR's cloud retirements compose (cli ratchet, registration pins 18/18, product-neutral allowlist all green). The retired surface (tombstone, Clause-2 narrowing, changeset) is byte-unchanged by the merge, so no contract re-review is triggered. No new behaviour, no new files. mergeable_state after push: behind (main advanced 1 commit to b014f5e, objectui#13031 tooling-only pin manifests) with mergeable true; the merge queue rebuilds on main, so I did not chase it.",
"tests": "All at head 1152059. Closure build (cli^/app-shell^/i18n^/types^ deps) under lock VERDICT command-exit 0. type-check: types 0, app-shell 0, cli 0, i18n 0 (each echoed its type-check script; app-shell/i18n/types include tsconfig.test.json). Targeted vitest --maxWorkers=1, 18 files (every PR-touched test plus families cloud-plan-status, navRunAction, registered-types-validate, zod-mirror-parity incl. base-schema, check-sdui-registration-pins, check-side-effects-array, vite-declared-lazy-views, appRouteChunks, console-copy-system-noun, productBlocks, product-neutral-renderer ratchet): Test Files 18 passed (18), Tests 301 passed (301), VERDICT command-exit 0. Console closure build (turbo 35/35) under lock exit 0, then check:eager-closure 0 and check-sdui-registration-pins 0 (All 18 registrations present, 2261 chunks). Pre-tsc battery: check:phantom-deps 0, check:self-import 0, check:unreferenced-sources 0, check:doc-example-readers 0, check:handler-key-reads 0, check:side-effects-array 0, check:element-data-source-declaration 0, check:spec-symbols 0, check:action-forward-parity 0, check:designer-field-key-parity 0, check:icon-record-names 0, check:i18n-keys 0, check:i18n-drift 0, check:i18n-designer-parity 0, check:control-bytes 0; check-hand-rolled-comment-mask 0. check:spec-floors 1 (no-artifact for unbuilt packages; recorded per order, not fixed). Changesets: check-changeset-fixed 0, check-changeset-presence 0, check:changeset-claims 0, changeset:check 0, check-changeset-no-major 0. eslint narrowed: 38 changed ts/tsx/mjs files vs origin/main merge-base, population = root eslint.config.js, count from --format json = 38 files, 0 errors 63 warnings, 0 ignored; config has no type-aware linting (no parserOptions.project/projectService), so the diff cannot move any untouched file's verdict. NOT MEASURED: whole-package-directory vitest runs for types/app-shell/cli/i18n/scripts, reason: the order's Lock section forbids whole-package-directory runs; declared to CI. No ablation this round (no new assertion).",
"mcp_calls": "0",
"api_writes": "1 — fleet-write relay op comment POST /repos//issues/12954/comments (this report); plus 1 git push (not REST)",
"open_questions": [
{
"question": "The order both says run each touched package dir under the lock and, in its Lock section, forbids whole-package-directory runs. I followed the prohibition and declared full dirs to CI. Should the landing seat require them locally?",
"options": [
"A keep declared to CI (merge queue runs the full suite on rebuilt main)",
"B a follow-up round runs types/app-shell/cli/i18n dirs under the lock"
],
"recommendation": "A, because the merge was conflict-free with disjoint hunks, every family the order named passed, and the queue runs the full matrix anyway"
}
],
"out_of_scope_findings": [],
"deviations": [
"merge commit message amended locally before push to carry the model-free trailer pair (git's default merge message has none)",
"package-dir vitest runs declared to CI, see open_questions"
],
"files_changed": "merge only: no file outside the merge of main changed; branch diff vs main is still the PR's 49 files",
"gates": {
"tc-types": "0",
"tc-app-shell": "0",
"tc-cli": "0",
"tc-i18n": "0",
"vitest-targeted": "0",
"check:phantom-deps": "0",
"check:self-import": "0",
"check:unreferenced-sources": "0",
"check:doc-example-readers": "0",
"check:handler-key-reads": "0",
"check:side-effects-array": "0",
"check:element-data-source-declaration": "0",
"check:spec-symbols": "0",
"check:action-forward-parity": "0",
"check:designer-field-key-parity": "0",
"check:icon-record-names": "0",
"check:i18n-keys": "0",
"check:i18n-drift": "0",
"check:i18n-designer-parity": "0",
"check:control-bytes": "0",
"check:spec-floors": "1",
"check-hand-rolled-comment-mask": "0",
"check-changeset-fixed": "0",
"check-changeset-presence": "0",
"check:changeset-claims": "0",
"changeset:check": "0",
"check-changeset-no-major": "0",
"eslint-narrowed": "0",
"check:eager-closure": "0",
"check-sdui-registration-pins": "0"
}
}
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
ACCEPT · objectui#12954 · PR #12969 ·
domain:ui#2·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-19T09:06ZPR #12969 at head
1152059(Fixes #12954), landed by this seat afterdomain:uiseat 1's release at clock-out. Reviewed against seat 1'sRelease:comment, the triage6261999412(the cloud reading of 0 consumers, and the maintainer's go-ahead 「同意你的建议」 to 「12954 免 cloud 核查」), the contract reviews6251061657(FAIL, no tombstone) and6251481920(PASS on47da571a), this seat's claim6262954430and the landing-round report6263402993.cloud:onboarding-nextandcloud:plan-statuspage node types and theirCloudOnboardingNext/CloudPlanStatuswidgets.RetiredCloudPlanStatusNodeSchemarefuses the retired literal by name (retiredNodeType, the objectui#8802 shape). Registration pins, the cli known-types ratchet, the product-neutral allowlist and the i18n keys follow.1152059, a merge commit; parents47da571a,maind14ba963): 35 commits ofmainwere merged with no textual conflict. Thirteen files were touched on both sides with no overlapping hunks; both sides were kept.scripts/vite-declared-lazy-views.ts, somain's count of 12 (objectui#13020) stands.main's retirement offield:permission-facet-linkcomposes with this one: the cli ratchet, the registration pins (18/18) and the allowlist are green.main: still exactly the PR's 49 files. The tombstone,cloud.zod.ts,cloud.tsand the changeset are byte-identical to the reviewed head47da571a, so the PASS6251481920stands with no new review owed.target:v18; a breaking narrowing that rides the major (objectui is inpreonnext).types/app-shell/cli/i18ntype-check 0;check:eager-closure0;check-sdui-registration-pins0; the pre-tsc battery 0; every changeset check 0; eslint 0 errors. Package directories are declared to CI, the dev's open question answered A.1152059(filter=latest),mergeable_stateclean.Verdict: ACCEPT. The seat marks the PR ready and enables auto-merge; the merge queue lands it on current
main.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Landed · objectui#12954 · PR #12969 ·
domain:ui#2·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-19T09:25Z30083daonmain. Verified by content against the accepted head1152059: 44 of the 49 files in30083da^1..30083daare blob-identical, and the other 5 are the PR's deletions (CloudOnboardingNext.tsx,CloudPlanStatus.tsx, their two tests, andcloud-plan-status-arm-10919.test.ts), absent on both sides. The squash message is model-free.cloud:onboarding-nextandcloud:plan-statuspage node types and their widgets are retired. A page that still namescloud:plan-statusis refused by name (RetiredCloudPlanStatusNodeSchema). This is a breaking narrowing undertarget:v18, with contract review PASS6251481920; cloud carries 0 consumers (triage6261999412).Fixes #12954;pm:dispatchedis removed with this note. Thanks todomain:uiseat 1 for the PR, the review rounds and the release state that made the hand-over clean.Generated by Claude Code