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
feat(lint): publish-time resolution of metadata-form predicate paths (#7010) (#7214)
* feat(lint): publish-time resolution of metadata-form predicate paths (#7010)
New `error`-level rule family `validate-predicate-path-refs`: a
conditional-visibility predicate on a schema-bound metadata form must name
paths the target schema actually declares.
- `predicate-path-unresolved` — a `data.`-rooted path whose first
unresolvable segment is not a key of the schema at that point.
- `predicate-path-unrooted` — a bare identifier that IS a key of the scope,
i.e. #6254's shape (right name, dropped root). Immune to the CEL type-name
blind spot that made #6248's gate structurally unable to catch it.
Scoped to the `data.*` layer: the metadata-type schema registry is a closed
key set, while an ObjectQL object's addressable path set is not.
Corpus-counted before enforcing: 0 findings over the shipped
METADATA_FORM_REGISTRY (17 forms, 46 predicates); 16 once #6254's pre-fix
`object.form.ts` spellings are restored.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F8q5J1MQyocgtNspb15fSn
* refactor(lint): fold the local `collectionEntries` copy into the #7186 helper
#7186 landed `packages/lint/src/collection-entries.ts` on main after this
branch was cut. The local 15-line duplicate documented as "folds into that
helper when it lands" now does — same semantics, same array/name-keyed-map
handling, same walk order, so no verdict or path changes.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F8q5J1MQyocgtNspb15fSn
---------
Co-authored-by: Claude <noreply@anthropic.com>
0 commit comments