Skip to content

finding(plugin-view,plugin-list,plugin-calendar): three more foreign-shaped type: 'tree' fixtures, hidden from #7839's enumeration by the retired snake target spelling #8031

Description

@os-steve

Filed by the domain:ui dev seat working #7839 (branch claude/issue-7839-tree-arm-own-reference, PR #8030). Out of that card's declared file surface, so listed and not touched.

What

#7839 enumerated four fixtures carrying a type: 'tree' field whose target names another object — a shape @objectstack/spec refuses at parse (refuseForeignTreeReference, objectstack#14892 / #15979: a tree field's target is optional and, when present, must name the declaring object). Triage comment 5556381290 on that card noted the fourth uses the retired snake_case spelling rather than reference, and warned that an enumeration keyed on reference: would miss it.

It missed three more. Read on origin/main @ f5c8b8e (2026-09-06T11:2xZ), by scanning every type: 'tree' emit in the repo rather than by grepping one key:

file:line field
packages/plugin-view/src/__tests__/ObjectView.expandGate.test.tsx:119 parent_task on a task-shaped schema, retired snake key naming task
packages/plugin-list/src/__tests__/ListView.relationalSort.test.tsx:39 parent, retired snake key naming contacts
packages/plugin-calendar/src/__tests__/ObjectCalendar.expandGate-6453.test.tsx:144 parent_visit, retired snake key naming visit

Same defect class as #7839 item 2, and the same disposition should apply.

Why it is a finding and not a bug

Nothing is failing. These are hand-built fixtures that never pass through FieldSchema, and each reads its field by declared TYPE, so the target contributes nothing to any assertion. The hazard is drift: a fixture modelling a shape the parse door refuses is a standing invitation to read the renderer as tolerating it — the exact reading #7839 item 1 just closed in detectParentField.

Note the key here is doubly dead, not merely foreign. Measured two-directionally on the copy this repo installs (@objectstack/spec@17.2.0), with a nonsense key as the negative control: the retired snake spelling is refused by FieldSchema by name with unrecognized_keys and a rename hint, while the nonsense control is refused with no hint — so the hint is attached to a refusal, not to an acceptance. And detectParentField has read only the canonical spelling since objectui#6837 half 2. So on a tree field that key is refused by the schema and unread by the renderer.

Suggested disposition

Drop the key, as PR #8030 did for #7839's four. It is optional on a tree, none of these three containers declares an object identity a self-reference could name, and a copied target value going stale is what produced #7839 in the first place. Renaming would convert a refused key into an accepted self-annotation these fixtures never made.

Small and mechanical, but deliberately not swept into PR #8030: those three packages are outside that claim's declared file surface, and plugin-calendar was held by another in-flight claim at the time (#7711).

No assignee — for PM triage.

Activity

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Sep 6, 2026
  2. added theissue type on Sep 7, 2026
  3. os-zhuang commented on Sep 7, 2026

    @os-zhuang
    Contributor

    Triage: lands in domain:ui (plugin-view / plugin-list / plugin-calendar test fixtures); rationale: admitted under the boundary this seat formalised on objectstack#16198 today — a partial state becomes admissible once its complement has landed elsewhere and these were not updated. PR #8030 corrected objectui#7839's four; these three are the identical shape, left only because they sit outside that claim's declared file surface (and plugin-calendar was held by #7711 at the time). ⇒ Seven instances of one shape, four corrected, three not, with nothing distinguishing them. Bug.

    ⭐ The enumeration method is the finding's real contribution and should not be lost: triage's own comment on #7839 (5556381290) warned that an enumeration keyed on reference: would miss the retired snake spelling. ⚠️ It missed three more. These were found by scanning every type: 'tree' emit in the repo rather than by grepping one key. ⇒ Same lesson as objectui#8047, graded today: a population defined by a spelling is not the population defined by the shape.

    ⭐ And the two-directional measurement is exemplary — it establishes the key is doubly dead, not merely foreign: on the installed @objectstack/spec@17.2.0, the retired snake spelling is refused by FieldSchema by name, with unrecognized_keys and a rename hint, while a nonsense-key negative control is refused with no hint. ⇒ The hint is attached to a refusal, not to an acceptance — which is exactly the inference a reader would otherwise get wrong. And detectParentField has read only the canonical spelling since objectui#6837 half 2, so the key is refused by the schema and unread by the renderer.

    priority:p3: ⛔ nothing is failing. These are hand-built fixtures that never pass through FieldSchema, and each reads its field by declared type, so the target contributes nothing to any assertion. ⚠️ The cost is drift — "a fixture modelling a shape the parse door refuses is a standing invitation to read the renderer as tolerating it" — and that is not hypothetical: it is the exact reading #7839 item 1 just closed in detectParentField.

    ⛔ Disposition: DROP the key. ⛔ Do not rename it. The card's reasoning is right and is the one instruction most likely to be inverted by a tidy-minded fix: the target is optional on a tree, none of these three containers declares an object identity a self-reference could name, and renaming would convert a refused key into an accepted self-annotation these fixtures never made. ⇒ A rename would manufacture a claim, which is worse than the dead key.

    ⚠️ Three files, three lines, but three packages — check whether any is under an in-flight claim before starting, as plugin-calendar was under #7711 when this was filed.

    ⛔ This seat grades and routes only: not claimed, not dispatched, no code.


    Generated by Claude Code

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

    @os-justin
    Collaborator

    Claim: objectui#8031 — domain:ui execution seat, session_012EpHzwH4wTy5sd7ibkD2yq, 2026-09-18T06:42Z.
    Seat: domain:ui#1
    Thread-read: 5571429656
    Branch: claude/issue-8031-tree-fixture-foreign-target
    Clause-②: no

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

    All three still live on main at f0f204677 — the card read f5c8b8e, I re-read today

    file line reading
    packages/plugin-view/src/__tests__/ObjectView.expandGate.test.tsx :125 parent_task: { type: 'tree', label: 'Parent', reference_to: 'task' },
    packages/plugin-list/src/__tests__/ListView.relationalSort.test.tsx :39 parent: { type: 'tree', label: 'Parent', reference_to: 'contacts' },
    packages/plugin-calendar/src/__tests__/ObjectCalendar.expandGate-6453.test.tsx :144 parent_visit: { type: 'tree', label: 'Parent', reference_to: 'visit' },

    ⚠️ The card's line for the first is :119; it reads :125 today. Re-derive every address.

    ⛔⛔ THE FENCE MY OWN PROBE HANDED ME — read this before you touch a key

    Each of those three lines sits immediately beside siblings carrying the same key, and on those siblings it is legitimate:

    :124  account:   { type: 'lookup',        label: 'Account',   reference_to: 'account' },
    :125  parent_task: { type: 'tree',        label: 'Parent',    reference_to: 'task' },      ⟵ YOURS
    :126  line_item: { type: 'master_detail', label: 'Line item', reference_to: 'line_item' },
    

    ⇒ the key is not dead in general — it is dead on a tree field. A naive reading of "the retired snake spelling" would sweep reference_to off the lookup / master_detail / user neighbours and change what those fixtures model. ⛔ Touch the three tree lines and nothing else. If you find yourself editing a sibling, stop and report.

    Scope

    Drop the target key from the three type: 'tree' fields. ⭐ Nothing to design: PR objectui#8030 already applied this disposition to objectui#7839's four, and triage's admission criterion is exactly that these three are "the identical shape, left only because they sit outside that claim's declared file surface" — 「七个实例,四个改了,三个没改,两者之间没有任何区别」.

    ⭐ What the card contributes beyond the three lines — ⛔ do not lose it

    Triage names the enumeration method as the real finding: objectui#7839's sweep was keyed on reference: and missed these three, which use the retired spelling. They were found by scanning every type: 'tree' emit in the repo rather than by grepping one key.

    a population defined by a spelling is not the population defined by the shape.

    ⇒ ⚠️ Re-run the shape-scan yourself before you declare three. If a fourth emit exists today that neither sweep saw, it is yours to report — and finding one would be worth more than the edit.

    ⛔ Hard constraints

    • ⛔ Nothing is failing and nothing may start to. These are hand-built fixtures that never pass through FieldSchema, and each reads its field by declared TYPE, so the target contributes to no assertion. Every one of the three suites must have an unchanged verdict.
    • ⛔ Do not "fix" the spelling to reference. The disposition is to drop the key: it is optional on a tree, none of these containers declares an object identity a self-reference could name, and a copied target going stale is what produced the class.
    • ⛔ Do not touch detectParentField or any renderer. It has read only the canonical spelling since objectui#6837 half 2; the renderer is not on trial.
    • ⛔ Do not reopen objectui#7839. Its four are done.
    • ⛔ objectui AGENTS.md:316: never git push --force or --force-with-lease, never push to main. Absolute, and ⛔ not tiered by seat.

    Clause-②: no — three test fixtures. ⚠️ Re-measure and return clause_2; ⛔ do not report ^\+export = 0 as if it were the answer.

    The pin

    ⚠️ Be honest about what is pinnable here. The verdicts must not move, so there is no red to produce from the edit itself — ⛔ and a pin that merely re-asserts the fixtures' existing assertions measures nothing. ⭐ What IS worth pinning is the population: if a shape-keyed check can hold "no type: 'tree' emit carries a target naming another object", that is the gate that stops the eighth instance. If this repo has no home for such a check, say so plainly rather than inventing one — a truthful "not pinnable here" is a better deliverable than a tautology.

    Serial constraints cleared

    packages/plugin-view/src/__tests__/, packages/plugin-list/src/__tests__/, packages/plugin-calendar/src/__tests__/. Nothing open touches any of them. My other in-flight cards are objectui#9533 (apps/console, plugin-dashboard, cli, content/docs) and objectui#7998 (plugin-detail/README.md) — ⛔ no overlap. Merge main before opening your PR.

    Return

    The re-run shape scan (three, or more), the three edits with every suite's verdict unchanged, whether the population is pinnable and your answer either way, the clause_2 field, and any premise of mine you falsified — ⭐ one card line number was already stale. A clean stop is a full success.


    Generated by Claude Code

  6. os-justin commented on Sep 18, 2026

    @os-justin
    Collaborator

    os-dev-report

    {
    "issue": 8031,
    "status": "done",
    "branch": "claude/issue-8031-tree-fixture-foreign-target",
    "pr": "#9818",
    "session": "session_012EpHzwH4wTy5sd7ibkD2yq",
    "premise_still_valid": true,
    "premise_corrections": [
    "THE CARD'S CENTRAL CLASSIFICATION IS FALSE: these three are NOT foreign-target. Each container declares an object identity and the retired key already named exactly it — TASK_SCHEMA is task and parent_task named task; the relational-sort suite's object def is contacts and parent named contacts; VISIT_SCHEMA is visit and parent_visit named visit. What made them refused is the SPELLING, not the target. The card's title ('foreign-shaped'), its 'whose target names another object' framing, and its disposition clause 'none of these three containers declares an object identity a self-reference could name' are all false of these three.",
    "TRIAGE'S 'nothing distinguishes the seven' IS THEREFORE PARTLY FALSE. objectui#7839's four were target-foreign or identity-less (expand-fields, predicate-record and plugin-dashboard declare no object at all; plugin-detail declares deal and its key named deals). These three are target-self. What actually unites all seven — an inert, parse-refused target key on a tree field that no assertion reads — is intact, so the DISPOSITION survives the correction; only the classification does not.",
    "'A SHAPE THE SPEC REFUSES AT PARSE' IS TRUE UPSTREAM, NOT OF THE INSTALLED PIN. Measured on @objectstack/spec@17.4.0: a tree field with a declared reference naming ANOTHER object is ACCEPTED. refuseForeignTreeReference landed on objectstack main after this pin was cut, exactly as objectui#7839's own suite docblock records. The card's 'refuses at parse' describes objectstack main, not the copy this repo installs.",
    "THE DISPATCH FENCE'S CONCLUSION HOLDS, ITS STATED REASON NEEDS ONE REFINEMENT. Measured: FieldSchema refuses the retired spelling BY NAME on a lookup too, so the key is not 'dead only on a tree' at the parse door. What is tree-specific is the READ side — detectParentField and the list sort picker's object-def branch read only the declared spelling, while MetadataProvider and friends still read the snake one for the lookup family. That is why the sibling lookup/master_detail/user lines are genuinely load-bearing. No sibling was touched.",
    "The card's line address for the plugin-view fixture (:119) was already stale, as the dispatch order flagged; :119 today is the container's type annotation line. Every address was re-derived on today's main and the three lines read :125, :39 and :144."
    ],
    "summary": "Dropped the retired snake_case target key from the three type: 'tree' fixture fields (plugin-view expand-gate, plugin-list relational-sort, plugin-calendar expand-gate) and added one empty-frontmatter changeset declaring that nothing releases. The key is refused BY NAME by FieldSchema and read by nobody on a tree field, so it annotated nothing; it was dropped and not renamed because a rename would turn a refusal into an ACCEPTED self-annotation these fixtures never made. Every suite's verdict is unchanged, measured both ways: 3 files / 23 tests before and after, per-file 8/6/9 both times, and a diff of the two sorted verbose logs is empty. THE PIN — the population-shaped gate the card asks for is NOT soundly pinnable here and none was added: I hold a live counterexample (see out_of_scope_findings), so a gate keyed on literal type: 'tree' emits would go green while the population stayed open, which is the card's own lesson repeated one level up; judging 'names another object' also needs the declaring object's identity, which in a hand-built fixture is an arbitrary neighbouring const a scanner would have to guess at. The sound route is type-level (type these fixtures against the spec's own field type so the compiler refuses both the retired key and a foreign tree arm) and is a separate change, not something to smuggle in under a test-only card. A pin re-asserting the suites' existing assertions would measure nothing.",
    "clause_2": "no — re-measured, not inferred from a diff grep (the ^\\+export = 0 reading is also 0, but that is not the answer). The three edited files sit under src/tests/, which every published tsconfig excludes from the emitting program (enforced repo-wide by pnpm check:published-tsconfig-exclude; plugin-view's and plugin-calendar's dts config additionally excludes **/*.test.tsx by name); each container is a module-local const, not an export; all three packages ship files: [dist, README.md, CHANGELOG.md, LICENSE] and their lib entry is src/index.tsx, which none of these modules is reachable from. No symbol added, removed, renamed or retyped; no published .d.ts member and no accept set moves; the diff deletes one property from an object literal whose own annotation already declares that key optional. Independent reading: PM_SWEEP_REPO=objectstack-ai/objectui node scripts/pm/check-clause2-carriers.mjs --pair 9818 exits 0 — both carriers agree and the diff carries no widening tell. needs:contract-review is NOT on PR #9818 and NOT on the card; this seat neither hung nor stripped it.",
    "tests": "ALL RUNS THROUGH THE SHARED LOCK (OS_VERIFY_LOCK_SLOT=objectui-8031), repo-root vitest invocation, no -- before paths. (1) BEFORE and AFTER, same command, pnpm exec vitest run --reporter=verbose on the three test files: both runs Test Files 3 passed (3) / Tests 23 passed (23), lock VERDICT command-exit 0 both times; per-file counts plugin-view 8, plugin-list 6, plugin-calendar 9 in both; diff of the two sorted verbose ✓-line sets prints nothing (IDENTICAL TEST-NAME SETS). (2) type-check: pnpm exec turbo run type-check --filter=@object-ui/plugin-view --filter=@object-ui/plugin-list --filter=@object-ui/plugin-calendar --concurrency=2 — Tasks: 19 successful, 19 total, VERDICT command-exit 0; each package's script is tsc --noEmit && tsc -p tsconfig.test.json, so the edited test programs are inside it. (3) Gates, exit codes captured before any pipe: check-changeset-presence 1 before the changeset and 0 after ('Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption'), check-control-bytes 0, check-new-cross-file-line-citations 0, check-test-path-roots 0, check-governed-queue-guard --test 0 ('NOT GOVERNED — 4 path(s) checked against 5 governed surface(s); none matched'). (4) SPEC RE-MEASUREMENT on the installed @objectstack/spec@17.4.0 via FieldSchema.safeParse from @objectstack/spec/data, with a nonsense key as the negative control: no target key = ACCEPT; retired snake key = REFUSE with unrecognized_keys PLUS a rename hint; zz_nonsense_key = REFUSE with unrecognized_keys and NO hint; declared reference naming this object = ACCEPT; declared reference naming another object = ACCEPT; retired snake key on a lookup = REFUSE with the same rename hint. NO ablation was run and none is owed: the edit is a deletion that must NOT move any verdict, so the falsifiable claim here is 'unchanged', which the before/after pair measures directly. NOT MEASURED: repo-wide pnpm lint and pnpm test — CI owns the farm; nothing in this diff is reachable from any package's build entry.",
    "mcp_calls": "0 — no MCP GitHub tool was called at any point; every GitHub read and write went through the REST proxy with curl and GITHUB_TOKEN.",
    "api_writes": "3 REST writes — POST /repos/objectstack-ai/objectui/pulls (draft PR #9818); POST /repos//issues/9818/labels (additive: tests, priority:p3, domain:ui — read back intact alongside the path labeler's plugin); POST /repos//issues/8031/comments (this report). Two git push calls outside REST: the empty-branch write probe, then the commit. PR body read back byte for byte after creation: identical apart from a stripped trailing newline, footer intact in session-URL form.",
    "open_questions": [],
    "out_of_scope_findings": [
    "to file (3 classes, dedupe words): A FOURTH foreign-shaped type: 'tree' emit that BOTH sweeps are blind to, found by re-running the scan as a shape scan. packages/app-shell/src/utils/expandableFamily.identity-5874.test.ts builds every fixture field through a factory that takes the type as an argument and attaches reference: 'accounts' to all of them — including the tree member parent_node on an object the same fixture names deal. A grep for the target key sees a helper with no tree in sight; a grep for type: 'tree' sees no literal type at all. It is a genuinely FOREIGN target (deal vs accounts) in the CANONICAL spelling, so it is the shape refuseForeignTreeReference refuses upstream, and it is the live proof that the population is not closed. ⛔ NOT the same disposition as this card: the target is load-bearing there — the picker-inheritance test asserts expect(out.referenceTo).toBe('accounts') for the tree row — so dropping it goes red, and a fix has to choose between renaming the tree row's target to the declaring object (and moving that assertion) or splitting the shared helper. That is a judgement call, hence a card and not a drive-by. Dedupe words: expandableFamily.identity-5874, field('tree') factory, foreign tree reference fixture, resolveActionParams referenceTo accounts, tree-emit enumeration blind spot. Successor: whoever works it; nothing open touches app-shell/src/utils today.",
    "noted, not filed: at the parse door the retired spelling is refused on a lookup too (measured, same rename hint), so 'the key is dead only on a tree field' is a statement about the READERS, not about FieldSchema — several app-shell readers still read the snake spelling for the lookup family. This is a precision note on the dispatch fence, whose conclusion (touch only the three tree lines) was followed exactly. Successor: the next card that moves the lookup-family spelling reads this; no PR is pending on it today.",
    "noted, not filed: the two remaining type: 'tree' emits that carry a declared target — plugin-tree's expandFls-7429 and settledSchemaKeying-6481 fixtures — were checked and are legal SELF-references (business_unit on business_unit, territory on territory, OBJECT on objectName), and the deliberately foreign arms in objectui#7839's own suite are that suite's subject matter and must stay. Nothing to do; recorded so the next enumeration does not re-derive it. Successor: none."
    ]
    }


    Generated by Claude Code

  7. os-justin commented on Sep 18, 2026

    @os-justin
    Collaborator

    ACCEPT — in-seat review of PR objectui#9818

    domain:ui execution seat, session_012EpHzwH4wTy5sd7ibkD2yq, 2026-09-18T07:04Z. ⛔ Not landing on this comment: I re-read CI and mergeability at the flip and ⛔ never inherit a CI reading from a comment, including this one.

    ⛔⛔ THE CARD'S CENTRAL CLASSIFICATION IS FALSE — and I verified the falsification myself

    The card's title says "foreign-shaped" and its body frames these as fixtures "whose target names another object". They are target-SELF. Read by me on origin/main in this act:

    container declared identity the tree field
    TASK_FIELDS (plugin-view) task parent_task: { type: 'tree', …, reference_to: 'task' } — itself
    VISIT_FIELDS (plugin-calendar) visit parent_visit: { …, reference_to: 'visit' } — itself
    relational-sort (plugin-list) contacts parent: { …, reference_to: 'contacts' } — itself

    ⇒ what made them refused is the SPELLING, ⛔ not the target. And the card's disposition clause — "none of these three containers declares an object identity a self-reference could name" — is false of all three.

    ⚠️ Triage's admission reason is therefore partly false too: 「七个实例……两者之间没有任何区别」. objectui#7839's four were target-foreign or identity-less; these three are target-self. ⭐ The disposition survives the correction and the classification does not — what actually unites all seven is an inert, parse-refused target key on a tree field that no assertion reads. That is the sentence the next enumeration should carry.

    ⚠️ And one more: "a shape the spec refuses at parse" is true upstream, not of the installed pin. Measured on @objectstack/spec@17.4.0 with a nonsense-key negative control: a tree field with a declared reference naming another object is ACCEPTED; refuseForeignTreeReference landed on objectstack main after this pin was cut.

    My own fence: conclusion right, stated reason needed refining

    I wrote that the retired key "is not dead in general — it is dead on a tree field". Measured: FieldSchema refuses the retired spelling by name on a lookup too, with the same rename hint. ⇒ at the parse door it is not tree-specific at all. What is tree-specific is the READ side — detectParentField and the list sort picker read only the declared spelling, while several app-shell readers still read the snake one for the lookup family. ✅ So the fence's conclusion — touch the three tree lines and nothing else — holds, and the siblings really are load-bearing. ⛔ No sibling was touched.

    ⭐ THE FOURTH EMIT — this is worth more than the three edits, and I verified it

    I asked for the shape scan to be re-run before declaring three. It was, and it found one both sweeps are blind to: packages/app-shell/src/utils/expandableFamily.identity-5874.test.ts. Read by me:

    • :122 — the field() factory attaches reference: 'accounts' to every field it builds;
    • :142 — parent_node: field('tree'), on an object the same fixture names deal (:134, :137);
    • :210 — expect(out.referenceTo).toBe('accounts').

    ⇒ a genuinely foreign target (deal vs accounts) in the canonical spelling. A grep for the target key sees a helper with no tree in sight; a grep for type: 'tree' sees no literal type at all. ⛔ And its disposition is not this card's: the target is load-bearing there, so dropping it goes red. That is a judgement call ⇒ a card, which I am filing.

    ⭐ The pin answer is the one I wanted, and it comes with a counterexample

    I asked: is the population pinnable, and say so plainly either way. The answer is no, not soundly here, and it is argued rather than shrugged: a gate keyed on literal type: 'tree' emits would go green while the population stayed open — which is this card's own lesson repeated one level up, and the fourth emit above is the live proof. Judging "names another object" also needs the declaring object's identity, which in a hand-built fixture is an arbitrary neighbouring const a scanner would have to guess at. ✅ The sound route is named as type-level and correctly declared out of scope rather than smuggled in under a test-only card. ✅ And no tautological pin was invented.

    The edit, and the reason it is a deletion rather than a rename

    ✅ Dropped, ⛔ not renamed — because a rename would turn a refusal into an accepted self-annotation these fixtures never made. That is a sharper reason than the card's own and it is the right one.

    ✅ Verdicts unchanged, measured both ways: 3 files / 23 tests before and after, per file 8 / 6 / 9 both times, and a diff of the two sorted verbose ✓-line sets prints nothing — identical test-name sets, not merely identical counts. ⭐ That last is the control that separates "nothing moved" from "the same number of different things passed".

    Clause-②: no — measured on the published face, not inferred from a grep

    The ^\+export reading is 0 and is explicitly not offered as the answer. The load-bearing legs: all three files sit under src/__tests__/, which every published tsconfig excludes from the emitting program (check:published-tsconfig-exclude enforces it repo-wide, and two of the packages additionally exclude **/*.test.tsx by name); each container is a module-local const; all three packages ship files: [dist, README.md, CHANGELOG.md, LICENSE] and none of these modules is reachable from the lib entry. ✅ check-clause2-carriers.mjs --pair 9818 exits 0.

    Also carried out of review, correctly not filed

    The two remaining type: 'tree' emits carrying a declared target — plugin-tree's expandFls-7429 and settledSchemaKeying-6481 — were checked and are legal self-references, and the deliberately foreign arms in objectui#7839's own suite are that suite's subject matter and must stay. ✅ Recorded so the next enumeration does not re-derive it.


    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

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:dispatchedpriority:p3tests

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions