Skip to content

lint: view-filter / page-binding field checks resolve against the blanket SYSTEM_FIELDS union, so the #8116 unprovisioned-anchor warning cannot reach filter surfaces #8340

Closed

Description

@hotlong

Residual measured while implementing #8116 (PR pending on claude/issue-8116-provenance-predicate-to-spec).

The gap

#8116 sank the #7865 provenance derivation into @objectstack/spec/data and taught the per-object resolution sites in @objectstack/lint to warn when a reference resolves to an injected anchor with no storage behind it on an ADR-0015 external object. That covers the two rules that resolve fields per object today:

  • validate-expressions.ts (buildFieldIndex / the object-bound expression surfaces),
  • validate-semantic-roles.ts (stageField / highlightFields).

The filter-position field checks are structurally different: they judge a field name against the object-independent blanket union SYSTEM_FIELDS (packages/lint/src/system-fields.ts), which by design answers "could this name be a system column anywhere" and therefore never flags a system name. Measured read sites:

  • packages/lint/src/validate-widget-bindings.ts:479 (dashboard filter effective field),
  • packages/lint/src/validate-react-page-props.ts:476 (aggregate/filter field refs),
  • packages/lint/src/validate-page-field-bindings.ts:343,
  • packages/lint/src/validate-flow-template-paths.ts:100 (CRUD-node filter template paths).

So filter: [["owner_id", "=", "..."]] on a view/widget/page bound to a federated object lints clean while the runtime degrades exactly as #8116's warning describes (on SQLite: constant-false, HTTP 200, zero rows, no error).

Why it did not ride #8116's PR

Attaching the marker at these sites first requires converting each rule from the blanket union to the per-object derivation (injectedColumnsFor / unprovisionedInjectedColumnsFor) — #5378-shaped work with its own false-positive analysis per surface (each rule's tolerance for names it cannot resolve differs). The #8116 ruling scoped that card to the provenance predicate move only. The spec-side prerequisite now exists, so this is pure lint wiring.

Pointers


Generated by Claude Code

Activity

  1. added
    pm:queueReady for the PM dispatch loop
    domain:devxDomain lane — seat card indexed by label:pm:seat
    on Aug 13, 2026
  2. added theissue type on Aug 13, 2026
  3. hotlong commented on Aug 13, 2026

    @hotlong
    ContributorAuthor

    Triage: lands in domain:devx (packages/lint). pm:queue, type: Bug — the #8116 unprovisioned-anchor warning was scoped to the two per-object resolution rules; the four filter-position sites judge against the object-independent SYSTEM_FIELDS blanket union by construction and so structurally cannot flag the same degradation class the warning exists to catch. Pure lint wiring per the filer, reusing an already-shipped marker (unprovisionedInjectedColumnsFor) and warning shape (warnUnprovisionedAnchors) — no new decision surface.

    Size/model suggestion: M, mode:subagent, model: opus (four call sites, each with its own false-positive tolerance per the filer's note — needs care, not just mechanical copy-paste).


    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

No one assigned

    Labels

    domain:devxDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatch

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions