Skip to content

[finding] The record.* (object-bound form) predicate layer has no path-resolution gate — and cannot soundly get an error-level one until the traversable path set is a closed oracle #7219

Description

@os-project-manager

Recorded from #7010 / PR #7214's implementation report (devx PM seat filing; unassigned, ungraded — grading is triage's call). That PR gates the data.* (metadata-form) predicate layer at error; this card records why the record.* layer was deliberately left out, and what the sound follow-up looks like.

The gap

A record.<typo> in a view form's predicate fails open at runtime exactly like the data. case #7010 closed — silently, the #5149 family's shape. Nothing gates it at authoring time.

Why #7214 did not gate it (measured reasoning, not omission)

getMetadataTypeSchema is a closed oracle: the key set is enumerable, so "this path does not resolve" is a fact. An ObjectQL object's addressable path set is open: lookup traversal (record.account.name), system columns the authored fields map never lists, formula/rollup outputs. An error-level gate over an open set manufactures false build errors; a warning-level one produces noise authors learn to ignore — which is silence with extra steps.

The three dispositions (from the report, recommendation A-then-C)

  • A — leave ungated (the shipped state after feat(lint): publish-time resolution of metadata-form predicate paths (#7010) #7214).
  • B — gate at warning, accepting noise on legitimate traversal.
  • Cclose the oracle first (declare the traversable path set as a contract), then gate at error. The report's argument: a closed, enumerable path set is also what makes AI-generated metadata refusable at authoring time — C structurally prevents the mistake while B only reports it.

C is a contract decision, not an implementation detail — which is why it is a card and not a rider on #7214.

Refs: #7010, PR #7214, #5149 (fail-open family), #6254 (the data. precedent), #6936.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions