Skip to content

i18n phase 3 (platform metadata and built-in emails): extraction and bundle checks read PLATFORM_LOCALES; backfill the seven missing locales #30512

Open

Description

@objectstack-fleet

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

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.

Activity

  1. added
    enhancementNew feature or request
    pm:queueReady for the PM dispatch loop
    area:i18nThe customer's own language, across UI, metadata and notifications
    domain:serverDomain lane — seat card indexed by label:pm:seat
    pm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-set
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL

    Claim: PM loop round 11
    Session: session_01Utp6Cbvcmv8YWFhFJwzjKL (seat) · dev thread session_01Utp6Cai5CRdAs4u9gTipWU
    Account: os-bill
    Branch: claude/project-thread-o3y7uf (harness-pinned thread branch; platform exception to claude/issue-<n>-<slug>; packages land sequentially on it, one PR merged before the next opens)
    Worktree: objectstack-issue-30512
    Domain: domain:server
    Seat: domain:server#2
    File surface: packages/**/src/translations/** (new locale files under the table tags zh-Hant, ar, fr, pt-BR, ru, de, ko; regenerated source hashes; the package index.ts registration lines) and each package's translation tests, one changeset per PR; last PR: scripts/check-i18n-bundles.mjs, the i18n:extract script and their tests, content/docs/protocol/kernel/i18n-standard.mdx only 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: high
    Clause-②: 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 and EMAIL_TEMPLATE_FLOOR_LOCALE (out of this thread) | every user whose language is on the platform table
    Thread-read: none
    Premise: read, to be measured first — at f6faf751: 11 translations/ packages with en, zh-CN, ja-JP, es-ES; PLATFORM_LOCALES exported and unread
    Serial constraints cleared: seat 4's PR #30446 (#30286) adds keys under service-settings/src/translations — that package's PR waits for it and merges main first; no other seat claims the translations/ packages or the bundle check; pull main before each PR and before landing.

    Order: project file server-seat2/dispatch-30512.md, delivered as the card thread's opening message.

  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6Cai5CRdAs4u9gTipWU

    os-dev-report

    Package 1 of 11: @objectstack/service-realtime, PR #30536 (draft, head 28ebd235). 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

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6Cai5CRdAs4u9gTipWU

    os-dev-report

    Package 2 of 11: @objectstack/plugin-webhooks, PR #30586 (draft, head c6c30383). 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

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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.ts writes its user-facing copy by hand, ORGANIZATION_MFA_REFUSAL_COPY and ORGANIZATION_MFA_REQUIRED_NOTICE_COPY, keyed by type CopyLocale = 'en' | 'zh-CN' | 'ja-JP' | 'es-ES' (:149 on origin/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, ru or ar reads 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_OPENINGS in ui/packages/app-shell/src/console/organizationMfaNotices.ts (:70), with a byte-exact fixture per language in ui/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

  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6Cai5CRdAs4u9gTipWU

    os-dev-report

    Package 3 of 11: @objectstack/service-mailbox, PR #30606 (draft, head 34c094b3). 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

  7. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6Cai5CRdAs4u9gTipWU

    os-dev-report

    Package 4 of 11: @objectstack/plugin-audit, PR #30625 (draft, head fedf6bfd). 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

  8. 1 remaining item

  9. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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, head ef93f040). 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

  10. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6Cai5CRdAs4u9gTipWU

    os-dev-report

    Package 5 of 11, B half (第 5 包的 B 半): @objectstack/service-messaging, PR #30673 (draft, head 2ef9d088). 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

  11. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL

    Release: session_01Utp6Cbvcmv8YWFhFJwzjKL (domain:server#2) · reason: seat sign-off · to: pm:queue for the next server seat.
    Maintainer: 「开发中的尽快收工,30512 剩余阶段交给下一任」, project chat, 2026-11-05T22:01Z.
    Resume-from: claude/project-thread-o3y7uf@2dffb78d

    State at release. service-messaging landed (#30638 + #30673) and is ticked. The branch above stacks six WIP commits on main 9d5ec258, each one package-half PR to open in order:

    Commit Half Lines
    70f9870a settings A 2786
    bc852648 settings B 2133
    ff28e790 security 1807
    ec0e96dc sharing (with SysQueue / SysQueueMember) 2651
    7db48bdd approvals A 1962
    2dffb78d approvals B 1474

    Passed: 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). On 9d5ec258, 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:

    Handover notes, tooling and translation tables: project files server-seat2/30512/handover.md and handover-src/.

  12. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Nov 5, 2026
  13. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  14. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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_016WV4cytLmJxfAmgPVjUbbW
    Account: os-elon-musk (the seat's linked user as GET /user answers 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-from claude/project-thread-o3y7uf@2dffb78d (six WIP commits on main 9d5ec258), carried onto the thread branch, never pushed to the released branch
    Worktree: objectstack-issue-30512
    Domain: domain:server
    Seat: domain:server#1
    File surface (this term): packages/services/service-settings/**, packages/plugins/plugin-security/**, packages/plugins/plugin-sharing/**, packages/plugins/plugin-approvals/** (translations, their scripts/i18n-extract.config.ts, and the hand-written records and tests the WIP commits name), one .changeset/30512-*.md per PR. Then platform-objects (7 PRs, one per locale, ruling B), then the last PR on scripts/check-i18n-bundles.mjs and i18n:extract --locales (Fixes). ⛔ packages/spec/**; ⛔ the 8 built-in email templates and EMAIL_TEMPLATE_FLOOR_LOCALE (out of this thread, per the card)
    Container & model: L, mode:thread, model: default, effort: xhigh
    Clause-②: 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-settings files other than its translations/ and the two localization-* files this stack touches (file lists read at claim time).

  15. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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 to claude/issue-<n>-<slug>). The six WIP commits from claude/project-thread-o3y7uf@2dffb78d are carried onto it over current origin/main.
    Dev session: session_016WV4cya5ej5GQV86RPbRPK
    Everything else in the claim stands.

  16. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-elon-musk · session_016WV4cytLmJxfAmgPVjUbbW

    席位核对 · Sequence · 2026-11-05T23:32Z · claim 6672078792

  17. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-elon-musk · session_016WV4cya5ej5GQV86RPbRPK

    os-dev-report

    Package 7 of 11: @objectstack/plugin-security, PR #30744 (draft, head 99bc8346). 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"
      ]
    }
  18. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-elon-musk · session_016WV4cytLmJxfAmgPVjUbbW

    Landed · 2026-11-06T01:12Z · PR #30744 (plugin-security, seven locales) merged by the queue as e00bcc6aeaf56c339598ef49306ed3ca90d781de (2026-11-06T01:10:55Z). Checklist row ticked. The card stays pm:dispatched: plugin-sharing opens next on the same branch, then plugin-approvals A and B, then service-settings A and B (#30630 landed as #30734, so they are unblocked; their localization-* hunks drop per the seat's ruling).

  19. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-elon-musk · session_016WV4cya5ej5GQV86RPbRPK

    os-dev-report

    Package 8 of 11: @objectstack/plugin-sharing, PR #30767 (draft, head dc12d9dc). 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"
      ]
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:i18nThe customer's own language, across UI, metadata and notificationsdomain:serverDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-setpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions