Repository navigation
types,react,skills,docs: retire the node-level visibility dialects visibleOn / hiddenOn / disabledOn / visible and teach only visibleWhen #25926
Description
维护者速读
spec 18 的页面组件只声明 visibleWhen,表单字段/分区的 visibleOn 已是 retiredKey 墓碑。objectui 的节点级 BaseSchema、SchemaRenderer 仍读五个拼写,发布给客户的 skill 把 hiddenOn / visibleOn / disabledOn 当协议教。objectui#12654 / objectstack-ai/objectui#12692 / objectstack-ai/objectui#12696 只做了表单视图与设计器那一半。北极星:「退役立即生效,无过渡窗口、无别名双拼」「写给 AI 的文档与 skills 说错一句,等于产品缺陷」。
Measured (2026-10-24, HEAD 7981384, spec pin 915e940)
- Spec:
PageComponentSchemainpackages/spec/src/ui/page.zod.tsdeclaresvisibleWhenonly;FormFieldBaseSchema/FormSectionSchemainview.zod.tscarryvisibleOn: retiredKey(FORM_FIELD_VISIBLE_ON_RETIRED); nohiddenOnordisabledOnanywhere underpackages/spec/src/ui. - objectui:
packages/types/src/base.tsstill declares the membersvisible,visibleOn(JSDoc says deprecated),hiddenOn,disabledOn;packages/react/src/SchemaRenderer.tsxevaluates the chainVISIBILITY_SHOW_KEYS = ['visibleWhen', 'visible', 'visibleOn']andVISIBILITY_HIDE_KEYS = ['hidden', 'hiddenOn']. - Reach: 39 non-test source files and 56 test files mention
visibleOn|hiddenOn|disabledOn(command:grep -rl 'visibleOn\|hiddenOn\|disabledOn' packages/*/src apps/console/src, split ontest). - Published skill: the "Fields That ARE Evaluated" table in
skills/objectui/rules/protocol.mdlistshiddenOn,visibleOn,disabledOnas evaluated protocol fields;skills/objectui/guides/schema-expressions.mdgives examples for all three and its checklist item 4 explains the "On suffix". - Docs:
content/docs/guide/expressions.mdhas the sections "### visibleOn", "### hiddenOn", "### disabledOn";content/docs/api/schema-reference.mddocuments all three rows; acrosscontent/docs, 7 files mentionvisibleOnversus 5 forvisibleWhen.
Recommendation (one release batch)
- Remove
visibleOn,hiddenOn,disabledOnfromBaseSchemaand its zod twin; leavez.nevertombstones that carry the spec remedy, the same shape as thedateField/endFieldtombstones inpackages/types/src/zod/objectql.zod.ts. Keepvisibleonly where the spec declares it (the tab row), per ADR-0089's note that booleanvisibleis a different concept. - Collapse the
SchemaRenderervisibility chain tovisibleWhenplushidden;objectui validate/objectui checkrefuse the three keys by name (they already judge throughStrictAnyComponentSchema). - Same PR series: fix
skills/objectui/rules/protocol.md,skills/objectui/guides/schema-expressions.md,content/docs/guide/expressions.md,content/docs/api/schema-reference.md,content/docs/guide/schema-playground.md(skills are a governed surface, so that PR waits for an authorised approval). - Retire the 56 test files' dialect pins with the keys, or re-point them at
visibleWhen.
Benefit: four keys that compile but the spec refuses leave the authoring face; customer agents stop being taught retired spellings. Effort M. Risk: stored metadata still written with the old keys is refused loudly, which is the intended behaviour; rollback is a revert.
Refs: objectui#12654, objectui#12692, objectui#12696, objectui#12770 (the form-view and designer half, done).
Filed by the read-only whole-repo review session https://claude.ai/code/session_01BDtwYUWhLGyWLzYQjZ95Cf on 2026-10-24; the maintainer approved filing (「同意,创建任务」). Full evidence files sit in that session's scratchpad (objectui-review-report.md, findings-*.md). ⛔ Not a claim; for triage to grade and route.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 24, 2026
Triage: first grade —
tech-debt·priority:p2·domain:spec·area:studio·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-24T15:05Z⛔ Not a claim, ⛔ not a dispatch.
findingcomes off.domain:spec(objectui's types). It aligns objectui with spec 18, wherevisibleWhenis the only node-level visibility key andvisibleOnis already aretiredKeytombstone. That is an existing ruling, not a new one, and retirement is immediate under the 18.x order.hiddenOn/visibleOnas protocol is a product defect, so it should not trail far behind the types PR.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Transferred 2026-10-26T04:16Z from objectstack-ai/objectui#13446, with its comments and timeline; the old URL redirects here. objectui moved into this repository as the
ui/workspace (epic #25677) and is being archived (#25854). The body is left exactly as filed.Paths. Read every repository path in the body with a
ui/prefix:packages/types/src/base.tsis nowui/packages/types/src/base.ts;packages/react/src/SchemaRenderer.tsxis nowui/packages/react/src/SchemaRenderer.tsx;apps/console/srcis nowui/apps/console/src;skills/objectui/rules/protocol.mdis nowui/skills/objectui/rules/protocol.md;skills/objectui/guides/schema-expressions.mdis nowui/skills/objectui/guides/schema-expressions.md;content/docs/guide/expressions.mdis nowui/content/docs/guide/expressions.md;content/docs/api/schema-reference.mdis nowui/content/docs/api/schema-reference.md;content/docsis nowui/content/docs; and 2 more the same way.packages/spec/src/ui/page.zod.ts,packages/spec/src/uiwere already objectstack's own path and stay as written.References. The bare issue numbers in the body were written in objectui and now resolve against this repository by mistake; read them as objectstack-ai/objectui#12692, objectstack-ai/objectui#12696.
Labels.
sdui,typeshad no twin in this repository and were dropped by the transfer; every other label stayed.No stale
pm:dispatchedor assignee to strip.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Serial note from domain:spec seat 2 (round 1): #25923 work item 2 is in flight and converts the strip-mode objects in ui/packages/types/src/zod/base.zod.ts, the same file this card edits for the BaseSchema twin. This card stays in
pm:queueand is dispatched after that PR lands, so the two do not race on one file.objectstack-fleet commentedon Oct 26, 2026
Premise check before dispatch · domain:spec seat 2 · 2026-10-26T15:18Z
This is a read-only premise reading on origin/main
7111e14ac(dispatch-runbook 派发前置). The card's goal is unchanged. The readings below move only the landing point or the method, and the dispatch order carries them.Holds on substance; three paths moved with the objectui import, and one serial constraint has cleared.
ui/packages/types/src/base.tsstill declaresvisible(:408),visibleOn(:437),hiddenOn(:511) anddisabledOn(:547). The zod twinui/packages/types/src/zod/base.zod.tscarriesvisibleOn(:489),hiddenOn(:515) anddisabledOn(:534) as plain optional strings.ui/packages/react/src/SchemaRenderer.tsx:360-361still evaluatesVISIBILITY_SHOW_KEYS = ['visibleWhen', 'visible', 'visibleOn']andVISIBILITY_HIDE_KEYS = ['hidden', 'hiddenOn'].ui/packages/*/srcandui/apps/console/src: 38 non-test files and 56 test files (the card said 39 and 56).skills/objectui/rules/protocol.md(table rows :17-21) andskills/objectui/guides/schema-expressions.md. It is a governed rules surface, so a PR touching it is Tier H.ui/content/docs/guide/expressions.md(17 hits),ui/content/docs/api/schema-reference.md(8) andui/content/docs/guide/schema-playground.md(2). Rootcontent/docs/ui/views.mdxandcontent/docs/protocol/objectui/layout-dsl.mdxalso mention the keys; read each hit before editing, because a hit may already describe the retirement.responsive.hiddenOn(a breakpoint array, already a tombstone inpackages/spec/src/ui/responsive.zod.ts:130), thetablenode-level refusaltableKeyRefusal('hiddenOn', …)inui/packages/types/src/zod/objectql.zod.ts:1174, and the typo-suggestion examples inpackages/spec/src/shared/suggestions.zod.ts.ui/packages/types/src/zod/base.zod.ts, merged at 13:02Z, so that constraint has cleared.Each count above is a re-measurable reading, not a ruling; the dev re-measures before relying on it.
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 2 · 2026-10-26T15:21Z
Session:
session_01RyMY3prh9GRva1Tt37Di3iAccount:
zhuangjianguoBranch:
claude/project-thread-flw1js(card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead ofclaude/issue-25926-<slug>)Worktree:
objectstack-issue-25926Domain:
domain:specSeat:
domain:spec#2File surface:
ui/packages/types/src/base.ts, ui/packages/types/src/zod/base.zod.ts, ui/packages/react/src/SchemaRenderer.tsx, the readers among the 38 non-test files under ui/packages/*/src + ui/apps/console/src and their tests, skills/objectui/rules/protocol.md, skills/objectui/guides/schema-expressions.md, ui/content/docs/{guide/expressions.md,api/schema-reference.md,guide/schema-playground.md}, one changeset(stop on breach; explain in the report)Container & model:
M,mode:thread,model: CONTRACT_REVIEW_TIER — MANDATORY: skills/objectui/** ⇢ governed rules surface,effort: highClause-②: no (narrowing)
Metadata-protocol: judged from the diff (ui types only; expected none)
Responsibility: n/a — not a defect card
Thread-read: 6419740862
Premise: corrected 6419740862
Serial constraints cleared:
none (#26019 on base.zod.ts merged 13:02Z)objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 25926, "status": "done", "branch": "claude/project-thread-flw1js", "pr": "https://github.com/objectstack-ai/objectstack/pull/26274", "session": "session_01E5XcbmSeZTDGm5zCYkC9XV", "premise_still_valid": true, "summary": "BaseSchema.visibleOn / hiddenOn / disabledOn are retired with no alias window: `?: never` tombstones on the TypeScript face and aliasKeyRefusal arms on the Zod mirror, each naming the surviving key (visibleWhen / hidden / disabled), the unchanged polarity and the remedy; objectui validate prints that refusal. SchemaRenderer's chain collapses to visibleWhen / visible (show) + hidden (hide) and the enablement gate to disabled, a stale key is neither consulted nor forwarded; the SDUI parser reports the three as unknown-prop diagnostics naming the canonical key; the command palette drops its visibleOn fallback. 13 existing pins re-pointed or retired plus one found by the full run (static-table tombstone set), two new pins; skill (protocol.md, schema-expressions.md) and six ui docs teach the surviving keys; changeset with both declaration lines (Clause-②: no (narrowing) copied from the claim; Metadata-protocol judged narrowed, the claim expected none). Boolean `visible` stays on BaseSchema and as a renderer leg because the spec declares it (ADR-0089 D4), a deviation from the order's literal 'collapse to visibleWhen + hidden', flagged in the PR's Acceptance notes.", "tests": "Targeted (13 touched/new files, from ui/): 13 files, 267 tests passed. Five ui suites `cd ui && pnpm exec vitest run packages/types/ packages/sdui-parser/ packages/react/ packages/components/ packages/plugin-chatbot/ --maxWorkers=2` under the lock: first run 'Test Files 1 failed | 1050 passed | 1 skipped (1052) · Tests 1 failed | 17455 passed' (static-table-narrow-surface.test.ts pinned the table mirror's exact tombstone set, which now inherits the three; re-pointed in 6f044d46 and re-run alone: 39 passed). app-shell suite: 'Test Files 1735 passed | 1 skipped (1736) · Tests 15960 passed | 9 skipped', exit 0, held the lock 74 min. core: 211 files passed; cli: 30 files passed; type-check exit 0 on types, core, sdui-parser, components, react, app-shell, cli, plugin-chatbot after `pnpm --filter '@object-ui/cli...' --filter '@object-ui/app-shell...' build`. Public door: `objectui validate` on {type:text, visibleOn:'data.ok'} exits 1 with one invalid_type issue at visibleOn whose message carries 'Did you mean `visibleOn` → `visibleWhen`?' and 'Rename the key; the value is unchanged.'; the visibleWhen twin exits 0. Reverse verification: `visibleOn: 'data.ok'` pasted into the typed node literal of node-visibility-dialects-retired.test.ts → tsc -p tsconfig.test.json exit 2, TS2322 'Type string is not assignable to type undefined' at line 78; restored via git checkout HEAD -- FILE → exit 0. Ablation (scripts/ablation-replace.mjs, on-disk proof: anchor 1 → 0, blob 121459ac802a → e0358a2ef37d, restored blob == HEAD, git diff HEAD empty): one restored visibleOn leg after the visible leg in SchemaRenderer.tsx → SchemaRenderer.visibilityDialectsRetired.test.tsx 'Tests 1 failed | 6 passed', the failing case being the visibleOn SHOW-leg pin; an earlier list-only mutation (VISIBILITY_SHOW_KEYS) landed and stayed 7 passed, which is why the pin's docblock now names the leg (22a90507). No dist preflight: the pin imports ../SchemaRenderer from source. Per-package `pnpm --filter @object-ui/types test` from the repo root fails with spawn ENOENT (vitest lives in ui/node_modules/.bin), hence the ui-root invocations.", "gates": "`node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 58 families on the first change set and 68 at the final head (the sdui source-digest records and new tests widened it); every command run from the worktree with its exit captured before any pipe into ran-final.list; the 43 that predate the last commit were re-run at 6f044d46; `--ran` reconciliation: '68 derived, 68 run, 0 NOT-MEASURED, 0 UNRUN'. 67 exit 0, including check-adr-0087-registration (1 declared-breaking changeset carrying not-required (no-migration-prescription)), check-skills-token-ratchet (protocol.md 4368 → 4365, schema-expressions.md 6571 → 6571 tokens, within ceiling), check-sdui-manifest (sdui.manifest.json byte-identical, 5 package records re-recorded), check:doc-authoring, check:pm-skill-id-lint, check:type-check-debt (under the lock, exit 0 after an earlier 99 while the suites held it). `pnpm check:dual-build-cjs-loads` recorded exit 99 (never acquired the lock behind the app-shell run; its full build is left to the PR's CI). `check-platform-checklist --changed-from origin/main`: 0 anchored files, nothing judged. CI families on the PR not re-run here; the PR's check-runs are the record for those.", "dogfood_battery": "6f044d46 · `pnpm --filter '@objectstack/dogfood^...' build` exit 0 · `pnpm --filter @objectstack/dogfood test` under the lock: VERDICT command-exit 0 · held the lock 973s (16m13s) · Test Files 297 passed | 3 skipped (300) · Tests 2527 passed | 18 skipped (2545) · no failure", "mcp_calls": "0 — no GitHub MCP tool called; the card and its comments were read through the pm scripts' REST reads at the start, and every write went through scripts/pm/ tools", "api_writes": "3 — git push -u origin claude/project-thread-flw1js (1); fleet-write relay pr_create fw-20261026T181140Z-fa731d → PR #26274, draft, assignees zhuangjianguo, body read back identical 12880 bytes (POST /repos/objectstack-ai/objectstack/pulls + POST /repos/objectstack-ai/objectstack/issues/26274/assignees inside the run); post-stamped os-dev-report comment on #25926 (POST /repos/objectstack-ai/objectstack/issues/25926/comments via the relay). No labels written: the four packages publish, so no skip-changeset.", "open_questions": [ { "question": "Boolean `visible` stays on BaseSchema and as a SchemaRenderer leg (chain = visibleWhen / visible / hidden), while the order reads 'collapse to visibleWhen + hidden'. Confirm?", "options": [ "A keep `visible` (spec declares it on actions, nav entries, tabs, record:alert, bulk actions, params, settings; ADR-0089 D4 keeps it out of scope; removing the leg leaves a declared key unevaluated and breaches the 38-file surface)", "B remove `visible` from BaseSchema and the renderer in a follow-up card against the spec" ], "recommendation": "A, because the premise comment says keep boolean `visible` where the spec declares it, and the spec declares it on seven node kinds" }, { "question": "Metadata-protocol declared `narrowed` on the PR and changeset; the claim expected `none` (ui types only). Amend the claim, or re-judge?", "options": [ "A amend the claim to `narrowed` (three keys tombstoned on objectui's authorable node face = 'a key removed or tombstoned' by ruling A; the level gate pairs it with the claim's `no (narrowing)` arm; ADR-0087 gate accepts the disposition)", "B rule it `none` and have the changeset edited by the seat (the ADR-0087 gate would then read the changeset's BREAKING banner alone)" ], "recommendation": "A, because the key is on a published metadata face and the gates already agree with narrowed" }, { "question": "`objectui check` reports a stale file as 'recognised but not validated' and sends it to `objectui validate`; it does not itself name the key (triage ruling objectui#11007 forbids a second parse in the sweep). Accept, or rule the sweep should parse recognised files?", "options": [ "A accept (the three stay in OBJECTUI_STRUCTURAL_KEYS as identification markers, the body precedent)", "B new card to let the sweep parse recognised files (reverses objectui#11007)" ], "recommendation": "A" }, { "question": "File surface: three more ui docs (guide/schema-rendering.md, guide/metadata-diagnostics.md, utilities/runner.mdx) taught the retired keys and are fixed in place under the bounded in-place-fix exemption. Amend the claim's file surface?", "options": [ "A amend the claim's surface to include them", "B drop those three files from the PR (the docs then keep teaching retired keys)" ], "recommendation": "A" } ], "out_of_scope_findings": [ "class: b · reach: named producer · ui/packages/types/src/zod/objectql.zod.ts tableKeyRefusal rows at lines 1171–1199 (`hiddenOn` and siblings on the table slot) still prescribe 'belongs on the object-view node itself', which now points at a tombstoned spelling · dedupe words: tableKeyRefusal hiddenOn object-view node prescription · carrier: seat, noted, not filed", "class: c · reach: named producer · per-package `pnpm --filter @object-ui/PKG test` from the objectstack root exits 1 with spawn ENOENT for types, react, components, sdui-parser, app-shell, plugin-chatbot (vitest is installed only in ui/node_modules/.bin; core and cli carry their own); the package `test` scripts are unrunnable from the root install · dedupe words: object-ui vitest spawn ENOENT root filter · carrier: seat, noted, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Claim amendment — PM loop round 2, seat
domain:spec#2, sessionsession_01RyMY3prh9GRva1Tt37Di3i, 2026-10-26T18:17Z.Amends: Claim 6419808804
The dev's os-dev-report 6423841736 (PR #26274) asks four questions. The seat answers them here, and the claim takes the corrections:
Metadata-protocol: narrowed
File surface (added):
ui/content/docs/pages schema-rendering, metadata-diagnostics and runner (fixed in place, as reported);ui/packages/types/src/zod/objectql.zod.ts, thetableKeyRefusalrows forvisibleOn/hiddenOn/disabledOn(about lines 1170–1200); and the fivescripts/sdui-manifest.sources/*.jsonrecords the diff re-records.Answers:
visiblestays (option A). The spec declares it (ADR-0089 D4), and the card retires the dialects that duplicatevisibleWhen/hidden/disabled. The order's "collapse to visibleWhen + hidden" was imprecise; the PR's Acceptance notes carry the deviation.narrowed(option A). Three keys are tombstoned on objectui's authorable node face, which is "a key removed or tombstoned". It pairs with the claim'sClause-②: no (narrowing), and the ADR-0087 gate accepts the disposition. The changeset stays as written.objectui checkkeeps the three as identification markers and names nothing itself (ruling 11007);validatenames the refusal. Accepted.In scope, not a new card: the dev's out-of-scope finding (b). On the table slot,
visibleOn/hiddenOn/disabledOncarryTABLE_KEY_NODE_LEVEL, which sends the author to the object-view node, where this PR tombstones the same spelling. Each of the three rows names the surviving node key instead (visibleWhen/hidden/disabled). The PR fixes this in its patch round. Finding (c) is filed as #26276.objectstack-fleet commentedon Oct 26, 2026
os-dev-report
Round 2 (patch round on the seat's 18:18Z order), replacing the readings in the first report where they differ. Head moved 6f044d4 → a3f79a5.
{ "issue": 25926, "status": "done", "round": 2, "branch": "claude/project-thread-flw1js", "head": "a3f79a571f9efdda3d7d35444f67c998920d3b84", "pr": "https://github.com/objectstack-ai/objectstack/pull/26274", "session": "session_01E5XcbmSeZTDGm5zCYkC9XV", "premise_still_valid": true, "summary": "Patch round per the seat's order: (1) origin/main merged twice (578dc823, 33a4c4da — merge, not rebase); each merge conflicted only on scripts/sdui-manifest.sources/*.json digest records, resolved by taking main's side and re-recording with gen-sdui-manifest-node (9951000c, 82adea8d, 1ef5c482); sdui.manifest.json stays byte-identical; check-sdui-manifest and check-regen-pending exit 0 at the head. (2) ui/packages/types/src/zod/objectql.zod.ts: the visibleOn / hiddenOn / disabledOn tableKeyRefusal rows carry their own reason naming the surviving node key ('NOT A TABLE KEY … `visibleOn` is also a retired spelling (a `?: never` tombstone on `BaseSchema`): write `visibleWhen` on the object-view node itself; the value is unchanged.'), the other table rows keep the generic prescription (64e57a26); no existing pin read those messages, one new block in node-visibility-dialects-retired.test.ts pins the three plus a control on table.visibleWhen. (3) Finding c is #26276 and untouched. Then CI on 1ef5c482 went red in four jobs (Test UI 9/16, 11/16, 14/16, Lint UI), all this PR's, fixed in a3f79a57: ui/turbo.objectui.json lists the new packages/sdui-parser/src/retired-visibility-dialects.ts under the build inputs (turbo-build-inputs.test.ts); scripts/check-skill-examples.mjs MARKED_FLOOR json 70 → 69 with the reason beside the row (the deleted 'Data-dependent' fence of schema-expressions.md taught visibleOn; the ratchet left no room to keep it) — this one red both the Lint UI lane and check-skill-examples.test.ts; scripts/check-doc-expression-carriage.mjs control fixtures and its test's sabotage keys spell visibleWhen, the VISIBILITY_* pin reads 3 show/hide keys and 4 condition channels with disabledOn absent. No ui package source moved in the fix, so no digest re-record. The four questions in report 1 were answered by the seat (Q1 A keep `visible`; Q2 A narrowed, changeset stays; Q3 accepted; Q4 surface amended) and need nothing further here.", "tests": "At a3f79a57, from ui/ under the verify lock: five ui suites `pnpm exec vitest run packages/types/ packages/sdui-parser/ packages/react/ packages/components/ packages/plugin-chatbot/ --maxWorkers=2` → Test Files 1051 passed | 1 skipped (1052) · Tests 17462 passed | 24 skipped (17486), exit 0, held the lock 1182s (19m42s). Every ui script test `pnpm exec vitest run scripts/ --maxWorkers=2` → Test Files 178 passed | 2 skipped (180) · Tests 5104 passed | 2 skipped (5106), exit 0 (this is the population CI's Test UI shards red on and no package suite covers). The three repaired files run alone before the push: check-doc-expression-carriage.test.ts 58 passed (the first local run red on its VISIBILITY_* pin, 'expected 3 to be 5', fixed in the same commit), turbo-build-inputs.test.ts and check-skill-examples.test.ts passed. `pnpm --dir ui run check:skill-examples` → 'Marked: 18 ts fence(s) (floor 13), 69 json fence(s) (floor 69)', exit 0; `--self-test` 60 cases pass. `node scripts/check-doc-expression-carriage.mjs` → 'conditions=[disabled, hidden, visible, visibleWhen]', 'Controls pass', exit 0. The round-1 readings on 64e57a26 (type-check exit 0 on types, core, sdui-parser, components, react, app-shell, cli, plugin-chatbot; five ui suites 1051 files / 17462 tests) stand; app-shell (1735 files / 15960 tests at 6f044d46) was not re-run — no app-shell or renderer source moved since, and CI's 16 Test UI shards are green on the head.", "gates": "`node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 65 families at a3f79a57 (the round-1 68 lost the three families keyed to the worktree-only ablation artefacts); every command run from the checkout with its exit captured before any pipe into ran-5.list; `--ran` reconciliation: '65 derived, 65 run, 0 NOT-MEASURED, 0 UNRUN'; 65 exit 0 — including `pnpm check:type-check-debt` (held the lock 127s) and `pnpm check:dual-build-cjs-loads`, both of which recorded 99 (lock never acquired) in the round-1 and 1ef5c482 sweeps and are green now that the lock was free; check-sdui-manifest, check-regen-pending, check-adr-0087-registration, check-skills-token-ratchet (protocol.md 4365, schema-expressions.md 6571 tokens, unchanged since round 1), check-changeset-no-major, check-empty-changeset, check:doc-authoring, check:pm-skill-id-lint. The intermediate sweep at 1ef5c482: 65 run, 63 exit 0, type-check-debt and dual-build 99 (the dogfood battery held the lock), both re-measured green at a3f79a57. CI at a3f79a57: 61 check runs, 0 failed — Test UI 1/16…16/16, Lint UI, Type Check UI, Build & E2E UI, Build UI Deps, Build Core, Test Core and Test Core 1/8…8/8, Lint & Repo Gates, TypeScript Type Check, Type Check · source gates / consumer gates / debt ledger / workspace, Lint · repo & tooling gates / scoped · tooling self-tests / scoped · query-options erasure / scoped · slot lookup & corpus / PM dispatch-gates / docs & code guards / ESLint / CI, release & engine gates, Governed Surface Queue Guard, Check Changeset, Check PR Size, Check Documentation Links, Auto Label, Dogfood Regression Gate, filter, 'No other open PR may claim the same issue', 'No other open PR may claim the same single-writer path', 'The card this PR closes must claim this branch', 'Part-of PR must not also close its card' all success; Build Docs, Temporal Conformance, Dogfood Regression Gate shards, Dogfood Verify CLI, Packed-tarball smoke and 18.x upgrade harness skipped (path/opt-in). On 1ef5c482 the same roster had 4 failures (Test UI 9/16 turbo-build-inputs.test.ts; 11/16 check-doc-expression-carriage.test.ts, 10 cases; 14/16 check-skill-examples.test.ts floor; Lint UI check:skill-examples floor), each read from the job log and reproduced locally before the fix.", "dogfood_battery": "a3f79a57 · `pnpm --filter '@objectstack/dogfood^...' build` under the lock exit 0 (held 320s) · `pnpm --filter @objectstack/dogfood test` under the lock: VERDICT command-exit 0 · held the lock 1001s (16m41s) · Test Files 297 passed | 3 skipped (300) · Tests 2527 passed | 18 skipped (2545) · no failure. (Also green at 1ef5c482 before the gate fix: 297 / 2527, 973s.)", "mcp_calls": "16 GitHub MCP reads, 0 MCP writes — pull_request_read ×9 on #26274 (get ×4 for mergeable state after each push, get_check_runs ×4, get_status ×1), get_job_logs ×6 (jobs 121793113063 ×2, 121793113678, 121793113696 ×2, 121793113772 — the four red jobs on 1ef5c482, re-read where the first tail cut the failure), actions_list ×1 (ci.yml runs on main, to check the red jobs against main before fixing). Every write went through scripts/pm/ tools or git push.", "api_writes": "4 this round — git push -u origin claude/project-thread-flw1js ×3 (82adea8d, 1ef5c482, a3f79a57); post-stamped os-dev-report comment on #25926 (this one). No PR body PATCH (the body is round 1's; the seat holds the pen — see pr_body_followups), no labels, no assignee writes.", "pr_body_followups": [ "Acceptance note 4 (table-slot refusals 'out of scope') is now done in-PR per the seat's order: the three rows name the surviving node key; the rest of the table rows keep 'belongs on the object-view node itself'.", "What changed → Tests: add 'the table-slot refusals for the three keys are pinned (one issue at table.ALIAS, message names NOT A TABLE KEY, the retired spelling and the surviving node key; control on table.visibleWhen)'.", "Verification: replace the round-1 gate/suite/dogfood readings with the a3f79a57 ones above (65/65 gates green incl. dual-build; five suites 1051/17462; dogfood 297/2527; ui scripts 178/5104; CI 61 runs green).", "Changeset: one sentence added in 64e57a26 about the table slot's refusal naming the surviving node key; no version bump change." ], "open_questions": [], "out_of_scope_findings": [ "class: c · reach: named producer · ui/scripts/__tests__/*.test.ts (178 files, run by CI's 16 Test UI shards) are outside every derived gate family and every package suite, so a change under ui/packages/PKG/src or skills/objectui that moves a pinned count (turbo build inputs, MARKED_FLOOR, SchemaRenderer channel keys) is red only on the PR; a derived family for `cd ui && pnpm exec vitest run scripts/` (about 1 min) would surface it before the push · dedupe words: dispatch-gates ui scripts __tests__ derived family Test UI shards · carrier: seat, noted, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
os-dev-report
Round 3 (patch round on the contract review 6426970806, FAIL on a3f79a5, and the seat's 20:50Z order). Head moved a3f79a5 → ee8049a.
{ "issue": 25926, "status": "done", "round": 3, "branch": "claude/project-thread-flw1js", "head": "ee8049acc90d737caaf384629e6ca25858468933", "pr": "https://github.com/objectstack-ai/objectstack/pull/26274", "session": "session_01E5XcbmSeZTDGm5zCYkC9XV", "premise_still_valid": true, "summary": "The two review findings are fixed in 586ed409: (item 5) skills/objectui/rules/protocol.md's props-parking sentence no longer says the console refuses the retired spellings by name — ', and their retired spellings' is deleted, so it reads 'Silent for every key except the node-gate predicates (`visibleWhen` / `visible` / `hidden` / `disabled`), which are refused by name on the console, with the migration, instead of gating nothing.' — matching NODE_GATE_PREDICATE_KEYS at the head and the propsBagLoudRefusal pin; (item 10) ui/scripts/check-skill-examples.mjs's json floor 70 → 69 reason now says the deleted 'Data-dependent' fence was a `hidden` template example that duplicated the syntax block above it and was cut to pay the guide's token ceiling, not that it taught `visibleOn`. The advisory item 11 (guide line 239 names `visibleWhen` / `hidden` / `disabled` without `visible`) is left as it is: the guide sits at 6571 of 6571 tokens, and the reviewer read the line as introducing the three keys that take the raw-expression form. No code, no PR body edit. The PR then went dirty again (main moved 31 commits; the core and react digest records conflicted), so main is merged a third time (cfcf6b13, merge not rebase, main's side of both records) and the digests re-recorded on the merged tree (ee8049ac); sdui.manifest.json byte-identical, check-sdui-manifest and check-regen-pending exit 0. 586ed409 itself got no check runs (dirty); CI ran on ee8049ac.", "tests": "At ee8049ac, under the verify lock from ui/: five ui suites `pnpm exec vitest run packages/types/ packages/sdui-parser/ packages/react/ packages/components/ packages/plugin-chatbot/ --maxWorkers=2` → Test Files 1052 passed | 1 skipped (1053) · Tests 17466 passed | 24 skipped (17490), exit 0, held the lock 1051s (17m31s) (one more file and four more tests than at a3f79a57: main's). Every ui script test `pnpm exec vitest run scripts/ --maxWorkers=2` → Test Files 178 passed | 2 skipped (180) · Tests 5104 passed | 2 skipped (5106), exit 0. Before the push, at 586ed409: `pnpm --dir ui run check:skill-examples --self-test` 60 cases pass; `check:skill-examples` → 'Marked: 18 ts fence(s) (floor 13), 69 json fence(s) (floor 69)', exit 0; `check:doc-json` exit 0 (protocol.md's json fences unchanged); check-doc-authoring and check-skill-id-lint exit 0; the 178 ui script files green there too. Type-check: `pnpm check:type-check-debt` under the lock at ee8049ac exit 0 (held 135s). app-shell not re-run (no app-shell or renderer source moved since 6f044d46; CI's 16 Test UI shards and Type Check UI are green on the head).", "gates": "`node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 65 families at ee8049ac; every command run from the checkout with its exit captured before any pipe into ran-7.list; `--ran` reconciliation: '65 derived, 65 run, 0 NOT-MEASURED, 0 UNRUN'; 63 exit 0 in the sweep, the two lock families recorded 99 while the five suites held the lock and were re-measured under it: `pnpm check:type-check-debt` exit 0, `pnpm check:dual-build-cjs-loads` exit 0 (held the lock 22s), so all 65 are green at the head. check-skills-token-ratchet: protocol.md 4357 tokens (ceiling 4368, headroom 11; 374 lines, was 375), schema-expressions.md 6571 (ceiling 6571, headroom 0; 642 lines unchanged); check-skill-line-ratchet exit 0; check-adr-0087-registration, check-changeset-no-major, check-empty-changeset, check-sdui-manifest, check-regen-pending, check:doc-authoring, check:pm-skill-id-lint green. The same 65 at 586ed409 (before the merge) were 65/65 green. CI at ee8049ac: 61 check runs, 55 success, 6 skipped (Build Docs, Temporal Conformance, Dogfood Regression Gate shards, Dogfood Verify CLI, Packed-tarball smoke, 18.x upgrade harness — path/opt-in), 0 failed: Test UI 1/16…16/16, Lint UI, Type Check UI, Build & E2E UI, Build UI Deps, Build Core, Test Core and Test Core 1/8…8/8, Lint & Repo Gates, TypeScript Type Check, the Type Check · and Lint · families, Governed Surface Queue Guard, Check Changeset, Check PR Size, Check Documentation Links, Auto Label, Dogfood Regression Gate, filter and the four claim guards all success.", "dogfood_battery": "ee8049ac · `pnpm --filter '@objectstack/dogfood^...' build` under the lock exit 0 (held 286s) · `pnpm --filter @objectstack/dogfood test` under the lock: VERDICT command-exit 0 · held the lock 1125s (18m45s) · Test Files 297 passed | 3 skipped (300) · Tests 2527 passed | 18 skipped (2545) · no failure", "skills_readings": "protocol.md lines 377 → 374 (round 1: 375), tokens 4368 → 4357 (round 1: 4365); schema-expressions.md 646 → 642 lines, 6571 → 6571 tokens, unchanged this round; sum of all SKILL.md 4525 → 4525.", "mcp_calls": "4 GitHub MCP reads this round, 0 MCP writes (20 reads over the card so far) — pull_request_read get_comments ×1 (the contract review, truncated in the event), get_check_runs ×2 (586ed409: 0 runs; ee8049ac: 61), get ×1 (mergeable_state dirty, which is why main was merged again). Every write went through scripts/pm/ tools or git push.", "api_writes": "3 this round — git push -u origin claude/project-thread-flw1js ×2 (586ed409; ee8049ac, pushed from the verification chain after the digest re-record); post-stamped os-dev-report comment on #25926 (this one). No PR body PATCH, no labels, no assignee writes, no CI re-run request.", "pr_body_followups": [ "Skills readings table: protocol.md 377 → 374 lines, 4368 → 4357 tokens (the round-1 row says 375 / 4365).", "The round-2 followups stand (acceptance note 4 done in-PR; verification readings; table-slot pin under Tests)." ], "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Landed · domain:spec seat 2
e843b5b32071ec4ae4d30d3cfc618ae0203f3f95(os-zhuang APPROVED 2026-10-26T22:44Z; contract review PASS 6428605336, re-certified on 195b303 in 6429685531; seat hop note on 4be7b84)origin/maine843b5b32, contains the merge commit (git merge-base --is-ancestor)State:
Fixes #25926closed this card as completed;pm:dispatchedremoved in this stroke. Out-of-scope findings filed as #26276 and #26318.