Filing gate: ① a declared≠enforced family, filed as one sweep card per family under ruling A′ item ④ on #18900 (5727134555). This is triage's standing request 5857165909 on the seat post. Family field-use-grouping, seat verdict ENFORCE.
reach: the declared authoring door. packages/spec parses this key and publishes it in the reference docs. The liveness ledger row cited below records it as not enforced, and the census re-measured the reader side (§5 cross-checks, each with a lit control).
- The criterion is the maintainer's: 「每族该问的是:主流平台有没有这个能力 —— 有 ⇒ 补消费端(一次做对);没有 ⇒ 退役,而不是看仓里有没有人读」.
- The maintainer's one word, per ruling A′ ④: ENFORCE (the seat's proposal: the mainstream has it, so build the consumer once, correctly) or RETIRE (retire the key together with its ledger row).
Census by the domain:spec execution seat 1 (session_01Rjy9MeetSfq34PKn81CRiN, seat post #6017), 2026-09-27. Bases: objectstack a9fb83ef, re-checked against 4d7e740d, where no ledger file or cited surface moved; objectui 6fa5f64a1 (pin f8a9d0fb); cloud 96eb092. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim. This family's rank is 14 of 16. The sibling family cards filed so far are #20273, #20274, #20281, #20282, #20287–#20289, #20294, #20295 and #20299–#20301; the ledger fix is #20296.
Capability: Per-field toggle for thousands separators
| key |
ledger status |
ledger row |
what the ledger cites |
field.useGrouping |
planned |
packages/spec/liveness/field.json:190 |
note: [#7768] Declared 2026-08-11 — Option A of the card's fork (narrowest shape with measured pull, maintainer veto window open). Maps 1:1 to Intl.NumberFormat's useGrouping. The runtime consumer is objectui#4033 (in flight at declaration time): its interim … |
Mainstream evidence:
- Airtable number field formatting offers a thousands-separator option (local / comma / period / space / none). The exact option list is UNVERIFIED.
- Excel and Google Sheets number formats (#,##0 vs 0).
- Odoo integer widgets accept
options="{'format': false}" to drop the separator (used for years). UNVERIFIED across versions.
- Lacking: a Salesforce Number field has no grouping toggle. Dataverse is UNVERIFIED.
Verdict: ENFORCE — the mainstream has the capability, so build the consumer once, correctly.
Reader that must exist / disposition: objectui packages/core/src/utils/number-display.ts: shouldGroupDisplayNumber(scale, currency) (:166, used :213) must let the authored field.useGrouping override the interim scale-0 heuristic, which is already documented as "overridden by the spec presentation hint when it lands" (:109-116).
User-visible risk (1): Display. The interim heuristic already fixes the year case (2026 rather than 2,026).
Acceptance: Every ledger row listed leaves dead/planned/experimental for live, citing the new reader as file#symbol (and a producer where the read depends on a supplied input); pnpm check:liveness green; the family's byStatus in state-counts.md regenerated.
Lane: objectui (domain:ui) sub-issue under a spec-seat parent
File surface: packages/spec/src/data/field.zod.ts:1327 · objectui packages/core/src/utils/number-display.ts · packages/spec/liveness/field.json
Dedupe: useGrouping → 3 open hits. None carries a key of this family:
四轴:
- 实际业务需求: 编号、年份等整数不应显示千分位,而金额应当显示。Airtable 允许按字段切换。
- 项目长远合理性: 渲染器已经预留了「spec 提示覆盖启发式」的位置,接上即可闭环。
- 防 AI 写错: 作者显式写 false 却仍被启发式决定,会让 AI 误判字段设置无效。
- 创业阶段不扩散: 单键,一个函数。
Filing gate: ① a declared≠enforced family, filed as one sweep card per family under ruling A′ item ④ on #18900 (
5727134555). This is triage's standing request5857165909on the seat post. Familyfield-use-grouping, seat verdict ENFORCE.reach:the declared authoring door.packages/specparses this key and publishes it in the reference docs. The liveness ledger row cited below records it as not enforced, and the census re-measured the reader side (§5 cross-checks, each with a lit control).Census by the
domain:specexecution seat 1 (session_01Rjy9MeetSfq34PKn81CRiN, seat post #6017), 2026-09-27. Bases: objectstacka9fb83ef, re-checked against4d7e740d, where no ledger file or cited surface moved; objectui6fa5f64a1(pinf8a9d0fb); cloud96eb092. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim. This family's rank is14of 16. The sibling family cards filed so far are #20273, #20274, #20281, #20282, #20287–#20289, #20294, #20295 and #20299–#20301; the ledger fix is #20296.Capability: Per-field toggle for thousands separators
field.useGroupingpackages/spec/liveness/field.json:190Intl.NumberFormat'suseGrouping. The runtime consumer is objectui#4033 (in flight at declaration time): its interim …Mainstream evidence:
options="{'format': false}"to drop the separator (used for years). UNVERIFIED across versions.Verdict: ENFORCE — the mainstream has the capability, so build the consumer once, correctly.
Reader that must exist / disposition: objectui packages/core/src/utils/number-display.ts:
shouldGroupDisplayNumber(scale, currency)(:166, used :213) must let the authoredfield.useGroupingoverride the interim scale-0 heuristic, which is already documented as "overridden by the spec presentation hint when it lands" (:109-116).User-visible risk (1): Display. The interim heuristic already fixes the year case (2026 rather than 2,026).
Acceptance: Every ledger row listed leaves dead/planned/experimental for live, citing the new reader as file#symbol (and a producer where the read depends on a supplied input); pnpm check:liveness green; the family's byStatus in state-counts.md regenerated.
Lane: objectui (domain:ui) sub-issue under a spec-seat parent
File surface: packages/spec/src/data/field.zod.ts:1327 · objectui packages/core/src/utils/number-display.ts · packages/spec/liveness/field.json
Dedupe:
useGrouping→ 3 open hits. None carries a key of this family:zodOnly方向**根本没接线**(只有嵌套列表有),这就是两个已声明键在全门禁绿的情况下缺席表单的原因 —— 本树实测 276 个 top-level zod-only 键 #19188 — census parent of #19188 split: 39 top-level zod-only keys are structured controls needing a designed widget, not a row #19332/#19188 split: 145 top-level zod-only keys need a RECORDED REASON, never a form row — and none can be recorded until the ledger learns a root path #19333 (form-offer axis)useGroupingas out of scope, does not build the field.useGrouping reader四轴: