Found while measuring #7627 (the data.provider === 'object' fold collapse). Filed separately because it is a different fold from the one #7627 names, and it stands whichever way #7627's precedence question is ruled.
What is true today (measured on origin/main 11edab88)
getDataConfig(schema) — the helper that resolves a block's record source from one of three keys, in the order data then staticData then objectName — is defined locally, five times:
| file |
line |
packages/plugin-calendar/src/ObjectCalendar.tsx |
117 |
packages/plugin-gantt/src/ObjectGantt.tsx |
320 |
packages/plugin-grid/src/ObjectGrid.tsx |
428 |
packages/plugin-map/src/ObjectMap.tsx |
127 |
packages/plugin-tree/src/ObjectTree.tsx |
92 |
Four of the five are byte-identical modulo the parameter type; plugin-tree's takes schema: any and is written on one line per rung. The bodies all read:
if (schema.data) return schema.data;
if (schema.staticData) return { provider: 'value', items: schema.staticData };
if (schema.objectName) return { provider: 'object', object: schema.objectName };
return null;
plugin-calendar's differs in one measured way: it guards with 'data' in schema && schema.data / 'staticData' in schema && schema.staticData rather than a bare truthiness read, because its parameter is a union of two schema types.
Why this is worth a card
This ladder is not an implementation detail — it is published contract, on both faces, and it is maintainer-ruled. packages/types/src/objectql.ts and packages/types/src/zod/objectql.zod.ts both declare, in .describe() strings that ship, that objectName is "the THIRD record source getDataConfig resolves, after data and staticData" and that data is "read FIRST by getDataConfig" (objectui#6939, maintainer ruling recorded 2026-09-02, director seat, decision batch #8). The Zod refinement requireRecordSource is written against exactly these three rungs, and packages/types/src/__tests__/objectql-record-source-refinement-6939.test.ts pins the validator half.
So the published spec names one resolver, and the repo has five copies of it that nothing holds together. A change to the ruled order has five edit sites and no gate that notices if one is missed — the same drift class AGENTS.md #0.1 names, and the same one #7627 files against the provider === 'object' reads layered on top of this helper.
No user-visible bug is claimed and none was measured: all five copies agree today for every input tested. The cost is drift risk against a published, ruled contract. Severity is for triage to set.
Note for whoever picks this up
Refs: #7627 (origin of this measurement) · #6939 (the ruling that published the ladder) · #7470 · AGENTS.md #0.1.
Found while measuring #7627 (the
data.provider === 'object'fold collapse). Filed separately because it is a different fold from the one #7627 names, and it stands whichever way #7627's precedence question is ruled.What is true today (measured on
origin/main11edab88)getDataConfig(schema)— the helper that resolves a block's record source from one of three keys, in the orderdatathenstaticDatathenobjectName— is defined locally, five times:packages/plugin-calendar/src/ObjectCalendar.tsxpackages/plugin-gantt/src/ObjectGantt.tsxpackages/plugin-grid/src/ObjectGrid.tsxpackages/plugin-map/src/ObjectMap.tsxpackages/plugin-tree/src/ObjectTree.tsxFour of the five are byte-identical modulo the parameter type;
plugin-tree's takesschema: anyand is written on one line per rung. The bodies all read:plugin-calendar's differs in one measured way: it guards with'data' in schema && schema.data/'staticData' in schema && schema.staticDatarather than a bare truthiness read, because its parameter is a union of two schema types.Why this is worth a card
This ladder is not an implementation detail — it is published contract, on both faces, and it is maintainer-ruled.
packages/types/src/objectql.tsandpackages/types/src/zod/objectql.zod.tsboth declare, in.describe()strings that ship, thatobjectNameis "the THIRD record sourcegetDataConfigresolves, afterdataandstaticData" and thatdatais "read FIRST bygetDataConfig" (objectui#6939, maintainer ruling recorded 2026-09-02, director seat, decision batch #8). The Zod refinementrequireRecordSourceis written against exactly these three rungs, andpackages/types/src/__tests__/objectql-record-source-refinement-6939.test.tspins the validator half.So the published spec names one resolver, and the repo has five copies of it that nothing holds together. A change to the ruled order has five edit sites and no gate that notices if one is missed — the same drift class AGENTS.md #0.1 names, and the same one #7627 files against the
provider === 'object'reads layered on top of this helper.No user-visible bug is claimed and none was measured: all five copies agree today for every input tested. The cost is drift risk against a published, ruled contract. Severity is for triage to set.
Note for whoever picks this up
dataConfigvalue that finding(core): the six per-blockdata.provider === 'object'folds could collapse onto one shared reader — the seventh now lives innormalizeListViewSchema#7627's seven read sites consume. Sequence matters: finding(core): the six per-blockdata.provider === 'object'folds could collapse onto one shared reader — the seventh now lives innormalizeListViewSchema#7627 is currently parked on a precedence decision (see that card), and the answer determines whether a sharedgetDataConfigshould also be the place the binding precedence is stated. Reading finding(core): the six per-blockdata.provider === 'object'folds could collapse onto one shared reader — the seventh now lives innormalizeListViewSchema#7627's report comment first will save re-measuring.packages/types/**was held by dispatch finding(types):DashboardComponentSchema.titleis declared-but-unread once the #7509 retirement lands #7623 while this was measured — re-check who holds it before touching the declarations.inputsstill declareobjectNamerequired while the renderers read three record sources #7470 (the designer-facinginputson the map/gantt registrations still declareobjectNamerequired while the renderers read three sources).Refs: #7627 (origin of this measurement) · #6939 (the ruling that published the ladder) · #7470 · AGENTS.md #0.1.