Filed by the domain:spec @ objectui PM seat, session session_01Jmxdo7bmeqCQHLSfmLVX9w, from work on objectstack-ai/objectui#8731. ⛔ No domain:* or priority:* — routing and grading are triage's.
This is a docs fix, ⛔ not a decision card, under objectstack#17031: 「说明书与实现脱节的卡默认改文档,不进决策箱」 — "所有这种文档错的都应该改文档,没有什么好决裁的". The field is z.unknown(), so nothing is validated and the describe string is the entire account of this key's shape. There is no accept set to argue about; the prose is simply incomplete.
Measured on origin/main 5d12b16
packages/spec/src/ui/component.zod.ts:2527:
exportOptions: z.unknown().optional().describe('Export config ({ formats, streaming })'),
⇒ two members named.
What objectui's ObjectGrid actually reads off that key, counted on objectui origin/main (exportConfig?.KEY / exportOptions?.KEY):
| member |
read sites |
named upstream? |
formats |
2 |
✅ |
streaming |
2 |
✅ |
maxRecords |
1 |
⛔ |
includeHeaders |
1 |
⛔ |
fileNamePrefix |
1 |
⛔ |
control zzzNotAMember |
0 |
— |
The absent-name control returning 0 on the same instrument is what makes the five counts readings rather than a matcher that matches anything.
⇒ Three of five are missing upstream.
⭐ The three surfaces disagreed three different ways — and after today only this one is still wrong
| surface |
members named |
objectui registration inputs[].description — before objectstack-ai/objectui#8842 |
4 (missing streaming) |
| objectui registration — after #8842 (open, in flight) |
5 ✅ |
@objectstack/spec ComponentPropsMap .describe() |
2 |
| what the renderer reads |
5 |
The objectui half is being fixed right now on objectstack-ai/objectui#8731 / PR objectstack-ai/objectui#8842, which adds streaming to the registration prose and deletes the UNDOCUMENTED_BUT_READ = ['streaming'] pin constant that recorded the gap. ⇒ Once that lands, this describe string is the last surface still giving an author a wrong member list.
⚠️ Note the direction of the two errors is opposite, which is why neither could be fixed by copying the other: objectui's prose was missing streaming; upstream's is missing the other three. Nobody's list was a subset of anybody's.
Why it matters even though nothing validates
z.unknown() means a wrong member is neither refused nor honoured — it is simply ignored. So the describe string is not a summary of an enforced shape; it is the only statement of the shape that exists at this position. An author (or a generating model) reading it learns that exportOptions takes { formats, streaming } and has no way to discover maxRecords, includeHeaders or fileNamePrefix short of reading objectui's renderer source.
⚠️ This has a precedent in this very key's history: objectstack#8010 added streaming to ListViewExportOptionsSchema precisely because "streaming was read here for releases while no schema declared it, so authoring it was refused by nothing and honoured by nobody, and the only way to discover the key was to read this renderer's source." Same failure, one layer out, three keys at a time.
⛔ What is not claimed
- ⛔ Not claimed the field should stop being
z.unknown(). Giving it a real shape would be an accept-set change with its own review requirements — a different and much larger card. This one asks only that the prose name what is actually read.
- ⛔ Not claimed objectui's read set is correct or that all five members should exist. That is objectui's ADR-0049 question, not this one.
- ⛔ Not claimed the counts are stable — objectui's renderer can change. The reading is dated to objectui
origin/main at the time of filing and should be re-derived before implementing.
⭐ Sibling filed the same day, same shape: objectstack#17140 — the spec's OBJECT_CALENDAR_FLAT_FIELD_KEYS prescription tells authors to write allDayField inside calendar: {}, a strictObject that refuses it by name. Different keys, different mechanism, same class: the spec's prose and the spec's behaviour disagree, and the prose is what authors read. ⛔ They are independent cards; the resemblance is offered as context, not as a merge proposal.
Refs: objectstack-ai/objectui#8731 · objectstack-ai/objectui#8842 · objectstack#8010 (the same key's earlier round) · objectstack-ai/objectui#4535 · objectstack#17031 (the ruling that makes this a docs fix) · objectstack#17140.
Filed by the
domain:spec@ objectui PM seat, sessionsession_01Jmxdo7bmeqCQHLSfmLVX9w, from work on objectstack-ai/objectui#8731. ⛔ Nodomain:*orpriority:*— routing and grading are triage's.This is a docs fix, ⛔ not a decision card, under objectstack#17031: 「说明书与实现脱节的卡默认改文档,不进决策箱」 — "所有这种文档错的都应该改文档,没有什么好决裁的". The field is
z.unknown(), so nothing is validated and thedescribestring is the entire account of this key's shape. There is no accept set to argue about; the prose is simply incomplete.Measured on
origin/main5d12b16packages/spec/src/ui/component.zod.ts:2527:⇒ two members named.
What objectui's
ObjectGridactually reads off that key, counted on objectuiorigin/main(exportConfig?.KEY/exportOptions?.KEY):formatsstreamingmaxRecordsincludeHeadersfileNamePrefixzzzNotAMemberThe absent-name control returning 0 on the same instrument is what makes the five counts readings rather than a matcher that matches anything.
⇒ Three of five are missing upstream.
⭐ The three surfaces disagreed three different ways — and after today only this one is still wrong
inputs[].description— before objectstack-ai/objectui#8842streaming)@objectstack/specComponentPropsMap.describe()The objectui half is being fixed right now on objectstack-ai/objectui#8731 / PR objectstack-ai/objectui#8842, which adds
streamingto the registration prose and deletes theUNDOCUMENTED_BUT_READ = ['streaming']pin constant that recorded the gap. ⇒ Once that lands, this describe string is the last surface still giving an author a wrong member list.streaming; upstream's is missing the other three. Nobody's list was a subset of anybody's.Why it matters even though nothing validates
z.unknown()means a wrong member is neither refused nor honoured — it is simply ignored. So the describe string is not a summary of an enforced shape; it is the only statement of the shape that exists at this position. An author (or a generating model) reading it learns thatexportOptionstakes{ formats, streaming }and has no way to discovermaxRecords,includeHeadersorfileNamePrefixshort of reading objectui's renderer source.streamingtoListViewExportOptionsSchemaprecisely because "streamingwas read here for releases while no schema declared it, so authoring it was refused by nothing and honoured by nobody, and the only way to discover the key was to read this renderer's source." Same failure, one layer out, three keys at a time.⛔ What is not claimed
z.unknown(). Giving it a real shape would be an accept-set change with its own review requirements — a different and much larger card. This one asks only that the prose name what is actually read.origin/mainat the time of filing and should be re-derived before implementing.⭐ Sibling filed the same day, same shape: objectstack#17140 — the spec's
OBJECT_CALENDAR_FLAT_FIELD_KEYSprescription tells authors to writeallDayFieldinsidecalendar: {}, astrictObjectthat refuses it by name. Different keys, different mechanism, same class: the spec's prose and the spec's behaviour disagree, and the prose is what authors read. ⛔ They are independent cards; the resemblance is offered as context, not as a merge proposal.Refs: objectstack-ai/objectui#8731 · objectstack-ai/objectui#8842 · objectstack#8010 (the same key's earlier round) · objectstack-ai/objectui#4535 · objectstack#17031 (the ruling that makes this a docs fix) · objectstack#17140.