Skip to content

[Decision] Console home blocks registered without a namespace: raise the namespaced ratchet, arm twins, or leave bare #13301

Closed

Description

@objectstack-fleet

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

  1. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:identityLogin and identity — sign-up, sessions, organization membership, SSO
    on Oct 21, 2026
  2. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Maintainer ruling: B (the triage seat's chat). Triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-21T09:08Z

    What B is: namespace the five console home blocks, regenerate KNOWN_SCHEMA_TYPES, and raise NAMESPACED_REFUSED_AT_TYPE from 302 to 307 as a named stopgap. This is the second named raise, after seat answer 6116842485. 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, checklist and tile-grid are still registered with no namespace.
    • packages/cli/src/__tests__/registered-types-validate-ratchet-10859.test.ts:171. The pin still reads 302, and :160 records the earlier named raise.
    • PR fix(fields): password inputs carry an autocomplete token (objectui#13295) #13300 (objectui#13295 items 1 and 3) merged without this item, so nothing has landed for it yet.

    Dispatch shape (domain:ui, one PR):

    1. Add namespace: 'app-shell' to each of the five ComponentRegistry.register calls. This is the namespace every other console registration uses.
    2. Regenerate KNOWN_SCHEMA_TYPES with the repo's generator, not by hand. The diff should add exactly five app-shell: keys.
    3. Set the pin to 307. The comment beside it names this card and this ruling, in the same form as the :160 entry.
    4. Pin tests:
      • a page that authors bare type: 'hero' (and the other four) still renders;
      • objectui validate refuses app-shell:hero at type, so hero stays the one authorable spelling;
      • booting the console logs no without a namespace is deprecated line for the five blocks.
    5. Add a patch changeset 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 in packages/core). Both stay out.

    State: needs-user-decision → pm:queue, at p3 (devtools noise only, nothing visible to users).


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 23 (priority:p3)
    Session: session_01XVp19E1MYUTFM3dnkwz8gB
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-13301-product-blocks-namespace
    Worktree: objectui-issue-13301
    Domain: domain:ui
    Seat: domain:ui#2
    File surface:

    • packages/app-shell/src/console/blocks/productBlocks.tsx (the five ComponentRegistry.register calls);
    • packages/cli/src/utils/known-schema-types.ts, regenerated with the repo's generator only (exactly five app-shell: keys added);
    • packages/cli/src/__tests__/registered-types-validate-ratchet-10859.test.ts (the NAMESPACED_REFUSED_AT_TYPE pin 302 → 307 and its named-raise comment, nothing else);
    • tests beside them;
    • one .changeset/13301-product-blocks-namespace.md (patch for each published package touched).

    ⛔ No @object-ui/types arm (option A) and no packages/core Registry 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:


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  5. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #13314 @ 6ccc16f38e42dc9fbfa5f9eca9eb40ae59bfaa01 · domain:ui seat 2 (session_01XVp19E1MYUTFM3dnkwz8gB)

    • Clause-②: no. Five internal registrations gain a namespace; the one authorable spelling stays the bare key. No contract review is owed, and the seat read the report and the diff.
    • Seat review, against the maintainer's ruling B (comment 6312301934):
      1. The five ComponentRegistry.register calls in productBlocks.tsx carry namespace: 'app-shell'.
      2. KNOWN_SCHEMA_TYPES was regenerated with scripts/regenerate-known-schema-types.mjs. The diff adds exactly app-shell:checklist, :hero, :stat, :tile-grid and :usage-bar, nothing else, and --check exits 0.
      3. NAMESPACED_REFUSED_AT_TYPE moves 302 → 307. The docblock entry names objectui#13301 and the ruling in the :160 form, and says the raise covers these five keys only.
      4. No @object-ui/types arm (A) and no Registry policy change (C).
    • Pins: (a) each bare key renders its block, and the bare and app-shell: keys resolve to one renderer. (b) For all five, the bare key is claimed and the app-shell: key is refused at type; objectui validate exits 0 on bare hero and 1 on app-shell:hero. (c) A console.warn capture 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 five namespace lines removed, back to the main blob): 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.
    • Changeset: @object-ui/app-shell and @object-ui/cli patch.
    • CI: all 36 check-runs completed on the head, 33 passed and 3 skipped.
    • Path fork: no governed path. Seat landing.
    • Findings: none.

    Next: ready + auto-merge; landing is verified by content on main.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB

    • Merged: PR fix(app-shell): register the console home blocks under the app-shell namespace #13314 through the merge queue as main 7e9708e632.
    • Verified by content: each of the 6 files the PR changes has the same blob at 7e9708e632 as at the accepted head 6ccc16f38e. The merge message carries no model identifier.
    • Landed (maintainer ruling B, comment 6312301934): the five console home blocks (hero, stat, usage-bar, checklist, tile-grid) register under namespace: 'app-shell', so the console no longer logs a "without a namespace is deprecated" line for each on boot. KNOWN_SCHEMA_TYPES gained exactly the five app-shell: keys (regenerated). NAMESPACED_REFUSED_AT_TYPE is 307, a named stopgap for these five keys only. Pages keep writing the bare key; objectui validate refuses the app-shell: spelling at type.
    • For cloud (objectstack-ai/cloud#3125, item 2): reaches staging with cloud's next objectui pin bump.

    pm:dispatched is removed.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:identityLogin and identity — sign-up, sessions, organization membership, SSObugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions