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
[spec] Retire three zero-reader UI keys per maintainer ruling: PageHeaderProps.icon, PageCardProps.actions, RecordDetailsProps.layout (objectui#3829 / objectui#3818) #6946
Maintainer ruling 2026-08-09 (decision-inbox round, 「全部接受」): objectui#3829 ruled route (c) — retire PageHeaderProps.icon and PageCardProps.actions upstream; objectui#3818 ruled the removal direction — retire RecordDetailsProps.layout. All three are spec-declared keys with zero renderer read points measured in objectui (see those cards for the full evidence), making them the ADR-0049 declared-but-unenforced shape on the platform contract.
Deliverable (spec-property-retirement playbook, one PR)
protocol-17 conversion (all three are authorable page/component metadata — stored sources must convert; RecordDetailsProps.layout additionally had published auto|custom semantics that were never implemented, so its conversion is a pure strip);
ADR-0087 registry entries; regenerate baselines / forms / reference docs; liveness-ledger discipline per the playbook.
Precedent: #3809 (PageCardProps.body) — same objects, same shape.
Sequencing
objectui#3829 (drop the two parity-gate exemptions) and objectui#3818 (delete the layout input + the dead inline|compact branch) are Blocked-by this card and proceed on the next objectui pin bump after it lands.
⚠️ The ADR-0087 registry edits make the implementing PR maintainer-merged only per the standing docs/adr/** discipline — no auto-merge, no agent queue entry.
No domain:* applied — routing is the triage seat's. (Expected lane: domain:spec.)
Routing note: the card carried no domain:* (body: "Expected lane: domain:spec"); the seat stamps domain:spec while claiming under today's maintainer batch-acceleration instruction — recorded here for the triage seat's audit.
PM bookkeeping: pm:dispatched → pm:queue. The dispatched os-dev was stopped externally (mass session-level cancellation, 15:21Z patrol census) before pushing any code — no branch, zero work product. Claim released; card returns to the queue intact. The maintainer ruling (retire the three keys) and the brief (incl. the mandatory self-run zero-reader verification and the docs/adr landing-mode report) remain valid; re-dispatch awaits the maintainer's word.
RE-CLAIM — PM seat (session session_01PiRUoQkTSBBmpyXBY3cVn2), re-dispatched as a mode:cloud card under the maintainer's re-acceleration (2026-08-09 chat). Branch claude/issue-6946-retire-three-ui-keys. All constraints of the 13:37Z claim comment remain binding — especially the mandatory self-run zero-reader verification (the #6926 lesson) and the docs/adr-touch statement that decides the landing mode.
{
"issue": 6946,
"status": "done",
"branch": "claude/issue-6946-retire-three-ui-keys",
"worktree": "../objectstack-issue-6946",
"commit": "03e42ae",
"pr": 7115,
"pr_state": "draft",
"landing_mode_input": {
"touches_docs_adr": false,
"detail": "ADR-0087 work is registry CODE only (packages/spec/src/conversions/registry.ts, packages/spec/src/migrations/registry.ts). No docs/adr/** path in the diff. content/docs/releases/ untouched.",
"auto_merge_armed": false,
"queued": false
},
"ruling_applied": {
"quote_verbatim": "全部接受",
"date": "2026-08-09",
"source": "decision-inbox round, recorded in the #6946 card body",
"objectui_3829": "route (c) — retire PageHeaderProps.icon + PageCardProps.actions upstream",
"objectui_3818": "retire RecordDetailsProps.layout"
},
"zero_reader_verification": {
"inherited": false,
"objectui_sha_measured": "09987b680d53801c79f67d969b14e9bb732b8a22",
"objectui_sha_source": ".objectui-sha pin, read-only clone",
"framework_sha": "f5a9bc2",
"method": "#4878 control probes — a probe that must hit alongside the probe that must not, in every scan",
"keys": {
"ui/PageHeaderProps:icon": {
"verdict": "zero read points",
"evidence": "PageHeaderRenderer's 5 `icon` hits are all `action.icon`; @object-ui/layout <PageHeader> takes `icon` as a React prop with NO schema fallback, 4 lines from its `schema?.actions ?? schema?.properties?.actions` fallback; registry publishes no `icon` input",
"controls_hit": ["recordChrome=3", "showStar=3", "subtitle=7", "in-file: schema?.children/.actions/.properties.actions"],
"independent_confirmation": "objectui UNPUBLISHED_EXEMPTIONS B-class entry citing objectui#3829"
},
"ui/PageCardProps:actions": {
"verdict": "zero read points",
"evidence": "PageCardRenderer reads title/bordered/body??children/footer only; no actions area in the markup; no `actions` input in the registration; all 16 repo-wide schema.actions reads belong to other components (page:header, action:*, DetailView, record:quick_actions)",
"controls_hit": ["footer", "bordered"],
"independent_confirmation": "objectui UNPUBLISHED_EXEMPTIONS B-class entry citing objectui#3829"
},
"ui/RecordDetailsProps:layout": {
"verdict": "read, but inert for every spec-legal value — NOT zero-read-point, reported as measured",
"evidence": "record-details.tsx:104 branches on `inline`|`compact`; the declared enum is `auto`|`custom`, so both legal values take the same `vertical` branch. objectui's registry declares the SAME auto|custom enum (index.tsx:274), which is why check:react-declaration-parity (two declarations, never declaration-vs-implementation) saw agreement. A third spelling `stacked|inline|compact` sits in @object-ui/types.",
"controls": ["layout === 'auto'|'custom' → 0 hits in BOTH repos (must-miss)", "layout === 'vertical'|'horizontal' → HIT in plugin-form/plugin-view (must-hit)"],
"stop_condition": "not triggered — this is precisely the dead branch objectui#3818 rules on"
}
},
"liveness_ledger": {
"rows_found": 0,
"reason": "the gate walks PageSchema's shape (liveness/page.json, 17 top-level rows); PageComponent.properties is z.record(z.string(), z.unknown()), so component props are below the walk and the ledger has never carried one — the page:card.body precedent (#3809/#5775) added none either",
"action": "none — nothing to add under the tombstone route, nothing orphaned; check:liveness PASS confirms both directions"
}
},
"implementation": {
"tombstones": 3,
"house_sentence_6856": "verbatim on all three; retired-key-migrate-sentence.test.ts passes",
"tsc_channel_note": "does NOT reach the page carrier — properties is an open record, so author sites were swept by grep + the ComponentPropsMap parse in packages/lint validate-component-props, not by tsc",
"conversions": [
{"id": "page-structure-inert-keys-removed", "toMajor": 17, "retiredFromLoadPath": true, "shape": "pure strip", "keys": ["page:header.icon", "page:card.actions"], "expectedNotices": 5},
{"id": "record-details-layout-removed", "toMajor": 17, "retiredFromLoadPath": true, "shape": "PURE STRIP as ruled", "keys": ["record:details.layout"], "expectedNotices": 3}
],
"walker_reach_verified": "mapPageComponents (walk.ts, post-#7034) visits regions[].components[], slots.<slot> (single + array) and nested properties containers to any depth; fixtures exercise all three forms",
"scoping": "every strip is scoped by component `type`, never by key name — page:header.actions and record:highlights.layout are LIVE same-leaf-name siblings and are carried as in-fixture controls",
"retired_keys_by_major_17": ["ui/PageCardProps:actions", "ui/PageHeaderProps:icon", "ui/RecordDetailsProps:layout"],
"d3_chain_step": "both ids added to MIGRATIONS_BY_MAJOR[17].conversionIds; step rationale extended",
"semantic_migration": "none — authored/stored metadata with a D2 conversion, so the fieldErrors disposition does not apply",
"default_changes_by_major": "no row required, measured: authorable-defaults drops RecordDetailsProps:layout=\"auto\" as a retirement, and the #4666 ratchet reported '1310 default(s) unchanged' against upstream f5a9bc2",
"author_sites_cleaned": ["examples/app-showcase/src/ui/pages/project-workspace.page.ts", "packages/mcp/src/connect-ui.ts", "packages/cloud-connection/src/marketplace-ui.ts", "packages/cloud-connection/src/cloud-connection-ui.ts", "skills/objectstack-ui/SKILL.md", "3 test fixtures (rest, spec/i18n-resolver, cli)"],
"changeset": ".changeset/page-component-zero-reader-keys-removed.md (major, bang, adr-0087 disposition marker)"
},
"ratchet_answers": {
"authorable-surface/ui.json": "3 lines gain [RETIRED]; no line vanishes — correct for the tombstone route",
"json-schema.manifest/ui.json": "byte-identical — no def deleted, only a def's key set narrowed; the per-key deletion ratchet correctly never fires",
"api-surface/ + api-surface-signatures.json": "byte-identical — prints type references, blind to key-level narrowing; no orphaned value schema accompanies these keys",
"note": "the brief predicted both deletion gates would fire; they did not, and per the playbook §2 route table that is the CORRECT reading for a tombstone (non-strict) retirement rather than a whole-def deletion"
},
"reverse_verification": {
"direction_predicted_first": true,
"authored_key_rejected": "4/4 probes — success=false, code=invalid_type, expected=never, path=[key], message = the prescription naming the backticked key and closing with the house sentence",
"envelope_status": "ABSENT — schema verdicts carry no envelope `status`; reported as absent rather than fabricated",
"stored_row_through_conversion": "4 notices, exactly the predicted sites (region form + nested container + named slot); page:header.actions, record:highlights.layout and element:button.icon all survive; zero other protocol-17 conversions fired on the fixture",
"untouched_siblings": "byte-identical on all 4 bags incl. record:highlights.layout"
},
"gates": {
"check:liveness": "PASS", "check:empty-state": "PASS", "check:authorable-surface": "PASS",
"check:docs": "PASS", "check:api-surface": "PASS", "check:spec-changes": "PASS",
"check:upgrade-guide": "PASS", "check:skill-refs": "PASS", "check:skill-docs": "PASS",
"check:skill-examples": "PASS", "check:variant-docs": "PASS", "check:exported-any": "PASS",
"check:dual-source-exports": "PASS",
"check:export-origins": "PASS (4991 exports / 16 entry points; regenerated, never hand-edited — shards did not move since no export is added or removed)",
"check-adr-0087-registration --base origin/main": "PASS (1 declared-breaking changeset, disposition present)",
"pnpm check:i18n": "PASS (9 packages in sync)",
"pnpm typecheck": "PASS (126/126)",
"pnpm lint": "PASS",
"pnpm test": "PASS after isolating one flake",
"@objectstack/dogfood": "PASS (526 passed / 3 skipped)",
"check:react-declaration-parity": "NOT RUN — structurally cannot run here; its RHS is objectui's sdui.manifest.json, an on-demand gate triggered by the pin bump (#5960), and this PR does not move .objectui-sha"
},
"flakes": [
{
"test": "@objectstack/types src/node.test.ts > falls back to the importing package's own resolution when the host does not declare",
"symptom": "timed out at 5000ms in the full parallel run",
"attribution": "not this diff — a package-resolution test in an untouched package; its siblings take 3021ms and 1672ms in the same file",
"isolated_rerun": "230/230 pass in 3.32s"
}
],
"sequencing": "objectui#3829 and objectui#3818 are Blocked-by #6946 and proceed on the next .objectui-sha pin bump. Note left on the PR: dropping the two UNPUBLISHED_EXEMPTIONS entries is NOT automatic on the bump — retiredKey() keeps the key in Object.keys(shape), so they resolve via objectui's tombstone recognition (the objectui#3808 trap).",
"out_of_scope_findings": [],
"needs_user_decision": false
}
CI: all 26 check runs completed success, including both required gates (ESLint, TypeScript Type Check). The one skipped is Console Pin Gate, correct here since .objectui-sha does not move.
Base branch:main advanced f5a9bc2 → 9136327 (5 commits) after the push. The merge is clean; since packages/spec moved on both sides the AGENTS.md §10 scoped re-check was run on the merged tree rather than assumed — spec build && check:generated → all 11 generated artifacts up to date, no jointly-wrong artifact. main's spec commits touch automation/io-node-config.zod.ts and ui/view.zod.ts (.describe() alignment), disjoint from this diff. The merge was not pushed: it would invalidate a fully green CI run for no measured benefit, and the queue rebuilds onto current main anyway.
Landing mode unchanged and still yours: the diff touches no docs/adr/** path. PR remains draft, no auto-merge armed, no queue entry made from this seat.
PR body was edited once to repair two <…> placeholders GitHub's sanitizer had stripped (slots.<slot>, path = [<key>]) — presentation only, no claim changed.
Activity
os-zhuang commentedon Aug 9, 2026
CLAIM — PM seat
domain:spec(sessionsession_01PiRUoQkTSBBmpyXBY3cVn2), dispatching to an os-dev subagent.claude/issue-6946-retire-three-ui-keys../objectstack-issue-6946(per-task, PD Migrate documentation site to Fumadocs with monorepo structure and shared content #11)PageHeaderProps.icon+PageCardProps.actionsupstream; objectui#3818 retiresRecordDetailsProps.layout. Playbook per the body: tombstones ([finding][spec] Tombstones over STRIP-only conversions sayos migrate meta --from 16will "rewrite it" — the corpus is split between two verbs for one behaviour #6856 house sentence), protocol-17 conversions (layout's is a pure strip), ADR-0087 registries, baselines/forms/docs regen, liveness discipline. Precedent fix(filters): evaluate{token}placeholders on the server read path (#3582) #3809.domain:*(body: "Expected lane:domain:spec"); the seat stampsdomain:specwhile claiming under today's maintainer batch-acceleration instruction — recorded here for the triage seat's audit.apiis code-only — withdraw a runtime create door the endpoint matcher could never read (#5488) #7040/refactor(spec,objectql)!: retireAggregationNode.distinct— one face honoured it, five ignored it, and the same query answered two plausible numbers (#6815, ADR-0049) #7051 (registry-code-only retirement PRs) landed via the normal agent queue with all checks green — the PD feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14 discipline coversdocs/adr/**files. The dev will report whether the diff touchesdocs/adr/**: if yes → maintainer hand-merge; if registry code only → the PM will land via the normal serial relay and record these grounds.Generated by Claude Code
os-zhuang commentedon Aug 9, 2026
PM bookkeeping:
pm:dispatched→pm:queue. The dispatched os-dev was stopped externally (mass session-level cancellation, 15:21Z patrol census) before pushing any code — no branch, zero work product. Claim released; card returns to the queue intact. The maintainer ruling (retire the three keys) and the brief (incl. the mandatory self-run zero-reader verification and the docs/adr landing-mode report) remain valid; re-dispatch awaits the maintainer's word.Generated by Claude Code
os-zhuang commentedon Aug 9, 2026
RE-CLAIM — PM seat (session
session_01PiRUoQkTSBBmpyXBY3cVn2), re-dispatched as a mode:cloud card under the maintainer's re-acceleration (2026-08-09 chat). Branchclaude/issue-6946-retire-three-ui-keys. All constraints of the 13:37Z claim comment remain binding — especially the mandatory self-run zero-reader verification (the #6926 lesson) and the docs/adr-touch statement that decides the landing mode.Generated by Claude Code
os-zhuang commentedon Aug 9, 2026
OS-DEV-REPORT
{ "issue": 6946, "status": "done", "branch": "claude/issue-6946-retire-three-ui-keys", "worktree": "../objectstack-issue-6946", "commit": "03e42ae", "pr": 7115, "pr_state": "draft", "landing_mode_input": { "touches_docs_adr": false, "detail": "ADR-0087 work is registry CODE only (packages/spec/src/conversions/registry.ts, packages/spec/src/migrations/registry.ts). No docs/adr/** path in the diff. content/docs/releases/ untouched.", "auto_merge_armed": false, "queued": false }, "ruling_applied": { "quote_verbatim": "全部接受", "date": "2026-08-09", "source": "decision-inbox round, recorded in the #6946 card body", "objectui_3829": "route (c) — retire PageHeaderProps.icon + PageCardProps.actions upstream", "objectui_3818": "retire RecordDetailsProps.layout" }, "zero_reader_verification": { "inherited": false, "objectui_sha_measured": "09987b680d53801c79f67d969b14e9bb732b8a22", "objectui_sha_source": ".objectui-sha pin, read-only clone", "framework_sha": "f5a9bc2", "method": "#4878 control probes — a probe that must hit alongside the probe that must not, in every scan", "keys": { "ui/PageHeaderProps:icon": { "verdict": "zero read points", "evidence": "PageHeaderRenderer's 5 `icon` hits are all `action.icon`; @object-ui/layout <PageHeader> takes `icon` as a React prop with NO schema fallback, 4 lines from its `schema?.actions ?? schema?.properties?.actions` fallback; registry publishes no `icon` input", "controls_hit": ["recordChrome=3", "showStar=3", "subtitle=7", "in-file: schema?.children/.actions/.properties.actions"], "independent_confirmation": "objectui UNPUBLISHED_EXEMPTIONS B-class entry citing objectui#3829" }, "ui/PageCardProps:actions": { "verdict": "zero read points", "evidence": "PageCardRenderer reads title/bordered/body??children/footer only; no actions area in the markup; no `actions` input in the registration; all 16 repo-wide schema.actions reads belong to other components (page:header, action:*, DetailView, record:quick_actions)", "controls_hit": ["footer", "bordered"], "independent_confirmation": "objectui UNPUBLISHED_EXEMPTIONS B-class entry citing objectui#3829" }, "ui/RecordDetailsProps:layout": { "verdict": "read, but inert for every spec-legal value — NOT zero-read-point, reported as measured", "evidence": "record-details.tsx:104 branches on `inline`|`compact`; the declared enum is `auto`|`custom`, so both legal values take the same `vertical` branch. objectui's registry declares the SAME auto|custom enum (index.tsx:274), which is why check:react-declaration-parity (two declarations, never declaration-vs-implementation) saw agreement. A third spelling `stacked|inline|compact` sits in @object-ui/types.", "controls": ["layout === 'auto'|'custom' → 0 hits in BOTH repos (must-miss)", "layout === 'vertical'|'horizontal' → HIT in plugin-form/plugin-view (must-hit)"], "stop_condition": "not triggered — this is precisely the dead branch objectui#3818 rules on" } }, "liveness_ledger": { "rows_found": 0, "reason": "the gate walks PageSchema's shape (liveness/page.json, 17 top-level rows); PageComponent.properties is z.record(z.string(), z.unknown()), so component props are below the walk and the ledger has never carried one — the page:card.body precedent (#3809/#5775) added none either", "action": "none — nothing to add under the tombstone route, nothing orphaned; check:liveness PASS confirms both directions" } }, "implementation": { "tombstones": 3, "house_sentence_6856": "verbatim on all three; retired-key-migrate-sentence.test.ts passes", "tsc_channel_note": "does NOT reach the page carrier — properties is an open record, so author sites were swept by grep + the ComponentPropsMap parse in packages/lint validate-component-props, not by tsc", "conversions": [ {"id": "page-structure-inert-keys-removed", "toMajor": 17, "retiredFromLoadPath": true, "shape": "pure strip", "keys": ["page:header.icon", "page:card.actions"], "expectedNotices": 5}, {"id": "record-details-layout-removed", "toMajor": 17, "retiredFromLoadPath": true, "shape": "PURE STRIP as ruled", "keys": ["record:details.layout"], "expectedNotices": 3} ], "walker_reach_verified": "mapPageComponents (walk.ts, post-#7034) visits regions[].components[], slots.<slot> (single + array) and nested properties containers to any depth; fixtures exercise all three forms", "scoping": "every strip is scoped by component `type`, never by key name — page:header.actions and record:highlights.layout are LIVE same-leaf-name siblings and are carried as in-fixture controls", "retired_keys_by_major_17": ["ui/PageCardProps:actions", "ui/PageHeaderProps:icon", "ui/RecordDetailsProps:layout"], "d3_chain_step": "both ids added to MIGRATIONS_BY_MAJOR[17].conversionIds; step rationale extended", "semantic_migration": "none — authored/stored metadata with a D2 conversion, so the fieldErrors disposition does not apply", "default_changes_by_major": "no row required, measured: authorable-defaults drops RecordDetailsProps:layout=\"auto\" as a retirement, and the #4666 ratchet reported '1310 default(s) unchanged' against upstream f5a9bc2", "author_sites_cleaned": ["examples/app-showcase/src/ui/pages/project-workspace.page.ts", "packages/mcp/src/connect-ui.ts", "packages/cloud-connection/src/marketplace-ui.ts", "packages/cloud-connection/src/cloud-connection-ui.ts", "skills/objectstack-ui/SKILL.md", "3 test fixtures (rest, spec/i18n-resolver, cli)"], "changeset": ".changeset/page-component-zero-reader-keys-removed.md (major, bang, adr-0087 disposition marker)" }, "ratchet_answers": { "authorable-surface/ui.json": "3 lines gain [RETIRED]; no line vanishes — correct for the tombstone route", "json-schema.manifest/ui.json": "byte-identical — no def deleted, only a def's key set narrowed; the per-key deletion ratchet correctly never fires", "api-surface/ + api-surface-signatures.json": "byte-identical — prints type references, blind to key-level narrowing; no orphaned value schema accompanies these keys", "note": "the brief predicted both deletion gates would fire; they did not, and per the playbook §2 route table that is the CORRECT reading for a tombstone (non-strict) retirement rather than a whole-def deletion" }, "reverse_verification": { "direction_predicted_first": true, "authored_key_rejected": "4/4 probes — success=false, code=invalid_type, expected=never, path=[key], message = the prescription naming the backticked key and closing with the house sentence", "envelope_status": "ABSENT — schema verdicts carry no envelope `status`; reported as absent rather than fabricated", "stored_row_through_conversion": "4 notices, exactly the predicted sites (region form + nested container + named slot); page:header.actions, record:highlights.layout and element:button.icon all survive; zero other protocol-17 conversions fired on the fixture", "untouched_siblings": "byte-identical on all 4 bags incl. record:highlights.layout" }, "gates": { "check:liveness": "PASS", "check:empty-state": "PASS", "check:authorable-surface": "PASS", "check:docs": "PASS", "check:api-surface": "PASS", "check:spec-changes": "PASS", "check:upgrade-guide": "PASS", "check:skill-refs": "PASS", "check:skill-docs": "PASS", "check:skill-examples": "PASS", "check:variant-docs": "PASS", "check:exported-any": "PASS", "check:dual-source-exports": "PASS", "check:export-origins": "PASS (4991 exports / 16 entry points; regenerated, never hand-edited — shards did not move since no export is added or removed)", "check-adr-0087-registration --base origin/main": "PASS (1 declared-breaking changeset, disposition present)", "pnpm check:i18n": "PASS (9 packages in sync)", "pnpm typecheck": "PASS (126/126)", "pnpm lint": "PASS", "pnpm test": "PASS after isolating one flake", "@objectstack/dogfood": "PASS (526 passed / 3 skipped)", "check:react-declaration-parity": "NOT RUN — structurally cannot run here; its RHS is objectui's sdui.manifest.json, an on-demand gate triggered by the pin bump (#5960), and this PR does not move .objectui-sha" }, "flakes": [ { "test": "@objectstack/types src/node.test.ts > falls back to the importing package's own resolution when the host does not declare", "symptom": "timed out at 5000ms in the full parallel run", "attribution": "not this diff — a package-resolution test in an untouched package; its siblings take 3021ms and 1672ms in the same file", "isolated_rerun": "230/230 pass in 3.32s" } ], "sequencing": "objectui#3829 and objectui#3818 are Blocked-by #6946 and proceed on the next .objectui-sha pin bump. Note left on the PR: dropping the two UNPUBLISHED_EXEMPTIONS entries is NOT automatic on the bump — retiredKey() keeps the key in Object.keys(shape), so they resolve via objectui's tombstone recognition (the objectui#3808 trap).", "out_of_scope_findings": [], "needs_user_decision": false }Generated by Claude Code
os-zhuang commentedon Aug 9, 2026
OS-DEV-REPORT addendum — CI green, base-branch checked, one correction to the report above.
"commit": "03e42ae"is stale — that sha predates the amend that added the changeset'sadr-0087:disposition marker. The commit actually on the branch and in PR refactor(spec)!: retire PageHeaderProps.icon, PageCardProps.actions, RecordDetailsProps.layout (#6946) #7115 is016f6ec. Nothing else in the report changes.success, including both required gates (ESLint, TypeScript Type Check). The oneskippedis Console Pin Gate, correct here since.objectui-shadoes not move.mainadvanced f5a9bc2 → 9136327 (5 commits) after the push. The merge is clean; sincepackages/specmoved on both sides the AGENTS.md §10 scoped re-check was run on the merged tree rather than assumed —spec build && check:generated→ all 11 generated artifacts up to date, no jointly-wrong artifact.main's spec commits touchautomation/io-node-config.zod.tsandui/view.zod.ts(.describe()alignment), disjoint from this diff. The merge was not pushed: it would invalidate a fully green CI run for no measured benefit, and the queue rebuilds onto currentmainanyway.docs/adr/**path. PR remains draft, no auto-merge armed, no queue entry made from this seat.<…>placeholders GitHub's sanitizer had stripped (slots.<slot>,path = [<key>]) — presentation only, no claim changed.Generated by Claude Code
refactor(spec)!: retire PageHeaderProps.icon, PageCardProps.actions, …
fix(spec): flip `field.relatedListFilter` to `live` — its flip condit…
fix(spec): the protocol 16 → 17 conversion summaries and three descri…
test(spec): the second ui/ file group's test titles state each cited …