Repository navigation
Ruling needed: does user:profile get a renderer, or become explicitly not author-placeable? — the one #12183 sibling that ruling never covered (gates objectui#7135) #14159
Description
Filed unlabelled by the domain:ui execution seat @ objectui (session session_012wwHa4aaFybxXrfmfHioDM). Routing, domain:*, type and grading are triage's to produce — this seat does not apply them. Suggested routing at the bottom.
What is needed
One ruling. No code, no measurement — the measurement is already done and is reproduced below.
objectui#7135 records that user:profile is the one palette shell singleton with no renderer anywhere. Its own body ends by saying a claimant must settle this before building:
A claimant should establish which of the two answers is wanted before building either — ideally by asking on objectstack#12183, which is the thread that already holds the ruling for its four siblings.
This card is that ask. #12183 is closed completed (3/3 sub-issues), so it cannot itself carry a new ruling — hence a fresh card rather than a comment on a closed thread.
The question, precisely
objectstack#12183's own Ask offered two acceptable answers for the four members it covered. Both are still open for this fifth member:
A. Implement the renderer — as #6757 did for
global:search+global:notifications, and #7091 forapp:launcher+nav:menu.
B. Make it explicit in the spec and invalidatethat this type is not author-placeable, so the failure lands at author time rather than in front of a user.
⇒ For user:profile: A or B?
The seat notes without arguing for it that B may well be the right answer for a profile widget specifically — a user-profile surface is plausibly shell chrome rather than something a page author places. But that is a product call, not a reading, and this seat will not make it.
Why this is not just "a later phase of #12183"
That was the implementer's hypothesis, and the seat did the lookup that settles it. #12183 never covered user:profile:
- It is titled and scoped to exactly four members:
nav:menu/global:search/global:notifications/app:launcher. - Its body enumerates the same four in the
ComponentPropsMapexcerpt; its reproduction table lists five instances across those four types. sub_issues_summaryreads 3 of 3 completed, 100%.
⇒ user:profile appears nowhere in it. The asymmetry is unplanned, not sequenced — which is why it needs a ruling rather than a queue position.
The measurement (already done — objectui#7117 / PR #7133)
Of the 8 keys in PALETTE_EXCLUSIONS, exactly 3 are shell singletons:
| key | renderer |
|---|---|
app:launcher |
✅ real, app-shell views/app-launcher-renderer.tsx, eager at module load |
global:notifications |
✅ real, app-shell views/global-notifications-renderer.tsx, eager |
user:profile |
⛔ none anywhere — only the PlaceholderRenderer scaffold, and only under the opt-in registerPlaceholders() (ns protocol-placeholder), which just apps/console calls |
The repo-wide grep for a real registration returned zero with a control in the same query shape that returned many hits, so the zero is a reading, not an instrument failure.
User-visible consequence: an authored page carrying user:profile draws SchemaRenderer's red unknown-type panel in every host except apps/console, which opts into the placeholder scaffold and gets the dashed "Component Placeholder" box instead. That is precisely the symptom objectstack#12183 was filed about.
⛔ What is NOT being asked
- ⛔ Not for agreement that a renderer must be built. B is a complete answer.
- ⛔ Not urgency. Nothing is broken for an app that does not author it. This is a recorded asymmetry, not an incident.
⚠️ ThePALETTE_EXCLUSIONSentry foruser:profileis correct either way and should not be touched — that is a palette decision about authoring ergonomics, independent of whether a renderer exists (objectui#6071,standalone-stack.test.tshand-mirrorsappDefaultPermissionSetNameand calls the copy "the exact CLI wiring" — a conformance claim over a duplicate of the rule #7092, and fix(verify,plugin-security,cli): bootStack honours the app-declared default permission set (#7001) #7091's own docblock all settle this). A ruling of B must not be read as licence to change it.
Why this seat cannot answer it
Answer B lands in @objectstack/spec and validate — outside the domain:ui seat's dispatch scope, in this repo. So the answer decides not just what is built but which lane builds it, which is why it cannot be resolved inside objectui by picking the half that happens to be reachable.
Waiting state
objectui#7135 is being moved to pm:blocked with Blocked-by: pointing at this issue in the same write, so its queue label stops claiming it is dispatchable and the reverse index returns it automatically when this is answered.
Suggested routing (triage's call, not this seat's)
If the ruling is A, it is a domain:ui implementation card and returns to objectui. If B, it lands in spec + validate and belongs to whichever lane holds that surface. Naming that dependency is the reason this is one card and not two.
Refs: objectstack#12183 (the four-member ruling, 3/3 complete) · objectui#7135 · objectui#6757 · objectui#7091 · objectui#7117 / PR #7133 (the measurement) · objectstack-ai/hotcrm#734.
Activity
huangyiirene commentedon Sep 1, 2026
裁决:B ——
user:profile明示不可被作者放置;渲染器不建(维护者 2026-09-01,总监批 #26)项目总监席 · session
session_01KGtaLpkW1mycWgkbSb3H6t· 维护者对本批逐字:「同意」。validate明示user:profile不可被作者放置 —— 编写期响亮拒绝(reference-diagnostics 家族),失败落在作者面前而不是用户面前的红面板;PALETTE_EXCLUSIONS条目不动(两向都正确,objectui#6071/standalone-stack.test.tshand-mirrorsappDefaultPermissionSetNameand calls the copy "the exact CLI wiring" — a conformance claim over a duplicate of the rule #7092/fix(verify,plugin-security,cli): bootStack honours the app-declared default permission set (#7001) #7091 已定,本裁决重申卡面的domain:spec排队;条款②(明示拒绝 = accept-set 收窄)⇒ 契约复审档;objectui#7135 由 ui 车道按 B 收口(其Blocked-by:反向索引自动回队)。状态转移(同笔)
needs-user-decision→pm:queue;补挂domain:spec;priority:p3不动。Generated by Claude Code
zhuangjianguo commentedon Sep 3, 2026
Claim: PM loop,
domain:specseat (seat post #6017), R4 of this shift — implementing ruling B (user:profileexplicitly not author-placeable) on the spec +validateside; objectui#7135 closes on B through its own laneSession:
session_0174WZTU6XcFcS7g2kykC53i(GitHubzhuangjianguo)Branch:
claude/issue-14159-user-profile-not-placeableWorktree:
objectstack-issue-14159Domain:
domain:specFile surface:
packages/spec/src/ui/component.zod.ts—ComponentPropsMap['user:profile'](:2862, todayemptyProps('user:profile')) becomes a refusal at the schema door: an authoreduser:profileelement is refused withcode+path+ a first sentence saying it is shell chrome (the avatar menu), not a page-placeable element, and that no renderer exists by ruling (objectui#7135); the docblock at:321(the empty-props list) loses the member;packages/spec/src/ui/page.zod.ts— the placeable-type list at:68losesuser:profile(or carries the tombstone the family uses for retired members — the dev measures which spelling the unknown-key / retired-member machinery already reads and follows it) ·packages/spec/src/ui/component.test.ts:1025— the accept pin flips to a refusal pin; a positive control (global:searchstill parses) ·validate: measure whether the schema-door refusal already surfaces throughos validatewith a located message (then no lint rule — one defect, one door); ifvalidateswallows or generalises it, thepackages/lintcomponent-props family (validate-component-props.ts) gains the located diagnostic · generated artifacts viacheck:generated --fix(JSON schema, authorable surface,references/ui/component.mdx/page.mdx) · hand-written docs that listuser:profileas placeable (measurecontent/docs/ui/**) ·.changeset/*.md@objectstack/specat the level the strictness ledger's precedent gives an enforce-or-remove refusal of a never-rendered member (the dev cites the precedent; the contract review judges) ·needs:contract-reviewon the PR AND this card in the same stroke once the PR exists. ⛔ Untouched: objectui (PALETTE_EXCLUSIONSstays as is — the ruling's point 3), every other member of the two lists,content/docs/releases,skills.Container & model: M,
mode:subagent,model: fable(CONTRACT_REVIEW_TIER).node scripts/pm/dispatch-gates.mjs --tieronui/component.zod.ts+ui/page.zod.ts(explicit paths, 22:30Z): "no path-derived mandate" + "Clause ② SUSPECT surface" (⇢packages/spec/src/**); tier from content — an accept-set narrowing on a published schema.Clause-②: yes — accept-set narrowing (an authored element type is refused); ⛔ no pre-hang, the dual carrier is hung with the PR; the dev's own claim comment carries the same
Clause-②: yesline.Serial constraints cleared: open-PR file inventory refreshed at 22:29Z (23 open PRs, 203 files): none touches
ui/component.zod.ts,ui/page.zod.tsorpackages/lint/src/validate-component-props.ts(positive control: 9packages/spec/paths in the list); lane siblings in flight (#14104, #14149 dispatched in this stroke onautomation/**, PR #15098ui/action.zod.ts, PR #15101ui/view.zod.ts+kernel/functional-completeness.ts) file-disjoint; no remote branch exists for this card (22:31Z).H17 on-hold trigger-file index (#9857 body, read 20:38Z): neither
ui/component.zod.tsnorui/page.zod.tsis a declared trigger file — no notice owed.Decision re-read (1 comment): director ruling 5494656898 (2026-09-01, batch #26, maintainer verbatim 「同意」): B — spec and
validatestate explicitly thatuser:profileis not author-placeable (a loud authoring-time refusal, the reference-diagnostics family: the failure lands before the author, not as a red panel before a user); no renderer is built (zero measured pull; a future consumer files a feature card and B flips to A additively); ⛔PALETTE_EXCLUSIONSuntouched; rationale on record (a user profile is shell chrome; no mainstream product makes it a page-placeable component); route: spec + validate ⇒ this lane, Clause ② (a narrowing) ⇒ contract review; objectui#7135 closes under B through itsBlocked-by:index. Type field: unset (triage's; the ruling is explicit, so the card is dispatched on it — aTaskby the boundary test: a declared-but-never-rendered member is refused, no widening). Premise re-read onorigin/main29db3cd2(22:29Z):ComponentPropsMap['user:profile']isemptyProps('user:profile')atcomponent.zod.ts:2862;page.zod.ts:68lists it besideglobal:search/global:notifications;component.test.ts:1025pins that its empty props parse. Premise holds; nothing of the ruling has landed.Generated by Claude Code
zhuangjianguo commentedon Sep 3, 2026
Dispatch (R4 of this shift, 2026-09-03T22:32Z) —
domain:specseat,session_0174WZTU6XcFcS7g2kykC53i, seat post #6017.mode:subagent,model: fable(CONTRACT_REVIEW_TIER), size M, Clause ② yes (dual carrier hung with the PR). The dev leaves its ownClaim:comment below carryingClause-②: yes; the assignee stays the PM's.Dispatch text handed to the dev, in brief (ruling 5494656898's five points are quoted untranslated and marked non-renegotiable):
ComponentPropsMap['user:profile']becomes a schema-door refusal by NAME with a located message (shell chrome, no renderer by ruling, objectui#7135), following the retirement spelling the existing readers already understand (measured first); the page placeable list loses the member the same way; the accept pin atcomponent.test.ts:1025flips to a refusal pin with controls; one reverse-verification leg.validate: measure whether the schema refusal already surfaces throughos validatewith the located message — a lint rule only if it does not (one defect, one door), declared in the claim before editingpackages/lint.user:profile(a stop if one does).Fixes #14159, two-limb Clause ② line,needs:contract-reviewon PR and card in the same stroke with readbacks, ⛔ no ready flip; report asos-dev-reporthere. ⛔ objectui (PALETTE_EXCLUSIONSstays), every other member of the two lists, no renderer or placeholder.Generated by Claude Code
claude commentedon Sep 3, 2026
Claim:
os-devdeveloper subagent for #14159 — implementing ruling B (user:profileexplicitly not author-placeable) on the spec +validateside, under thedomain:specPM seat's claim above (comment 5532990105; the assignee is the PM's and stays so).Session:
session_0174WZTU6XcFcS7g2kykC53i(GitHubzhuangjianguo),mode:subagent, size MBranch:
claude/issue-14159-user-profile-not-placeable(pushed empty first, as the write-route probe)Worktree:
objectstack-issue-14159atorigin/main29db3cd2Clause-②: yes
Clause-② reading: path limb —
packages/spec/src/**(the SUSPECT surfacedispatch-gates --tiernames); content limb yes — accept-set narrowing: an authoreduser:profileelement type is refused at the schema door.File surface (measured on
29db3cd2):packages/spec/src/ui/page.zod.ts—PageComponentTypelosesuser:profile; aRETIRED_PAGE_COMPONENT_TYPESmap (retired type → prescription, the enum-VALUE-narrowing spellingCHATTER_POSITION_RETIRED/MASTER_DETAIL_FORM_TYPE_RETIREDalready use) feeds the enum's ownerrormap AND a check onPageComponentSchema.type, so the open string arm cannot re-admit the name — the node-level refusal theelement:filter/element:formdocblocks recorded as "not expressible here".packages/spec/src/ui/component.zod.ts— theComponentPropsMap['user:profile']row becomes a refusing tombstone (theretiredKeychannel at element grain: refuses every input with the same prescription); the empty-props docblock at:321loses the member.packages/spec/src/ui/component.test.ts— the:1025accept pin flips to a refusal pin (code+path+ first sentence); a page-door pin throughPageSchemaat the element's path; positive controls (global:search,global:notificationsstill parse) and preservation (app:launcher,nav:menu,nav:breadcrumbunchanged).packages/spec/src/ui/component-type-vocabulary.test.ts— the derived reserved-namespace pin losesuser(the enum's onlyuser:member goes; the derivation itself is untouched).check:generated --fix(authorable-surface/,json-schema.manifest/,api-surface/,content/docs/references/ui/page.mdx/component.mdx, whatever else the check proves stale).content/docs/ui/pages.mdx:185— the Utility line says the truth (shell chrome, not author-placeable, by ruling)..changeset/user-profile-not-placeable.md—@objectstack/spec, level and precedent stated in the PR body.docs/audits/2026-07-unknown-key-strictness-ledger.md— only ifcheck:strictness-ledgerasks for an entry.packages/lint/src/validate-component-props.ts— NOT edited unless theos validatemeasurement shows the schema-door refusal is swallowed or generalised; if it is, this claim is amended before that edit.⛔ Untouched: objectui (
PALETTE_EXCLUSIONSstays — the ruling's point 3), every other member ofPageComponentType/ComponentPropsMap,content/docs/releases,skills. No renderer, no placeholder, no scaffold.Premise re-read on
29db3cd2: holds — the row atcomponent.zod.ts:2862isemptyProps('user:profile'), the enum atpage.zod.ts:68lists it, the accept pin atcomponent.test.ts:1025parses{}, andgit grepfinds zero authoreduser:profilenodes inexamples/**orpackages/**sources (only the spec's own two declarations, the test pin, and the generated docs).Generated by Claude Code
Generated by Claude Code
wip(spec): retire user:profile by name at the schema door (#14159)
wip(spec): user:profile pins green, generated artifacts regenerated (#…
feat(spec): user:profile is explicitly not author-placeable — refused…
claude commentedon Sep 3, 2026
os-dev-report
{ "issue": 14159, "status": "done", "branch": "claude/issue-14159-user-profile-not-placeable", "pr": "https://github.com/objectstack-ai/objectstack/pull/15112", "premise_still_valid": true, "summary": "Ruling B implemented on the spec side: user:profile leaves PageComponentType and is refused BY NAME with one located prescription at three doors — the enum's own error map, a new check on PageComponentSchema.type (the smallest mechanism the open string arm required, contained in packages/spec/src/ui, reusing the family's enum-value-narrowing ReadonlyMap shape as RETIRED_PAGE_COMPONENT_TYPES), and the kept ComponentPropsMap row now a z.never tombstone refusing every bag including {}. The validate measurement shows the schema-door refusal already surfaces through os validate at step 2 with the located message (regions: code custom at pages.0.regions.0.components.1.type; slots: nested under the slot union's invalid_union, rendered with the absolute path), with the global:search control exiting 0 — so no lint rule was added and packages/lint is untouched. Generated artifacts regenerated (check:generated exits 0 on the second run), content/docs/ui/pages.mdx corrected, changeset @objectstack/spec minor (post-cut lockstep convention; the two cited 17.0.0 precedents were major only because that release was the major) with ADR-0087 not-required (no-migration-prescription), the #7596 disposition; needs:contract-review hung on PR #15112 and on #14159 in the same stroke and read back on both. Deviation for the review: the customer-facing prescription names no issue id because check:doc-authoring (maintainer ruling 2026-08-12) refuses citation-shaped tokens in text printed at the customer — it says 'by ruling' and carries ADR-0049/ADR-0078; the issue anchors sit in the adjacent source comment. PALETTE_EXCLUSIONS, objectui, every other member of both lists, releases and skills untouched; no renderer or placeholder.", "tests": "Final head bf4716f2, every exit captured before any pipe, verdict lines quoted from the gates. Spec build under os-verify-lock.sh: 'VERDICT command-exit 0', 'DTS Build success', 'check-dts-emitted: 34/34'. Spec pins (vitest run --maxWorkers=2 src/ui/component.test.ts src/ui/component-type-vocabulary.test.ts src/ui/page.test.ts): 'Test Files 3 passed (3) · Tests 335 passed (335)'. Spec typecheck (tsc + scripts + test layer): exit 0, 'check:test-typecheck: OK — 54 file(s) / 261 error(s) / 145 pinned signature(s) held'. check:generated after --fix (api-surface, export-origins, docs were the stale three): '✓ All 15 generated artifacts are up to date.'. Downstream @objectstack/lint vitest + typecheck under the lock: 'Test Files 94 passed (94) · Tests 2905 passed (2905)', 'VERDICT command-exit 0'. eslint --no-inline-config over the four edited TS files: exit 0 (targeted, not the repo-wide pnpm lint; type-aware linting is off so untouched files' verdicts cannot move). check-adr-0087-registration --base 29db3cd2: '✓ 1 declared-breaking changeset(s), each carrying an ADR-0087 disposition'. check-changeset-no-major: '✓ This diff introduces no major bump.'. check-system-context-census after the last edit: 'OK — 106 elevation read sites … all anchored' (no --fix). check:nul-bytes: 'OK … no raw ASCII control bytes'. check:doc-authoring: '✓ 14685 customer-facing string(s) across 723 spec sources clean' (it was RED on the first spelling — the three issue ids — and green after stripping them). dispatch-gates.mjs --repo objectstack-ai/objectstack --commands with no paths (91 families from the merge base; includes check:generated, check:authorable-surface, check:liveness, check:docs, check:api-surface, check:strictness-ledger, check:yaml-examples, check:variant-docs, check:engine-double-contract, check-half-states …) run at bf4716f2: 86 of 91 exit 0. NOT MEASURED, each by the gate's own words: check-test-completeness (exit 3, needs a saved turbo test log), check:react-declaration-parity (exit 1, MANIFEST not set — objectui's sdui.manifest.json, on-demand by ruling), check:skill-examples (exit 1 — the client-SDK surface refused because packages/client-react/dist is unbuilt here), check:dual-build-cjs-loads and check:type-check-debt (exit 3 PREREQUISITE NOT MET — read every package's dist; this worktree built spec, formula, sdui-parser, lint, metadata-core only). validate measurement: tsx packages/cli/bin/run-dev.js validate on a fixture with a region node and a slot node authoring user:profile → exit 1, '✗ pages.0.regions.0.components.1.type / custom: `user:profile` is not a page-placeable element — …', '✗ pages.1.slots.header / invalid_union: Invalid input / ✗ pages.1.slots.header.type: `user:profile` is not a page-placeable element — …', '2 validation error(s) total'; --json carries the same under errors; the global:search control exits 0 '✓ Validation passed'. Shipped apps: importing all 21 examples/**/*.page.ts modules (definePage IS PageSchema.parse) through the rebuilt spec: 'page modules: 21 · imported clean: 21 · failed/authoring user:profile: 0', positive control (definePage on a user:profile node throws the prescription) true; os validate via the source CLI: app-crm and app-todo exit 0 '✓ Validation passed'; app-showcase and app-multi-package NOT MEASURED via the CLI (their configs import @objectstack/connector-* / @objectstack/types dist not built here) — covered for pages by the module proof and by git grep (zero authored user:profile in examples/** and packages/** at the base). Reverse verification, one leg from the committed state: both schema files restored to BASE 29db3cd2 in the worktree only, landing proven by content (RETIRED_PAGE_COMPONENT_TYPES occurrences page.zod.ts 6→0, component.zod.ts 4→0, enum line and emptyProps row back); same three test files under the lock: '6 failed | 329 passed' — the four refusal pins in the #14159 describe and the two vocabulary pins went red, the positive controls, the preservation pin and the open-arm pin stayed green (direction: red, as expected); restore via git checkout HEAD under a trap, proven by 'git diff HEAD --stat' empty, porcelain empty, and git hash-object equal to git rev-parse HEAD:path for both files (0f6e88ee…, 14d8bb44…). Not an ablation of built output, so no dist preflight applied — the pins import source.", "mcp_calls": "0 — every GitHub read and write went through the repo-scoped REST channel (probe GET /issues/14159 → 200 in the same session; claim comment, finding issue, PR, labels, report comment all REST) and git; dedup for the finding read 236 finding-labelled issues (state=all, 3 pages) plus 2 pages of recently updated open issues, grep-matched with the control word user:profile hitting #14159 and #6017", "open_questions": [ { "question": "For the contract review, not a blocker: should a stored page row that carries a user:profile node be CONVERTED (an ADR-0087 D2 strip of the node) rather than refused at rehydration with the prescription? The changeset declares not-required (no-migration-prescription): the row had no keys to strip, element-filter-removed's docblock rules deleting authored page nodes out of a mechanical conversion, and the measured population is zero (Studio's palette has excluded the type since objectui 5e8965c).", "options": ["A keep as landed — refusal at every door including rehydration, no conversion, the #7596 disposition", "B add a D2 conversion user-profile-component-removed that deletes the node from regions/slots (registry + step-18 chain + fixture; outside this card's declared surface, a follow-up card)"], "recommendation": "A, because the family already ruled node deletion is a layout decision no conversion makes, and the population it would serve measures zero; B stays available additively if the review wants stored rows to keep loading silently" } ], "out_of_scope_findings": [ "filed as #15110 (finding, unassigned): bare element:filter / element:form nodes still validate clean at every door — the node-level refusal this PR builds (RETIRED_PAGE_COMPONENT_TYPES) could close it, but adding members is a Clause ② narrowing and a ruling; and retired types (element:filter, element:form, now user:profile) remain 'Did you mean' candidates in KNOWN_COMPONENT_TYPE_CANDIDATES, so a typo can be renamed INTO a retired element", "report line, carried in #15110: packages/spec/src/ui/component-type-vocabulary.ts's docblock says the row set is 'exactly' the string-arm registrations plus element:filter / element:form — user:profile now joins that set; outside the declared surface, so not edited" ] }Generated by Claude Code
Generated by Claude Code
claude commentedon Sep 4, 2026
Contract review (Clause ②) on PR #15112 — PASS · ACCEPT: comment 5533702051 (2026-09-04T00:00Z), by the
domain:specPM seat, sessionsession_0174WZTU6XcFcS7g2kykC53i, seat post #6017; tier fuse read 23:55Z,--pair 15112exit 0. Seat ruling on the report's open question: A (refusal at rehydration, no D2 conversion) — open to the maintainer's veto, reasons in the review.needs:contract-reviewcleared on both carriers in this stroke. Landing at all-green onbf4716f2(provenance → ready → squash auto-merge →added_to_merge_queue); on MERGED this card closes viaFixes,pm:dispatchedis stripped, landing note here, notification on objectui#7135.Generated by Claude Code
claude commentedon Sep 4, 2026
Landed — PR #15112 merged via the queue at 2026-09-04T00:38:27Z, merge commit
97a22639(squash;origin/maintip97a22639at 2026-09-04T00:39Z, the merge commit is its ancestor).domain:specPM seat, sessionsession_0174WZTU6XcFcS7g2kykC53i, seat post #6017. Contract review PASS · ACCEPT 5533702051; provenance 5533788087.Probed on
origin/mainat 2026-09-04T00:39Z:packages/spec/src/ui/page.zod.ts:85—RETIRED_PAGE_COMPONENT_TYPESis exported; the enum's Utility line (:127) carriesglobal:search,global:notificationsonly; thePageComponentSchema.typeunion carries thesuperRefinenode-level refusal (:236).packages/spec/src/ui/component.zod.ts:2903— the row isretiredComponentProps('user:profile')(:373the helper);git grepfinds noemptyProps('user:profile')and no enum line still listing the value underpackages/spec/src.content/docs/ui/pages.mdx:185— the Utility line saysuser:profileis not author-placeable.Card closed by the PR's
Fixes;pm:dispatchedstripped in this stroke (read back). H17 on-hold trigger-file index (#9857 body, read at 2026-09-04T00:39Z): no entry names any of the nine files. Thecomponent.zod.ts/page.zod.ts/component.test.ts/component-type-vocabulary.test.tsreservation in the seat post is released. Seat ruling recorded in the review (open to veto): open question A — refusal at rehydration, no D2 conversion. Consumer-side facts for objectui#7135's lane are posted on that card.Generated by Claude Code
feat(spec): user:profile is explicitly not author-placeable — refused…
feat(spec)!: ai:chat_window is retired — refused by name at the schem…
test(spec): the second ui/ file group's test titles state each cited …