docs(changelog): correct the two published Seed.locale claims PR #17013 falsified, with erratum lines - #17896
Merged
Conversation
#17013 falsified `packages/spec/CHANGELOG.md` and `packages/metadata-protocol/CHANGELOG.md` carry the same compiled 17.4.0 entry for the `Seed.locale` axis. Two of its present-tense claims were true when written and false by the time the entry was published: "no first-party call site supplies one" and "the liveness ledger records `seed.locale` as `experimental`". Both are corrected to the post-#17013 truth, each followed by one erratum line naming PR #17013 and the correction date, per the maintainer ruling recorded on #17026 (director decision batch #119 item 1, 2026-09-12). The clause "on the default boot path the axis is inert" is falsified by the same landing and is corrected in the same sentence; the residual bound is stated rather than dropped — three request builders outside `AppPlugin` still pass no locale. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MkQhmuuJAVDjmeWNixwDDH
Contributor
📓 Docs Drift Check
What this run could not see
Coarse fallback — 137 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
os-bill
marked this pull request as ready for review
September 12, 2026 20:03
os-bill
deleted the
claude/issue-17026-seed-locale-changelog-erratum
branch
September 12, 2026 20:33
zhuangjianguo
pushed a commit
that referenced
this pull request
Sep 13, 2026
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.
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 #17026
Clause-②: no — the landing surface is prose inside two already-compiled
packages/*/CHANGELOG.mdentries plus erratum lines. No schema key, no accepted-set change, no new exported symbol, no new key on a published payload. Diff is markdown only; no path underpackages/**/src/**moves.The ruling this PR implements, verbatim
Director seat, decision batch #119 item 1, 2026-09-12T04:15Z. Maintainer's own word to the batch presented as
1A·2A·3A·4D·5A: 「同意」.And the boundary that makes A legitimate, also verbatim:
Step 2 first — the gate, run before any edit
Run on a local scratch branch off the same base, then discarded. Marker inserted into the already-compiled
## 17.4.0section of both files (into the very paragraph this PR edits), thenpnpm changeset version.git diff --stat= 2 files, 2 insertions / 2 deletions)pnpm changeset versionVERDICT changeset-version-exit 0— "All files have been updated"changeset version2451→5654; metadata-protocol128→898— pushed down, content intact## 17.5.0section is prepended at the top,packages/spec/package.jsonmoves17.4.0→17.5.0, and the 250 pending changesets drop to 0git reset --hard+git clean -fd;git diff HEADempty, 0 marker residue, 250 changesets back, scratch branch deleted⇒
changeset versionprepends and never rewrites an already-compiled section. The triage seat's own stated blind spot — "我没有验证过手工编辑 CHANGELOG 会不会被下一次发版覆盖或冲突 …… 但我没有测" — is now measured, and it does not block A.Step 1 — what changed, and why each corrected sentence is true of today's tree
Both files carry the same compiled
## 17.4.0entry for commitc1d8f98, byte-identical before and after this change. The single paragraph atpackages/spec/CHANGELOG.md:2451/packages/metadata-protocol/CHANGELOG.md:128becomes four: two corrected paragraphs, each followed by one erratum line naming PR #17013 and the correction date 2026-09-12.Claim 1 — "no first-party call site supplies one". Verified false on this tree, not taken from the card:
packages/runtime/src/app-plugin.ts:1717declaresprivate resolveSeedLocale(), readingi18n.defaultLocaleoff the bundle.SeedLoaderRequests that plugin builds: lines1349,1434,1791(...(seedLocale ? { locale: seedLocale } : {})).⇒ the corrected sentence says a first-party call site does supply
config.localeand names the producer and the three sites.Claim 2 — "the liveness ledger records
seed.localeasexperimental". Verified false:packages/spec/liveness/seed.json→props.locale.statusreadslive, withproducernamingpackages/runtime/src/app-plugin.ts#resolveSeedLocale.One adjacent clause corrected in the same stroke, named rather than smuggled. "on the default boot path the axis is inert" sits in the same paragraph and is falsified by the same landing. Leaving it would have left a known-false clause beside a corrected one, which defeats the ruling's own purpose; it is corrected and called out here.
The corrected text does not overclaim. The ledger row's
liveis explicitly bounded, and the correction carries that bound rather than dropping it. Measured on this tree: three request builders outsideAppPluginstill build aconfigwith nolocalekey —packages/runtime/src/domains/packages.ts:1776applyPublishedSeeds(package apply) —config: { defaultMode, multiPass, organizationId? }, zero occurrences oflocalein the whole file;packages/metadata-protocol/src/protocol.ts:17490applySeedBodies(draft publish) — same three keys;packages/cloud-connection/src/marketplace-install-local-plugin.ts:1510runInlineSeed(marketplace install) — same three keys.And
SeedLoaderService#warnOnUnresolvedLocaleScopestill exists (packages/metadata-protocol/src/seed-loader.ts:2592, called at:554), so the corrected paragraph keeps the sentence about the warning instead of deleting it.House convention followed rather than invented
The dispatch pointed at #16859 as the precedent.⚠️ Read to the end, #16859 did not in fact edit a published CHANGELOG — its own report states
packages/spec/CHANGELOG.md"was not opened for writing" and that correction 1 was "confirmed foreclosed and left alone". So it establishes no erratum wording.The convention that does exist was found by measurement — three entries already corrected in place in this repo:
packages/spec/CHANGELOG.md:5257— "As published, this sentence justified that by … that was false when written and is false now …" closing(Corrected after publication, #15058.)packages/spec/CHANGELOG.md:7401andpackages/lint/CHANGELOG.md:1214— same shape, closing(Corrected after publication, #15026.)⇒ this PR follows that: the published sentence is quoted in place and marked false, the correction follows in the same entry, and the last erratum line closes
(Corrected after publication, #17026.)naming the card, as those three name theirs.It is also exactly what the
packages/*/CHANGELOG.mdguardrail row now added to AGENTS.md by #16849 prescribes: "Factual error in a released entry → amend that entry in a dedicated docs-only PR, ⛔ never an erratum in a later entry and never a rider on code changes". This PR is docs-only, amends the entry itself, and adds nothing to a later entry.skip-changeset— measured, not assertedc744c0af332CHANGELOG.md.changeset/*.mdadded by this PRpackages/specfiles[]dist, json-schema, liveness, prompts, llms.txt, README.md, src/**/*.zod.ts, CHANGELOG.md, api-surface, spec-changes.jsonpackages/metadata-protocolfiles[]dist, README.md, CHANGELOG.mdCHANGELOG.mdis in both packages'files[], so the corrected bytes do ship inside the next tarball either package happens to publish. What does not move is any package version, any API, anydist/, any source file, or any generated artifact — and because this PR adds no changeset, it schedules no version bump of its own. That is the sense in which "no package publishes anything from this change" holds.Gates
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackagainst the real change set, then reconciled with--ran.✓ dispatch-gates --ran: 54 derived famil(ies) accounted for — 50 run, 4 NOT-MEASURED (4 DERIVED from a recorded exit 3).Every exit code captured before any pipe.check:dts-closure,check:dual-build-cjs-loads,check:lean-entry-closure,check:sourcemap-no-sources-content; all exit 3 = PREREQUISITE NOT MET, each refusing because there is nodist/in this worktree ("Runpnpm buildfirst. ⛔ This is NOT a pass: nothing was measured."). They read build artifacts only, which a markdown-only diff cannot move. Declared to CI, which builds first.pnpm lint(eslint . --no-inline-config) over the full population: exit 0 in 1m26s. No narrowing declared because none was needed. A targeted run over just these two files reportsFile ignored because no matching configuration was supplied.for both — markdown is outside eslint's configured population here.pnpm check:nul-bytesgreen, plus a manual control-character sweep of both touched files (grep -naPover the non-tab, non-newline C0 range plus DEL): no matches, with a printable lit control on the same files firing.CHANGELOG.mdas a file class is theaction-owner-key-single-sourcepair, whose scanner is fixed to.tssources.Acceptance notes — out of scope, noted, not filed
packages/core/src/plugin-contract.ts:69carries a code comment asserting the opposite posture for a different entry: "CHANGELOG.mdis NOT a live document and is deliberately not corrected … supersedes them BY VERSION rather than by rewriting them." That predates thepackages/*/CHANGELOG.mdguardrail row gate/AGENTS: the Documentation Guardrails table has no row forpackages/*/CHANGELOG.md— a released, consumer-shipped, generated file that is neither.changeset/input norcontent/docs/releases/#16849 added to AGENTS.md, which now prescribes amending the entry. ⛔ Not touched by this PR and not filed — it belongs to whoever next revisits that entry, and the governing text is already the AGENTS.md row.Not in play
⛔
content/docs/releases/is untouched by this PR and by all of the ruling's options. This ispackages/*/CHANGELOG.md, a different surface. Named here only so the red line is not read into a task it does not cover.Authored by the
domain:specexecution lane, sessionsession_01MkQhmuuJAVDjmeWNixwDDH, on branchclaude/issue-17026-seed-locale-changelog-erratum.Generated by Claude Code