Blocked-by: #16510
Why this exists
#16510 / PR #16592 adds a locale filter axis to seed datasets and the loader that enforces it. The
consumer half is complete; no first-party call site supplies config.locale yet, so on the
default boot path the axis is inert — a locale-scoped dataset loads everywhere, exactly as if it
carried no scope.
The dev that landed the consumer half named this gap in its own PR body and asked the PM to file it
rather than widening its card past the declared file surface. That is the right call: packages/spec
and packages/metadata-protocol are one lane's surface, packages/runtime is another's.
Call sites
Confirmed by grep at tree c383352:
packages/runtime/src/app-plugin.ts:1249
packages/runtime/src/app-plugin.ts:1326
packages/runtime/src/app-plugin.ts:1642
all three await seedLoader.load(request).
PR #16592's body additionally names a draft-publish path in protocol.ts. I could not confirm that
one in my checkout — the grep over packages/metadata-protocol/src/protocol.ts returned nothing at
c383352. Whoever picks this up should re-derive the full call-site list against current main
rather than trusting either reading; the three above are the ones that stand up today.
What to do
- Resolve the locale from the stack's configured locale (
i18n.defaultLocale is the obvious source;
confirm against how env is resolved in resolveEnvConfig, which is the shape this mirrors) and
pass it as SeedLoaderConfig.locale at each call site.
- Flip the liveness ledger row
seed.locale in packages/spec/liveness/seed.json from
experimental to live, with a producer pointer to the wiring. That flip is the point of the
card — the row is experimental today specifically because publishing live on a
correct-but-insufficient consumer pointer is the falsehood the producer field exists to prevent.
warnOnUnresolvedLocaleScope in the loader exists to signpost the unwired state. Check whether it
should stay as a guard for embedding hosts that still pass no locale, or go once the default path
supplies one — that is a judgement call for the implementer, not a decided answer here.
Not in scope
Reconciling rows already written under a different locale. Switching an app's active locale on a
non-empty database leaves the other locale's rows resident, because every seed is upsert and the
loader only writes. That is a real gap, it is named in #16510's body as a cost the consuming app
currently documents in its README, and it is not filed yet — it needs a decision on whether the
loader should own that reconciliation at all before it becomes a card.
Origin
Follow-up requested by the dev on #16510 (PR #16592). Filed by the PM seat that dispatched it.
Blocked-by: #16510
Why this exists
#16510 / PR #16592 adds a
localefilter axis to seed datasets and the loader that enforces it. Theconsumer half is complete; no first-party call site supplies
config.localeyet, so on thedefault boot path the axis is inert — a
locale-scoped dataset loads everywhere, exactly as if itcarried no scope.
The dev that landed the consumer half named this gap in its own PR body and asked the PM to file it
rather than widening its card past the declared file surface. That is the right call:
packages/specand
packages/metadata-protocolare one lane's surface,packages/runtimeis another's.Call sites
Confirmed by grep at tree
c383352:packages/runtime/src/app-plugin.ts:1249packages/runtime/src/app-plugin.ts:1326packages/runtime/src/app-plugin.ts:1642all three
await seedLoader.load(request).PR #16592's body additionally names a draft-publish path in
protocol.ts. I could not confirm thatone in my checkout — the grep over
packages/metadata-protocol/src/protocol.tsreturned nothing atc383352. Whoever picks this up should re-derive the full call-site list against currentmainrather than trusting either reading; the three above are the ones that stand up today.
What to do
i18n.defaultLocaleis the obvious source;confirm against how
envis resolved inresolveEnvConfig, which is the shape this mirrors) andpass it as
SeedLoaderConfig.localeat each call site.seed.localeinpackages/spec/liveness/seed.jsonfromexperimentaltolive, with aproducerpointer to the wiring. That flip is the point of thecard — the row is
experimentaltoday specifically because publishingliveon acorrect-but-insufficient consumer pointer is the falsehood the
producerfield exists to prevent.warnOnUnresolvedLocaleScopein the loader exists to signpost the unwired state. Check whether itshould stay as a guard for embedding hosts that still pass no locale, or go once the default path
supplies one — that is a judgement call for the implementer, not a decided answer here.
Not in scope
Reconciling rows already written under a different locale. Switching an app's active locale on a
non-empty database leaves the other locale's rows resident, because every seed is
upsertand theloader only writes. That is a real gap, it is named in #16510's body as a cost the consuming app
currently documents in its README, and it is not filed yet — it needs a decision on whether the
loader should own that reconciliation at all before it becomes a card.
Origin
Follow-up requested by the dev on #16510 (PR #16592). Filed by the PM seat that dispatched it.