Repository navigation
fix(spec): the Seed.locale liveness note names the six seed-load builders and the locale each supplies - #30666
Merged
objectstack-fleet[bot] merged 1 commit intoNov 5, 2026
Conversation
…ders and the locale each supplies The locale row's note in packages/spec/liveness/seed.json listed the marketplace install among the paths that pass no locale. Since the install paths started picking seed datasets by locale, runInlineSeed resolves one through resolveSeedLocaleForLoad, and so do the sample-data reseed, the restart heal and both per-organization replayers. The note now names all six SeedLoaderRequest builders by path#function with the locale source of each, keeps the 2026-09-10 ruling paragraph verbatim and adds a dated line that its bound now covers package apply and draft publish only, and restates why warnOnUnresolvedLocaleScope stays. status stays live; verifiedAt moves to 2026-11-05. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L6bhgVugtCCwBs98FeR27P
Contributor
📓 Docs Drift Check
What this run could not see
Coarse fallback — 170 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
Contributor
Author
|
domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P 维护者速读
席位核对ACCEPT · head
Generated by Claude Code |
objectstack-fleet
Bot
deleted the
claude/issue-30607-seed-locale-ledger-note
branch
November 5, 2026 22:38
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.
Requested by Sales · project thread
domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P
Fixes #30607
Clause-②: no
Metadata-protocol: none
维护者速读
packages/spec/liveness/seed.json里Seed.locale这一行的note重写为六个种子加载请求构建点各自是否带语言、语言从哪来;verifiedAt改为 2026-11-05;另加一个@objectstack/spec的 patch changeset。SeedSchema.locale的 describe(PR docs(spec): Seed.locale says which loads filter on it, and the ownership-queue contract says the registered service honours onFailedRead refuse #30604)相反。status仍是live,无代码、schema 或导出变化;回滚即 revert 本 PR。packages/spec/liveness/seed.json第 53 行 note 中 "THE SCOPE OF THISlive" 一段(六个构建点清单)与紧随 Seedlocalescope is silently inert on the three publish/install-time seed-load paths — package apply, draft publish and marketplace install pass noconfig.locale#17011 裁决原文之后新增的 "NARROWED 2026-11-05" 一句;②.changeset/30607-seed-locale-liveness-note.md。pnpm --filter @objectstack/spec check:liveness,预期退出码 0,末尾两行均为 ✓。What changes
packages/spec/liveness/seed.json, theprops.localerow:noteandverifiedAtonly (2 lines).status(live),evidence,producer,evidenceScope, every other row and the file's_noteparse identical before and after. Plus one@objectstack/specpatch changeset.The builders, counted from the code at
b8929f48. ProductionSeedLoaderRequestSchemaparses (tests excluded) give six request builders, the same number the old note gave. A control scan of everynew SeedLoaderService(finds three more constructions (marketplace-install-local-plugin.ts#sampleDataInScope,#handlePurge,#handleSampleDataCount). All three call onlybuildDependencyGraph, neverload(), so none of them is a request builder.path#function)packages/runtime/src/app-plugin.ts#start(inline boot seed)i18n.defaultLocale(resolveSeedLocale)packages/runtime/src/app-plugin.ts#registerHotReloadSeederpackages/runtime/src/app-plugin.ts#start(theseed-replayerit registers)resolveSeedLocaleForLoad: the org'slocalization.localewhen set (notsource: 'default'), then the founder'ssys_user.locale, then the app'si18n.defaultLocalepackages/cloud-connection/src/marketplace-install-local-plugin.ts#runInlineSeedapplySideEffects), restart heal (maybeHealSampleData), the plugin's own per-org replayer (buildSeedReplayer, used only where noAppPluginreplayer is registered)resolveSeedLocaleForLoad: the setting, then the installing / reseeding user or the founder, then the package'si18n.defaultLocale(the heal has no user; the plugin's replayer has no app-default rung)packages/runtime/src/domains/packages.ts#applyPublishedSeedspackages/metadata-protocol/src/protocol-publish-batch.ts#applySeedBodies(the bodyprotocol.ts#applySeedBodiesdelegates to)The note, FROM → TO, by sentence (every sentence not listed is unchanged byte for byte):
In the quotes below, PR #30346's closing line is spelled in words so that this body points a closing keyword only at this card. The note itself writes it in code.
SeedLoaderService.load()supplies a locale — three do not, they are named below, …"TO "… — two do not, they are named below, …"
config.localeat the runtime's seed-load call sites — the locale axis added by #16510 is inert on the default boot path until a producer supplies it #16595 wired the THREE inpackages/runtime/src/app-plugin.ts— the default boot path, which is what makes authoringlocalechange runtime behaviour and therefore what makes this rowlive."TO "FOUR supply a locale, each named by the function that builds its request:" followed by builders (1)–(4) above, each with its
path#functionand its locale source, then "Wireconfig.localeat the runtime's seed-load call sites — the locale axis added by #16510 is inert on the default boot path until a producer supplies it #16595 wired (1)–(3) inpackages/runtime/src/app-plugin.ts— the default boot path, which is what makes authoringlocalechange runtime behaviour and therefore what makes this rowlive— and PR feat(runtime,cloud-connection,organizations): the marketplace install, sample-data reseed, restart heal and per-organization replay pick seed datasets by the organization's language #30346 (the PR that closed card 30281 [spelled in code in the note], merged 2026-11-05) moved (3) ontoresolveSeedLocaleForLoad, keepingresolveSeedLocaleas its last rung, and wired (4). A builder whose source answers nothing sends nolocalekey, never an'en'guess."…/packages.ts#applyPublishedSeeds(package apply),…/protocol.ts#applySeedBodies(draft publish) and…/marketplace-install-local-plugin.ts#runInlineSeed(marketplace install)."TO "TWO are publish-time paths and still pass no locale: (5)
packages/runtime/src/domains/packages.ts#applyPublishedSeeds(package apply) and (6)packages/metadata-protocol/src/protocol-publish-batch.ts#applySeedBodies(draft publish — the bodypackages/metadata-protocol/src/protocol.ts#applySeedBodiesdelegates to; the request moved out ofprotocol.tswith it)."enveither, … and a locale has no ambient source, so it cannot be closed the same way."TO "Neither is handed the stack config, and neither passes
enveither, … and a locale has no ambient source insideload(), so it cannot be closed the same way: the four builders that supply one resolve it at the call site."localescope is silently inert on the three publish/install-time seed-load paths — package apply, draft publish and marketplace install pass noconfig.locale#17011 (director seat, one-class self-adjudication, option A 「不扩散」): … So this line is a DECISION, not a to-do." is unchanged: 653 characters, the same bytes, found once in the new note. ADDED right after it: "localescope is silently inert on the three publish/install-time seed-load paths — package apply, draft publish and marketplace install pass noconfig.locale#17011's install-path bound) ordered the install paths to pick datasets by locale, on HotCRM's request for zh-CN demo data rather than through the measurement the premise below names; PR feat(runtime,cloud-connection,organizations): the marketplace install, sample-data reseed, restart heal and per-organization replay pick seed datasets by the organization's language #30346 (the PR that closed card 30281 [spelled in code in the note], merged 2026-11-05) carried it out and moved the marketplace-install path, builder (4) above, across that bound. The ruling's bound now covers package apply and draft publish only — builders (5) and (6) — andSeedSchema.locale's describe (PR docs(spec): Seed.locale says which loads filter on it, and the ownership-queue contract says the registered service honours onFailedRead refuse #30604) and that docs page state it narrowed the same way."i18nblock — all of which …"TO "It is the live diagnostic for the two call sites above that pass none (package apply, draft publish), for any embedding host that builds its own request, for a stack that declares no
i18nblock (the boot seed and the dev hot-reload seeder have no other source), and, since 2026-11-05, for an install, reseed, heal or replay on which no rung ofresolveSeedLocaleForLoadanswers — all of which …". This reason was checked against the code:SeedLoaderService#warnOnUnresolvedLocaleScopereturns early only whenconfig.localeis set, andloadDatasetscalls it on every load.resolveSeedLocaleForLoadreturnsundefinedwhen no rung answers, and both of its callers then spread nolocalekey.SeedLoaderRequestSchemaparses: still SIX builders, the six named above, with the draft-publish request now built inprotocol-publish-batch.ts. A control scan of everynew SeedLoaderService(finds no seventh: its three other constructions, in the marketplace plugin's sample-data scope, purge and count reads (sampleDataInScope,handlePurge,handleSampleDataCount), call onlybuildDependencyGraphand neverload()."verifiedAt:2026-09-09→2026-11-05, theYYYY-MM-DDform the sibling rows use.Verification
All local readings are on head
0cd1455d86(branch pointb8929f48).pnpm --filter @objectstack/spec check:liveness: exit 0. Its two closing lines are both ✓: every property is classified and every repo-localevidence/producerpointer,path:NNNline andpath#symbolanchor resolves;state-counts/is current. Totals are unchanged: 1172 live · 1 experimental · 83 dead · 42 planned.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, over 2 paths (+14 / −2 lines): 55 commands, all run with exit codes captured before any pipe. 55 × exit 0.PREREQUISITE NOT MET, nodist/):check:dts-closure,check:dual-build-cjs-loads,check:lean-entry-closureandcheck:sourcemap-no-sources-content.pnpm build --concurrency=2, 118/118 tasks,VERDICT command-exit 0. The working tree was still clean afterwards..d.tspresent across 115 packages; 116requireentry points load; 2 lean conditions are measured from a real load; 1276 source maps embed no source text.dispatch-gates.mjs --ran: "✓ 55 derived famil(ies) accounted for — 55 run, 0 NOT-MEASURED (a DERIVED zero — all 55 recorded an exit code and none of them is 3)". 0 UNRUN.mainmoved during the run (47c457b23c, 9 commits). None of them touchesseed.jsonor any file the note cites. The builder recount at that tip is the same sixSeedLoaderRequestSchemaparses and the same nineSeedLoaderServiceconstructions.Derived families, second pass (55 × exit 0)
node scripts/check-adr-0087-registration.mjs --base origin/mainnode scripts/check-adr-0087-registration.mjs --self-testnode scripts/check-changeset-no-major.mjs --base origin/mainnode scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-testnode scripts/check-comment-mask-adoption.mjsnode scripts/check-comment-mask-adoption.mjs --self-testnode scripts/check-comment-mask-corpus.mjsnode scripts/check-dev-prereqs.mjs --self-testnode scripts/check-dts-emitted.mjs --self-testnode scripts/check-empty-changeset.mjs --base origin/mainnode scripts/check-empty-changeset.mjs --self-testnode scripts/check-issue-citations.mjsnode scripts/check-plugin-teardown-shape.mjsnode scripts/check-plugin-teardown-shape.mjs --self-testnode scripts/ci/assert-turbo-remote-cache.mjs --self-testnode scripts/ci/plan-test-core-shards.mjs --self-testnode scripts/ci/prune-turbo-cache.mjs --self-testnode scripts/docs-audit/check-affected-docs.mjsnode scripts/docs-audit/check-drift-comment.mjsnode scripts/pm/release-rehearsal-clone.mjs --self-testnode scripts/release-pending-publish.mjs --self-testpnpm --filter @objectstack/spec run check:empty-statepnpm --filter @objectstack/spec run check:livenesspnpm --filter @objectstack/spec run check:strictness-ledgerpnpm --filter @objectstack/spec run check:variant-docspnpm check:changeset-gate-self-testspnpm check:ci-filter-paritypnpm check:closed-ceremony-textpnpm check:cross-package-test-inputspnpm check:doc-authoringpnpm check:driver-memory-censuspnpm check:dts-closurepnpm check:dual-build-cjs-loadspnpm check:gitlink-declaredpnpm check:issue-citationspnpm check:keyed-text-boundspnpm check:lean-entry-closurepnpm check:merge-driverpnpm check:nul-bytespnpm check:org-identifierpnpm check:page-declaration-shapepnpm check:platform-checklistpnpm check:platform-object-tenancy-censuspnpm check:published-filespnpm check:refd-timer-probepnpm check:registry-log-declaredpnpm check:rest-log-spy-declaredpnpm check:slot-lookuppnpm check:sourcemap-no-sources-contentpnpm check:system-context-censuspnpm check:test-source-aliaspnpm check:tier-file-adoptionpnpm check:undeclared-dep-importspnpm check:watch-hint-literalAcceptance notes
note. It checks statuses,evidence/producerpointers (path:NNNlines,path#symbolanchors, key mentions) and theverifiedAtformat and age. No test pins the note's text:git grepfor its phrases outsideseed.jsonfinds only spec(seed): the Seed.locale docblock and .describe() say installing is locale-neutral, but the install paths now pick by the organization's locale #30347's changeset and the docs page, and they use their own wording. Everypath#symbolthe new note names was checked to exist in its file atb8929f48.skip-changeset.livenessis in@objectstack/spec'spackage.jsonfiles, soseed.jsonships in the tarball, and Check Changeset requires a changeset when the PR has noskip-changesetlabel. Apatchchangeset with both declaration lines, as fix(spec): repoint the query.searchFields liveness row at engine-find.ts#expandSearchOnAst #30368 and fix(spec): the page liveness ledger grades the app page record binding live, citing its console readers #30611 did for liveness-only edits.protocol-publish-batch.ts#applySeedBodies, andprotocol.ts#applySeedBodiesdelegates to it. The sample-data reseed and the restart heal live inmarketplace-install-local-plugin.ts(both go throughrunInlineSeed), not inapp-plugin.ts. There are two per-org replayers: AppPlugin's, and cloud-connection'sbuildSeedReplayer, which is registered only where no replayer exists yet.producerfield saysresolveSeedLocaleis threaded "into all THREESeedLoaderRequests this plugin builds: the inline boot seed, the per-org replayer registered for tenant provisioning, and the dev hot-reload seeder". Since PR feat(runtime,cloud-connection,organizations): the marketplace install, sample-data reseed, restart heal and per-organization replay pick seed datasets by the organization's language #30346 the per-org replayer passesresolveSeedLocaleForLoad's answer and usesresolveSeedLocaleonly as its last rung (packages/runtime/src/app-plugin.ts, thereplayerclosure instart)._notecitespackages/runtime/src/app-plugin.ts:832, :971andpackages/metadata-protocol/src/protocol.ts:6764for the seed-load calls. Atb8929f48those lines are a closing brace, a datasource-routing docblock line and a search-403 docblock line. The calls are now atapp-plugin.tsL1856 / L1951 / L2376, and the publish apply has moved toprotocol-publish-batch.ts. The gate boundspath:NNNonly inevidence/producer, so this has never been checked.resolveSeedLocaleturned 5 of 7 cases red, covering all three AppPlugin call sites) is the 2026-09-09 reading. The per-org replay now resolves throughresolveSeedLocaleForLoad, so a fresh ablation could read differently. No ablation was run here, because this PR changes no tested behaviour.🤖 Generated with Claude Code
https://claude.ai/code/session_01L6bhgVugtCCwBs98FeR27P