docs(spec): correct the 17.4.0 duration-keys erratum falsified by #17783/#17785 - #18077
Conversation
The published packages/spec/CHANGELOG.md 17.4.0 entry, under "Keys deliberately left alone", said the burn-rate `window` and the OpenTelemetry exporter `timeout` name no unit anywhere in their prose and are outside check:duration-unit-keys's population, with pin tests holding the bare spellings. All three claims are false now: #17783 renamed the burn-rate window to `durationSeconds` and #17785 renamed the exporter timeout to `timeoutMs` (with its `exportTimeout` sibling to `exportTimeoutMs`), both tombstoned with `retiredKey()`, and the pin tests that held the bare names were rewritten into rename-refusal pins. This corrects the sentence to the post-#17783/#17785 truth and appends one erratum line, matching the ef47459 (#17896) precedent's shape. Clause-②: no skip-changeset: no package publishes anything from this change — the edit is prose inside an already-compiled CHANGELOG.md section plus an erratum line.
The erratum line was written before PR #18077 existed; replace the placeholder with its real number now that it does.
📓 Docs Drift Check
What this run could not see
Coarse fallback — 136 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
ACCEPT — PR #18077Epic PM for the #15939 subtree,
Why no in-seat clause-② review is owed here — a reading, ⛔ not an omissionThe path leg does not fire: The survival gate — run, controlled, and ⛔ not inheritedThe dispatch made this mandatory and forbade taking #17896's result. The round ran it on a scratch branch off
Verified by me against the tree, not taken from the report
Two notes for the record
Four gate families read exit 3 NextTurning ready and enqueuing. The merge queue is the only recognised landing path. epic PM for #15939 · Generated by Claude Code |
Fixes #18076
Clause-②: no — the landing surface is prose inside one already-compiled
packages/spec/CHANGELOG.mdentry plus an erratum line. No schema key, no accepted-set change, no new exported symbol, no new key on a published payload, and no path underpackages/**/src/**moves.skip-changeset: no package publishes anything from this change.The ruling this PR implements
Director seat, decision batch #119 item 1, 2026-09-12T04:15Z, maintainer's own word
1A·2A·3A·4D·5A: 「同意」, implemented once already byef47459474(#17896). This card applies the same remedy shape to a second falsified instance:Step 2 first — the survival gate, run before any edit
On a local scratch branch off
484484041a(scratch/issue-18076-survival-gate), discarded afterward:## 17.4.0"Keys deliberately left alone" paragraphSURVIVALGATEMARKER18076XQ7changeset versionZZQV18076NOPE, invented at read time) beforepnpm changeset versionchangeset version## 17.5.0section is prepended,packages/spec/package.jsonmoves17.4.0→17.5.0, and 452 of 453 pending.changeset/*.mdfiles are consumedgit checkout -fback to the real branch;diff <(git show origin/main:packages/spec/CHANGELOG.md) packages/spec/CHANGELOG.md→ identical; scratch branch deleted⇒
changeset versionprepends a new section and never rewrites an already-compiled one. Re-measured on this tree rather than inherited fromef47459474's reading, per the ruling's explicit instruction.What changed, and why each corrected claim is true of today's tree
packages/spec/CHANGELOG.md, inside the already-released## 17.4.0entry (commite9fcd6b, "Keys deliberately left alone"), said:All three claims are false, verified on this tree independently of the card:
packages/spec/src/system/metrics.zod.ts:368-375(SLO_BURN_RATE_WINDOW_RETIRED):ServiceLevelObjective.errorBudget.burnRateWindows[].windowwas renamed todurationSecondsin@objectstack/spec17 (spec: 5 duration key(s) insystem/metrics.zod.tsname their unit only in JSDoc — #15939 Ruling A remediation (5 of the 21-row delta) #17783), tombstoned withretiredKey()atmetrics.zod.ts:402/:498. The pin that held the bare spelling is nowmetrics.test.ts:612,it('REFUSES the burn-rate \window` with a rename naming `durationSeconds`', …)`.packages/spec/src/system/tracing.zod.ts:546-550:OpenTelemetryCompatibility.exporter.timeoutwas renamed totimeoutMs(spec: 4 duration key(s) insystem/tracing.zod.tsname their unit only in JSDoc — #15939 Ruling A remediation (4 of the 21-row delta) #17785), tombstoned withretiredKey(); itsbatch.exportTimeoutsibling moved toexportTimeoutMsthe same way (:586/:601). The pin is nowtracing.test.ts:594-611,it.each([['exporter.timeout', 'timeoutMs'], …])('REFUSES the retired \%s` with the rename in the message', …)`.The corrected paragraph quotes the falsified sentence, states the truth with both PR numbers and both new key names, and closes with one erratum line naming this PR and the correction date, matching
ef47459474's shape.The paragraph's other four claims were checked and are still true (not touched, per the ruling's scope boundary):
FailoverConfig.dns.ttl— still bare,disaster-recovery.zod.ts:148, under the sameexternalVocabularyexemption comment.CacheAvalanchePrevention.lockout.lockTimeoutMs— still milliseconds,cache.zod.ts:162.MetricExportConfig.batch.size— still a bare record count,metrics.zod.ts:702.QueueConfig.rateLimit.max— still a bare task count,worker.zod.ts:~276.The erratum line's PR number — how it went in, and the fix for a review finding
#18077(the PR number for this correction) is not knowable before the PR exists, so the first pushed commit (bfc744c98c) carried a placeholder,#PRPLACEHOLDER18076, in the erratum line's parenthetical, meaning to fill it in once the PR was open. That fill-in commit (ac68eff364) was made locally but not pushed before the round's first status check ran againstbfc744c98c, so a reviewer correctly caught a shipped placeholder. It is now pushed; HEAD isac68eff364, verified directly against the remote rather than assumed:Placeholder sweep of the whole diff, with controls (
git diff origin/main..HEAD -- packages/spec/CHANGELOG.md, 35 lines):PLACEHOLDER|\bTODO\b|\bTBD\b|\bXXX\b|\bFIXME\b|<[A-Z_]+>|\{\{.*\}\}(case-insensitive) over the diff: 0 matches.PRPLACEHOLDER99999line to the same scanned text and re-ran the identical pattern — 1 match, confirming the regex class actually fires and the 0 above is a real zero, not a typo'd pattern reading a false clean.18077appears exactly once in the diff — the one erratum reference, present and correctly substituted.Verification
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 54 local gate families for this diff (all matched via broadpackages/**/packages/specglobs — this path carries no gate of its own). Ran all 54 twice — once onbfc744c98c, again on the finalac68eff364after the placeholder fix landed — both times reconciled with--ranagainst the recorded exit codes, same result both runs:pnpm check:nul-bytes,check:release-notes,check:release-page-status,check:release-section-coverage[--strict],check:changeset-gate-self-tests,check:doc-authoring,check:page-declaration-shape,check:published-files,check:slot-lookup,check:test-source-alias,check:type-source-resolution, and 39 more — full list in this branch's derivation).PREREQUISITE NOT MET), declared rather than swallowed:check:dts-closure,check:dual-build-cjs-loads,check:lean-entry-closure,check:sourcemap-no-sources-content— each refuses on a missingdist/in this fresh worktree ("Runpnpm buildfirst … this is NOT a pass: nothing was measured"). These are whole-repo build-completeness gates unrelated to this diff's content (no code, no export, nodistpath moves); running a ~80-packagepnpm buildto satisfy them is disproportionate to a one-line CHANGELOG correction, and CI builds fresh before running them.check:changeset-gate-self-tests(the gate's own self-test) is green.skip-changesetnow shows as an applied label on this PR (not applied by this session — labels were left untouched per this card's operating constraints).pnpm check:nul-bytesand a directgrep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'both clean on the diff.node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD: clean on both commits — no card-relation trailer, model-free trailer pair.No
packages/spectest/typecheck run beyond the above: this diff touches no code, no export and no public surface byte, so per this repo's verification-scope convention there is nothing forpnpm --filter @objectstack/spec test/typecheckto newly exercise.🤖 Generated with Claude Code
https://claude.ai/code/session_015c5G6TmpMKgnusmTpD7Ntt
Generated by Claude Code