Skip to content

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

Merged
objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/project-thread-cydyoy
Nov 5, 2026
Merged

objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/project-thread-cydyoy

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Bill · project thread

domain:server#4 · os-bill · session_01Utp6CZMkHvuDeVYgTD73qF

维护者速读

  • 改了什么: 市场安装、重灌示例数据、重启自愈、新组织的按组织回放,四条路径都按"这个组织说什么语言"挑 Seed.locale 数据集:先看组织的「设置 → 本地化 → 默认语言」(有人设过才算,内置的 en-US 默认值不算),再看安装人/创建人的个人语言,最后看应用声明的 i18n.defaultLocale。
  • 为什么改: HotCRM 想让中国客户装上就是中文示例数据。原来安装路径不传语种,中文组织拿到英文产品目录,外加一页中文那份被唯一键拒掉的告警;一台服务器上新建的每个组织都拿启动时那一个语种。Irene 裁定 A(2026-11-05):安装路径按语种挑。
  • 风险与回滚: 只影响带 locale 的数据集;没有 locale 的照旧全装,整包都没有 locale 时连设置和用户都不读。读设置或用户时出错就不灌,按原路径报出(安装摘要、重灌 400、回放告警),不会拿别的语种顶上。启动种子、热重载、包应用、草稿发布不变。回滚即撤 PR。
  • 先看: packages/runtime/src/seed-locale.ts(三级取值与"默认值不算"那一句);packages/runtime/src/app-plugin.ts 的 replayer(改成每次回放按组织取);packages/plugins/organizations/src/organizations-plugin.ts 中间件 B 把创建人传给 replayer 的那几行。
  • 两分钟验证: pnpm --filter @objectstack/runtime exec vitest run --maxWorkers=2 src/app-plugin.seed-locale-producer.test.ts,预期 22 个测试全绿,其中"两个组织不同语种在同一进程拿到不同数据集"和"建组织时按创建人语言"两条。
  • 需要你做的: 无,席位落地。packages/spec 里 Seed.locale 的说明仍写"安装不按语种挑",归 spec 车道另改(follow-up owed)。

Fixes #30281

Clause-②: yes (widening) — @objectstack/runtime exports the seed-locale producer (resolveSeedLocaleForLoad, appDefaultSeedLocale, seedsDeclareLocale, describeSeedLocale and three types), and the seed-replayer service callable takes an optional second argument (organizationId, { userId }); a one-argument caller works as before.
Metadata-protocol: semantic — an existing Seed.locale key now selects datasets on the marketplace install, the sample-data reseed, the restart heal and the per-organization replay, where it loaded every dataset and warned.
Skills-docs: updated here — content/docs/data-modeling/seed-data.mdx (the two Locale Scoping callouts: where the loading locale comes from on the install paths, and "installing is locale-neutral" narrowed to apply and publish); skills/** teaches no Seed.locale (git grep -n locale skills names no seed or dataset line), so nothing there turns false. follow-up owed — packages/spec/src/data/seed.zod.ts locale docblock and .describe() (install paths now pick by the organization's locale, ruling A 2026-11-05), whose .describe() regenerates content/docs/references/data/seed.mdx.

What changes

The producer (@objectstack/runtime, new seed-locale.ts). resolveSeedLocaleForLoad(host, { seeds, organizationId, userId, appDefaultLocale }) answers the locale one seed load filters Seed.locale on. First answer wins:

  1. localization.locale read from the settings service for organizationId ({ tenantId }), so the service's own cascade decides (env override, the organization's row, the global row). ⛔ A value whose source is 'default' does not count. The manifest declares default: 'en-US' (service-settings/src/manifests/localization.manifest.ts), so taken literally the card's "effective value (cascade platform → global → tenant), or else the user's locale, or else i18n.defaultLocale" always stops at the first rung and the other two are unreachable. The repo already reads it this way in two places: the auth email language takes localization.locale "only when it was EXPLICITLY set; a manifest default leaves the app's build-time i18n.defaultLocale standing" (plugin-auth/src/auth-plugin.ts, applyLocalizationLocale), and the new-organization currency writes only while the key "still resolves from the default (source: 'default')" (plugin-auth/src/organization-default-currency.ts). The seat accepted this reading before code.
  2. sys_user.locale of userId (system-context read, SystemObjectName.USER).
  3. appDefaultLocale.

Nothing answers ⇒ undefined, and the request carries no locale key (the loader's unrestricted spelling, with its existing warning). When seeds is given and no dataset declares locale, rungs 1 and 2 are not read at all. No settings service ⇒ rung 1 is skipped. A settings or user read that throws is thrown on: the caller's seed reports it and writes nothing. Also exported: appDefaultSeedLocale(body) (top-level i18n.defaultLocale, then a nested manifest; a legacy i18n array declares none), seedsDeclareLocale, describeSeedLocale (log line), and the three types.

Per-organization replay (AppPlugin, packages/runtime/src/app-plugin.ts). The replayer used to capture resolveSeedLocale() (the boot bundle's i18n.defaultLocale) once at boot. It now resolves at replay time per organization, with the boot default as rung 3, and takes (organizationId, options?: { userId }). One info line names the locale and its rung. The boot inline seed and the dev hot-reload seeder still use resolveSeedLocale() alone (outside the card's ask; see Acceptance notes).

The founder (@objectstack/organizations, Middleware B). On a sys_organization insert the middleware passes opCtx.context.attributedUserId (else userId) to the replayer as { userId }, and keeps the one-argument call when the insert names no person. better-auth's create runs through the adapter as system with the signed-in creator as attributedUserId (plugin-auth/src/objectql-adapter.ts, withSystemContext).

Item 3, new-organization founding: lands on (a), with (c) behind it, by construction. At the insert the organization has no tenant row yet (plugin-auth writes its currency and timezone in afterCreateOrganization, after the insert, and writes no locale at all), so rung 1 answers only an env or global value. Rung 2 is then the founder's sys_user.locale, which is option (a); no founder (the boot's default organization, a cloud system insert) falls to the app's default, which is option (c). Option (b) would need a deferral mechanism the cascade does not have. No needs_decision; both paths are pinned (Tests).

Install paths (@objectstack/cloud-connection, runInlineSeed and its three call sites). runInlineSeed(ctx, datasets, organizationId?, localeFrom = {}) resolves through the runtime producer and spreads locale into the loader config. Measured call sites on origin/main 4be9734 (the dispatch's mapping was off by one role each; the seat confirmed):

  • applySideEffects step 3 (reached by the install, handleInstall, and by the reseed, handleReseed): the active organization, the admitted user (opts.userId, new, passed from both handlers' admission.userId), and the package body for its i18n.defaultLocale.
  • The rehydrate heal (maybeHealSampleData, single-tenant only): no organization, no user, the converted body.
  • This plugin's own seed-replayer (registered only when the host has none): the organization and the founder, ⛔ no app default, because it replays the union of every installed package and no one package's default speaks for it.

The constructor and the rehydrate section (seat 3's #30217) are untouched.

Docs. content/docs/data-modeling/seed-data.mdx, Locale Scoping: the info callout gains the install-path rungs; the warn callout's "publishing and installing are locale-neutral, by decision" is narrowed to apply and publish, citing this ruling as reversing the install half of #17011.

Changeset. 30281-seed-locale-per-organization.md: @objectstack/runtime minor, @objectstack/cloud-connection minor, @objectstack/organizations patch (Metadata-protocol: semantic ⇒ at least one moved package minor), both declaration lines.

Tests

  • packages/runtime/src/app-plugin.seed-locale-producer.test.ts (the Seed.locale producer harness), two new top-level describes, rows reaching the engine as the assertion through the real SeedLoaderService:
    • per-org replay (Seed.locale: marketplace install, reseed sample data and per-org replay should select datasets by the installing organization's locale #30281), 12 cases: two organizations with different settings get different datasets in one process (pin 2) and each settings read names its own tenantId; a global value counts; at founding the founder's language decides (option (a)); the manifest's en-US default never outranks the founder; the organization's setting outranks the founder; no founder and no setting ⇒ the app's default (option (c)); a founder with a blank language falls through; no settings service still honours the founder; nothing answers ⇒ every dataset loads and the loader warns; an unscoped dataset loads for both organizations (pin 4); no locale-scoped dataset ⇒ neither the setting nor sys_user is read; a settings read that throws rejects the replay and writes no row.
    • appDefaultSeedLocale, 3 cases (top level, nested manifest, legacy array, blank).
  • packages/cloud-connection/src/marketplace-install-local-seed-replayer.test.ts (the install-path seeding harness), new top-level describe, 7 cases with recording stand-ins for the producer (its rungs are pinned in runtime): the install asks for the active organization, the admitted user and the package's i18n.defaultLocale, and the loader receives the answer (pin 1); the reseed asks again and loads the answer as it stands now; the rehydrate heal asks with no organization and no user; the replayer asks per organization (two organizations, two locales, pin 2) and passes the founder with no app default; no answer ⇒ no locale key; a failing read seeds nothing and the install summary names the error.
  • packages/plugins/organizations/src/organizations-plugin.test.ts, new top-level describe, 2 cases: Middleware B hands the replayer { userId } from the insert's attributedUserId, and keeps the one-argument call for a system insert with no person.
  • Six sibling cloud-connection suites whose @objectstack/runtime mock carries the loader alone gained the three producer exports answering "no locale" (their subject is not the locale; vitest throws on a mocked module's missing export, which turned their seeds into seed-error skips).
  • Ablations, one per resolution point (scripts/ablation-replace.mjs, anchor hit 1 → 0 on disk, restore proven by an empty git diff HEAD on the file). All subjects are imported by relative path from src/, so no dist/ leg applies.
# Mutation Result
A1 delete the settings rung's return runtime 3 failed / 19 passed (two organizations; global; setting outranks founder)
A2 let source: 'default' count runtime 5 failed / 17 passed (founder (a), default-not-a-choice, app default (c), blank founder, …)
A3 delete the user rung's return runtime 3 failed / 19 passed (founder (a), default-not-a-choice, no settings service)
A4 app-default rung answers undefined runtime 3 failed / 19 passed (the pre-existing replayer pin, (c), blank founder)
A5 delete the "no scoped dataset ⇒ no read" short-circuit runtime 1 failed / 21 passed
A6 AppPlugin replayer resolves with organizationId: undefined runtime 3 failed / 19 passed
A7 Middleware B drops the founder organizations 1 failed / 19 passed
A8 install/reseed pass userId: undefined cloud-connection 2 failed / 14 passed
A9 heal drops the package body cloud-connection 1 failed / 15 passed
A10 cloud-connection replayer drops the founder cloud-connection 1 failed / 15 passed
A11 runInlineSeed drops locale from the loader config cloud-connection 4 failed / 12 passed

Acceptance notes

  • "Set" means source !== 'default'. See What changes, rung 1. A deployment that wants every organization seeded en-US regardless of its founders sets the global value (or OS_LOCALIZATION_LOCALE), which counts.
  • Tags match exactly. The loader matches Seed.locale case-insensitively and otherwise exactly (['zh'] does not match zh-CN). A user whose stored sys_user.locale is a bare zh does not select a zh-CN dataset; the Localization setting offers only the four region-qualified tags.
  • Founder = the insert's attributed user. An organization created server-side on someone else's behalf (a platform administrator's session creating it for a named owner) is attributed to the session's user, so the replay uses that person's language. The owner can reseed under their own Localization setting afterwards.
  • A fresh organization on a marketplace-only runtime. This plugin's replayer has no app-default rung (the union has no single default), so an organization with no setting and no founder language loads every dataset with the loader's warning, as before this change. An AppPlugin-hosted runtime keeps its boot app's default as rung 3.
  • Unchanged paths, by the card's scope. The boot inline seed and the dev hot-reload seeder still filter on the app's i18n.defaultLocale; package apply (service-package) and draft publish still pass no locale. The ruling text names the install paths; apply and publish are left alone as the dispatch says.
  • Spec red line. packages/spec/src/data/seed.zod.ts's locale docblock and .describe() still say the install paths do not filter by locale (and the generated content/docs/references/data/seed.mdx repeats it). Not edited here (follow-up owed, Skills-docs line); the hand-written docs page is corrected in this PR. The code ships honestly against it: the behaviour is the ruling's, and the stale sentence is a description to correct, not a contract a caller relies on.
  • Shared file with seat 3. marketplace-install-local-plugin.ts edits are limited to runInlineSeed, its three call sites, applySideEffects' options type and the two handler calls that feed it. Whoever merges second merges origin/main first.
  • Assignee and reviewers: none set. The dispatch forbids GitHub MCP writes and asks for no review request, so the session's usual reviewer step is left to the seat.

Verification

Head 6d3a814a4, the merge of origin/main c1240a38a into the branch. The merge touches none of this PR's 16 files.

  • At head, under the verify lock: app-plugin.seed-locale-producer.test.ts 22 passed, marketplace-install-local-seed-replayer.test.ts 16 passed, organizations-plugin.test.ts 20 passed.
  • Full package suites on c6795fe0a, the last code commit (these packages' files are byte-identical at head; a8fb28cd5 adds the docs page and the changeset): @objectstack/runtime 541 files, 8635 passed, 19 skipped; @objectstack/cloud-connection 70 files, 853 passed; @objectstack/organizations 18 files, 250 passed. Typecheck of the same three packages: exit 0.
  • At head: pnpm install --frozen-lockfile exit 0; turbo run build --filter='!@objectstack/docs' 119/119.
  • node scripts/pm/dispatch-gates.mjs --commands derived 95 families. Each ran at head with its exit recorded: 95 of 95 exit 0. --ran reconciliation (it re-derives on the head tree): 95 derived, 95 run, 0 NOT-MEASURED, 0 UNRUN, exit 0.
  • pnpm lint exit 0.
  • Ablations: the table under Tests, each red then restored.

Not measured: a live boot that installs a marketplace package into a zh-CN organization over HTTP. The install, reseed, heal and replay seams are pinned at the plugin with the producer stood in, and the producer's three rungs are pinned in runtime against the real SeedLoaderService, so the join between the two is covered by types and the shared export, not by one end-to-end run.

pnpm --filter @objectstack/runtime exec vitest run --maxWorkers=2 src/app-plugin.seed-locale-producer.test.ts
pnpm --filter @objectstack/cloud-connection exec vitest run --maxWorkers=2 src/marketplace-install-local-seed-replayer.test.ts
pnpm --filter @objectstack/organizations exec vitest run --maxWorkers=2 src/organizations-plugin.test.ts

Expect 22, 16 and 20 passed.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Utp6CafJkuNKWHNo7WLtiP

… on install, reseed, heal and replay (WIP)

The marketplace install, the sample-data reseed, the rehydrate heal and the
per-org seed replay now pass a Seed.locale filter: the organization's
Localization setting when one is set, else the installing or founding
user's language, else the app's declared i18n.defaultLocale.

Claude-Session: https://claude.ai/code/session_01Utp6CafJkuNKWHNo7WLtiP
Co-authored-by: Claude <noreply@anthropic.com>
…g suites stub it

Claude-Session: https://claude.ai/code/session_01Utp6CafJkuNKWHNo7WLtiP
Co-authored-by: Claude <noreply@anthropic.com>
…tion's language; changeset

Claude-Session: https://claude.ai/code/session_01Utp6CafJkuNKWHNo7WLtiP
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/l documentation Improvements or additions to documentation tests tooling labels Nov 5, 2026
@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/cloud-connection, @objectstack/organizations, @objectstack/runtime, touching 32 documentable anchor(s). ⚠️ 1 changed file(s) yielded no anchor (packages/runtime/src/index.ts), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

43 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: node scripts/docs-audit/affected-docs.mjs --json cfb602c4595795c696dd07763abca3104dd4cf80.

⛔ 10 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails.

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/runtime/src/index.ts) — pages documenting those are invisible to this run
  • 4 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 61 of 219 client-bound route-ledger rows — the other 158 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 158: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 103 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 36 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json cfb602c4595795c696dd07763abca3104dd4cf80 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 5f46ef6c606f6bdf41f7c947c681d0729df68636 — the merge of head 6d3a814a442b0c3a9d101a3a6e67d5b75e89ff2b into base cfb602c4595795c696dd07763abca3104dd4cf80, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 5f46ef6c606f6bdf41f7c947c681d0729df68636 && git checkout 5f46ef6c606f6bdf41f7c947c681d0729df68636
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin cfb602c4595795c696dd07763abca3104dd4cf80 6d3a814a442b0c3a9d101a3a6e67d5b75e89ff2b && git checkout -B drift-repro cfb602c4595795c696dd07763abca3104dd4cf80 && git merge --no-ff 6d3a814a442b0c3a9d101a3a6e67d5b75e89ff2b

node scripts/docs-audit/affected-docs.mjs --json cfb602c4595795c696dd07763abca3104dd4cf80

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs cfb602c4595795c696dd07763abca3104dd4cf80 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#4 · os-bill · session_01Utp6CZMkHvuDeVYgTD73qF

席位意见:ACCEPT(#30281)。市场安装、重灌示例数据、重启自愈和按组织回放,四条路径都按组织的语言挑 Seed.locale 数据集:先看组织设过的「默认语言」,再看安装人或创建人的个人语言,最后看应用的 i18n.defaultLocale。读设置或用户出错就不灌,不拿别的语种顶上。spec 里 Seed.locale 的说明另立卡 #30347。

席位核对

Head-sha: 6d3a814a442b0c3a9d101a3a6e67d5b75e89ff2b · read 2026-11-05T07:17Z

Item Reading
Shape Draft → main, author objectstack-fleet[bot] (relay pr_create); attribution block, then signature line, Fixes #30281, Clause-② / Metadata-protocol / Skills-docs at line start. 16 files, +819/−36, under packages/runtime, packages/cloud-connection, packages/plugins/organizations, content/docs/data-modeling/seed-data.mdx and .changeset/. ⛔ packages/spec/** untouched.
Ruling Maintainer ruling option A (2026-11-05, quoted in the card body): the install paths pick by locale. Triage audit 6650042287. Item 3 (founding a new organization) settled by measurement, not by a decision: at the insert the organization has no tenant row yet, so rung 2 (the founder's sys_user.locale) is option (a), and no founder falls to the app default, option (c). Both paths are pinned.
Gates (check-runs on this head) 38 success, 12 skipped, 0 failure, 0 pending. Dev's report 6651782468: 95 derived gates exit 0, --ran 95/95, 0 NOT MEASURED; pnpm lint 0; full build 119/119; runtime 8635, cloud-connection 853, organizations 250 pass; 11 ablations each red, restored.
Seat review (declaration face, TIER_DEFAULT) Read at this head. seed-locale.ts: rung 1 reads localization.locale through the settings service for the organization, and a value whose source is 'default' does not count. Two places in the tree already read it this way: applyLocalizationLocale in plugin-auth, and the new-organization currency. The seat accepted that reading before code. Rung 2 is a system-context sys_user read with limit: 1; rung 3 is the app's i18n.defaultLocale. A load whose datasets declare no locale reads neither rung 1 nor 2. A read that throws is thrown on, and the caller seeds nothing and reports it. The replayer resolves per organization at replay time, not once at boot. Middleware B passes the insert's attributedUserId as the founder. The cloud-connection replayer passes no app default, because it replays the union of packages. Boot seed, hot reload, package apply and draft publish are unchanged. No finding.
Semver Clause-②: yes (widening): new exports from @objectstack/runtime, plus an optional second argument on the seed-replayer callable; a one-argument caller is unchanged. Metadata-protocol: semantic: an existing Seed.locale key now selects datasets on four paths. @objectstack/runtime and @objectstack/cloud-connection are minor, @objectstack/organizations is patch. Claim 6650471084 carries both lines.
Docs seed-data.mdx Locale Scoping callouts narrowed in this PR. Owed: the packages/spec/src/data/seed.zod.ts locale docblock and .describe(), filed by the seat as #30347 (spec lane, serial after this PR).
Landing Not governed (check-governed-merges --pr 30346: 0 of 16 paths), 855 lines ≤ 3000. Seat lands: pr_ready + automerge_enable.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 5, 2026 07:18
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge November 5, 2026 07:18
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 5, 2026
Merged via the queue into main with commit 8589756 Nov 5, 2026
51 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-cydyoy branch November 5, 2026 07:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/l tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Seed.locale: marketplace install, reseed sample data and per-org replay should select datasets by the installing organization's locale

1 participant