Skip to content

plugin-tree registers object-tree with no public tier — the spec declares the block (ComponentPropsMap) but getPublicConfigs() / PUBLIC_BLOCKS exclude it, so the tracked sdui.manifest.json can never carry it (ruling batch #197 item 1 letter A on objectstack#18407) #10064

Description

@os-project-manager

Path: none | 清单区 studio-authoring:公开块清单 | spec 声明了 object-tree,公开层不收录 ⇒ 受管 sdui.manifest.json 永远带不上它
分诊重测与定级:2026-09-20T15:13Z

Filed by the director seat, summon #25 (session_012GcsUbuqFGBibkEDMRC1eE), executing ruling batch #197 item 1 letter A (objectstack#18407, maintainer 「同意」). ⛔ Filed bare: domain:*, priority:* and type are triage's production. objectstack#18407 carries Blocked-by: on this card; PR objectstack#19270 (the parity-gate half, draft) lands once this fix reaches objectstack through the pin.

The reading, taken by the objectstack#18407 dev (os-dev-report on PR objectstack#19270, at pinned objectui 53ded82bf7a4) — ⛔ not re-run by the filing seat; reproduce with a lit control first

  • getAllConfigs() returns 494 configs including plugin-tree:object-tree and view:tree.
  • getPublicConfigs() returns 57 with zero tree names; lit control: object-grid and grid are in it.
  • PUBLIC_BLOCKS (packages/core/src/registry/public-blocks.ts lines 26–117) has 57 entries, zero tree names.
  • getConfig('object-tree').tier is undefined; packages/plugin-tree/src/index.tsx registers the renderer twice ('object-tree' lines 34–39, 'tree' lines 41–46), both with a namespace and neither with a tier.
  • Registry.ts line 821 is the curated path, line 824 the tier: 'public' path.

⇒ Both manifest producers faithfully report a registry that does not expose object-tree on the public tier. Regenerating the manifest in objectstack is a byte-identical no-op (git hash-object 78f870e42fe9), and bumping the pin cannot help: the pinned source lacks the entry. The defect is curation, here.

Ruling this card executes

object-tree joins the public tier. Use the mechanism the curated path already uses for sibling blocks such as object-grid (a PUBLIC_BLOCKS entry or tier: 'public' on the registration — whichever the siblings use, ⛔ not both). The 'tree' alias registration is out of scope: this card is about the block the spec declares.

Acceptance

  • getPublicConfigs() includes object-tree; a pin that reads it through the same public path the manifest generators use, with object-grid as the lit control in the same test.
  • Report, ⛔ do not silently absorb: any render, bundle-size or docs consequence of object-tree becoming public (the director seat measured none of these).
  • Clause-② declared from the diff; changeset per the package's convention (a public-tier addition is user-visible).

Sequencing

Lands first. Then in objectstack: .objectui-sha bump (after PR objectstack#18723 releases the pin) → sdui:manifest regeneration → PR objectstack#19270's check:react-declaration-parity reads green and lands. objectstack#18407 unblocks when the pin has moved past this fix (pin-consumed repo: pin moved = installable), ⛔ not when this merges.

Dedupe words: object-tree public tier · plugin-tree tier public · PUBLIC_BLOCKS object-tree · getPublicConfigs tree · sdui.manifest.json object-tree missing · objectstack#18407


Generated by Claude Code

Activity

  1. self-assigned this
    on Sep 21, 2026
  2. os-elon-musk commented on Sep 21, 2026

    @os-elon-musk
    Collaborator

    Claim: PM loop round 3 — domain:ui execution seat
    Session: session_01Xr7APep6jm1Zta3KUzPzZf
    Branch: claude/issue-10064-object-tree-public-tier
    Worktree: objectui-issue-10064
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: packages/plugin-tree/ and the public-block registry that getPublicConfigs() / PUBLIC_BLOCKS read (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: default judgement tier — ⚠️ dispatch-gates.mjs refuses for this repo ⇒ ⛔ no path-derived mandate; tier is this seat's judgement.
    Clause-②: no
    Thread-read: 5750668838
    Serial constraints cleared: packages/plugin-tree/ and the public-block registry are held by no one in this lane. Same-batch siblings objectui#10059 and objectui#10061 are disjoint. Seat #2's objectui#10132 / objectui#10130 and seat #3's objectui#9684 are disjoint. packages/fields/ · packages/plugin-form/ · packages/i18n/src/locales/ are held by the unmerged objectui#10172 — stop-and-report.

    ⭐ This card is a cross-repo unblock, and that raises its stake

    objectstack#18407 carries a Blocked-by: on this card, and objectstack PR#19270 (the parity-gate half, draft) lands only once this fix reaches objectstack through the pin. ⇒ this is not a lane-local tidy: a sister-repo card and a drafted gate are waiting on it.

    ⚠️ Consequence for the delivery: the fix must be the one the pin will carry, ⛔ not a local workaround that satisfies this repo's own reading of the manifest.

    Why Clause-②: no

    ⭐ Worth stating precisely, because this one looks like widening and is not. The spec already declares object-tree in ComponentPropsMap; the public tier is what fails to收录 it, so the tracked sdui.manifest.json can never carry a block the contract says exists. Admitting it is 「拉回已声明契约」 — the accepted set does not grow, it stops being narrower than the declaration.

    ⛔ If the route you find would instead add a block the spec does not declare, stop — that is the opposite act and it is a yes.

    domain:ui seat #1 · session_01Xr7APep6jm1Zta3KUzPzZf · claim · 2026-09-21T02:31Z


    Generated by Claude Code

  3. os-elon-musk commented on Sep 21, 2026

    @os-elon-musk
    Collaborator

    os-dev-report

    {
      "issue": 10064,
      "status": "done",
      "branch": "claude/issue-10064-object-tree-public-tier",
      "pr": "https://github.com/objectstack-ai/objectui/pull/10192",
      "session": "session_01Xr7APep6jm1Zta3KUzPzZf",
      "premise_still_valid": true,
      "clause_2": "no — confirmed from the diff, not inherited. The accepted set does not grow past the declaration: @objectstack/spec already declares object-tree on ComponentPropsMap, and the roster entry pulls the public tier back to that declaration. The one route that WOULD have been a yes — curating the bare `tree` alias, a key the spec does not declare — is explicitly withheld and pinned as withheld.",
      "public_tier_membership": "TWO routes, measured in Registry.getPublicConfigs() before changing anything: (1) membership of the curated PUBLIC_BLOCKS roster in packages/core/src/registry/public-blocks.ts, resolved per tag through getContractConfig() so a listed tag with no registration behind it is skipped silently; (2) `tier: public` declared on the registration itself, for bare non-namespaced keys, including pending lazy stubs. The siblings decide which: object-grid / object-map / object-gantt and every other curated view block take the roster, and NO registration in this repo published source declares the tier flag (the only four hits are test fixtures). So the repair is one roster entry — not a flag, and not both, per the ruling.",
      "fix_is_the_one_the_pin_will_carry": "yes. The edit is packages/core/src/registry/public-blocks.ts — published source of @object-ui/core, which the framework generator installs from npm at the version .objectui-sha pins. That generator eager-imports 16 registry modules including @object-ui/plugin-tree, reads ComponentRegistry.getPublicConfigs() and serializes through manifestFromConfigs — the same read this fix moves. No local-only adjustment was made: nothing was changed in any manifest, in any consumer-side reading of a manifest, or anywhere in the objectstack repo. Measured with a local mirror of that exact producer: 58 blocks before, 59 after, object-tree present, alias `tree` absent.",
      "summary": "object-tree now sits on the ADR-0080 curated public tier. @objectstack/spec declares the block on ComponentPropsMap and @object-ui/plugin-tree has registered the renderer all along; the PUBLIC_BLOCKS roster was the one face that withheld it, so getPublicConfigs() — the read both manifest producers serialize — reported the tier as narrower than the declaration, and no downstream regeneration or pin bump could repair that. One roster entry fixes it, plus a new pin in packages/plugin-tree and the two console guards whose EXACT lists the roster edit mechanically reds. The bare `tree` alias stays out deliberately and is pinned as withheld, which is the explicit answer triage asked the claimant to settle. Changeset: @object-ui/core minor (no major, per repo rule).",
      "premise_notes": "The card readings were relayed from the objectstack#18407 dev at a pinned sha and were re-taken here on the branch base 516583b54 before any edit. Direction confirmed, one number differs: the roster holds 58 entries on today main, not the 57 recorded at the pinned sha. Zero tree names either way, with object-grid as the lit control passing on the line above each failure.",
      "mechanism_assumptions": {
        "A": "CONFIRMED and then made precise — see public_tier_membership. getAllConfigs() sees the block while getPublicConfigs() excludes it; the deciding mechanism is the curated allow-list, not a flag and not a derived rule.",
        "B": "TESTED — no deliberate exclusion exists anywhere. public-blocks.ts records six exclusions by name (record:chatter, action:bar, element:image, element:record_picker, element:text_input, element:metadata_viewer) and the console reverse-coverage guard carries the same six with reasons; no tree name is in either. Structural reason it stayed silent: that guard sweeps only the record/page/element/action namespaces, so a plugin-tree-namespaced block was never in a population any forcing function looked at. Omission, not decision, so a fix and not a decision card.",
        "C": "FALSIFIED for this repo, and harmlessly. No sdui.manifest.json is tracked in objectui — the tracked artefact lives at the objectstack repo root and is generated there from the PUBLISHED @object-ui/* packages (scripts/gen-sdui-manifest-node.mjs). objectui only ships the generator (packages/sdui-parser/scripts/gen-manifest.ts) and the browser dump page. So no generated file moves in this diff, and there was no regeneration command to run here. The objectstack-side regeneration is the separate pin-bump card and was NOT touched."
      },
      "files_changed": [
        "packages/core/src/registry/public-blocks.ts (+17) — the admission, with its reasoning",
        "packages/plugin-tree/src/registration.publicTier-10064.test.tsx (+100, new) — the pin, object-grid as lit control in the same file",
        "apps/console/src/__tests__/public-contract.test.ts (+6) — FORCED: EXPECTED_COVERED and EXPECTED_LAZY are exact lists over the same roster",
        "apps/console/src/__tests__/public-block-binding-reach.test.tsx (+4) — FORCED: EXPECTED_CANDIDATES is an exact list over the derived objectName population",
        ".changeset/10064-object-tree-public-tier.md (+39, new) — @object-ui/core minor"
      ],
      "tests": "Reproduce-before-repair on base 516583b54: the new pin fails 3 / passes 2 — expected [ object-grid, list-view, …(56) ] to include object-tree — with the object-grid control passing on the line above each failure. After the fix: 5 passed. Package suites (repo-root vitest, exit codes captured to files): packages/core + packages/plugin-tree = 177 files / 3466 tests passed exit 0; apps/console/src/__tests__ + react-page-scope + container-declaration census and ratchet = 32 files / 500 tests passed exit 0, including the newly derived probe named `object-tree asks the data layer for its objectName`. type-check: turbo core+plugin-tree 15 tasks OK, console 36 tasks OK. ABLATION, from the committed fix, over the src the vitest aliases resolve: anchor asserted 1 before / 0 after, HEAD blob 73659fca18f2 to mutated blob da6c6862fd71, control object-grid still 1 on disk. A one-shot probe mirroring both manifest producers (eager-register the 16 modules, getPublicConfigs, assertFullyLoaded, manifestFromConfigs) reads blocks=59 object-tree=true fixed vs blocks=58 object-tree=false ablated, object-grid=true on both; the pin reds 3 failed / 2 passed. RESTORE PROVEN: git checkout HEAD -- path, then git diff HEAD empty, on-disk hash back to 73659fca18f2, admission line count back to 1, pin green again 5 passed; the throwaway probe was deleted (not committed) and the worktree is clean.",
      "gates": {
        "check:sdui-registration-pins": "exit 0 over a REAL console build (pnpm --filter @object-ui/console build, 8708 modules) — 16 promised registrations present, 2310 chunks weighed. Not NOT MEASURED: the build was run first so the gate had a dist to weigh.",
        "check:changeset-claims": "exit 0 (report-only by its own header)",
        "check:control-bytes": "exit 0 — 8190 tracked text files scanned",
        "check:component-surface-parity": "exit 0 (report-only by its own header)",
        "check:dist-completeness": "exit 0, and re-run AFTER the builds so it was not vacuous: 12 packages complete, 1661 emitted files verified (the first run, before any build, weighed 0 packages and is discarded)",
        "check:eager-closure": "exit 0 — 3033.2 KB gzipped / 3104.5 KB budget; plugin-tree appears 0 times in that report while the control ui-components appears 3",
        "check:side-effects-array": "exit 0",
        "check:registry-bare-names": "exit 0 — 0 contested keys",
        "check:doc-types": "exit 0 — every documented component type is registered",
        "check:prompt-keys": "exit 0",
        "check:new-line-citations": "exit 0 — 0 new citations",
        "changeset presence + fixed + no-major": "exit 0 — 3 guarded source files changed, 1 changeset declared, no major",
        "Lint": "declared narrowing, and a measurement: eslint --no-inline-config --format json over the 4 changed source files = 4 files linted, 0 errors, 5 warnings, all five pre-existing no-explicit-any hits in public-block-binding-reach.test.tsx on lines this branch does not touch. Population read from eslint own config resolution (none of the three packages carries its own eslint.config.*, so each package `eslint .` resolves the same root flat config this invocation used); type-aware linting is NOT enabled (tseslint.configs.recommended, no project / projectService / TypeChecked anywhere), so this diff cannot move any untouched file verdict. The repo-wide sweep is CI run.",
        "merge-queue required set (9)": "NOT MEASURED locally by design — Lint, Type Check, Test shards 1/4..4/4, Build & E2E, Build Docs, Changeset Declaration are CI runs. Their local counterparts above are green; CI convergence is the PM read, not this seat wait."
      },
      "line_budget": "n/a — the diff touches no published skills/** package and no governed surface at all (no AGENTS.md, no CLAUDE.md, no .claude/**, no skills/**, no docs/adr/**), so no net-line budget and no governed-approval hold applies. Raw size: 5 files, +166 / -0.",
      "deviations": [
        "SCOPE, declared not absorbed: two files outside the claimed surface (packages/plugin-tree/ plus the public-block registry) are in the diff — apps/console/src/__tests__/public-contract.test.ts and apps/console/src/__tests__/public-block-binding-reach.test.tsx. Both are MECHANICALLY FORCED, not chosen: each asserts an EXACT list over the roster this card edits (deliberately, because the failure they guard is a shrinking contract), so the change cannot be green without them, and each edit is exactly the one-line entry the failing assertion prints plus its reason. Both were measured red first and the two failures are quoted in the PR body. Held by no other claim in this lane per the claim serial constraints. Not stopped on, because it is not a discretionary reach into another surface — the alternative is a diff that cannot land.",
        "A throwaway ablation probe was written under apps/console/src/__tests__/ to take the manifest reading, then DELETED — never committed, and the worktree is clean.",
        "No label, assignee or draft-state write was attempted, per dispatch. needs:contract-review was not touched."
      ],
      "api_writes": "2 REST proxy writes: POST /repos/objectstack-ai/objectui/pulls (draft) and POST /repos/objectstack-ai/objectui/issues/10064/comments. Reads, not writes: GET issues/10064, GET issues/10064/comments, GET pulls/10192 (the mandatory body read-back). Branch pushes went over git, not REST.",
      "mcp_calls": "0 — no MCP GitHub tool of any kind was called, read or write.",
      "body_readback": "PR 10192 body read back after creation: the stored body starts with the sent body VERBATIM and is 90 bytes longer; the entire delta is GitHub appending its own session-URL attribution footer. 0 angle-bracket-shaped fragments stored (none were sent), and the only closing-keyword-near-a-number hit is the intended Fixes reference to this card. Nothing was eaten.",
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: content/docs/guide/react-pages.md heads its escape-hatch section `Any registered component, including ones outside the public contract` and uses Block type=object-tree as the specimen. The sentence stays literally true and Block still renders any registered type, but the specimen is now INSIDE the contract, so the example no longer illustrates the case it was chosen for. Not repaired: the page is outside this card surface and nothing it asserts becomes false. Carrier: the next change to that guide page, or the docs half of the objectstack#18407 chain.",
        "noted, not filed: the reverse-coverage forcing function in apps/console/src/__tests__/public-contract.test.ts sweeps only SEMANTIC_NAMESPACES (record / page / element / action) for shipped-but-uncurated blocks, so a block registered under a plugin namespace — which is what object-tree is — can never fail it by absence. That is the structural reason this defect sat with no ledger entry and no red. Widening that sweep is a decision about what the ledger is for, does not follow from this card, and would open a population nobody has measured. Carrier: whoever next edits that guard SEMANTIC_NAMESPACES.",
        "no class a/b/c finding to file: neither note is a reproducible defect, a breached declared contract, or an authoring trap — no metadata is refused or silently dropped by either."
      ]
    }

    Generated by Claude Code

  4. os-elon-musk commented on Sep 21, 2026

    @os-elon-musk
    Collaborator

    ✅ ACCEPT — PR objectui#10192 at head 4ee4ef8f85, reviewed against both trees and CI

    domain:ui seat #1, session_01Xr7APep6jm1Zta3KUzPzZf, 2026-09-21T03:29Z. 5 files, +166/-0. Every row is a reading this seat took, ⛔ not a repeat of the report.

    claim under review how it was checked measured
    the protocol already declares the block objectstack packages/spec/src/ui/component.zod.ts 'object-tree': ObjectTreePropsSchema at :4202, inside ComponentPropsMap (opens :4046); the schema itself at :3798
    the bare tree alias is NOT declared same file, same spelling absent — CONTROL: the identical probe finds 'object-grid': :4185, 'object-map': :4200, 'object-gantt': :4201, so it reaches
    the alias is pinned as WITHHELD, not merely omitted the new pin file :87 getConfig('tree') toBeDefined (the positive control — the registration exists), :88 PUBLIC_BLOCKS not.toContain, :89 publicTypes() not.toContain, :98 getMeta('tree')?.tier toBeUndefined
    the two console edits are MECHANICALLY FORCED, not a reach the guards themselves public-contract.test.ts:165 expect(PUBLIC_BLOCKS.filter(…)).toEqual(EXPECTED_COVERED) and :177 toEqual(EXPECTED_LAZY); public-block-binding-reach.test.tsx:520 toEqual([...EXPECTED_CANDIDATES].sort()) — exact lists, so the roster edit cannot be green without them
    the roster entry carries its own reasoning the diff 16 comment lines + one string, and the comment states both the admission and the withholding
    CI on 4ee4ef8f85 every check run on the head 43 runs, 0 pending, 0 failures
    carriers check-clause2-carriers.mjs --pair 10192 EXIT=0, no widening tell

    ⚖️ Clause-②: no — and the reasoning is the right one

    Admitting a block to the curated public tier looks like widening. It is not, and the diff's own comment says why better than a label could: @objectstack/spec declares object-tree on ComponentPropsMap and @object-ui/plugin-tree has registered the renderer all along — the roster was the one face narrower than the declaration. Under 基本裁决原则 (「声明而未兑现是实现缺口,补实现或退役」) that is an implementation gap being closed, not an accepted set being relaxed. ⇒ a narrowing being undone, the same shape this seat is now applying to objectui#9964.

    ⭐ And the dev drew the line on the correct side of it: curating the bare tree alias would have been yes, because the spec declares no such key — so it is withheld and pinned as withheld, which is the answer triage asked the claimant to settle. Withheld-and-unpinned would have been a decision nobody could later find.

    ⭐ The measurement worth remembering

    The fix's value rests entirely on editing the source the framework generator installs from npm, not a local artefact. The dev proved that rather than asserting it: a one-shot probe mirroring both manifest producers (eager-register the 16 registry modules → getPublicConfigs() → assertFullyLoaded → manifestFromConfigs) read 58 blocks / object-tree false ablated and 59 / true fixed, with object-grid true on both as the control. ⇒ the read this change moves is the read both producers serialize.

    ⚠️ Assumption C was falsified and that is recorded rather than buried: no sdui.manifest.json is tracked in objectui at all — the tracked artefact lives at the objectstack root and is generated from the PUBLISHED packages. So no generated file moves in this diff and there was no regeneration to run here; the objectstack-side regeneration stays the separate pin-bump card.

    The scope deviation, accepted

    Two files outside the claimed surface (apps/console/src/__tests__/public-contract.test.ts, public-block-binding-reach.test.tsx). Both assert exact lists over the roster this card edits — deliberately, because the failure they guard is a shrinking contract — so the change cannot be green without them, and each edit is the one entry the failing assertion prints plus its reason. ⇒ forced, not discretionary; declared, not absorbed; measured red first. Correct call, and the right one to declare rather than stop on.

    ⚠️ One reading correction for the record: the card's premise was relayed at a pinned sha with 57 roster entries; today's main carries 58. Direction unchanged, zero tree names either way, object-grid lit as the control on the line above each failure. The dev re-took it rather than inheriting it.

    Noted, ⛔ not filed — and this seat agrees with both

    • content/docs/guide/react-pages.md heads its escape-hatch section 「Any registered component, including ones outside the public contract」 and uses object-tree as the specimen. The sentence stays true; the specimen is now inside the contract, so the example no longer illustrates its own case. Carrier: the next change to that guide, or the docs half of the objectstack#18407 chain.
    • ⭐ The structural reason this defect sat with no red: public-contract.test.ts's reverse-coverage sweep covers only SEMANTIC_NAMESPACES (record / page / element / action), so a plugin-namespaced block can never fail it by absence. Widening that sweep is a decision about what the ledger is for and would open a population nobody has measured — ⛔ rightly not taken here.

    Landing

    Clause-②: no, CI green, no held surface touched, no published surface widened past the declaration. ⇒ ready + queue under this seat's concurrency.

    domain:ui seat #1 · session_01Xr7APep6jm1Zta3KUzPzZf · review · readings taken 2026-09-21T03:29Z


    Generated by Claude Code

  5. removed their assignment
    on Sep 21, 2026
  6. os-elon-musk commented on Sep 21, 2026

    @os-elon-musk
    Collaborator

    ✅ Landed and closed — the whole card, on main.

    domain:ui seat #1, session_01Xr7APep6jm1Zta3KUzPzZf, 2026-09-21T03:44Z. PR objectui#10192 merged through the queue; squash c131d9e69. ⛔ The close is not the evidence; the table is.

    Verified by CONTENT with a control taken on the pre-merge base 63f4f928f:

    probe over packages/core/src/registry/public-blocks.ts pre-merge 63f4f928f merged c131d9e69
    'object-tree' 0 1
    the bare 'tree', alias 0 0 — withheld, as ruled
    CONTROL 'object-grid' 1 1 — unchanged, so the file and the probe are real
    registration.publicTier-10064.test.tsx present 0 1

    What landed, and why it is not a widening

    @objectstack/spec declares 'object-tree': ObjectTreePropsSchema on ComponentPropsMap (component.zod.ts:4202, map opens :4046) and @object-ui/plugin-tree has registered the renderer all along. This roster was the one face narrower than the declaration — so getPublicConfigs(), the read both manifest producers serialize, reported a tier smaller than the contract, and ⛔ no downstream regeneration or pin bump could repair it. One roster entry. ⇒ a narrowing being undone, Clause-②: no.

    ⭐ The dev drew the line on the correct side: curating the bare tree alias would have been yes — the spec declares no such key and it would leave an authoring model two names for one block — so it is withheld and pinned as withheld (getConfig('tree') toBeDefined as the positive control, then PUBLIC_BLOCKS / publicTypes() not.toContain, and getMeta('tree')?.tier toBeUndefined). Withheld-and-unpinned would have been a decision nobody could later find.

    ⭐ And the fix's value was proved, not asserted: a one-shot probe mirroring both manifest producers read 58 blocks / object-tree false ablated and 59 / true fixed, with object-grid true on both as the control.

    Recorded on landing

    • Two apps/console guard edits are outside the claimed surface and were mechanically forced: both assert EXACT lists over this roster (toEqual(EXPECTED_COVERED), toEqual([...EXPECTED_CANDIDATES].sort())), so the change cannot be green without them. Declared, not absorbed; measured red first.
    • Assumption C falsified and kept on the record: no sdui.manifest.json is tracked in objectui at all — the tracked artefact lives at the objectstack root and is generated from the PUBLISHED packages. ⇒ no generated file moves here; the objectstack-side regeneration stays the separate pin-bump card (objectstack#18407).
    • ⭐ Noted, not filed — the structural reason this sat with no red: public-contract.test.ts's reverse-coverage sweep covers only SEMANTIC_NAMESPACES (record / page / element / action), so a plugin-namespaced block can never fail it by absence. Widening that sweep is a decision about what the ledger is for and opens a population nobody has measured. Carrier: whoever next edits SEMANTIC_NAMESPACES.
    • Noted, not filed: content/docs/guide/react-pages.md uses object-tree as the specimen for 「components outside the public contract」. The sentence stays true; the specimen is now inside it.

    domain:ui seat #1 · session_01Xr7APep6jm1Zta3KUzPzZf · landing · readings taken 2026-09-21T03:44Z


    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

No one assigned

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions