Repository navigation
[Decision] Console home blocks registered without a namespace: raise the namespaced ratchet, arm twins, or leave bare #13301
Description
Filed by domain:ui seat 2 (session_01XVp19E1MYUTFM3dnkwz8gB) from the os-dev report on PR #13300 (objectui#13295, item 2). ⛔ Not a claim. The other two items of objectui#13295 are handled in PR #13300; this card carries item 2 alone.
Reader (who acts): the maintainer (or the director seat) picks a route; then the objectui domain:ui lane applies it.
What
packages/app-shell/src/console/blocks/productBlocks.tsx registers five console home blocks (hero, stat, usage-bar, checklist, tile-grid) with no namespace. packages/core/src/registry/Registry.ts (~529) logs Registering component "…" without a namespace is deprecated for each, on every console boot. That was found on cloud staging (objectstack-ai/cloud#3125) and is still present on objectui main (measured at 0093b2c826).
The ruled fix, namespace: 'app-shell' (the namespace every other console registration uses), works at runtime: a bare type: 'hero' still renders, app-shell:hero renders, and no warning is logged. But regenerating KNOWN_SCHEMA_TYPES then adds five app-shell: keys that objectui validate refuses at type. That raises NAMESPACED_REFUSED_AT_TYPE in packages/cli/src/__tests__/registered-types-validate-ratchet-10859.test.ts from 302 to 307.
Governing text: packages/cli/src/__tests__/registered-types-validate-ratchet-10859.test.ts header: "⛔ It never rises … ⛔ Do not raise the constant to make it pass — arm the type, or take the registration's authorability to the card." The same file records one earlier "named stopgap raise" by seat answer (6116842485). Raising a gate's pin is a weakening, so the seat does not grant it on its own.
Options
| Route | Effort | |
|---|---|---|
| A | Namespace the five calls and arm the five app-shell: twins in @object-ui/types (product-blocks.zod.ts), so validate accepts both spellings. |
~half a day; outside a UI-only surface (types zod, TS face, parity gates) |
| B (dev's recommendation) | Namespace the five calls, regenerate KNOWN_SCHEMA_TYPES, and raise the pin 302 → 307 as a named stopgap with a comment naming this card. The diff is ready (5 namespace lines, 5 generated keys, the pin, a pin test). |
~15 minutes |
| C | Leave the registrations bare and close the item as won't-fix (devtools noise only), or move it to a Registry policy that does not warn for a bare key that is the spec's own page-vocabulary spelling. | 0 now; the Registry policy change touches packages/core and every bare registration |
四维分析
- 实际业务需求:可观测的症状只是每次控制台启动打印的 5 条弃用告警,用户界面无影响。没有人写
app-shell:hero:所有页面和预览画廊都写裸hero。A 的双拼写无实测生产者;B 与 C 都不改变作者面。 - 项目长远合理性:B 让这五个注册与其余
app-shell:注册(已在 302 之内)同形,但用一次「永不上升」棘轮的上调换取;C 认为裸hero本就是规范的页面词汇拼写(ADR-0060),告警本身才是该改的地方,但那是packages/core的策略改动;A 引入第二种可写拼写,与 contract-first 相悖。 - 防 AI 写错:B 保持唯一可写拼写
hero,app-shell:hero在 validate 处被响亮拒绝;C 中性;A 最差,让 AI 两种拼写都能写。 - 创业阶段不扩散:B 与 C 都不扩面;A 无拉动地扩面。B 需要豁免一条「永不上升」的门禁规则,门禁只减不增的方向上属于放松,故交维护者。
Seat view: B or C. B removes the observed symptom at the cost of a named, five-key stopgap raise. C is zero-cost and arguably more faithful to the spec's bare page vocabulary, but leaves the warnings. A is not recommended.
class: a · reach: every console session's devtools log (no user-visible effect).
Dedupe words: productBlocks namespace deprecated warning, hero stat usage-bar checklist tile-grid without a namespace, NAMESPACED_REFUSED_AT_TYPE raise. Parent: objectui#13295. No other open card covers it.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 21, 2026
Maintainer ruling: B (the triage seat's chat). Triage seat ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-21T09:08ZWhat B is: namespace the five console home blocks, regenerate
KNOWN_SCHEMA_TYPES, and raiseNAMESPACED_REFUSED_AT_TYPEfrom 302 to 307 as a named stopgap. This is the second named raise, after seat answer6116842485. The maintainer grants it for these five keys only. ⛔ The gate's "never rises" rule still applies to every other change.Readings it builds on (objectui
main, fresh read):packages/app-shell/src/console/blocks/productBlocks.tsx:360,:375,:386,:398,:408.hero,stat,usage-bar,checklistandtile-gridare still registered with nonamespace.packages/cli/src/__tests__/registered-types-validate-ratchet-10859.test.ts:171. The pin still reads302, and:160records the earlier named raise.Dispatch shape (
domain:ui, one PR):namespace: 'app-shell'to each of the fiveComponentRegistry.registercalls. This is the namespace every other console registration uses.KNOWN_SCHEMA_TYPESwith the repo's generator, not by hand. The diff should add exactly fiveapp-shell:keys.307. The comment beside it names this card and this ruling, in the same form as the:160entry.type: 'hero'(and the other four) still renders;objectui validaterefusesapp-shell:heroattype, soherostays the one authorable spelling;without a namespace is deprecatedline for the five blocks.patchchangeset for@object-ui/app-shell. There is no spec or protocol change, so this needs no objectstack-side work and no pin move.Out of scope: A (the
app-shell:twins in@object-ui/types) and C (a Registry policy change inpackages/core). Both stay out.State:
needs-user-decision→pm:queue, at p3 (devtools noise only, nothing visible to users).Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
Claim: PM loop round 23 (
priority:p3)Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-13301-product-blocks-namespaceWorktree:
objectui-issue-13301Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/app-shell/src/console/blocks/productBlocks.tsx(the fiveComponentRegistry.registercalls);packages/cli/src/utils/known-schema-types.ts, regenerated with the repo's generator only (exactly fiveapp-shell:keys added);packages/cli/src/__tests__/registered-types-validate-ratchet-10859.test.ts(theNAMESPACED_REFUSED_AT_TYPEpin 302 → 307 and its named-raise comment, nothing else);.changeset/13301-product-blocks-namespace.md(patch for each published package touched).⛔ No
@object-ui/typesarm (option A) and nopackages/coreRegistry policy change (option C); the ratchet's "never rises" rule is waived for these five keys only. Stop on breach; explain in the report.Container & model:
S,mode:subagent,model: opus(default tier; no path-derived mandate)Clause-②: no (internal registrations; the one authorable spelling stays bare)
Responsibility: the console registers its five home blocks without a namespace, so the Registry logs a deprecation warning for each on every boot | none | every console session's devtools log (no user-visible effect)
Thread-read: 6312301934
Serial constraints cleared:
productBlocks.tsx,known-schema-types.tsor the ratchet test (read at 10:25Z). objectui#13308 (PR test(types): stop authoring the retired addRecord.mode / formView in two spec-alignment tests #13312) touchespackages/typestests only.Claimed at: 2026-10-21T10:23Z
Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
os-dev-report
{ "issue": 13301, "status": "done", "branch": "claude/issue-13301-product-blocks-namespace", "pr": "https://github.com/objectstack-ai/objectui/pull/13314", "session": "session_01XVp19E1MYUTFM3dnkwz8gB", "premise_still_valid": true, "summary": "Ruling B executed at base f5e42cad47. The five console home blocks (hero, stat, usage-bar, checklist, tile-grid) now register with namespace app-shell; KNOWN_SCHEMA_TYPES was regenerated with scripts/regenerate-known-schema-types.mjs and gained exactly the five app-shell: keys (checklist, hero, stat, tile-grid, usage-bar) and nothing else; NAMESPACED_REFUSED_AT_TYPE moved 302 to 307 with a docblock entry naming objectui#13301 and maintainer ruling 6312301934, in the form of the objectui#7611 PR-5 entry, saying the raise covers these five keys only. Two new pin files cover (a), (b) and (c), plus a patch changeset for @object-ui/app-shell and @object-ui/cli. Draft PR #13314 (head 6ccc16f38e), assigned to baozhoutao, body line 1 Fixes #13301 and line 2 Clause-②: no.", "tests": "All at head 6ccc16f38e, vitest --maxWorkers=1 under os-verify-lock, one package group at a time. app-shell blocks (new productBlocks-namespace-13301.test.tsx + productBlocks-12197 + localeMapHole-12936): Test Files 3 passed, Tests 30 passed. cli + generator pins (new product-blocks-namespace-13301.test.ts, registered-types-validate-ratchet-10859, known-schema-types-derivation-5115, report-namespace-agreement-6416): 4 files, 62 passed. Families naming the touched files: cli (check-known-types, check-unbindable-text-expression-4795, check-unknown-type-case-suggestion, retired-view-dashboard-key-9533, unfulfilled-chart-stubs-retired-8760) 5 files 61 passed; types (4 arm/registry files) 88 passed; plugin-report report-bare-key-ownership 12 passed; scripts check-lucide-icon-record-names 51 passed; examples/schema-catalog catalog-gallery-render 588 passed. Pins: (a) each bare key renders its text via SchemaRenderer with no unknown-component panel, and bare and app-shell: keys resolve to the same renderer; (b) bare key claimed and app-shell: key refused at type (invalid_union at path type) for all five, and objectui validate exits 0 on a page with bare hero and 1 with app-shell:hero; (c) a console.warn capture installed in vi.hoisted before ../productBlocks evaluates (dom project, isolate true) sees no deprecation line naming the five, with a lit control (a bare probe registration is captured). (d) one-shot probes through objectstack scripts/ablation-replace.mjs: pin 307 to 306 landed (anchor 1 to 0, blob e41bfebce987 to d6cc69e86b7f) and went red 'refuses 307 registered namespaced key(s) at type; the pin is 306.'; a sixth key app-shell:probe-sixth-13301 inserted into known-schema-types.ts landed (anchor 1 to 0, blob 285dbf9e58ac to 6141454df73d) and went red 'refuses 308 ...; the pin is 307.' with the probe in the refused list; both restored, blob == HEAD, git diff HEAD empty. Ablation (fix committed first): ablation-replace --delete --expect 5 on the five namespace lines, anchor 5 to 0, blob 2f944edbf050 to 4e044375ef7d (the origin/main blob); Tests 2 failed | 6 passed (8): red = the deprecation pin (c) and the same-renderer pin; green = the five bare-key renders (a) and the capture control; restore blob 2f944edbf050 == HEAD blob, git diff HEAD empty. No dist build: the test imports ../productBlocks from source. Closure build turbo run build --concurrency=2 --filter=@object-ui/app-shell^... --filter=@object-ui/cli^...: 28 successful, 28 total. type-check @object-ui/app-shell exit 0 (tsc --noEmit && tsc -p tsconfig.test.json), @object-ui/cli exit 0 (tsc --noEmit); --listFilesOnly count 1 for each new test. Lint narrowed: eslint --no-inline-config --format json on the 5 changed source/test files: 5 files, 0 errors, 1 warning (react-refresh/only-export-components on productBlocks.tsx line 211, untouched, pre-existing). Population: repo eslint.config.js, no type-aware parserOptions project, so this diff cannot move a verdict on an untouched file. Declared to CI: full packages/app-shell/ and packages/cli/ directories.", "mcp_calls": "0", "api_writes": "4 — git push (branch create, empty) + git push (commit 6ccc16f38e); relay pr_create (POST /repos/objectstack-ai/objectui/pulls + POST /issues/13314/assignees, run 39586232400, read-back 6047 bytes sent = stored); relay comment POST /repos/objectstack-ai/objectui/issues/13301/comments (this report). No label writes (objectui; none named by the order).", "open_questions": [], "out_of_scope_findings": [], "deviations": [ "The first sixth-key probe was a no-op: ablation-replace refused it before running anything, because its replacement still contained the anchor (anchor 1 to 1). It restored to the HEAD blob and was re-run with an anchor the mutation removes (the usage-bar line plus the following app:launcher line). The reading quoted in tests is from the second run.", "PR footer uses the role file's session-URL form instead of the harness's suggested footer; commit trailers are exactly the order's model-free pair." ], "files_changed": [ "packages/app-shell/src/console/blocks/productBlocks.tsx", "packages/app-shell/src/console/blocks/__tests__/productBlocks-namespace-13301.test.tsx", "packages/cli/src/utils/known-schema-types.ts", "packages/cli/src/__tests__/registered-types-validate-ratchet-10859.test.ts", "packages/cli/src/__tests__/product-blocks-namespace-13301.test.ts", ".changeset/13301-product-blocks-namespace.md" ], "gates": "closure build 0 (28/28); type-check app-shell 0, cli 0; narrowed lint 0 (0 errors); battery exit 0: check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-drift, i18n-designer-parity, control-bytes, doc-types, registry-bare-names, prompt-keys, entry-guard, new-line-citations (0 new), check-hand-rolled-comment-mask, check-doc-expression-carriage, regenerate-known-schema-types --check, check-changeset-fixed, check-changeset-presence. check:spec-floors exit 1: five no-artifact findings (unbuilt packages in this worktree, app-shell and cli among them) and one floor-too-low on the untouched @object-ui/types; recorded, not fixed; NOT MEASURED for this diff. Control-byte self-scan on the changed files: 0 hits. CI: in_progress at report time.", "line_budget": "n/a (no skills/** or governed surface touched)" }Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
ACCEPT — PR #13314 @
6ccc16f38e42dc9fbfa5f9eca9eb40ae59bfaa01·domain:uiseat 2 (session_01XVp19E1MYUTFM3dnkwz8gB)ComponentRegistry.registercalls inproductBlocks.tsxcarrynamespace: 'app-shell'.KNOWN_SCHEMA_TYPESwas regenerated withscripts/regenerate-known-schema-types.mjs. The diff adds exactlyapp-shell:checklist,:hero,:stat,:tile-gridand:usage-bar, nothing else, and--checkexits 0.NAMESPACED_REFUSED_AT_TYPEmoves 302 → 307. The docblock entry names objectui#13301 and the ruling in the:160form, and says the raise covers these five keys only.@object-ui/typesarm (A) and no Registry policy change (C).app-shell:keys resolve to one renderer. (b) For all five, the bare key is claimed and theapp-shell:key is refused attype;objectui validateexits 0 on bareheroand 1 onapp-shell:hero. (c) Aconsole.warncapture installed before the module evaluates records no deprecation line for the five; a control proves the capture works. (d) One-shot probes: the pin at 306 reds, and a sixth unarmed namespaced key reds at 307; both were restored by blob. Ablation (the fivenamespacelines removed, back to themainblob): the deprecation pin and the same-renderer pin went red, with the five bare renders and the control green. The restore was proven by blob.@object-ui/app-shelland@object-ui/clipatch.Next: ready + auto-merge; landing is verified by content on
main.Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gBmain7e9708e632.7e9708e632as at the accepted head6ccc16f38e. The merge message carries no model identifier.hero,stat,usage-bar,checklist,tile-grid) register undernamespace: 'app-shell', so the console no longer logs a "without a namespace is deprecated" line for each on boot.KNOWN_SCHEMA_TYPESgained exactly the fiveapp-shell:keys (regenerated).NAMESPACED_REFUSED_AT_TYPEis 307, a named stopgap for these five keys only. Pages keep writing the bare key;objectui validaterefuses theapp-shell:spelling attype.pm:dispatchedis removed.Generated by Claude Code