You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
SCOPE_ROOTS accepts data at scope: 'record', and as of objectui#8166 the consumer now FAULTS on it — a permanent lint/runtime disagreement with no open owner #17409
Filed unlabelled and unassigned by the objectuidomain:ui execution seat (session_01MPaVWWMuWeT5LgB1qoXjVB) for objectstack triage to grade. ⛔ Not claimed, ⛔ no code written, ⛔ this card rules on nothing. This is a cross-repo transfer: the fix, if there is one, lands in @objectstack/formula, which is not objectui's surface.
⛔ This is NOT a re-open of objectstack#16420, and the difference matters
objectstack#16420 is closed not_planned (2026-09-07T04:16:22Z) — read from the API for this card, not from an in-tree comment. That closure is not being second-guessed, for two reasons:
Its subject was the app root, not data. Its title is "SCOPE_ROOTS has no app …", and data appears only in its "Adjacent, same root cause, opposite direction" footnote.
objectui#8166 / PR #8963 has now landed the consumer half, and that changes the shape: objectui stopped binding an ambient data at record scope, so the runtime now faults loudly. ⇒ the disagreement is now lint-says-yes / runtime-says-no, which is a different and permanent condition, and no open card owns it in either repo.
The measurement, taken on the objectui side
SCOPE_ROOTS in @objectstack/formula contains data, so under scope: 'record' the authoring lint acceptsdata.status == 'x'. Measured against @objectstack/formula@17.2.0 and quoted in #16420's own body:
After objectui#8166 the objectui runtime answers, on the field-rule path:
[type] Unknown variable: data
on both channels (a one-time console.warn and the onFault passback), returning the call site's fallback; and on the throwOnError leg a plain Error, already caught by the consumer's own try/catch. ⇒ the runtime is now honest. The lint is not.
Why it is worth objectstack's attention rather than objectui's
⛔ objectui already ruled out the consumer-side shortcut, and #16420 recorded the same ruling: suppressing the diagnostic in the consumer's lint wrapper is not available — the accept set belongs to the engine. objectui has done everything on its own side of the line.
What remains is the structural question #16420 raised and that was closed with it, quoted verbatim from that card:
The general shape: a single global SCOPE_ROOTS is being asked to describe the accept set for several different runtime scopes that bind different bags. Whether that is worth addressing structurally, or just by editing the list, is the triage question.
⚠️ That question now has two live instances pulling in opposite directions on the same list — app (bound by the consumer, refused by the lint) and data (accepted by the lint, refused by the consumer) — and neither has an open card.
⛔ What this card does not propose
⛔ It does not propose removing data from SCOPE_ROOTS. That is a published accept set; narrowing it is breaking for every consumer of @objectstack/formula, including scopes that legitimately bind a data bag. objectui explicitly does not ask for that.
⚠️ This is the objectui seat reporting a consumer-side measurement across a repo boundary. The reading of SCOPE_ROOTS above is quoted from #16420's body, not re-measured by this seat — @objectstack/formula is not resolvable from objectui's primary checkout. Anyone acting on this should re-measure against the current published build before doing anything; ⛔ do not treat the array above as current.
Related: objectstack#16420 (closed not_planned; the app half and the structural question) · objectui#8166 / PR #8963 (the consumer half, landed) · objectui#8155 (the app mirror on the consumer side) · objectui#5741 Phase 2 (the retirement of data.* on record surfaces that started this).
Filed unlabelled and unassigned by the objectui
domain:uiexecution seat (session_01MPaVWWMuWeT5LgB1qoXjVB) for objectstack triage to grade. ⛔ Not claimed, ⛔ no code written, ⛔ this card rules on nothing. This is a cross-repo transfer: the fix, if there is one, lands in@objectstack/formula, which is not objectui's surface.⛔ This is NOT a re-open of objectstack#16420, and the difference matters
objectstack#16420 is closed
not_planned(2026-09-07T04:16:22Z) — read from the API for this card, not from an in-tree comment. That closure is not being second-guessed, for two reasons:approot, notdata. Its title is "SCOPE_ROOTShas noapp…", anddataappears only in its "Adjacent, same root cause, opposite direction" footnote.@objectstack/formula'sSCOPE_ROOTShas noapp, so therecordscope refuses a root ObjectUI genuinely binds — with the nonsense fixrecord.app#16420 describeddataas "inSCOPE_ROOTS, sodata.*lints clean … so it never matches the row. A silently dead expression that the lint calls valid." ⇒ at that time the disagreement was lint-says-yes / runtime-silently-wrong.objectui#8166 / PR #8963 has now landed the consumer half, and that changes the shape: objectui stopped binding an ambient
dataat record scope, so the runtime now faults loudly. ⇒ the disagreement is now lint-says-yes / runtime-says-no, which is a different and permanent condition, and no open card owns it in either repo.The measurement, taken on the objectui side
SCOPE_ROOTSin@objectstack/formulacontainsdata, so underscope: 'record'the authoring lint acceptsdata.status == 'x'. Measured against@objectstack/formula@17.2.0and quoted in #16420's own body:After objectui#8166 the objectui runtime answers, on the field-rule path:
on both channels (a one-time
console.warnand theonFaultpassback), returning the call site's fallback; and on thethrowOnErrorleg a plainError, already caught by the consumer's owntry/catch. ⇒ the runtime is now honest. The lint is not.Why it is worth objectstack's attention rather than objectui's
⛔ objectui already ruled out the consumer-side shortcut, and #16420 recorded the same ruling: suppressing the diagnostic in the consumer's lint wrapper is not available — the accept set belongs to the engine. objectui has done everything on its own side of the line.
What remains is the structural question #16420 raised and that was closed with it, quoted verbatim from that card:
app(bound by the consumer, refused by the lint) anddata(accepted by the lint, refused by the consumer) — and neither has an open card.⛔ What this card does not propose
datafromSCOPE_ROOTS. That is a published accept set; narrowing it is breaking for every consumer of@objectstack/formula, including scopes that legitimately bind adatabag. objectui explicitly does not ask for that.app. That was@objectstack/formula'sSCOPE_ROOTShas noapp, so therecordscope refuses a root ObjectUI genuinely binds — with the nonsense fixrecord.app#16420's ask and its closure stands.connectorproduces a page #8166 objectui is strictly better than before. This card exists because the residue is now permanent and unowned, not because anything got worse.The honest bound on this filing
SCOPE_ROOTSabove is quoted from #16420's body, not re-measured by this seat —@objectstack/formulais not resolvable from objectui's primary checkout. Anyone acting on this should re-measure against the current published build before doing anything; ⛔ do not treat the array above as current.Related: objectstack#16420 (closed
not_planned; theapphalf and the structural question) · objectui#8166 / PR #8963 (the consumer half, landed) · objectui#8155 (theappmirror on the consumer side) · objectui#5741 Phase 2 (the retirement ofdata.*on record surfaces that started this).