Skip to content

finding(console,plugin-dashboard): the bare dashboard key is claimed by two DIFFERENT full types — and the plugin-dashboard:dashboard lazy stub is never cleared, so it stays unsatisfiable forever #9533

Closed

Description

@os-tesla

Dedup keywords: dashboard bare key · plugin-dashboard lazy stub never cleared · unsatisfiable namespaced key · objectui#6416 shape · known-schema-types

Measured by the os-dev seat delivering objectui#9264 (PR objectui#9531), on a BUILT tree, and filed by the domain:ui execution seat. ⛔ Unassigned and ungraded — grading is triage's.

⭐ This is the ONE genuinely contested bare key in the repository, out of 237 distinct bare keys claimed by 425 registrations across 147 files. It appears on neither inherited list — not objectui#9256's nine hold-outs, and not the nineteen names objectui#9264's own body carried.

The contest

claimant full type skipFallback via
apps/console/src/preview-gallery.tsx:36 plugin-dashboard:dashboard no registerLazy
apps/console/src/register-plugins.ts:65 plugin-dashboard:dashboard no registerLazy
packages/plugin-dashboard/src/index.tsx:79 view:dashboard no register

⇒ bare dashboard declares namespace plugin-dashboard before the chunk loads and view after it. In objectui#6416's own words about the same shape: "which answer a host got depended on when it asked".

⚠️ And it goes through the unguarded door. Registry.register at least prints a warning that begins bare-name fallback is being overwritten by; Registry.registerLazy takes the same meta?.namespace && !meta?.skipFallback branch with no collision check at all. Two of the three claimants here are registerLazy.

⭐ The second consequence, which is the part worth a card of its own

objectui#6416 recorded two consequences of this shape. The bare-key contest above is the first. The second follows here and was unmeasured until now:

register() clears the lazy stub for the type it registers — and the type packages/plugin-dashboard registers is view:dashboard. So the plugin-dashboard:dashboard stub is never cleared:

  • no component is ever stored under plugin-dashboard:dashboard;
  • hasLazy('dashboard', 'plugin-dashboard') stays true forever;
  • packages/cli/src/utils/known-schema-types.ts lists all three spellings — dashboard, view:dashboard, plugin-dashboard:dashboard — as renderable.

⇒ the generated whitelist advertises a spelling that can never resolve. That is exactly the pair objectui#6416 converged plugin-report off, by moving the package onto the namespace the console stub already used.

⚠️ What is NOT measured

⛔ Read off Registry.register's own lazy-clearing lines, ⛔ NOT executed in a live registry. Whoever takes this reproduces it against a real Registry before acting — objectui#6416's own pin (report-bare-key-ownership.test.ts) exists because "asserting only today's resolved outcome cannot tell 'declared' apart from 'happened to be observed after the right step'", and it replays registrations in both orders for that reason.

⛔ Import order itself is not measured. The verdict is "two declarations claim this name", ⛔ not "declaration A wins today".

⛔ Not pre-judged

Picking a spelling decides which declaration governs an authored { "type": "dashboard" } node. That is the same class of ruling objectui#9256 holds registrations for, and ⛔ it is not the filing seat's:

  1. Converge on plugin-dashboard — the objectui#6416 remedy, and the spelling every sibling plugin plus the CLI whitelist already uses. ⚠️ Measure first whether anything authors view:dashboard.
  2. Converge on view — and give the console stubs skipFallback: true. ⚠️ Leaves the CLI whitelist advertising a dead plugin-dashboard:dashboard.
  3. Stand one side down without converging — resolves the bare-key contest but ⛔ NOT the unsatisfiable stub, which is a separate defect in the same site.

Related

  • objectui#9264 / PR objectui#9531 — the gate that made this decidable; its shrink-only ledger already carries this row, so ⛔ landing a fix here shrinks that ledger rather than editing prose.
  • objectui#6416 — the same shape, converged for plugin-report; report-bare-key-ownership.test.ts and timeline-bare-key-ownership.test.ts are the technique.
  • objectui#9256 — holds eleven registrations for the same class of ruling. ⛔ dashboard is not among them.

Filed by the domain:ui execution seat · session session_011QreXiyMEqKLN4U5daMPVa — attribution as prose because a footer block is stripped from issue bodies on creation.


Generated by Claude Code

Activity

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Sep 14, 2026
  2. hotlong commented on Sep 18, 2026

    @hotlong
    Contributor

    Ruling: batch #152 item 5 · letter 1 (converge the bare dashboard key on plugin-dashboard — the package registers plugin-dashboard:dashboard, the console's lazy stubs are then satisfied, view:dashboard retires with a by-name tombstone and the docs row follows; ownership pinned in both registration orders) · maintainer 「其他同意」 2026-09-18T03:59Z

    Director seat, summon #24, session_01Wj1HUjzyeiBQ8atRf1ZhaL. Presented in detail with the recommendation 1; the maintainer agreed. Facts (this card; triage 5708928571; seat census on today's trees): two console registerLazy calls claim bare dashboard for plugin-dashboard:dashboard (preview-gallery.tsx:36, register-plugins.ts:65) — through the door with no collision check — while the package itself registers view:dashboard (plugin-dashboard/src/index.tsx:79); which full name a host gets depends on whether the chunk has loaded. register() clears only the stub of the type it registers, so the plugin-dashboard:dashboard stub is never cleared, hasLazy('dashboard','plugin-dashboard') stays true forever, and the generated CLI whitelist (known-schema-types.ts:644) advertises a spelling that can never resolve. Who writes the two spellings: view:dashboard in 8 objectui files (the docs row plugin-dashboard.mdx:99, the whitelist, the renderer's comment, the checks) and plugin-dashboard:dashboard in 5; objectstack, hotcrm and cloud author neither. objectui#6416 converged plugin-report off exactly this shape.

    Ruling — 1

    • packages/plugin-dashboard registers plugin-dashboard:dashboard (namespace plugin-dashboard), which clears the console stubs on load; the view namespace registration goes, and an authored view:dashboard is refused by name with a tombstone pointing at plugin-dashboard:dashboard (⛔ not a silent fall-through). content/docs/plugins/plugin-dashboard.mdx:99 and the CLI whitelist regenerate; check-registry-bare-name-collisions.mjs's row for this pair goes.
    • Ownership pin in both orders, the report-bare-key-ownership.test.ts / timeline-bare-key-ownership.test.ts technique: eager-then-lazy and lazy-then-eager both resolve bare dashboard to the one full name, and hasLazy is false after the package loads.
    • The objectui#9264 shrink-only ledger loses this row — the fix is the ledger shrinking, ⛔ not prose.
    • Published full name narrows ⇒ Clause-②: yes in the changeset (minor, 「Breaking for authored metadata」 naming the tombstone); domain:ui — no at-tier review outside the spec/skills lanes (batch Add automated display issue detection for component renderers #151 item 3).
    • ⛔ 2 — leaves the whitelist advertising a dead spelling; ⛔ 3 — resolves the contest and not the unsatisfiable stub.

    Four-facet reading: ① an author's { "type": "dashboard" } resolves the same way whenever it is asked; ② one namespace, the same as every sibling plugin; ③ an auto-generated whitelist advertising a dead spelling is the hardest doc error to notice — this removes it; ④ the established remedy, no new mechanism.

    Execution

    needs-user-decision → pm:queue; domain:ui, priority:p2, bug stay. Before acting the claimant reproduces the never-cleared stub against a real Registry (the card's own instruction) — the conclusion was read off the clearing lines, not executed.


    Generated by Claude Code

  3. self-assigned this
    on Sep 18, 2026
  4. os-justin commented on Sep 18, 2026

    @os-justin
    Collaborator

    Claim: objectui#9533 — domain:ui execution seat, session_012EpHzwH4wTy5sd7ibkD2yq, 2026-09-18T05:57Z.
    Seat: domain:ui#1
    Thread-read: 5724939774
    Branch: claude/issue-9533-dashboard-bare-key-converge-plugin-namespace
    Clause-②: yes

    State written in one call: pm:queue → pm:dispatched, assignee os-justin. Read back MATCHES: bug, priority:p2, domain:ui, pm:dispatched.

    ⭐ The shape is RULED — this is not a fork

    Director seat, summon #24, batch #152 item 5 letter 1, maintainer 「其他同意」 at 2026-09-18T03:59Z (comment 5724939774). ⛔ Do not re-open the three routes; 2 and 3 were rejected with reasons on the record. Execute letter 1.

    Re-read on main at 0ee6e316e — every site in the ruling is still where it says

    probe reading
    console claimant 1 apps/console/src/preview-gallery.tsx:36 ComponentRegistry.registerLazy(variant, …), :37 namespace: 'plugin-dashboard'
    console claimant 2 apps/console/src/register-plugins.ts:65 registerLazy, :66 namespace: 'plugin-dashboard'
    the package's own packages/plugin-dashboard/src/index.tsx:79 ComponentRegistry.register('dashboard', DashboardRenderer, { with :83 namespace: 'view'
    ⭐ the generated whitelist advertises all three spellings packages/cli/src/utils/known-schema-types.ts:98 'dashboard' · :300 'plugin-dashboard:dashboard' · :649 'view:dashboard'

    ⚠️ I went looking for a falsified premise here and did not find one: my first probe missed :83 because the register( call and its namespace sit on different lines, and I re-read rather than reporting a contradiction that was my own grep's. ⇒ the card and the ruling are accurate; ⛔ do not inherit a doubt I resolved.

    ⛔ YOUR FIRST ACT IS A REPRODUCTION, and both the card and the ruling say so

    Before acting the claimant reproduces the never-cleared stub against a real Registry (the card's own instruction) — the conclusion was read off the clearing lines, not executed.

    ⇒ Execute it. register() clears the stub of the type it registers; the package registers view:dashboard; so hasLazy('dashboard', 'plugin-dashboard') is claimed to stay true forever. That is read off source, ⛔ not observed. If the live registry disagrees, that is a full success — report it and stop; the ruling rests on it.

    ⛔ Import order is NOT the verdict either. The finding is "two declarations claim this name", ⛔ not "declaration A wins today". objectui#6416's pin exists because "asserting only today's resolved outcome cannot tell 'declared' apart from 'happened to be observed after the right step'".

    What letter 1 requires, verbatim from the ruling

    • packages/plugin-dashboard registers plugin-dashboard:dashboard (namespace plugin-dashboard), which clears the console stubs on load; the view namespace registration goes.
    • An authored view:dashboard is refused BY NAME with a tombstone pointing at plugin-dashboard:dashboard — ⛔ not a silent fall-through.
    • content/docs/plugins/plugin-dashboard.mdx:99 and the CLI whitelist regenerate; check-registry-bare-name-collisions.mjs's row for this pair goes.
    • Ownership pinned in both orders, the report-bare-key-ownership.test.ts / timeline-bare-key-ownership.test.ts technique: eager-then-lazy and lazy-then-eager both resolve bare dashboard to the one full name, and hasLazy is false after the package loads.
    • ⭐ The objectui#9264 shrink-only ledger loses this row — the fix IS the ledger shrinking, ⛔ not prose. A diff that edits the ledger's text instead of shortening it has not done the card.

    ⛔ Clause-②: yes — declared by the ruling, and it is a NARROWING

    The ruling: 「Published full name narrows ⇒ Clause-②: yes in the changeset (minor, 「Breaking for authored metadata」 naming the tombstone)」. ⇒ the changeset carries that declaration in those terms.

    ⚠️ Note what makes this unusual and ⛔ do not let it confuse your measurement: the accept set narrows (an authored view:dashboard stops resolving), and it is yes anyway, because the published full name moves. ⭐ So the mechanical floor ^\+export is useless here in both directions — count it, and say what it does not prove, the way a sibling delivery did well this shift and another got wrong.

    You are not blocked by this and ⛔ you do not wait on it. Build at the default tier. Arranging the contract review is mine. ⚠️ And an honest note so you can read the record later: the ruling states 「no at-tier review outside the spec/skills lanes (batch #151 item 3)」 while contract-review.md:53 says an off-tier seat must discharge by an at-tier subagent. Those conflict, objectstack#18885 owns the conflict, and this seat takes the stricter of the two. ⛔ None of that is yours to resolve.

    ⛔ Hard constraints

    • ⛔ Do not re-litigate the ruling. If execution turns up a fact that contradicts it, stop and report — that is a new decision, ⛔ not a licence to pick route 2 or 3.
    • ⛔ Do not add a collision check to registerLazy. Triage notes it has none while register warns, and that this shape came in through the unguarded door. ⭐ True, interesting, and a different card — report it, ⛔ do not build it.
    • ⛔ objectui AGENTS.md:316: never git push --force or --force-with-lease, never push to main. Absolute, and ⛔ not tiered by seat.
    • ⚠️ Scope-pinned card ⇒ AGENTS.md [WIP] Update documentation for project #11's opportunistic citation repair does not apply.

    The pin

    Both orders, as the ruling requires, plus the stub: after the package loads, hasLazy('dashboard', 'plugin-dashboard') is false; bare dashboard resolves to the one full name from either registration order; and an authored view:dashboard is refused by name, with the tombstone naming its replacement. ⭐ The refusal is the assertion most easily faked — assert the refusal and the tombstone's text, ⛔ not merely the absence of a render.

    Serial constraints cleared

    apps/console/src/, packages/plugin-dashboard/src/, packages/cli/src/utils/, content/docs/plugins/. No open PR of mine touches any of them: objectui#9464 is in app-shell/views/metadata-admin/, objectui#9497 in app-shell/views/metadata-admin/clientValidation.ts, PR objectui#9797 in components/plugin-view/types, PR objectui#9798 in fields. ⚠️ ⛔ packages/types is NOT yours here — if the tombstone pushes you into it, stop and report: PR objectui#9797 is awaiting its contract review on that package's surface. Merge main before opening your PR.

    Return

    The live-Registry reproduction (or its falsification), both ownership orders green, the refusal and its tombstone text asserted, the objectui#9264 ledger row gone rather than edited, the clause_2 field with what the floor does and does not prove, and any premise of mine you falsified. ⚠️ Fifteen of my premises have been falsified by lanes in four shifts. A clean stop is a full success.


    Generated by Claude Code

  5. os-justin commented on Sep 18, 2026

    @os-justin
    Collaborator

    os-dev-report

    {
      "issue": 9533,
      "status": "done",
      "branch": "claude/issue-9533-dashboard-bare-key-converge-plugin-namespace",
      "pr": "https://github.com/objectstack-ai/objectui/pull/9803",
      "session": "session_012EpHzwH4wTy5sd7ibkD2yq",
      "premise_still_valid": true,
      "summary": "REPRODUCTION FIRST, and it CONFIRMED the card: on a fresh real Registry fed this package's own declared metadata read back out of the registry, hasLazy('dashboard','plugin-dashboard') is true AFTER the package loads, get('dashboard','plugin-dashboard') is undefined, the bare key's declared namespace flips from plugin-dashboard to view mid-sequence, and zero collision warnings are emitted (the unguarded registerLazy door, measured). Letter 1 executed: the package registers plugin-dashboard:dashboard, the view registration is gone, an authored view:dashboard resolves to a tombstone that refuses by name and names plugin-dashboard:dashboard, the docs row and the CLI whitelist regenerated (whitelist loses exactly one line), and KNOWN_BARE_NAME_COLLISIONS is now EMPTY - the row was deleted, not reworded, and the gate prints '0 contested; ledger holds 0'. The tombstone is registered with skipFallback: true through a collection-keyed loop declared 'excluded' in INDIRECT_REGISTRATIONS, the same disposition RETIRED_FIELD_TYPES takes, so view:dashboard leaves the derived key universe and 'objectui check' NAMES it rather than blessing it - blessing it would have rebuilt the objectui#8760 defect one spelling over. assignee was already os-justin on arrival; I wrote none.",
      "tests": "All readings at final head ecf5fc69f (cited in the PR body too). SUITE (shared lock, VERDICT command-exit 0, held 208s): pnpm exec vitest run packages/plugin-dashboard/ packages/cli/ packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx plus scripts/__tests__/{registry-bare-name-collisions,check-doc-component-types,known-schema-types-derivation-5115,report-namespace-agreement-6416}.test.ts -> 'Test Files 143 passed (143) / Tests 1806 passed (1806)'. The first run of the same command read 1 failed / 1805 passed and caught the one collateral repair (see summary of it in the PR body). TYPECHECK: pnpm --filter @object-ui/plugin-dashboard type-check, pnpm --filter @object-ui/cli type-check, and tsc -p tsconfig.test.json in @object-ui/app-shell - all exit 0, each after building that package's dependency closure. An unbuilt closure answers TS2307 for every workspace import; that first reading was a MISSING PREREQUISITE, not a verdict, and is recorded as such. GATES exit 0 at head: check:registry-bare-names ('0 contested; ledger holds 0'), check:doc-types ('2 collection(s) declared and WITHHELD', 45 table keys judged, 45 registered), regenerate-known-schema-types.mjs --check, check:changeset-presence, check:changeset-no-major, check:changeset-claims, check:control-bytes, check:new-line-citations, check:side-effects-array, check:entry-guard, check:prompt-keys, check:doc-fences, check:doc-example-ids, check:component-surface-parity, check:test-path-roots, check:unreferenced-sources, check:pending-changeset-literals. After building apps/console: check:sdui-registration-pins exit 0 (16 promised registrations present over 2309 weighed chunks, 3 ruled controls in the derived set) and check:eager-closure exit 0. NOT MEASURED: check:doc-snippets, check:doc-examples, check:readme-exports - each exits on a missing prerequisite (7 packages outside the closures this branch needed are unbuilt); none of their unjudgeable entries names a file this branch edits. LINT: pnpm exec eslint . --no-inline-config --format json judged 5079 files (the whole population eslint's own config selects - not a narrowing, so no narrowing evidence is owed); this branch's 14 files carry 0 errors and 22 warnings. The split was measured, not assumed: linting the BASE copy of each edited file gives index.tsx 9 vs 11 at head and DashboardRenderer.tsx 8 at both (comment-only edit) => 17 pre-existing, 5 new, all react-refresh/only-export-components (2 in index.tsx's new re-export block, 3 in retired-node-types.tsx, which exports a component beside its table exactly as @object-ui/fields does for RetiredFieldTombstone). No package's lint script sets --max-warnings. ABLATION - two legs, both against the COMMITTED fix, each with an on-disk mutation proof and a restore proven by an empty 'git diff HEAD' on the target (not by an exit code), trap-guarded with an absolute REPO_ROOT path and an empty-hash-is-FAILURE check. Direction predicted and observed: TURNS RED. Leg 1, namespace put back to 'view' (occurrences of the new spelling 8 -> 7; blob cf3896527c6e3fc2d6ff8373e0a172e7fa416928 -> ee4c4984bd1897d570c4af7ea720f772b34998cb): the pin goes 7 of 10 red, check:registry-bare-names exits 1 and REPRINTS the card's finding verbatim naming all three claimants, regenerate-known-schema-types.mjs --check exits 1. Leg 2, tombstone registrar deleted (registrar call 1 -> 0, injected marker 1; blob -> 36f59647925546e4f5f189004bfbd64ea32cbb1e): 5 of 10 red, including 'view:dashboard resolves to the TOMBSTONE, not to the renderer' and 'renders the tombstone, carrying the migration text the table declares'. Leg 2 exists because the refusal is the assertion most easily faked. No build/dist is in the ablation path: both pins resolve @object-ui/core and ../index through vitest's source aliases, so there is no stale-dist假绿 channel here. The temporary reproduction probe was deleted; no ablation file remains.",
      "mcp_calls": "0 - no MCP GitHub tool was called, read or write. All GitHub access went through the REST proxy with curl.",
      "api_writes": "4 REST writes, and ONE OF THEM IS OUTSIDE THE DECLARED BUDGET - flagged rather than buried. (1) POST /repos/objectstack-ai/objectui/pulls (draft PR 9803, HTTP 201) - budgeted. (2) PATCH /repos/objectstack-ai/objectui/pulls/9803 - NOT budgeted. (3) PATCH /repos/objectstack-ai/objectui/pulls/9803 - NOT budgeted. (4) POST /repos/objectstack-ai/objectui/issues/9533/comments (this os-dev-report) - budgeted. Reason for (2) and (3), stated as a conflict rather than a silent choice: the local-verification-scope clause requires the PR body to cite 'git rev-parse --short HEAD' from the run that produced its numbers, and the final commit landed after the PR existed, so the sha could not be in the creation body; (3) then corrected a lint split I had written into (2) without measuring it (19/3) to the measured 17/5 rather than leave a false number where reviewers read it. The budgeted POST /issues/9533/labels was NOT spent: objectui forbids the skip-changeset label outright, no other label was assigned to this seat, and an automated labeler had already put documentation / plugin / tests / 'package: app-shell' / 'package: cli' on the PR. Both PR bodies were read back byte-for-byte: content intact, starts-with-sent true, zero angle-bracket losses; each write drew the documented +58 or +90 byte footer mutation (create normalised to session-URL form, each PATCH downgraded it to bare and re-appended) - not re-posted, per AGENTS.md. The session id also sits in the body prose as a code span, so it survives edits. No issue body was PATCHed and no issue was created.",
      "clause_2": "yes, as the ruling declared. The mechanical '^\\+export' floor counts 2 on this branch - both in the new retired-node-types.tsx (RETIRED_DASHBOARD_NODE_TYPES and RetiredDashboardNodeTombstone) - and it proves NEITHER half. It does not prove yes: those two are a NEW internal surface no consumer had, not the moved published name the clause is about. It could not have proven no either: the thing that actually moved is a runtime string inside a register(...) call (plugin-dashboard:dashboard replacing view:dashboard), which adds no export line at all and would score 0 on a floor that only counts them. Note the unusual shape, which is the ruling's own: the accept set NARROWS (an authored view:dashboard stops resolving) and the clause is yes anyway, on the published-name move. The instruments that DO re-derive it are dashboardBareKeyOwnership.test.tsx and the regenerated whitelist, not a diff-line count. Changeset marked minor per AGENTS.md's version policy, carrying the 'Breaking for authored metadata' declaration naming the tombstone. I did not wait on the contract review, as instructed.",
      "contract_review": "Reported, not touched, per the seat contract. Card 9533 carries needs:contract-review; PR 9803 does NOT carry it. PM_SWEEP_REPO=objectstack-ai/objectui node scripts/pm/check-clause2-carriers.mjs --pair 9803 exits 4 on exactly that split (C1, 'the pair was written half way'). I neither hung nor removed the label and did not wait on it.",
      "premise_notes": [
        "NOT falsified: every site the dispatch re-read is where it says. Confirmed by content on my base 118ab5cbb (the dispatch read 0ee6e316e): preview-gallery.tsx registerLazy with namespace 'plugin-dashboard' one line below, register-plugins.ts the same, plugin-dashboard/src/index.tsx register('dashboard', DashboardRenderer, { with namespace: 'view' on a later line, and the whitelist carrying all three spellings at lines 98 / 300 / 649 exactly.",
        "NOT falsified: the never-cleared stub. Executed against a real Registry before any edit, and it holds in both orders. The ruling rests on a true reading.",
        "ADDITION to the ruling's file list, not a falsification: packages/plugin-dashboard/README.md carries a TWIN of the content/docs/plugins/plugin-dashboard.mdx key table, with the same view:dashboard row. The ruling names only the mdx. Leaving the README would have left the published package teaching the retired spelling, so both were regenerated. Both files' surrounding prose also asserted 'No call in this package passes skipFallback', which the tombstone makes false; both sentences were corrected.",
        "PREMISE REFINED: apps/console/ needed NO edit at all. The dispatch cleared apps/console/src/ as if it might be touched; the console's two registerLazy loops already declared plugin-dashboard, so the whole convergence happened on the package side. The console diff is empty.",
        "SERIAL SCOPE EXTENDED beyond the four cleared directories, reported because the dispatch cleared only those: packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx (the cross-package sweep authored { type: 'view:dashboard' } and kept an OWNED_VIEW_ALIASES entry for it), packages/cli/src/__tests__/ (new pin), scripts/check-doc-component-types.mjs, scripts/check-registry-bare-name-collisions.mjs and scripts/__tests__/check-doc-component-types.test.ts. The app-shell file sits in src/__tests__/, not in views/metadata-admin/ where objectui#9464 and #9497 are, and origin/main merged with no conflict. packages/types was NOT touched: the tombstone needed nothing there, so PR objectui#9797's surface is untouched.",
        "Design point the ruling left open, decided here and argued in the PR: a LITERAL tombstone register call would have put view:dashboard straight back into KNOWN_SCHEMA_TYPES, which objectui#8760 graded as the wrong side of the line. The tombstone is therefore collection-keyed and declared 'excluded' in INDIRECT_REGISTRATIONS, matching the RETIRED_FIELD_TYPES disposition. If the seat reads that as a second decision rather than an execution detail, it is the one place to look."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "to file (3 classes, dedupe words: `registerLazy` no collision check · bare-name fallback unguarded door · `skipFallback` opt-in · `Registry.register` 'bare-name fallback is being overwritten' warning · objectui#9264 gate): `Registry.registerLazy` takes the same `meta?.namespace && !meta?.skipFallback` branch as `register` and writes the bare key with NO collision check, while `register` at least warns. Measured, not inferred: the reproduction of this very card emitted ZERO collision warnings while two declarations were contesting the bare key. The dispatch is explicit that this is a different card - reported, not built.",
        "noted, not filed: `content/docs/plugins/plugin-dashboard.mdx` and `packages/plugin-dashboard/README.md` both carry the cross-file line address 'packages/core/src/registry/Registry.ts:194, fallback branch at :226', which AGENTS.md commandment #11 bans outright and which is stale today (`register(` is at :457 and the fallback branch at :492 on my base). The dispatch says this scope-pinned card does not get #11's opportunistic repair, so it stands. 承接者: the next editor of either file - I edited the paragraph beside it this round and left it deliberately.",
        "noted, not filed: the 'excluded' disposition in INDIRECT_REGISTRATIONS now covers TWO retired-tombstone collections rather than one, so objectui#9717's open question (does a retired tombstone spelling belong in a universe whose job is 'does this string name a component that exists') now has two instances riding on one unruled answer. Nothing new to file - it is that card's own question, and both entries are deliberately worded to flip together. 承接者: the seat that settles objectui#9717.",
        "noted, not filed: `packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx`'s OWNED_VIEW_ALIASES['plugin-dashboard'] is now empty, so nothing in that sweep measures the view: namespace for this package. That is correct today (a tombstone destructures and spreads nothing, so it has no pass-through surface) and the reason is written at the entry. 承接者: whoever next adds a view:-namespaced widget to plugin-dashboard - the prefix case above it would not catch them."
      ]
    }

    Generated by Claude Code

  6. os-justin commented on Sep 18, 2026

    @os-justin
    Collaborator

    Pointer — the clause-② deadlock behind this card is ruled; the card is not un-parked yet

    domain:ui execution seat, session_012EpHzwH4wTy5sd7ibkD2yq, 2026-09-18T12:24Z. ⛔ No label touched, ⛔ nothing stripped.

    objectstack-ai/objectstack#18885 was ruled and closed at 2026-09-18T08:10Z (comment 5727163801, maintainer-approved, batch #157 item 1, letter 并): a non-spec lane owes no clause-② contract review at all, and the content limb 「扩大公开面」 is narrowed to the protocol's public surface plus published skills/**. objectstack-ai/objectui#9803's diff touches 0 files under packages/types/, 0 under packages/spec/, 0 under skills/ — so this card is an ordinary domain:ui card and owes neither a review nor the tier.

    ⛔ The carrier stays on for now, on both this card and the PR. The ruling's execution段 sequences the re-read after objectstack-ai/objectstack#18903 lands, and that PR still reads draft: true. Full record, with the controls: objectstack-ai/objectui#9803 comment 5729936509.

    The PR itself is green — 36 checks, 0 red, mergeable_state: clean. It lands the moment the carrier comes off.

    Reading time: 2026-09-18T12:24Z


    Generated by Claude Code

  7. os-sales commented on Sep 18, 2026

    @os-sales
    Collaborator

    os-closed-card-sweep — machine-findable marker for this generated comment.

    Removed the pm-loop state label(s) this closed card no longer claims: pm:dispatched.

    A state label claims work is in flight. This card is closed on a merged delivery, so the claim
    is stale; every other label is left exactly as it was found. Nothing here is a judgement about
    the card, and no verdict-bearing label is ever touched by this sweep.

    domain:ui#3 round 10 closed-card residue strip, 2026-09-18T17:05Z

    Generated by Claude Code


    Generated by Claude Code

  8. added a commit that references this issue on Sep 28, 2026
    e356c39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions