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
finding(fields,plugin-detail,plugin-list,app-shell): six more non-QueryResultcount/value arms survive the seams #6840 repaired — and one of them reads value AHEAD of data #6917
Found while implementing #6840 (out of that card's fence — it names related-count-store.ts and plugin-view/ObjectView.tsx, and only those two).
#6840 ran a producer sweep for count and value at the DataSource.find() seam and
deleted both arms from its two modules on a measured zero. The same sweep incidentally
enumerated every read site of those two keys above the adapter. Six more survive in
four packages this card does not fence, and they were left untouched.
The sites
count — the same arm #6840 removed, in two more modules
apps/console/src/pages/developer/PublicFormsPage.tsx:134 — same shape
apps/console/src/pages/developer/FlowRunsPage.tsx:155 — same shape
⚠️ One of them is NOT dead — it is an active precedence inversion
The two arms #6840 removed were both dead: each sat behind the contract's own member. packages/fields/src/index.tsx:250 does the opposite —
(result?.value || result?.data || [])
— it reads valueahead ofdata, the one rows member QueryResult declares. That
is the precedence inversion #5945 and #6726 were filed about, still standing, on the key
those cards did not measure. A producer emitting both members with different contents is
resolved the wrong way here, whereas in the modules #6840 fixed it merely failed to be
reached. Worth grading separately from the other five.
What is NOT measured here
⛔ No producer sweep was run for these six sites.#6840's zero is seam-local and
must not be carried over — it measured the seam its own two modules sit on, and each of
these sites sits on its own. #6840's PR demonstrates exactly why that distinction is not
pedantry: the very same value key returned 0 producers at ObjectView's seam and 5 live producers at extractRecords' seam (#6839) in one and the same pass. Recording
a shape is not measuring the arm.
What a repair owes, per module, is what #6840 was held to:
does any producer emit count / value at that seam (repo-wide, with a control term
that must hit and does, sitting on the join rather than merely on the terms);
only on a zero, delete the arm and pin the contract read, one pin per module;
The refusal-pin form to copy is the one #6840 set (see its PR): the header carries the
measurement, the live arms stay pinned beside the dead one, and a precedence-inversion
case is written only where an inversion actually exists.
Two smaller observations from the same pass
packages/core/src/data-scope/ViewDataProvider.ts:128 declares a second, private extractRecords reading records | data | items — a different tolerance set from @object-ui/core's exported extractRecords (records | data | value), under the same
name. Two utilities, one name, disagreeing about which undeclared keys are acceptable.
packages/plugin-grid/src/__tests__/columnIdentity.test.tsx:31 and recordIdFieldProjection.test.tsx:48 return { value: [], '@odata.count': 0 } from
their find doubles, but ObjectGrid reads result.data || [] only. The fixtures read
as though they supply rows and supply none. Inert today because the arrays are empty;
it would silently mislead the first person who puts a row in one.
Why it is worth recording
AGENTS.md #0.1: a tolerant arm is where a non-conforming producer keeps working
unrejected. This key family's own history is the argument for naming the residue rather
than leaving it for a fourth pass — records/items outlived #5458 and #5945 precisely
because each pass fixed the spellings it had been asked about and said nothing about the
ones it had not. #6726 was the third pass, #6840 the fourth, and this is what the fourth
could see but was not fenced to touch.
Found while implementing #6840 (out of that card's fence — it names
related-count-store.tsandplugin-view/ObjectView.tsx, and only those two).#6840 ran a producer sweep for
countandvalueat theDataSource.find()seam anddeleted both arms from its two modules on a measured zero. The same sweep incidentally
enumerated every read site of those two keys above the adapter. Six more survive in
four packages this card does not fence, and they were left untouched.
The sites
count— the same arm #6840 removed, in two more modulespackages/plugin-detail/src/renderers/record-reference-rail.tsx:196—: typeof res?.count === 'number'packages/plugin-list/src/ListView.tsx:1816—? ((results as any).total ?? (results as any).count)value— the same arm #6840 removed, in four more placespackages/fields/src/index.tsx:250—(result?.value || result?.data || [])packages/app-shell/src/layout/AppHeader.tsx:182—: Array.isArray(result?.value)apps/console/src/pages/developer/PublicFormsPage.tsx:134— same shapeapps/console/src/pages/developer/FlowRunsPage.tsx:155— same shapeThe two arms #6840 removed were both dead: each sat behind the contract's own member.
packages/fields/src/index.tsx:250does the opposite —— it reads
valueahead ofdata, the one rows memberQueryResultdeclares. Thatis the precedence inversion #5945 and #6726 were filed about, still standing, on the key
those cards did not measure. A producer emitting both members with different contents is
resolved the wrong way here, whereas in the modules #6840 fixed it merely failed to be
reached. Worth grading separately from the other five.
What is NOT measured here
⛔ No producer sweep was run for these six sites. #6840's zero is seam-local and
must not be carried over — it measured the seam its own two modules sit on, and each of
these sites sits on its own. #6840's PR demonstrates exactly why that distinction is not
pedantry: the very same
valuekey returned 0 producers atObjectView's seam and5 live producers at
extractRecords' seam (#6839) in one and the same pass. Recordinga shape is not measuring the arm.
What a repair owes, per module, is what #6840 was held to:
count/valueat that seam (repo-wide, with a control termthat must hit and does, sitting on the join rather than merely on the terms);
QueryResultto blesscountorvalue— a published-type changeand a maintainer decision, the same hard floor The same
records-before-datatolerant reader survives in ~7 morefind()consumers that #5945 did not name #6726 and finding(components,plugin-view): two more non-QueryResultarms survive on the seams #6726 repaired —res?.countandresults.value#6840 both respected. If areal producer turns up, the likely correct fix is to repair the producer.
The refusal-pin form to copy is the one #6840 set (see its PR): the header carries the
measurement, the live arms stay pinned beside the dead one, and a precedence-inversion
case is written only where an inversion actually exists.
Two smaller observations from the same pass
packages/core/src/data-scope/ViewDataProvider.ts:128declares a second, privateextractRecordsreadingrecords | data | items— a different tolerance set from@object-ui/core's exportedextractRecords(records | data | value), under the samename. Two utilities, one name, disagreeing about which undeclared keys are acceptable.
packages/plugin-grid/src/__tests__/columnIdentity.test.tsx:31andrecordIdFieldProjection.test.tsx:48return{ value: [], '@odata.count': 0 }fromtheir
finddoubles, butObjectGridreadsresult.data || []only. The fixtures readas though they supply rows and supply none. Inert today because the arrays are empty;
it would silently mislead the first person who puts a row in one.
Why it is worth recording
AGENTS.md #0.1: a tolerant arm is where a non-conforming producer keeps working
unrejected. This key family's own history is the argument for naming the residue rather
than leaving it for a fourth pass —
records/itemsoutlived #5458 and #5945 preciselybecause each pass fixed the spellings it had been asked about and said nothing about the
ones it had not. #6726 was the third pass, #6840 the fourth, and this is what the fourth
could see but was not fenced to touch.
No PR here; recording only.
Generated by Claude Code