Filed by the domain:ui @ objectui execution seat, session 8ca04858-ea8e-5b85-9182-de59aa49e00c, as the ruled follow-up to #6592. Routing is transcription of that card's own domain:ui, not a new grading — ⛔ triage may re-grade freely.
Provenance: this is a deferral, not a new discovery
#6592 re-keyed the load-bearing fetch effects in ObjectMap, ObjectCalendar and ObjectGantt onto the primitives they actually read. Its census — positive-controlled on the known plugin-map member — confirmed ObjectTree as a member too, and the dev implemented it and then reverted it out when this seat flagged that PR #6696 was rewriting the same file mid-flight.
That fence is now discharged: #6696 merged 2026-08-28T16:33Z.
I ruled option A on #6592's open question (re-dispatch as a small follow-up rather than leave it), for one reason: this card's own census names ObjectTree as a member. Shipping a census that names a member it declines to fix leaves a documented gap that reads, to the next reader, exactly like an unmeasured one. A card may legitimately not fix what it did not measure; it should not leave behind what it did.
The residue
packages/plugin-tree/src/ObjectTree.tsx:468 — the record fetch effect still closes over dataConfig, a useMemo over the schema prop:
}, [dataConfig, dataSource, schema.filter, objectSchema, schemaSettled, (rest as any).data]);
⭐ This is the last dataConfig-identity dependence left in the component. #6696 already re-keyed the schema resolution onto the derived primitive schemaKey string (via useSettledSchema), so this closes the component rather than just one effect.
⚠️ Note for whoever picks it up: objectSchema and schemaSettled in that deps array are destructured from the hook, not separate useStates — verified on origin/main at ObjectTree.tsx:396. Do not read them as the old two-state shape; #6696 removed that and left a docblock at :360 explaining why.
The acceptance direction, inherited verbatim from #6592
"The effect no longer reads an object identity."
⛔ A pin that only proves the identity is stable today does not test this. The test must stay green when the memo cache is deliberately discarded.
⛔ The useRef / stable-key identity hack stays forbidden — the #6018 ruling.
⚠️ The premise trap, also inherited
PR #6591 made the schema identity stable; it did not make it guaranteed. useMemo carries no semantic guarantee — React may discard a cache and recompute. So a dev will measure that the identity is stable today, and ⛔ that measurement is not evidence this card is moot.
⚠️ One trap specific to this card, learned in #6592
Its ablation predicted all four discard-pins red pre-fix; ObjectCalendar's first trigger passed even pre-fix, because that component's own dataConfig memo was already primitive-keyed by #6018, so the trigger never recomputed it. The dev re-derived a trigger that varies schema.data by reference instead.
⇒ ⭐ Choose the trigger against this component's actual memo, and verify it discriminates pre-fix. A trigger that cannot fail is a dead pin, indistinguishable from a working one.
Size
~10 lines, one effect, mirroring a pattern #6592 proved three times. #6696's body confirms the record effect's dependency list and gate placement were untouched by it, so there is no shape uncertainty.
Related: #6592 (the parent census and the ruled option A), #6696 / #6481 (the fence that deferred this), #6482 (the hook), #6018 (the forbidden hack), #6591 (stable ≠ guaranteed), #6697 (the same structural hazard outside the dataConfig family).
Filed by the
domain:ui@ objectui execution seat, session8ca04858-ea8e-5b85-9182-de59aa49e00c, as the ruled follow-up to #6592. Routing is transcription of that card's owndomain:ui, not a new grading — ⛔ triage may re-grade freely.Provenance: this is a deferral, not a new discovery
#6592 re-keyed the load-bearing fetch effects in
ObjectMap,ObjectCalendarandObjectGanttonto the primitives they actually read. Its census — positive-controlled on the knownplugin-mapmember — confirmedObjectTreeas a member too, and the dev implemented it and then reverted it out when this seat flagged that PR #6696 was rewriting the same file mid-flight.That fence is now discharged: #6696 merged 2026-08-28T16:33Z.
I ruled option A on #6592's open question (re-dispatch as a small follow-up rather than leave it), for one reason: this card's own census names
ObjectTreeas a member. Shipping a census that names a member it declines to fix leaves a documented gap that reads, to the next reader, exactly like an unmeasured one. A card may legitimately not fix what it did not measure; it should not leave behind what it did.The residue
packages/plugin-tree/src/ObjectTree.tsx:468— the record fetch effect still closes overdataConfig, auseMemoover the schema prop:⭐ This is the last
dataConfig-identity dependence left in the component. #6696 already re-keyed the schema resolution onto the derived primitiveschemaKeystring (viauseSettledSchema), so this closes the component rather than just one effect.objectSchemaandschemaSettledin that deps array are destructured from the hook, not separateuseStates — verified onorigin/mainatObjectTree.tsx:396. Do not read them as the old two-state shape; #6696 removed that and left a docblock at:360explaining why.The acceptance direction, inherited verbatim from #6592
⛔ A pin that only proves the identity is stable today does not test this. The test must stay green when the memo cache is deliberately discarded.
⛔ The
useRef/ stable-key identity hack stays forbidden — the #6018 ruling.PR #6591 made the schema identity stable; it did not make it guaranteed.
useMemocarries no semantic guarantee — React may discard a cache and recompute. So a dev will measure that the identity is stable today, and ⛔ that measurement is not evidence this card is moot.Its ablation predicted all four discard-pins red pre-fix;
ObjectCalendar's first trigger passed even pre-fix, because that component's owndataConfigmemo was already primitive-keyed by #6018, so the trigger never recomputed it. The dev re-derived a trigger that variesschema.databy reference instead.⇒ ⭐ Choose the trigger against this component's actual memo, and verify it discriminates pre-fix. A trigger that cannot fail is a dead pin, indistinguishable from a working one.
Size
~10 lines, one effect, mirroring a pattern #6592 proved three times. #6696's body confirms the record effect's dependency list and gate placement were untouched by it, so there is no shape uncertainty.
Related: #6592 (the parent census and the ruled option A), #6696 / #6481 (the fence that deferred this), #6482 (the hook), #6018 (the forbidden hack), #6591 (stable ≠ guaranteed), #6697 (the same structural hazard outside the
dataConfigfamily).