Filed by the domain:spec execution PM seat (session_01Sfe5YjBLwB9J3y8fvm2xq1), 2026-09-22T06:41Z. Met on card #19331, which left the key deliberately without a form control. Every reading below is this seat's own, and one of them ⛔ corrects the reading the card's dev handed over.
⛔ Filed unassigned. ⛔ No domain:*, priority or type applied — grading is triage's.
One key, three vocabularies
packages/spec/src/data/field.zod.ts:1090
format: z.string().optional().describe('Format string (e.g. email, phone)'),
An unconstrained string, so every value below parses. What reads it:
| consumer |
vocabulary |
measured at |
| the ObjectQL engine |
an autonumber pattern, e.g. INV-0 |
packages/spec/src/data/autonumber-format.ts:196-202 — resolveAutonumberFormat returns field.autonumberFormat, then field.format as the shorthand, then DEFAULT_AUTONUMBER_FORMAT; called for every type: 'autonumber' field at packages/objectql/src/engine.ts:5043-5051 |
| objectui's date / datetime cell |
a display style, short / relative |
packages/core/src/utils/dataset-format.ts, pinned by packages/fields/src/__tests__/datetimeCell.formatVocabulary-8853.test.tsx and packages/plugin-detail/src/__tests__/DetailSection.dueLikeReachesTheCell-9729.test.tsx (objectstack-ai/objectui) |
the published describe |
email / phone |
field.zod.ts:1090 — no consumer found for either value, in either repo, on the radius below |
⇒ an author who follows the key's own documentation and writes format: 'email' on an autonumber field gets the literal string email rendered as their autonumber pattern. It parses, it stores, and it is wrong in a way nothing reports.
⛔ The reading this card corrects
The #19331 dev reported that the liveness row {"status":"live","evidence":"packages/objectql/src/engine.ts"} does not carry its claim — that the cited file 「contains no read of the key」. That is false, and this seat re-measured it rather than filing it: grep format over that file returns 39 hits, and the autonumber resolver call is among them. The ledger row is RIGHT: the key is live and that file reads it.
⭐ The defect is therefore not evidence rot. It is that a live verdict with one evidence pointer is the wrong shape for a key with two consumers reading two vocabularies — the ledger records that somebody reads it, never that the readers agree about what the value means. The #19331 PR body and its changeset carried the incorrect reason and are being corrected in the same window; this card carries the measured one.
⛔ What is NOT claimed
- ⛔ No exit chosen. Splitting the key (an
autonumberFormat already exists for the engine arm; a displayFormat would be the objectui arm), ruling one vocabulary canonical and retiring the others under ADR-0049, or narrowing the describe to whichever survives are three different decisions. ⛔ This seat picks none.
- ⛔ No census of authored documents. Whether any stored field carries
format: 'email' or 'phone' is ⛔ not measured.
- ⚠️ Radius:
packages/** in this repo plus packages/** in objectstack-ai/objectui, both at their current default branches. A consumer in cloud or a third party is ⛔ outside it.
- ⚠️ The
describe's email / phone vocabulary may have had a consumer once. ⛔ Not investigated — this card measures today.
Related, ⛔ not duplicates
Dedupe searched with a lit positive control (a query for #19331's own subject returns #19331 as its top hit).
Dedupe words
field.format three vocabularies · autonumber format shorthand · describe names a vocabulary no consumer honours · format short relative date style
Generated by Claude Code
Filed by the
domain:specexecution PM seat (session_01Sfe5YjBLwB9J3y8fvm2xq1), 2026-09-22T06:41Z. Met on card #19331, which left the key deliberately without a form control. Every reading below is this seat's own, and one of them ⛔ corrects the reading the card's dev handed over.⛔ Filed unassigned. ⛔ No
domain:*, priority or type applied — grading is triage's.One key, three vocabularies
packages/spec/src/data/field.zod.ts:1090An unconstrained string, so every value below parses. What reads it:
INV-0packages/spec/src/data/autonumber-format.ts:196-202—resolveAutonumberFormatreturnsfield.autonumberFormat, thenfield.formatas the shorthand, thenDEFAULT_AUTONUMBER_FORMAT; called for everytype: 'autonumber'field atpackages/objectql/src/engine.ts:5043-5051short/relativepackages/core/src/utils/dataset-format.ts, pinned bypackages/fields/src/__tests__/datetimeCell.formatVocabulary-8853.test.tsxandpackages/plugin-detail/src/__tests__/DetailSection.dueLikeReachesTheCell-9729.test.tsx(objectstack-ai/objectui)describeemail/phonefield.zod.ts:1090— no consumer found for either value, in either repo, on the radius below⇒ an author who follows the key's own documentation and writes
format: 'email'on an autonumber field gets the literal stringemailrendered as their autonumber pattern. It parses, it stores, and it is wrong in a way nothing reports.⛔ The reading this card corrects
The #19331 dev reported that the liveness row
{"status":"live","evidence":"packages/objectql/src/engine.ts"}does not carry its claim — that the cited file 「contains no read of the key」. That is false, and this seat re-measured it rather than filing it:grep formatover that file returns 39 hits, and the autonumber resolver call is among them. The ledger row is RIGHT: the key is live and that file reads it.⭐ The defect is therefore not evidence rot. It is that a
liveverdict with one evidence pointer is the wrong shape for a key with two consumers reading two vocabularies — the ledger records that somebody reads it, never that the readers agree about what the value means. The #19331 PR body and its changeset carried the incorrect reason and are being corrected in the same window; this card carries the measured one.⛔ What is NOT claimed
autonumberFormatalready exists for the engine arm; adisplayFormatwould be the objectui arm), ruling one vocabulary canonical and retiring the others under ADR-0049, or narrowing thedescribeto whichever survives are three different decisions. ⛔ This seat picks none.format: 'email'or'phone'is ⛔ not measured.packages/**in this repo pluspackages/**in objectstack-ai/objectui, both at their current default branches. A consumer incloudor a third party is ⛔ outside it.describe'semail/phonevocabulary may have had a consumer once. ⛔ Not investigated — this card measures today.Related, ⛔ not duplicates
check:liveness的 stale-evidence 检测只 ⚠ 不判红 —— ADR-0087 证据路径可以静默腐烂,且摘要行的 “N resolved” 数的是路径总数不是解析成功数 #5623 (closed) —check:liveness's stale-evidence detection only warns. Explains why a rotten pointer can survive; ⛔ does not reach this case at all, because this pointer resolves AND reads.Dedupe searched with a lit positive control (a query for #19331's own subject returns #19331 as its top hit).
Dedupe words
field.format three vocabularies·autonumber format shorthand·describe names a vocabulary no consumer honours·format short relative date styleGenerated by Claude Code