Repository navigation
Open
Labels
area:i18nThe customer's own language, across UI, metadata and notificationsThe customer's own language, across UI, metadata and notificationsdomain:serverDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestNew feature or requestpm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-setDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-setpm:dispatchedDispatched to a dev agent by /pm-dispatchDispatched to a dev agent by /pm-dispatchpriority:p2Medium: important, M3Medium: important, M3
Description
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Filing gate: ③ a split of tracking card #29428 (ruling F of #29349), which domain:spec#2 asked for (6659592659). Phase 1, #30001, landed in PR #30007, so @objectstack/spec/system now exports PLATFORM_LOCALES, PLATFORM_LOCALE_TAGS, PLATFORM_LOCALE_READ_ALIASES and platformLocaleTagOf. Nothing reads them yet. ⛔ Not a claim.
Part of #29428
Wanted
i18n:extract --localesandscripts/check-i18n-bundles.mjsreadPLATFORM_LOCALES, so a missing locale in anytranslations/package turns the existing bundle check red. ⛔ No new gate (ruling F).- Backfill the seven locales missing from every
translations/package: one PR per package, AI-written, at the same quality bar as [Decision] Repeater row-property localisation: 604 catalog leaves across four locales — who authors the translated copy? #17508 (precedent PR feat(spec): a repeater property panel names its columns in every locale, not only English #19345). Do the same for the 8 built-in email templates. EMAIL_TEMPLATE_FLOOR_LOCALE = 'en-US'against the table'senis a protocol change. Decide it in its own PR, with an alias, as Platform locale table (ruling F of #29349): one list of 11 languages in spec, complete on every surface #29428 says.
Reader: domain:server (the translations/ packages, the email templates, i18n:extract). This card holds the list of per-package PRs; tick each package as it lands.
Per-package PRs (kept by domain:server#2)
Locales added under the table tags: zh-Hant, ar, fr, pt-BR, ru, de, ko. One PR per package, landed in sequence on the card thread's branch; platform-objects splits into seven PRs, one per locale.
-
service-realtime— PR i18n(service-realtime): ship the presence object in all eleven platform languages #30536 (merged 2026-11-05) -
plugin-webhooks— PR i18n(plugin-webhooks): ship the webhook object in all eleven platform languages #30586 (merged 2026-11-05) -
service-storage— PR i18n(service-storage): ship the file and upload-session objects in all eleven platform languages #30649 (merged 2026-11-05) -
service-mailbox— PR i18n(service-mailbox): ship the mailbox objects in all eleven platform languages #30606 (merged 2026-11-05) -
service-messaging(with its hand-writtenmessages.tsrecords) — PRs i18n(service-messaging): ship the notification objects and digest heading in zh-Hant, ar, fr and pt-BR (第 5 包的 A 半) #30638 + i18n(service-messaging): ship the notification objects and digest heading in ru, de and ko (第 5 包的 B 半) #30673 (merged 2026-11-05) -
plugin-audit— PR i18n(plugin-audit): ship the audit objects and activity sentences in all eleven platform languages #30625 (merged 2026-11-05) -
plugin-approvals(with its hand-written records; after Setup: replace developer wording and hand-written JSON with fields a business administrator can use #30208 lands) -
plugin-security— PR i18n(plugin-security): ship the security objects, built-in permission sets and positions in all eleven platform languages #30744 (merged 2026-11-06) -
plugin-sharing(after Setup: replace developer wording and hand-written JSON with fields a business administrator can use #30208 lands; withSysQueue,SysQueueMember) -
service-settings(after fix(service-settings)!: Setup's default language offers and accepts the languages the deployment supports, not four hard-coded ones #30446 lands; its coverage test readsPLATFORM_LOCALESin the last PR) -
platform-objects(7 PRs, one per locale) - last PR:
i18n:extract --localesandcheck-i18n-bundles.mjsreadPLATFORM_LOCALES(Fixes) - out of this thread: the 8 built-in email templates and
EMAIL_TEMPLATE_FLOOR_LOCALE
Metadata
Metadata
Assignees
Labels
area:i18nThe customer's own language, across UI, metadata and notificationsThe customer's own language, across UI, metadata and notificationsdomain:serverDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestNew feature or requestpm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-setDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-setpm:dispatchedDispatched to a dev agent by /pm-dispatchDispatched to a dev agent by /pm-dispatchpriority:p2Medium: important, M3Medium: important, M3
Activity
objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL
Claim: PM loop round 11
Session:
session_01Utp6Cbvcmv8YWFhFJwzjKL(seat) · dev threadsession_01Utp6Cai5CRdAs4u9gTipWUAccount:
os-billBranch:
claude/project-thread-o3y7uf(harness-pinned thread branch; platform exception toclaude/issue-<n>-<slug>; packages land sequentially on it, one PR merged before the next opens)Worktree:
objectstack-issue-30512Domain:
domain:serverSeat:
domain:server#2File surface:
packages/**/src/translations/**(new locale files under the table tagszh-Hant,ar,fr,pt-BR,ru,de,ko; regenerated source hashes; the packageindex.tsregistration lines) and each package's translation tests, one changeset per PR; last PR:scripts/check-i18n-bundles.mjs, thei18n:extractscript and their tests,content/docs/protocol/kernel/i18n-standard.mdxonly where a sentence becomes false. ⛔packages/spec/**(stop and ask),ui/**,apps/**,skills/**,docs/adr/**,content/docs/releases/**,.claude/**, the built-in email templates (stop on breach; explain in the report)Container & model:
M,mode:thread,model: default tier (opus) — dispatch-gates --tier: no path-derived mandate,effort: highClause-②: no expected — package PRs add translated content for locales the table already declares; the last PR makes the existing bundle check read the table (ruling F: no new gate); the dev re-declares if a registration or resolver change reaches a published surface
Metadata-protocol: none
Responsibility: the
translations/packages carry four of the table's eleven languages and the bundle check reads its own locale list | the table itself (phase 1, landed), Console UI (phase 2), email templates andEMAIL_TEMPLATE_FLOOR_LOCALE(out of this thread) | every user whose language is on the platform tableThread-read: none
Premise: read, to be measured first — at
f6faf751: 11translations/packages withen,zh-CN,ja-JP,es-ES;PLATFORM_LOCALESexported and unreadSerial constraints cleared: seat 4's PR #30446 (#30286) adds keys under
service-settings/src/translations— that package's PR waits for it and mergesmainfirst; no other seat claims thetranslations/packages or the bundle check; pullmainbefore each PR and before landing.Order: project file
server-seat2/dispatch-30512.md, delivered as the card thread's opening message.objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cai5CRdAs4u9gTipWU
os-dev-report
Package 1 of 11:
@objectstack/service-realtime, PR #30536 (draft, head28ebd235). Tick: service-realtime.{ "issue": 30512, "status": "done", "branch": "claude/project-thread-o3y7uf", "pr": "https://github.com/objectstack-ai/objectstack/pull/30536", "session": "session_01Utp6Cai5CRdAs4u9gTipWU", "premise_still_valid": true, "summary": "Package 1 of 11 (service-realtime, the smallest: 25 leaves). sys_presence now ships zh-Hant, ar, fr, pt-BR, ru, de, ko under the platform table tags, each a TAG.objects.generated.ts plus its source-hash companion written by the repo's own os i18n extract --fill=default --source-hashes, served through withSourceFallback like the existing three; index.ts lists zh-CN before zh-Hant. The extract command in the config docstring (what check-i18n-bundles runs) carries the seven tags and the config's merge baseline imports the seven bundles, so the existing check:i18n covers them from this PR on. Existing zh-CN/ja-JP/es-ES files byte-identical after re-extract. Leaves equal to English are native words only (fr 2, pt-BR 5, de 5), recorded by the extractor as source copies. Step-1 measurement: /mnt/project-files/server-seat2/30512-measure.md (seat thread).", "tests": "service-realtime under the verify lock: build + test (Test Files 5 passed (5), Tests 35 passed (35)) + typecheck, VERDICT command-exit 0, at 28ebd235. check-i18n-bundles --filter=realtime: in sync (21 bundle(s)), exit 0. One-off proof the check covers the new locales: removed device.options.other from ko.objects.generated.ts -> DRIFTED (2), exit 1; restored from HEAD, git diff HEAD empty. Mechanical per-leaf lint against en: same key set, identical backtick spans and brace tokens, no empty value, all 7 locales OK.", "gates": "dispatch-gates --commands at 28ebd235: 62 families; --ran reconciliation: 61 run exit 0 (incl. pnpm check:i18n all 10 bundle sets, pnpm check:i18n-stale-fill), 1 NOT MEASURED: check-plugin-teardown-shape --self-test exit 3 (prerequisite: shallow clone cannot read its pinned positive-control commit; CI full checkout). check:dual-build-cjs-loads first exit 3 while the build closure was still finishing, re-run alone exit 0. eslint --no-inline-config on changed .ts exit 0; check-nul-bytes exit 0. Repo-wide pnpm lint left to CI (os-dev local scope). CI check-runs: in_progress at report time. Record: /mnt/project-files/server-seat2/30512/gates-realtime-ran.txt", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm; content-only package PR (dispatch order: package suite + check:i18n + typecheck)", "line_budget": "733 changed lines (+731 / -2), 18 files; under the 3000-line human-merge threshold", "files_changed": ".changeset/30512-service-realtime-locales.md; packages/services/service-realtime/scripts/i18n-extract.config.ts; packages/services/service-realtime/src/translations/{index.ts, bundle-ownership.test.ts (one message sentence), 7 x TAG.objects.generated.ts, 7 x TAG.source-hashes.generated.ts}", "deviations": "Pinned harness branch: packages land sequentially on claude/project-thread-o3y7uf, one PR merged before the next opens (as the claim records). Seat-approved order puts security, sharing, approvals and platform-objects last (seat 4/6 copy work in flight); platform-objects split into 7 PRs, one locale each; service-settings coverage moves to the last PR via its own settings-translation-coverage.test.ts reading PLATFORM_LOCALES. First push refused by check:commit-card-trailers (model name in the co-author trailer); amended before publishing, nothing rewritten on the remote.", "mcp_calls": "3 — mcp__github__issue_read x3 (#30512 get, #30512 get_comments, #17508 get); no write tool", "api_writes": "2 — relay pr_create (fw-20261105T143537Z-8893a9 -> #30536, read-back identical, no assignees, no labels); this os-dev-report comment via post-stamped. Plus 1 git push (not REST).", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "class: b · reach: maintainer — Seam: spec:platformLocaleTagOf / PLATFORM_LOCALE_READ_ALIASES → runtime:packages/core/src/fallbacks/memory-i18n.ts#resolveLocale and packages/spec/src/system/i18n-resolver.ts#resolveBundleLocale. The table's contract (platform-locales.ts header) says stored codes zh-TW / zh-HK / zh-MO resolve to zh-Hant through the read aliases; neither resolver applies platformLocaleTagOf, and step 4 (variant expansion) returns the FIRST registered zh-* key. Repro (pure function): resolveBundleLocale({ en: {}, 'zh-CN': {}, 'zh-Hant': {} }, 'zh-TW') answers 'zh-CN' (Simplified) instead of 'zh-Hant'; same for resolveLocale('zh-HK', ['en','zh-CN','zh-Hant']). Not a regression (today no bundle has zh-Hant, so zh-TW already gets zh-CN); after this card's backfill a Traditional-Chinese reader gets Traditional only if the client sends the table tag zh-Hant itself. Mitigation in this card: every bundle lists zh-CN before zh-Hant so zh / zh-Hans keep expanding to Simplified. Dedupe words: zh-TW zh-Hant resolveBundleLocale platformLocaleTagOf variant expansion. carrier: seat files the resolver card.", "class: none (observation) · reach: n/a — existing zh-CN / ja-JP / es-ES service-realtime bundles still carry sys_presence.fields.display_title.label/.help as English source copies (2 source-hash entries each), served as English by design. carrier: none · noted, not filed.", "class: none (measurement for the separate email-template decision) · EMAIL_TEMPLATE_FLOOR_LOCALE = 'en-US' at packages/spec/src/system/email-template.zod.ts:63; not touched. carrier: #30512 email half (its own PR and decision)." ] }Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cai5CRdAs4u9gTipWU
os-dev-report
Package 2 of 11:
@objectstack/plugin-webhooks, PR #30586 (draft, headc6c30383). Tick on merge: plugin-webhooks.{ "issue": 30512, "status": "done", "branch": "claude/project-thread-o3y7uf", "pr": "https://github.com/objectstack-ai/objectstack/pull/30586", "session": "session_01Utp6Cai5CRdAs4u9gTipWU", "premise_still_valid": true, "summary": "Package 2 of 11 (plugin-webhooks, 47 leaves). sys_webhook ships zh-Hant, ar, fr, pt-BR, ru, de, ko under the table tags, generated and hashed by the repo's own extract, registered in index.ts (zh-CN before zh-Hant) and in the extract docstring + merge baseline, so check:i18n covers them. Branch restarted from origin/main a4c3e738 after #30536 merged (the remote branch had been deleted on merge, so a plain push; nothing rewritten). check:i18n-stale-fill flagged one benign coincidence (sys_webhook.pluralLabel: zh-CN and zh-Hant both 'Webhook', source 'Webhooks'; Chinese has no plural); ratcheted into scripts/i18n-stale-fill-baseline.json with its reason, the gate's documented path. Pre-checked the prepared mailbox/audit/messaging/storage translations against the same cross-locale rule: no further coincidence.", "tests": "plugin-webhooks under the verify lock: build + test (Test Files 25 passed (25), Tests 258 passed (258)) + typecheck, VERDICT command-exit 0, at c6c30383. check-i18n-bundles --filter=webhooks: in sync (21 bundle(s)), exit 0. check-i18n-stale-fill: exit 1 before the baseline entry (the one leaf above), exit 0 after. Per-leaf mechanical lint against en (keys, backtick spans, brace tokens, angle-bracket tokens): all 7 locales OK.", "gates": "dispatch-gates --commands at c6c30383: 68 families, --ran: 68 run, 0 NOT MEASURED (derived zero, every line carries its exit code; teardown-shape fixture commit fetched as the seat asked). eslint --no-inline-config on changed .ts exit 0; check-nul-bytes exit 0. CI check-runs in progress at report time. Record: /mnt/project-files/server-seat2/30512/gates-webhooks-ran.txt", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm; content-only package PR", "line_budget": "1066 changed lines (+1063 / -3), 19 files; under 3000", "files_changed": ".changeset/30512-plugin-webhooks-locales.md; scripts/i18n-stale-fill-baseline.json (1 classified entry); packages/plugins/plugin-webhooks/scripts/i18n-extract.config.ts; packages/plugins/plugin-webhooks/src/translations/{index.ts, bundle-ownership.test.ts (one message sentence), 7 x TAG.objects.generated.ts, 7 x TAG.source-hashes.generated.ts}", "deviations": "scripts/i18n-stale-fill-baseline.json is outside the dispatch order's expected landing surface; touched only through the gate's own --update path, one entry, reason recorded in place of the generator's 'unclassified' marker. Seat may prefer a different zh-Hant plural instead; say so and I re-translate the leaf.", "mcp_calls": "5 total this card — mcp__github__issue_read x3, mcp__github__pull_request_read x2 (#30536 get, check_runs); no write tool", "api_writes": "2 — relay pr_create (-> #30586, read-back identical, no assignees, no labels); this os-dev-report via post-stamped. Plus 1 git push (not REST).", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#4 · os-sales · session_01L6bhgVfPeFZkN1FP93imKU
Scope note for this card's list (ruling F of #29349, via #29428: every platform language complete on every surface) · 2026-11-05T17:53Z
One server surface that is not a
translations/package and is not on the per-package list above:packages/plugins/plugin-auth/src/organization-mfa-enrollment-guard.tswrites its user-facing copy by hand,ORGANIZATION_MFA_REFUSAL_COPYandORGANIZATION_MFA_REQUIRED_NOTICE_COPY, keyed bytype CopyLocale = 'en' | 'zh-CN' | 'ja-JP' | 'es-ES'(:149onorigin/main); every other caller locale is answered in English (copyLocaleFor).Why it matters now: since PR #30592 (#30565, merged 17:51Z) the console drops its own "7 days" line when the save answer's notice is this server notice, so an administrator in
de,fr,ko,pt-BR,ruorarreads the English notice alone where the console used to add a localized line.For whichever PR adds the seven table locales to this copy: the console recognises the notice by its opening sentence,
SERVER_MFA_NOTICE_OPENINGSinui/packages/app-shell/src/console/organizationMfaNotices.ts(:70), with a byte-exact fixture per language inui/packages/app-shell/src/console/__tests__/organizationMfaNotices-30295.test.tsx. Each new language's opening sentence goes there in the same PR (the same-PR follow rule). If it does not, the toast shows both lines in that language, never neither. ⛔ Not a claim.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cai5CRdAs4u9gTipWU
os-dev-report
Package 3 of 11:
@objectstack/service-mailbox, PR #30606 (draft, head34c094b3). Tick on merge: service-mailbox.{ "issue": 30512, "status": "done", "branch": "claude/project-thread-o3y7uf", "pr": "https://github.com/objectstack-ai/objectstack/pull/30606", "session": "session_01Utp6Cai5CRdAs4u9gTipWU", "premise_still_valid": true, "summary": "Package 3 of 11 (service-mailbox, 75 leaves across sys_mailbox, sys_mail_message, sys_mail_association). Seven table-tag locales generated and hashed by the repo's own extract, registered in index.ts (zh-CN before zh-Hant) and in the extract docstring + merge baseline. Branch restarted from origin/main 4831d500 after #30586 merged (remote branch had been deleted on merge, plain push, nothing rewritten). RFC 5322 header names and UIDVALIDITY kept verbatim in every locale, as zh-CN already does; other en-equal leaves are native cognates only, each recorded by the extractor as a source copy. No stale-fill coincidence; baseline untouched.", "tests": "service-mailbox under the verify lock: turbo build of the 12-package i18n closure (63 tasks) + test (Test Files 10 passed (10), Tests 152 passed (152)) + typecheck, VERDICT command-exit 0. check-i18n-bundles: services/service-mailbox in sync. check-i18n-stale-fill: exit 0 with baseline unchanged. Per-leaf mechanical lint against en (keys, backtick spans, brace and angle tokens): all 7 locales OK.", "gates": "dispatch-gates --commands at 34c094b3: 56 families, --ran: 56 run, 0 NOT MEASURED (derived zero, every line carries its exit code, all exit 0). Record: /mnt/project-files/server-seat2/30512/gates-mailbox-ran.txt. CI at report time: 43 of 47 check-runs completed with success or skipped (Build Core, Type Check x4, all Lint lanes, Check Changeset, PR-body guards, Governed Surface Queue Guard, Test Core 5-8/8); Test Core 1-4/8 still running.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm; content-only package PR", "line_budget": "1481 changed lines (+1480 / -1), 17 files; under 3000", "files_changed": ".changeset/30512-service-mailbox-locales.md; packages/services/service-mailbox/scripts/i18n-extract.config.ts; packages/services/service-mailbox/src/translations/{index.ts, 7 x TAG.objects.generated.ts, 7 x TAG.source-hashes.generated.ts}", "deviations": "none", "mcp_calls": "read-only this package: mcp__github__pull_request_read (get_check_runs on #30606); card total remains issue_read + pull_request_read only, no write tool", "api_writes": "2 — relay pr_create (-> #30606, draft, no assignees, no review request); this os-dev-report via post-stamped. Plus 1 git push (not REST).", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cai5CRdAs4u9gTipWU
os-dev-report
Package 4 of 11:
@objectstack/plugin-audit, PR #30625 (draft, headfedf6bfd). Tick on merge: plugin-audit.{ "issue": 30512, "status": "done", "branch": "claude/project-thread-o3y7uf", "pr": "https://github.com/objectstack-ai/objectstack/pull/30625", "session": "session_01Utp6Cai5CRdAs4u9gTipWU", "premise_still_valid": true, "summary": "Package 4 of 11 (plugin-audit: 128 object leaves across sys_audit_log, sys_activity, sys_comment, sys_comment_reaction, plus 8 activity-feed sentences in messages.ts). Seven table-tag locales generated and hashed by the repo's own extract, registered in index.ts (zh-CN before zh-Hant) with their messages, and in the extract docstring + merge baseline. Branch restarted from origin/main 6701c08a after #30606 merged (remote branch deleted on merge, plain push). One test change, stated in the PR body as a moved premise, not a loosening: the no-pack reader case moves from fr-FR to it-IT (same byte-for-byte assertion) and a new case pins fr-FR reading the fr pack. pt-BR writes sign-in/sign-out as Acesso / Encerramento de sessão rather than the English loanwords.", "tests": "plugin-audit under the verify lock at fedf6bfd: turbo build --filter=@objectstack/plugin-audit... (16 tasks) + test (Test Files 71 passed (71), Tests 1138 passed (1138)) + typecheck, VERDICT command-exit 0. check-i18n-bundles --filter=audit: in sync (21 bundle(s)), exit 0. check-i18n-stale-fill: exit 0, baseline untouched. Per-leaf mechanical lint against en: all 7 locales OK; message holes identical to en.", "gates": "dispatch-gates --commands at fedf6bfd: 61 families, --ran: 61 run, 0 NOT MEASURED (derived zero, all exit 0). eslint --no-inline-config on changed .ts exit 0. Record: /mnt/project-files/server-seat2/30512/gates-audit-ran.txt. CI at report time: 46 of 47 check-runs completed success or skipped; Test Core 4/8 still running.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm; content-only package PR", "line_budget": "2331 changed lines (+2328 / -3), 19 files; under 3000", "files_changed": ".changeset/30512-plugin-audit-locales.md; packages/plugins/plugin-audit/scripts/i18n-extract.config.ts; packages/plugins/plugin-audit/src/activity-summary-reader-locale.integration.test.ts; packages/plugins/plugin-audit/src/translations/{index.ts, messages.ts, 7 x TAG.objects.generated.ts, 7 x TAG.source-hashes.generated.ts}", "deviations": "none beyond the seat-ruled test change", "mcp_calls": "read-only this package: mcp__github__pull_request_read x1 (get_check_runs #30625); no write tool", "api_writes": "2 — relay pr_create (-> #30625, read-back identical, no assignees); this os-dev-report via post-stamped. Plus 1 git push (not REST).", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [] }Generated by Claude Code
1 remaining item
objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cai5CRdAs4u9gTipWU
os-dev-report
Package 10 of 11 (moved ahead by the seat):
@objectstack/service-storage, PR #30649 (draft, headef93f040). Tick on merge: service-storage.{ "issue": 30512, "status": "done", "branch": "claude/project-thread-o3y7uf", "pr": "https://github.com/objectstack-ai/objectstack/pull/30649", "session": "session_01Utp6Cai5CRdAs4u9gTipWU", "premise_still_valid": true, "summary": "Package 10 of 11 (service-storage, 68 leaves across sys_file and sys_upload_session), opened after #30638 merged as the seat ordered. Built on main after #30627 (#30335's storage half), so it carries every key that PR added; the prepared translations were re-linted against that en with zero missing or extra keys. Seven table-tag locales generated and hashed by the repo's own extract, registered in index.ts (zh-CN before zh-Hant) and in the extract docstring + merge baseline. No test changes needed. Branch restarted from origin/main ca37605c (remote branch deleted on merge, plain push).", "tests": "service-storage under the verify lock: turbo build --filter=@objectstack/service-storage... (17 tasks) + test (Test Files 73 passed (73), Tests 1353 passed (1353)) + typecheck, VERDICT command-exit 0 (measured on fabd2595 + this commit; re-checked at ef93f040: check-i18n-bundles --filter=storage in sync, check-i18n-stale-fill exit 0, baseline untouched).", "gates": "dispatch-gates --commands: 56 families, --ran: 56 run, 0 NOT MEASURED, all exit 0. eslint --no-inline-config on changed .ts exit 0. Record: /mnt/project-files/server-seat2/30512/gates-storage-ran.txt (same tree before the rebase onto ca37605c, which only added #30638's messaging files).", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm; content-only package PR", "line_budget": "1483 changed lines (+1482 / -1), 17 files; under 3000", "files_changed": ".changeset/30512-service-storage-locales.md; packages/services/service-storage/scripts/i18n-extract.config.ts; packages/services/service-storage/src/translations/{index.ts, 7 x TAG.objects.generated.ts, 7 x TAG.source-hashes.generated.ts}", "deviations": "none", "mcp_calls": "this package: none; card total read-only (issue_read, pull_request_read); no write tool", "api_writes": "2 — relay pr_create (-> #30649, read-back identical, no assignees); this os-dev-report via post-stamped. Plus 1 git push (not REST).", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cai5CRdAs4u9gTipWU
os-dev-report
Package 5 of 11, B half (第 5 包的 B 半):
@objectstack/service-messaging, PR #30673 (draft, head2ef9d088). Tick on merge: service-messaging (A half #30638 already merged).{ "issue": 30512, "status": "done", "branch": "claude/project-thread-o3y7uf", "pr": "https://github.com/objectstack-ai/objectstack/pull/30673", "session": "session_01Utp6Cai5CRdAs4u9gTipWU", "premise_still_valid": true, "summary": "Second half of package 5 (service-messaging): ru, de, ko for all 203 object leaves plus the digest heading, opened after #30649 merged as the seat ordered. The Russian heading is a count-neutral tally like the Arabic one (Уведомлений: {{count}}), and the messages.ts plural note now names Russian (2-4 vs 5+). German loanword Digest replaced by Zusammenfassung. Registered under table tags after the A half's four; MessagingLocale widens to eleven; extract docstring + merge baseline list the three tags. Two wording-rule tests add the three bundles to their lists (coverage widened, no assertion changed). Branch restarted from origin/main 66a8822b (plain push).", "tests": "service-messaging under the verify lock at 2ef9d088: turbo build --filter=@objectstack/service-messaging... (16 tasks) + test (Test Files 66 passed (66), Tests 851 passed (851)) + typecheck, VERDICT command-exit 0. check-i18n-bundles --filter=messaging in sync; check-i18n-stale-fill exit 0, baseline untouched.", "gates": "dispatch-gates --commands at 2ef9d088: 62 families, --ran: 62 run, 0 NOT MEASURED, all exit 0. eslint --no-inline-config on changed .ts exit 0. Record: /mnt/project-files/server-seat2/30512/gates-messaging-b-ran.txt.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm; content-only package PR", "line_budget": "1619 changed lines (+1610 / -9), 12 files; under 3000", "files_changed": ".changeset/30512-service-messaging-locales-b.md; packages/services/service-messaging/scripts/i18n-extract.config.ts; packages/services/service-messaging/src/translations/{index.ts, messages.ts, 3 x TAG.objects.generated.ts, 3 x TAG.source-hashes.generated.ts}; src/objects/{admin-copy-vocabulary,setup-list-empty-states}.test.ts", "deviations": "none", "mcp_calls": "this package: none; card total read-only (issue_read, pull_request_read); no write tool", "api_writes": "2 — relay pr_create (-> #30673, read-back identical, no assignees); this os-dev-report via post-stamped. Plus 1 git push (not REST).", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL
Release:
session_01Utp6Cbvcmv8YWFhFJwzjKL(domain:server#2) · reason: seat sign-off · to:pm:queuefor the next server seat.Maintainer: 「开发中的尽快收工,30512 剩余阶段交给下一任」, project chat, 2026-11-05T22:01Z.
Resume-from:
claude/project-thread-o3y7uf@2dffb78dState at release.
service-messaginglanded (#30638 + #30673) and is ticked. The branch above stacks six WIP commits onmain9d5ec258, each one package-half PR to open in order:70f9870abc852648ff28e790ec0e96dcSysQueue/SysQueueMember)7db48bdd2dffb78dPassed: the stack built under the verify lock on
b77c160a; package tests and typecheck passed (settings 1263, security 5679 pass / 45 skip, sharing 1416, approvals 1498). On9d5ec258,check-i18n-bundles(10 packages) and stale-fill passed. Not run: the derived gates. Run them per PR before opening it.Owed by the next seat:
fr-FR→it-ITis a moved premise, not a loosening; the approvals link sentence follows ruling A. The checklist rows "after Setup: replace developer wording and hand-written JSON with fields a business administrator can use #30208 / fix(service-settings)!: Setup's default language offers and accepts the languages the deployment supports, not four hard-coded ones #30446 lands" still apply: re-check them before each PR.platform-objects. The ruling already decided the split (B: 7 PRs, one per locale, each over the 3000-line human-merge threshold, reviewers os-zhuang + hotlong, four evidences). The handover's two cross-package pins ride those PRs.PLATFORM_LOCALES(Fixes).Handover notes, tooling and translation tables: project files
server-seat2/30512/handover.mdandhandover-src/.objectstack-fleet commentedon Nov 5, 2026
domain:server#1 · os-elon-musk · session_016WV4cytLmJxfAmgPVjUbbW
Claim: PM loop round 2 · 2026-11-05T23:18Z · resumes release 6671788758 (domain:server#2)
Session:
session_016WV4cytLmJxfAmgPVjUbbWAccount:
os-elon-musk(the seat's linked user asGET /useranswers it; the card's assignee)Branch: the card thread's designated
claude/project-thread-*branch, named in a claim amendment once the thread reports it. Resume-fromclaude/project-thread-o3y7uf@2dffb78d(six WIP commits onmain9d5ec258), carried onto the thread branch, never pushed to the released branchWorktree:
objectstack-issue-30512Domain:
domain:serverSeat:
domain:server#1File surface (this term):
packages/services/service-settings/**,packages/plugins/plugin-security/**,packages/plugins/plugin-sharing/**,packages/plugins/plugin-approvals/**(translations, theirscripts/i18n-extract.config.ts, and the hand-written records and tests the WIP commits name), one.changeset/30512-*.mdper PR. Thenplatform-objects(7 PRs, one per locale, ruling B), then the last PR onscripts/check-i18n-bundles.mjsandi18n:extract --locales(Fixes). ⛔packages/spec/**; ⛔ the 8 built-in email templates andEMAIL_TEMPLATE_FLOOR_LOCALE(out of this thread, per the card)Container & model:
L,mode:thread,model: default,effort: xhighClause-②: no
Metadata-protocol: none
Responsibility: the platform translation bundles per package | the bundle check, which reads a fixed locale list today | a console reader in any of the seven backfilled platform languages, who sees English platform metadata
Thread-read: 6671788758
Premise: holds; six of the eleven packages landed (card checklist), the six-commit stack is on the branch named above. The dev re-runs the derived gates per PR before opening it (release: "Not run: the derived gates")
Serial constraints cleared: #30446 landed (settings rows may proceed). The approvals / security / sharing rows say "after #30208 lands"; #30208 is still open, so the dev re-checks it before each of those PRs and holds that PR if the row still applies. Open PRs #30720 and #30448 edit
service-settingsfiles other than itstranslations/and the twolocalization-*files this stack touches (file lists read at claim time).objectstack-fleet commentedon Nov 5, 2026
domain:server#1 · os-elon-musk · session_016WV4cytLmJxfAmgPVjUbbW
席位核对 · Amendment · 2026-11-05T23:27Z · claim 6672078792
Branch:
claude/project-thread-1jep1s(the card thread's harness-pinned branch, objectstack-ai/objectstack; platform exception toclaude/issue-<n>-<slug>). The six WIP commits fromclaude/project-thread-o3y7uf@2dffb78dare carried onto it over currentorigin/main.Dev session:
session_016WV4cya5ej5GQV86RPbRPKEverything else in the claim stands.
objectstack-fleet commentedon Nov 5, 2026
domain:server#1 · os-elon-musk · session_016WV4cytLmJxfAmgPVjUbbW
席位核对 · Sequence · 2026-11-05T23:32Z · claim 6672078792
bdbaf80cdb, an ancestor of the WIP base9d5ec258), rows 4 and 9 in PR fix(ui): Setup's everyone note and header tags speak to an administrator #30488. Setup: replace developer wording and hand-written JSON with fields a business administrator can use #30208 stays open only for rows 5 (objectql lifecycle settings shape) and 6 (ruled E via [Decision] 通知偏好 topic/channel: pickers, refuse unmatched values, or free text as ruled on #25346? #30527), and neither touches these three packages. Order: security, sharing, approvals A, approvals B.domain:server#5, claim 6671511018). That card owns the module-local copy tables inlocalization-currency-lock.tsandlocalization-locale-options.tsand already carries all eleven languages there. When Settings actions and refusals: seven module-local copy tables still carry four languages and resolve zh-TW to Simplified; the SMS test and two built-in answers are English only #30630 lands, settings A/B rebase and drop theirlocalization-*hunks, keepingtranslations/, the coverage test and the changeset.objectstack-fleet commentedon Nov 6, 2026
domain:server#1 · os-elon-musk · session_016WV4cya5ej5GQV86RPbRPK
os-dev-report
Package 7 of 11:
@objectstack/plugin-security, PR #30744 (draft, head99bc8346). Tick on merge: plugin-security.{ "issue": 30512, "status": "done", "branch": "claude/project-thread-1jep1s", "pr": "https://github.com/objectstack-ai/objectstack/pull/30744", "session": "session_016WV4cya5ej5GQV86RPbRPK", "premise_still_valid": true, "summary": "Package 7 of 11 (plugin-security), first PR of this term, opened before settings per the seat's 23:33Z ruling (settings A/B wait for #30630; the #30208 row is cleared). The released handover commit ff28e790 carried onto main 06cccd32 unchanged (patch id 446fab73 equal), then origin/main 447226b2 merged in (17 commits, none in the four packages). Seven table-tag locales: 60 object leaves each, generated and hashed by the repo's own extract, registered in index.ts (zh-CN before zh-Hant) with the hand-written permission-set (9 sets) and built-in position (7) tables, and in the extract docstring + merge baseline, so check:i18n covers them. position-rename-consistency widens to six of the seven locales; Arabic left out because its role word also spells 'in turn', which a correct help text uses.", "tests": "plugin-security under the verify lock at 99bc8346 (after the main merge, whole tree rebuilt 118/118): test (Test Files 246 passed (246), Tests 5679 passed | 45 skipped (5724)) + typecheck (check:test-typecheck OK), VERDICT command-exit 0; identical counts at 41230cb6 before the merge. check-i18n-bundles --filter=security: in sync (21 bundle(s)), exit 0; check-i18n-stale-fill: exit 0, baseline untouched (both at 99bc8346). Per-leaf mechanical lint against en (key set, double-brace and single-brace holes, backtick spans, angle tokens): 7 locales OK, 0 diffs. zh-Hant scanned with OpenCC s2tw: no Simplified-only character (only 台 in 平台 and 核准/准 flagged, both standard Taiwan usage). No ablation: content-only change.", "gates": "dispatch-gates --commands at 41230cb6: 61 families; --ran: 61 derived, 61 run, 0 NOT MEASURED (derived zero; 61 x exit 0). Re-derived at 99bc8346: identical 61-command list; --ran on the same record: 61 run, 0 NOT MEASURED. pnpm lint exit 0 (at 41230cb6). eslint --no-inline-config on the changed .ts exit 0. Record: /mnt/project-files/server-lane-seat1/30512/gates-ran-security-41230cb6.txt. CI check-runs: not read at report time (report not held for CI).", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm; content-only package PR", "line_budget": "1807 changed lines (+1801 / -6), 20 files; under the 3000-line human-merge threshold", "files_changed": ".changeset/30512-plugin-security-locales.md; packages/plugins/plugin-security/scripts/i18n-extract.config.ts; packages/plugins/plugin-security/src/translations/{index.ts, permission-sets.ts, builtin-positions.ts, position-rename-consistency.test.ts, 7 x TAG.objects.generated.ts, 7 x TAG.source-hashes.generated.ts}", "deviations": "(1) turbo build ran at --concurrency=3, not 2: this container runs one agent. (2) The branch carries one merge commit (origin/main into the thread branch, no force-push), because the thread branch is not claude/issue-* and cannot be rewritten.", "mcp_calls": "10 read-only — mcp__github__issue_read x6 (#30512 get + comments, #30208 get + comments, #30630 get + comments), mcp__github__pull_request_read x3 (#30720 files, #30448 files, #30625 get), mcp__github__list_pull_requests x1 (#30630 branch), plus gh search reads; no write tool", "api_writes": "2 — relay pr_create (fw-20261106T002411Z-0a624f, run 42136558882 -> #30744, 6873 bytes read back identical, no assignees, no labels); this os-dev-report via post-stamped. Plus 2 git pushes (not REST).", "open_questions": [], "security_findings": "withheld", "out_of_scope_findings": [ "class: none (observation) · the existing zh-CN / ja-JP / es-ES bundles of plugin-sharing (sys_queue, sys_queue_member in ja-JP/es-ES) and plugin-approvals (sys_approval_delegation in ja-JP/es-ES) still carry English source copies recorded in their source-hashes files; the seven-locale backfill does not touch the existing three locales. carrier: seat (the #30208 landing note names them for the #30512 pass) · noted, not filed", "class: none (observation) · sys_user_position.fields.delegated_from.help English source carries the Chinese term (职务代理); every locale keeps it as es-ES does. carrier: none · noted, not filed" ] }objectstack-fleet commentedon Nov 6, 2026
domain:server#1 · os-elon-musk · session_016WV4cytLmJxfAmgPVjUbbW
Landed · 2026-11-06T01:12Z · PR #30744 (
plugin-security, seven locales) merged by the queue ase00bcc6aeaf56c339598ef49306ed3ca90d781de(2026-11-06T01:10:55Z). Checklist row ticked. The card stayspm:dispatched:plugin-sharingopens next on the same branch, thenplugin-approvalsA and B, thenservice-settingsA and B (#30630 landed as #30734, so they are unblocked; theirlocalization-*hunks drop per the seat's ruling).objectstack-fleet commentedon Nov 6, 2026
domain:server#1 · os-elon-musk · session_016WV4cya5ej5GQV86RPbRPK
os-dev-report
Package 8 of 11:
@objectstack/plugin-sharing, PR #30767 (draft, headdc12d9dc). Tick on merge: plugin-sharing.{ "issue": 30512, "status": "done", "branch": "claude/project-thread-1jep1s", "pr": "https://github.com/objectstack-ai/objectstack/pull/30767", "session": "session_016WV4cya5ej5GQV86RPbRPK", "premise_still_valid": true, "summary": "Package 8 of 11 (plugin-sharing), second PR of this term, cut from main e00bcc6a after #30744 landed. The released handover commit ec0e96dc carried onto main with one deviation, accepted in principle by the seat at 01:14Z: main gained #30728 (sys_queue record page and a hand-written four-locale pages section) after ec0e96dc was written, so its index.ts and extract-config hunks conflicted. The resolution keeps #30728's wiring and adds the seven locales through it; pages.ts gains seven page labels, each the locale's own sys_queue object label, recorded against the same en digest (87d4b808a85ea103), the shape plugin-audit's pages.ts uses. The 14 generated files and the test change are byte-identical to ec0e96dc (blob ids compared); the changeset gains one sentence for the page title. Seven table-tag locales: 151 object leaves each, registered in index.ts (zh-CN before zh-Hant) and in the extract docstring + merge baseline, so check:i18n covers them.", "tests": "plugin-sharing under the verify lock at dc12d9dc's tree (whole tree rebuilt 118/118): test (Test Files 67 passed (67), Tests 1424 passed (1424)) + typecheck (check:test-typecheck OK), VERDICT command-exit 0; identical counts at cb13b51f (same patch on main e8dc4833). sys-queue-page.test.ts reads the page label of every served locale, so the seven new labels are held to it. check-i18n-bundles --filter=sharing: in sync (21 bundle(s)), exit 0; check-i18n-stale-fill: exit 0, baseline untouched (both at dc12d9dc). Per-leaf mechanical lint against en: 7 locales OK, 0 diffs. zh-Hant scanned with OpenCC s2tw: no Simplified-only character (台 in 平台 and 表 in 儀表板 flagged, both standard Taiwan usage). No ablation: content-only change.", "gates": "dispatch-gates --commands at cb13b51f: 61 families; --ran: 61 derived, 61 run, 0 NOT MEASURED (derived zero; 61 x exit 0). Re-derived at dc12d9dc's tree: identical 61-command list. pnpm lint exit 0 (at cb13b51f). eslint --no-inline-config on the changed .ts exit 0. Record: /mnt/project-files/server-lane-seat1/30512/gates-ran-sharing-cb13b51f.txt. CI check-runs: not read at report time (report not held for CI).", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm; content-only package PR", "line_budget": "2694 changed lines (+2691 / -3), 19 files; under the 3000-line human-merge threshold", "files_changed": ".changeset/30512-plugin-sharing-locales.md; packages/plugins/plugin-sharing/scripts/i18n-extract.config.ts; packages/plugins/plugin-sharing/src/translations/{index.ts, pages.ts, recipient-vocabulary-consistency.test.ts, 7 x TAG.objects.generated.ts, 7 x TAG.source-hashes.generated.ts}", "deviations": "(1) pages.ts seven page labels beyond the handover commit, forced by #30728 (above). (2) turbo build ran at --concurrency=3, not 2: this container runs one agent. (3) The derived families ran at cb13b51f on main e8dc4833; the PR head is the same patch (patch id 3f616c44) on main e00bcc6a, and none of the five main commits in between touches plugin-sharing; suite and both i18n checks re-run on the head. (4) The first push was refused by check:commit-card-trailers (a 'Part of #30512' line in the commit message); the unpublished tip was amended to drop it (tree unchanged) and pushed. The branch is a single commit on main: the old head 99bc8346 was squash-merged and the remote branch was deleted on merge, so no force-push was involved.", "mcp_calls": "1 read-only — mcp__github__pull_request_read x1 (#30744 get, merge state); plus git reads; no write tool", "api_writes": "2 — relay pr_create (fw-20261106T014138Z-ae468c, run 42145526516 -> #30767, 7633 bytes read back identical, no assignees, no labels); this os-dev-report via post-stamped. Plus 1 git push (not REST).", "open_questions": [], "security_findings": "withheld", "out_of_scope_findings": [ "class: none (observation) · the queue page's members list title in plugin-sharing/src/sys-queue.page.ts is an inline locale map with four entries (en, zh-CN, ja-JP, es-ES), none for the seven new locales; page prose outside this PR's surface. carrier: seat (said 01:14Z it takes it at ACCEPT) · noted, not filed", "class: none (observation) · the existing ja-JP and es-ES bundles carry the English source copy 'Queue' for sys_queue.label (recorded in their source-hashes) while their page labels read キュー / Cola. carrier: seat (the #30208 landing note names the ja/es English fills for the #30512 pass) · noted, not filed" ] }