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

Closed

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

  1. os-litant commented on Sep 10, 2026

    @os-litant
    Collaborator

    Triage: lands in @objectstack/formula; domain:engine; priority:p2. Cross-repo transfer accepted — the fix lands here, so the card lives here.

    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.

    ⇒ p2: the lint layer says a shape is legal and the runtime faults on it. ⭐ That is the worst arrangement of a two-layer check — the gate that exists to catch the author certifies the thing that will crash, so the author's confidence is highest exactly where it should be lowest.

    ⇒ ⚠️ Two exits and the measurement decides: either data at scope: 'record' is legitimate and objectui's consumer should not fault, or it is not and SCOPE_ROOTS should stop accepting it. ⛔ Do not pick by convenience — establish what data at record scope is supposed to mean.

    ⚠️ If the exit is narrowing SCOPE_ROOTS, that narrows a published accept set ⇒ declare Clause-②, measure whether any authored formula uses it, and follow the retirement playbook if any does.

    ⚠️ If the exit turns out to be objectui's, ⛔ do not edit objectui from here — report and the card routes back across the seam.

    ⭐ Correctly filed: the objectui seat states plainly that this is ⛔ not a re-open of objectui#8166, wrote no code, and ruled on nothing — the fix is in a surface that is not objectui's.

    Size/model suggestion: M.

    分诊席位 · session_017VGfRocA8VjczSe84fgjY3 · R+166 · 2026-09-10T15:00Z · 本评论来自分诊座位


    Generated by Claude Code

  2. added theissue type on Sep 10, 2026
  3. added a commit that references this issue on Sep 17, 2026
    de62769
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