docs(spec): name the second publisher a duration-unit marker changes - #19016
Merged
Merged
Conversation
The two exemption markers this gate reads ride z.toJSONSchema into packages/spec/json-schema/, which this package's files[] ships and which carries zero tracked files -- a gitignored build artifact, so no diff can show that it moved. The file already states that a marker reaches the published JSON schema; what it did not state is that the published artifact has no tracked representation, so the declaration a marking owes covers two publishers: the rendered reference page and the published JSON Schema. Comment-only; no declaration, schema or accept set is touched. Claude-Session: https://claude.ai/code/session_01JbZnqu8bt6YqfJsr9vaFb3 Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #18687
Clause-②: no
What this is
Option A of the card — a docblock paragraph on the two
.meta()exemption-marker readers inpackages/spec/scripts/check-duration-unit-keys.ts. Option B (a changeset-gate criterion) is deliberately NOT implemented here: the card itself says that one has to be measured first, so this PR carries the measurement instead of a rule. Option C is untouched.Comment-only. No declaration, schema, accept set or generator behaviour is touched — one file, 19 insertions, 1 deletion.
What the file already said, and what it did not
On the base tree the file already states, in assertion position, that a declared unit rides into the published JSON schema (
:183-184,:389-390), and that the marker ridesz.toJSONSchemaverbatim so the reference page prints it (:176-179). All three are correct today and are left untouched; the new paragraph cross-references the channel rather than restating it.What is new — and it is the whole of this card — is the half none of them states:
packages/spec/json-schema/is published content: it is on this package'sfiles[]. It also carries zero tracked files — it is a gitignored build artifact (.gitignore:63). Measured at2767af8e83: 0 tracked paths underpackages/spec/json-schema/, against 17 underpackages/spec/api-surface/by the samegit ls-tree.git diffor any diff-reading gate to see move.The paragraph is hung on
DIMENSIONLESS_META_KEY, whose docblock is already the one that speaks for both markers ("It sits besideEXTERNAL_VOCABULARY_META_KEYin this reader on purpose. Both are declarations ON THE SCHEMA…"), plus a one-line pointer to it fromEXTERNAL_VOCABULARY_META_KEYso a reader arriving at the first marker is routed to it.One correction to the card's framing, measured
The card says such a change produces "not one line of git diff". Measured on this tree that is too strong, so the note is written to the measured shape instead:
packages/speca marked*.zod.tsfile is itself onfiles[]— so on a spec key that line is a published file in its own right;content/docs/references/**is tracked (224 generated pages) and both markers render into it ((unit per …)/(dimensionless — counts …)), so that publisher moves visibly as well.The gap is the artifact, not the edit. Those two visible halves are precisely what makes the invisible third read as already accounted for — which is why the note is worth writing at all.
Direct evidence for the claim
After
pnpm --filter @objectstack/spec buildon this branch:packages/spec/json-schema/materialises as 1532 generated JSON files, andgit status --ignored=matchingreports the directory as ignored — zero tracked."externalVocabulary": "HTTP Cache-Control \max-age` (RFC 9111 §5.2.2.1)"` — LIT control, the channel really does publish.Changeset:
skip-changeset, measured rather than assumedThe card's subject is exactly "the reason for
skip-changesetstill reads correct", so this one is measured file by file rather than asserted.Diff at
79e564be3avs merge base2767af8e83— one file:packages/specfiles[]?packages/spec/scripts/check-duration-unit-keys.tsdist,json-schema,liveness,prompts,llms.txt,README.md,src/**/*.zod.ts,CHANGELOG.md,api-surface,api-surface-declarations,spec-changes.json); package is not privateSecond, empirical leg against a real build: the sentence this PR adds appears 0 times across
dist/,json-schema/,api-surface/,liveness/andprompts/; the positive control — a genuinely published string — appears 18 times indist/and 8 times injson-schema/. Zero files onfiles[]moved, soskip-changesetholds, and it holds by measurement, not by the habit this card is about.The measurement option B owes (readings only — no rule is landed)
Criterion measured: a diff whose ADDED lines introduce a
.meta({ MARKER })key position requires a non-skip-changeset. A false positive is a commit the criterion fires on that touches no file on afiles[].Window, stated: every non-merge commit reachable from
origin/mainat2767af8e83— 13175 commits; hits span 2026-01-26 … 2026-09-17. (Wider than the brief's "last N commits touchingpackages/spec", and repo-wide rather than spec-only, since the criterion is repo-wide.) Candidates come fromgit log --no-merges -G; a candidate is kept only when an added line matches, which is what separates a marking from a removal.Broad reading — any
.meta({:-Gfiles[]membershipsrc-reaches-disttarball reading.changeset/*.md7 of the 10 naive false positives have their added
.meta({under ascripts/path — the class the card predicts must exist. They include8ca7aafc45, which edits this gate's own self-test fixtures, and three commits editingscripts/pm/check-widening-tells.mjs.Narrow reading — an added line matching
.meta({ externalVocabularyor.meta({ dimensionless. Six commits fire in all of history:17965dfd7epackages/spec/scripts/lib/schema-section.tsand its test8ca7aafc45484484041a7e6337007fpackages/spec/CHANGELOG.mdquoting a marker, in the release commite9fcd6bbd4c049e74679src/So the narrow criterion's false-positive rate is 3 of 6 (50%) under the naive reading, or 4 of 6 if the release commit that marks nothing is counted; and both of its true positives already carried a changeset without any rule forcing them to. These are readings for the maintainer's decision on option B — no gate,
check-*.mjsor CI criterion is changed by this PR.Verification
check-duration-unit-keys --self-test— green before (unmodified file at2767af8e83) and after: 104 cases across 13 batteries both times, every battery at or above its pinned floor.pnpm --filter @objectstack/spec build:: exit 0 (under the shared verify lock, 127s).pnpm --filter @objectstack/spec check:docs:: exit 0 — "224 generated files in sync with packages/spec", so zero reference pages move.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackyields 53 commands; all 53 were run with exit codes captured before any pipe. 51 exit 0. Two exit 3 —check:dual-build-cjs-loadsandcheck:lean-entry-closure— which is the code those gates use for PREREQUISITE NOT MET: both read built output of the whole package farm, which a spec-only build does not produce. Recorded as NOT MEASURED, not as green; a comment inscripts/reaches nodist, and CI builds the farm.--ranreconciliation: 53 derived, 51 run, 2 NOT-MEASURED derived from the recorded exit 3, 0 unrun.pnpm lint(eslint . --no-inline-config) at79e564be3a: 6858 files in eslint's own surveyed population, 0 errors, 0 warnings, exit 0. Not narrowed — the whole union was run after the final commit.pnpm check:nul-bytes:: exit 0, plus a direct control-character scan of the changed file: no hits.Acceptance notes
packages/spec/json-schema.manifest/andpackages/spec/authorable-surface/(14 tracked files each) are projections ofjson-schema/that record def keys and authorable keys, not.meta()markers — measured: zero occurrences of either marker name in both directories. So neither tracked projection gives the published JSON Schema a diff-visible shadow. Observation only, not filed.Generated by Claude Code