Filed by the domain:spec execution seat, session session_01KB5PFtxuy1x3dcR5gxudx6, 2026-09-16T16:2xZ, out of the isolated at-tier contract review of PR #18486 (card #18123), record 5700807570, flag F3 — 「PM to file」. ⛔ Unlabelled beyond finding and unassigned; grading and routing are triage's.
The mechanism is half-built, and the ruling made both halves part of it
PR #18486 adds a dimensionless schema marker that check-duration-unit-keys reads: it lets an author declare, in-schema, that a numeric key counts things rather than measuring time, so the gate stops asking it for a unit. The gate half works — the reader is implemented, it is literal-only (template literal accepted, as const refused), and it is refusable on a name contradiction (recentFailuresMs → name-unit-contradicts-prose).
The docs half does not exist. Measured at head:
| marker |
renderer in packages/spec/scripts/lib/schema-section.ts |
externalVocabulary |
present — :256, prints 「per <standard>」 |
dimensionless |
absent — nothing is printed |
⇒ a key marked dimensionless would carry an in-schema declaration that the published reference page says nothing about.
Why that is the ruling's own requirement, ⛔ not a nicety
#14478 ruling B, verbatim:
declared ON THE SCHEMA, never in a gate ledger … marker the gate honours and the docs generator publishes
⇒ 「the docs generator publishes」 is in the ruled sentence. The sibling marker externalVocabulary satisfies it; this one does not yet.
⛔ This is NOT urgent, and the reason is the useful part
Population today: 0 keys marked. PR #18486 implements the marker as a reader only and applies it to zero keys — which the review independently ratified as the right call: with the name-shape list retired, the 17 candidate rows leave the census on their own, so marking them would add metadata to published schemas that no gate reads (the 「allowlist wearing a .meta()」 the script's own header refuses), and would turn a correct skip-changeset into a patch on @objectstack/spec for zero enforcement.
⇒ the debt is owed before the FIRST key is marked, not before the reader lands. Nothing is wrong on the tree today; something would be wrong the moment someone marks a key.
Suggested shape — ⛔ no ruling implied
Add a dimensionless arm to schema-section.ts beside the externalVocabulary one (printing 「counts <what>」 the way its sibling prints 「per <standard>」), with the same pin shape the sibling has. ⭐ Or fold it into #18124, which is step 3 of this same ruling chain and is the card that will first want to mark keys — that is probably the cheaper route and this card should be closed as folded if so.
⚠️ One thing NOT measured
packages/spec/json-schema/ has 0 tracked files (it is generated), so whether the marker 「rides z.toJSONSchema verbatim」 into the published JSON Schema could not be verified at head. That reading is owed by whoever takes this card, and it decides whether the docs generator is the only publisher or one of two.
Dedupe words
dimensionless marker docs generator · schema-section dimensionless · externalVocabulary renderer · check-duration-unit-keys marker · #14478 ruling B docs half
Refs
#18123 / PR #18486 (where the reader lands) · #18124 (step 3, the likely carrier) · #14478 ruling B (the sentence that makes the docs half part of the mechanism)
Generated by Claude Code
Filed by the
domain:specexecution seat, sessionsession_01KB5PFtxuy1x3dcR5gxudx6, 2026-09-16T16:2xZ, out of the isolated at-tier contract review of PR #18486 (card #18123), record5700807570, flag F3 — 「PM to file」. ⛔ Unlabelled beyondfindingand unassigned; grading and routing are triage's.The mechanism is half-built, and the ruling made both halves part of it
PR #18486 adds a
dimensionlessschema marker thatcheck-duration-unit-keysreads: it lets an author declare, in-schema, that a numeric key counts things rather than measuring time, so the gate stops asking it for a unit. The gate half works — the reader is implemented, it is literal-only (template literal accepted,as constrefused), and it is refusable on a name contradiction (recentFailuresMs→name-unit-contradicts-prose).The docs half does not exist. Measured at head:
packages/spec/scripts/lib/schema-section.tsexternalVocabulary:256, prints 「per<standard>」dimensionless⇒ a key marked
dimensionlesswould carry an in-schema declaration that the published reference page says nothing about.Why that is the ruling's own requirement, ⛔ not a nicety
#14478 ruling B, verbatim:
⇒ 「the docs generator publishes」 is in the ruled sentence. The sibling marker
externalVocabularysatisfies it; this one does not yet.⛔ This is NOT urgent, and the reason is the useful part
Population today: 0 keys marked. PR #18486 implements the marker as a reader only and applies it to zero keys — which the review independently ratified as the right call: with the name-shape list retired, the 17 candidate rows leave the census on their own, so marking them would add metadata to published schemas that no gate reads (the 「allowlist wearing a
.meta()」 the script's own header refuses), and would turn a correctskip-changesetinto apatchon@objectstack/specfor zero enforcement.⇒ the debt is owed before the FIRST key is marked, not before the reader lands. Nothing is wrong on the tree today; something would be wrong the moment someone marks a key.
Suggested shape — ⛔ no ruling implied
Add a
dimensionlessarm toschema-section.tsbeside theexternalVocabularyone (printing 「counts<what>」 the way its sibling prints 「per<standard>」), with the same pin shape the sibling has. ⭐ Or fold it into #18124, which is step 3 of this same ruling chain and is the card that will first want to mark keys — that is probably the cheaper route and this card should be closed as folded if so.packages/spec/json-schema/has 0 tracked files (it is generated), so whether the marker 「ridesz.toJSONSchemaverbatim」 into the published JSON Schema could not be verified at head. That reading is owed by whoever takes this card, and it decides whether the docs generator is the only publisher or one of two.Dedupe words
dimensionless marker docs generator·schema-section dimensionless·externalVocabulary renderer·check-duration-unit-keys marker·#14478 ruling B docs halfRefs
#18123 / PR #18486 (where the reader lands) · #18124 (step 3, the likely carrier) · #14478 ruling B (the sentence that makes the docs half part of the mechanism)
Generated by Claude Code