Skip to content

Commit 1fbb5e8

Browse files
os-try2026claude
andcommitted
fix(lint): the new suite member keeps the #4463 P1 flow floor
Every member of the reference-integrity suite judges flow snapshots, pinned as a roster-wide invariant rather than a per-member preference. The member declares 'flow' to hold that floor; on a flow snapshot the objects are context in both passes, so it adds a pass and no verdict. 'view' stays argued out — a view write cannot change an object's own field-name lists. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
1 parent dbbaef8 commit 1fbb5e8

1 file changed

Lines changed: 18 additions & 12 deletions

File tree

packages/lint/src/reference-integrity-suite.ts

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,8 @@ export const REFERENCE_INTEGRITY_RULES: readonly ReferenceIntegrityRule[] = [
239239
// on a list view. Placed directly after them because it completes the same
240240
// sweep — every field name an object or its built-in views write down.
241241
//
242-
// `runtimeTypes` is `['object']` — the ONLY member of this suite that names
243-
// that type, and the only one that does not name `flow`. Both halves are
244-
// deliberate.
242+
// `runtimeTypes` is `['flow', 'object']` — the ONLY member of this suite
243+
// that names `object`, and `flow` for the floor the suite keeps.
245244
//
246245
// It names `object` because that is the point of the member: Studio's app
247246
// builder mints no `view` items at all, so the list-view members have
@@ -253,15 +252,22 @@ export const REFERENCE_INTEGRITY_RULES: readonly ReferenceIntegrityRule[] = [
253252
// against the object's OWN field map, so a one-object snapshot is not
254253
// merely sufficient, it is the whole universe the question has.
255254
//
256-
// It does NOT name `flow` or `view`, and that is not an omission. On either
257-
// of those snapshots the objects are CONTEXT, present in the baseline and
258-
// the candidate alike, so every finding this member could raise there
259-
// cancels in the gate's differential (#4463 D4 — a stored object already in
260-
// violation is never charged to someone else's write). Declaring them would
261-
// buy two extra passes over the tenant's object model per flow write and
262-
// change no verdict. CLI commands ignore this field entirely, so all three
263-
// commands judge every object either way.
264-
{ name: 'validateObjectFieldRefs', runtimeTypes: ['object'], run: validateObjectFieldRefs },
255+
// It names `flow` because EVERY member of this suite does — the #4463 P1
256+
// surface is the floor the member axis was never meant to narrow, and
257+
// `runtime-gate.view-writes.test.ts` pins it as an invariant over the whole
258+
// roster rather than a preference per member. Worth being plain about what
259+
// it buys here: on a flow snapshot the objects are CONTEXT, present in the
260+
// baseline and the candidate alike, so anything this member could raise
261+
// there cancels in the gate's differential (#4463 D4 — a stored object
262+
// already in violation is never charged to someone else's write). So it
263+
// adds a pass, not a verdict. That is the right trade against being the
264+
// first member to leave the floor.
265+
//
266+
// It does NOT name `view`, and that IS an argued omission: the `crossed`
267+
// list in that same test is written out precisely so each view crossing is
268+
// argued, and this member judges no list view. A view write cannot change
269+
// an object's own field-name lists.
270+
{ name: 'validateObjectFieldRefs', runtimeTypes: ['flow', 'object'], run: validateObjectFieldRefs },
265271
{ name: 'validateActionNameRefs', run: validateActionNameRefs },
266272
{ name: 'validatePageFieldBindings', run: validatePageFieldBindings },
267273
// [#14073] The same page, one question out. `validatePageFieldBindings`

0 commit comments

Comments
 (0)