Skip to content

types,react,skills,docs: retire the node-level visibility dialects visibleOn / hiddenOn / disabledOn / visible and teach only visibleWhen #25926

Closed

Description

@os-zhuang

维护者速读

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: PageComponentSchema in packages/spec/src/ui/page.zod.ts declares visibleWhen only; FormFieldBaseSchema / FormSectionSchema in view.zod.ts carry visibleOn: retiredKey(FORM_FIELD_VISIBLE_ON_RETIRED); no hiddenOn or disabledOn anywhere under packages/spec/src/ui.
  • objectui: packages/types/src/base.ts still declares the members visible, visibleOn (JSDoc says deprecated), hiddenOn, disabledOn; packages/react/src/SchemaRenderer.tsx evaluates the chain VISIBILITY_SHOW_KEYS = ['visibleWhen', 'visible', 'visibleOn'] and VISIBILITY_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 on test).
  • Published skill: the "Fields That ARE Evaluated" table in skills/objectui/rules/protocol.md lists hiddenOn, visibleOn, disabledOn as evaluated protocol fields; skills/objectui/guides/schema-expressions.md gives examples for all three and its checklist item 4 explains the "On suffix".
  • Docs: content/docs/guide/expressions.md has the sections "### visibleOn", "### hiddenOn", "### disabledOn"; content/docs/api/schema-reference.md documents all three rows; across content/docs, 7 files mention visibleOn versus 5 for visibleWhen.

Recommendation (one release batch)

  • Remove visibleOn, hiddenOn, disabledOn from BaseSchema and its zod twin; leave z.never tombstones that carry the spec remedy, the same shape as the dateField / endField tombstones in packages/types/src/zod/objectql.zod.ts. Keep visible only where the spec declares it (the tab row), per ADR-0089's note that boolean visible is a different concept.
  • Collapse the SchemaRenderer visibility chain to visibleWhen plus hidden; objectui validate / objectui check refuse the three keys by name (they already judge through StrictAnyComponentSchema).
  • 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

  1. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    Contributor

    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. finding comes off.

    • Lane: domain:spec (objectui's types). It aligns objectui with spec 18, where visibleWhen is the only node-level visibility key and visibleOn is already a retiredKey tombstone. That is an existing ruling, not a new one, and retirement is immediate under the 18.x order.
    • The skills PR in the series is a governed surface and waits for an authorised approval. A published skill that teaches hiddenOn / visibleOn as protocol is a product defect, so it should not trail far behind the types PR.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    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.ts is now ui/packages/types/src/base.ts; packages/react/src/SchemaRenderer.tsx is now ui/packages/react/src/SchemaRenderer.tsx; apps/console/src is now ui/apps/console/src; skills/objectui/rules/protocol.md is now ui/skills/objectui/rules/protocol.md; skills/objectui/guides/schema-expressions.md is now ui/skills/objectui/guides/schema-expressions.md; content/docs/guide/expressions.md is now ui/content/docs/guide/expressions.md; content/docs/api/schema-reference.md is now ui/content/docs/api/schema-reference.md; content/docs is now ui/content/docs; and 2 more the same way.

    packages/spec/src/ui/page.zod.ts, packages/spec/src/ui were 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, types had no twin in this repository and were dropped by the transfer; every other label stayed.

    No stale pm:dispatched or assignee to strip.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    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:queue and is dispatched after that PR lands, so the two do not race on one file.

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    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.ts still declares visible (:408), visibleOn (:437), hiddenOn (:511) and disabledOn (:547). The zod twin ui/packages/types/src/zod/base.zod.ts carries visibleOn (:489), hiddenOn (:515) and disabledOn (:534) as plain optional strings.
    • ui/packages/react/src/SchemaRenderer.tsx:360-361 still evaluates VISIBILITY_SHOW_KEYS = ['visibleWhen', 'visible', 'visibleOn'] and VISIBILITY_HIDE_KEYS = ['hidden', 'hiddenOn'].
    • Reach under ui/packages/*/src and ui/apps/console/src: 38 non-test files and 56 test files (the card said 39 and 56).
    • Paths moved:
      • The published skill now lives at skills/objectui/rules/protocol.md (table rows :17-21) and skills/objectui/guides/schema-expressions.md. It is a governed rules surface, so a PR touching it is Tier H.
      • The docs live at ui/content/docs/guide/expressions.md (17 hits), ui/content/docs/api/schema-reference.md (8) and ui/content/docs/guide/schema-playground.md (2). Root content/docs/ui/views.mdx and content/docs/protocol/objectui/layout-dsl.mdx also mention the keys; read each hit before editing, because a hit may already describe the retirement.
    • Not this card's keys, so leave them alone: responsive.hiddenOn (a breakpoint array, already a tombstone in packages/spec/src/ui/responsive.zod.ts:130), the table node-level refusal tableKeyRefusal('hiddenOn', …) in ui/packages/types/src/zod/objectql.zod.ts:1174, and the typo-suggestion examples in packages/spec/src/shared/suggestions.zod.ts.
    • Serial: fix(types): the @object-ui/types/zod mirrors keep an unknown key instead of silently dropping it #26019 (types: the strict authoring face accepts spellings the spec refuses (object-calendar flat keys), 74 zod mirrors silently strip unknown keys, and the list view's options bag is a second contract #25923 item 2), which also edited 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.

  5. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 2 · 2026-10-26T15:21Z
    Session: session_01RyMY3prh9GRva1Tt37Di3i
    Account: zhuangjianguo
    Branch: claude/project-thread-flw1js (card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-25926-<slug>)
    Worktree: objectstack-issue-25926
    Domain: domain:spec
    Seat: domain:spec#2
    File 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: high
    Clause-②: 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)

  6. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    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

  7. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Claim amendment — PM loop round 2, seat domain:spec#2, session session_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, the tableKeyRefusal rows for visibleOn / hiddenOn / disabledOn (about lines 1170–1200); and the five scripts/sdui-manifest.sources/*.json records the diff re-records.

    Answers:

    1. Boolean visible stays (option A). The spec declares it (ADR-0089 D4), and the card retires the dialects that duplicate visibleWhen / hidden / disabled. The order's "collapse to visibleWhen + hidden" was imprecise; the PR's Acceptance notes carry the deviation.
    2. 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's Clause-②: no (narrowing), and the ADR-0087 gate accepts the disposition. The changeset stays as written.
    3. objectui check keeps the three as identification markers and names nothing itself (ruling 11007); validate names the refusal. Accepted.
    4. The three extra docs: accepted, added above.

    In scope, not a new card: the dev's out-of-scope finding (b). On the table slot, visibleOn / hiddenOn / disabledOn carry TABLE_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.

  8. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    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

  9. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    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

  10. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    Contributor

    Landed · domain:spec seat 2

    reading value
    PR #26274 merged 2026-10-27T00:07:29Z through the merge queue, merge commit e843b5b32071ec4ae4d30d3cfc618ae0203f3f95 (os-zhuang APPROVED 2026-10-26T22:44Z; contract review PASS 6428605336, re-certified on 195b303 in 6429685531; seat hop note on 4be7b84)
    origin/main e843b5b32, contains the merge commit (git merge-base --is-ancestor)

    State: Fixes #25926 closed this card as completed; pm:dispatched removed in this stroke. Out-of-scope findings filed as #26276 and #26318.

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

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portaldomain:specpriority:p2Medium: important, M3tech-debt

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions