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
[Decision] hideEmpty on record:details sections: the spec REFUSES the key, @object-ui/types declares it, the zod mirror omits it, and the renderer honours it — plus hideEmpty: false is not an override #7129
Filed by the domain:ui seat (session session_012wwHa4aaFybxXrfmfHioDM) out of #7064 / PR #7123, which measured both questions below while executing the maintainer's 2026-08-31 ruling. ⛔ Recording and routing, not claiming.
#7064's own deliverable is complete and that card closes with its PR. These are new questions the work surfaced, not unfinished scope — which is why they are here rather than holding a finished card open.
⭐ Question 1 — one key, four parties, three different answers
Measured against installed @objectstack/spec17.2.0: RecordDetailsProps.safeParse over a record:details section carrying hideEmpty returns success: false with unrecognized_keys: ['hideEmpty'] and the message "Unrecognized key(s) on this record:details section". ⚠️ Control in the same probe: a section carrying columns: 2 parses and the value survives — so this is about the key, not a broken probe.
⛔ absent — 0 hits, ⚠️ control headerColor = 2 in the same file
RecordDetailsRenderer
✅ honours it
(The seat verified the two objectui-side rows independently; the spec row is #7123's measurement.)
Why this is a decision and not a bug fix
⚠️It changes what the ruling did. The ruling's second clause preserved authored hideEmpty: true as "the explicit opt-in to hiding". But on any spec-validated page the key never reaches the renderer at all — so the old forced hideEmpty ?? true was not a default over an authorable key, it was an unconditional platform policy with no author escape hatch. PR #7123 is correct as built (the renderer still honours the key for schemas that carry one), but the escape hatch the ruling describes does not exist where the spec is enforced.
Options
A — leave the spec refusing it; close the divergence on the objectui side (retire DetailViewSection.hideEmpty, ADR-0049 enforce-or-remove). ⭐ Consistent with the ruling's own direction: the platform decides this and the app does not author it, so a loud refusal is the aligned answer and the objectui declaration is the thing out of step. This is the seat's reading, carried up from fix(plugin-detail): let DetailSection's heuristic own the empty-section default #7123's implementer.
B — declare it in the spec so the honoured key becomes authorable and the contracts agree. ⚠️ Adds an authoring lever the ruling was written to remove.
C — leave all four as they are. ⛔ Not recommended: a key declared in one contract, refused by another, omitted by a third and honoured by the renderer is exactly the shape that produces confident wrong code.
⚠️Cross-repo: A and B both touch objectstack, which is outside the domain:ui @ objectui seat's dispatch scope. Routed, ⛔ not actionable here.
Question 2 — hideEmpty: false is not an override, and never has been
Measured inside DetailSection: shouldAutoHideEmpty tests !section.hideEmpty, so an authored false is indistinguishable from unauthored and the auto-hide heuristic still fires above its thresholds (4 fields / 25% empty; 3 / 20% on mobile).
⇒ An author who writes hideEmpty: false on a large sparse section sees no change at all.
⚠️Pre-existing and NOT introduced by PR #7123 — the old ?? true preserved an authored false too, so the same fixture took the same path before. #7123 pins the behaviour as a measurement, explicitly framed as not an endorsement, so it is visible in code rather than only in a report.
Options
A — leave as-is. Zero risk; the key silently does nothing in exactly the case an author would reach for it.
B — make false a hard override of the heuristic. Restores the key's plain-reading meaning; ⚠️ costs one more authorable lever, cutting against the ruling's zero-authoring direction, and its correct use requires knowing a threshold formula.
C — retire the authored key on this surface and let the heuristic be the whole contract. ⭐ Coheres with Question 1 option A and with the fact that the spec already refuses it.
Seat's reading: ⭐ A now, then C — and note Q1-A and Q2-C are the same action, so answering Question 1 likely answers this one. ⛔ Recommendation, not a ruling.
Filed by the
domain:uiseat (sessionsession_012wwHa4aaFybxXrfmfHioDM) out of #7064 / PR #7123, which measured both questions below while executing the maintainer's 2026-08-31 ruling. ⛔ Recording and routing, not claiming.#7064's own deliverable is complete and that card closes with its PR. These are new questions the work surfaced, not unfinished scope — which is why they are here rather than holding a finished card open.
⭐ Question 1 — one key, four parties, three different answers
Measured against installed⚠️ Control in the same probe: a section carrying
@objectstack/spec17.2.0:RecordDetailsProps.safeParseover arecord:detailssection carryinghideEmptyreturnssuccess: falsewithunrecognized_keys: ['hideEmpty']and the message "Unrecognized key(s) on thisrecord:detailssection".columns: 2parses and the value survives — so this is about the key, not a broken probe.@objectstack/spec17.2.0@object-ui/types—packages/types/src/views.ts:230hideEmpty?: booleanpackages/types/src/zod/views.zod.tsheaderColor= 2 in the same fileRecordDetailsRenderer(The seat verified the two objectui-side rows independently; the spec row is #7123's measurement.)
Why this is a decision and not a bug fix
hideEmpty: trueas "the explicit opt-in to hiding". But on any spec-validated page the key never reaches the renderer at all — so the old forcedhideEmpty ?? truewas not a default over an authorable key, it was an unconditional platform policy with no author escape hatch. PR #7123 is correct as built (the renderer still honours the key for schemas that carry one), but the escape hatch the ruling describes does not exist where the spec is enforced.Options
DetailViewSection.hideEmpty, ADR-0049 enforce-or-remove). ⭐ Consistent with the ruling's own direction: the platform decides this and the app does not author it, so a loud refusal is the aligned answer and the objectui declaration is the thing out of step. This is the seat's reading, carried up from fix(plugin-detail): let DetailSection's heuristic own the empty-section default #7123's implementer.objectstack, which is outside thedomain:ui@ objectui seat's dispatch scope. Routed, ⛔ not actionable here.Question 2 —
hideEmpty: falseis not an override, and never has beenMeasured inside
DetailSection:shouldAutoHideEmptytests!section.hideEmpty, so an authoredfalseis indistinguishable from unauthored and the auto-hide heuristic still fires above its thresholds (4 fields / 25% empty; 3 / 20% on mobile).⇒ An author who writes
hideEmpty: falseon a large sparse section sees no change at all.?? truepreserved an authoredfalsetoo, so the same fixture took the same path before. #7123 pins the behaviour as a measurement, explicitly framed as not an endorsement, so it is visible in code rather than only in a report.Options
falsea hard override of the heuristic. Restores the key's plain-reading meaning;Seat's reading: ⭐ A now, then C — and note Q1-A and Q2-C are the same action, so answering Question 1 likely answers this one. ⛔ Recommendation, not a ruling.
Related
record:detailsregistration comment says the spec STRIPS undeclared section keys — measured, it REFUSES them, and the same comment block already says so two sentences earlier #7127 — therecord:detailsregistration comment says the spec "STRIPS" undeclared section keys; measured, it refuses them. Same measurement, different artefact — that one is a plain comment fix, ⛔ not a decision.hideEmpty ?? trueover DetailSection's own stated heuristic #7064 / PR fix(plugin-detail): let DetailSection's heuristic own the empty-section default #7123 — the ruled flip. Complete.