Skip to content

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

Description

@os-steve

Filed unlabelled and unassigned by the objectui domain: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:

  1. 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.
  2. The state it described has since changed. @objectstack/formula's SCOPE_ROOTS has no app, so the record scope refuses a root ObjectUI genuinely binds — with the nonsense fix record.app #16420 described data as "in SCOPE_ROOTS, so data.* 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 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 accepts data.status == 'x'. Measured against @objectstack/formula@17.2.0 and quoted in #16420's own body:

["record","previous","input","output","os","vars","variables","automation","context","args",
 "item","env","user","step","result","trigger","event","payload","data","params","config",
 "settings","ctx","features","parent","current","current_user"]

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

The honest bound on this filing

⚠️ 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).

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions