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. 29 remaining items

  9. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

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

    os-dev-report

    Package 11 of 11, locale 1 of 7: @objectstack/platform-objects in zh-Hant, PR #30951 (head e8d9055e). Over the 3000-line threshold, so the body's 速读 says contract review owed; no reviewer requested (pr_create assigns, the request is the seat's step ③). Tick on merge: none yet (platform-objects still owes ar, fr, pt-BR, ru, de, ko).

    {
      "issue": 30512,
      "status": "done",
      "branch": "claude/project-thread-1jep1s",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30951",
      "session": "session_016WV4cya5ej5GQV86RPbRPK",
      "premise_still_valid": true,
      "summary": "Package 11 of 11, first of its seven locales (platform-objects: zh-Hant), cut from main 33043bd8 after #30931 landed, per the seat's go (ruling B: one PR per locale). Generated objects (1674 leaves) and metadata-forms (1263) bundles written by the repo's own extract from the merge baseline, plus their provenance companion (40 echoes, the same 40 zh-CN decided); hand bundle zh-Hant.ts (138 leaves) with all 138 source digests recorded; registered in SetupAppTranslations and MetadataFormsTranslations through withSourceFallback; apps barrel exports zhHant; extract-config docstring --locales and baseline carry zh-Hant, so check:i18n gates it; the 42 inline page maps (sys_user / sys_organization pages) and the System Overview null label gain zh-Hant. Text: zh-CN converted with OpenCC s2twp plus a 168-rule house glossary matching the zh-Hant bundles nine packages already ship; 446 leaves reuse an existing zh-Hant rendering of the same en + zh-CN pair verbatim. Both pins carried: nav_account_approvals = plugin-approvals my_pending (待我核准), nav_assignment_rules = #30856's object name (指派規則); nav_settings_* also read as #30870's settings hub titles (郵件投遞 / 簡訊投遞).",
      "tests": "Under the verify lock at e8d9055e (frozen-lockfile install, whole tree rebuilt 118/118): platform-objects test (Test Files 117 passed (117), Tests 1636 passed (1636); 1593 before, the 43 new are zh-Hant cases) + typecheck (tsc, scripts tsconfig, check:test-typecheck OK); plugin-security test (246 files, 5686 passed | 45 skipped); plugin-approvals test (115 files, 1502 passed); service-settings test (71 files, 1351 passed); cli test/platform-page-i18n-parity.test.ts (27 passed); VERDICT command-exit 0, one && chain. Typecheck of plugin-security, plugin-approvals, service-settings, cli: 4 x exit 0. check-i18n-bundles (all 10 packages) in sync; check-i18n-stale-fill OK, baseline untouched; check:i18n-coverage OK (426 baselined, none new); check:i18n-walk-parity OK; check:app-nav-i18n OK (5 locales, every id labelled); check-cli-command-ids exit 0 (all at e8d9055e). Per-leaf mechanical lint against zh-CN: code spans, {{holes}}, {holes}, angle tokens, snake_case identifiers identical except 3 intended (Chinese prose inside a hole default / JSON example); no Simplified-only character left (s2t remarks only on the Taiwan forms 台 准 群 游 里). No ablation: content-only change.",
      "gates": "dispatch-gates --commands at e8d9055e: 64 families; --ran: 64 derived, 64 run, 0 NOT-MEASURED (a derived zero; 64 x exit 0). pnpm lint exit 0. CI lane 'Lint · docs & code guards' run locally at e8d9055e: 56 commands (lane-verdict excepted), 56 x exit 0. Records: /mnt/project-files/server-lane-seat1/30512/gates-ran-po-zhHant-e8d9055e.txt, gates-ran-docs-guards-po-zhHant-e8d9055e.txt, gates-ran-extra-po-zhHant-e8d9055e.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": "7271 changed lines (+7216 / -55), 36 files; OVER the 3000-line human-merge threshold (pm-dispatch SKILL.md:187), so the terminal four apply with ③ request; 速读「需要你做的」says contract review owed and asks no approval",
      "files_changed": ".changeset/30512-platform-objects-locales-zh-hant.md; packages/platform-objects/{scripts/i18n-extract.config.ts, src/apps/translations/{zh-Hant.ts, zh-Hant.source-hashes.ts, zh-Hant.objects.generated.ts, zh-Hant.metadata-forms.generated.ts, zh-Hant.source-hashes.generated.ts, setup.translation.ts, index.ts}, src/metadata-translations/index.ts, src/pages/{sys-user,sys-organization}.page.ts, src/apps/dashboards/system.datasets.ts} + 19 platform-objects test files (locale lists widened); packages/plugins/plugin-security/src/people-org-assignment-nav-contribution.test.ts; packages/plugins/plugin-approvals/src/translations/approval-status-vocabulary.test.ts; packages/services/service-settings/src/setup-nav-hub-parity.test.ts; packages/cli/test/platform-page-i18n-parity.test.ts",
      "deviations": "(1) packages/cli/test/platform-page-i18n-parity.test.ts: its inline-map shape regex /^[a-z]{2}(-[A-Z]{2})?$/ rejected the script-subtag tag zh-Hant, so with zh-Hant present it found 0 maps ('expected 0 to be greater than or equal to 38'); widened to also accept a script subtag, and all 42 maps are found complete in 5 locales. (2) Four tests pin the shipped locale set and go red without zh-Hant (plugin.translations, setup-nav-per-user-stores, sys-user-details-tab, system-overview-null-label in this package; people-org-assignment-nav-contribution in plugin-security): each gains zh-Hant, no assertion changed. Fifteen more tests in this package iterate a fixed locale list and now include zh-Hant (coverage widens). (3) Cross-package pins widened to zh-Hant: plugin-approvals my_pending/nav parity, service-settings sidebar/hub-card parity. (4) Root package.json i18n:extract still lists 3 locales; left for the final PR that moves it and check-i18n-bundles to PLATFORM_LOCALES (the docstring, which check:i18n executes, carries zh-Hant now). (5) check:i18n-stale-fill found one cross-locale coincidence: zh-CN action.fields.method.helpText is the Latin 'GET / POST / PUT / DELETE', and the converted zh-Hant copy matched it; zh-Hant now translates it, zh-CN untouched (existing fills out of scope). (6) turbo build at --concurrency=3 (one agent in this container). (7) Assignee os-elon-musk per #30796.",
      "mcp_calls": "1 read-only since the settings B report — mcp__github__pull_request_read x1 (#30931 get); no write tool. Plus subscribe_pr_activity on #30951 (session tool, not GitHub).",
      "api_writes": "2 — relay pr_create (fw-20261106T135109Z-90a5d9, run 42228847677 -> #30951, 10400 bytes read back identical, assignee os-elon-musk, no labels, no reviewers); this os-dev-report via post-stamped. Plus 1 git push (not REST).",
      "open_questions": [],
      "security_findings": "withheld",
      "out_of_scope_findings": ["zh-CN quality notes seen while deriving zh-Hant, not changed: action.fields.method.helpText is not a translation (Latin method list); sys_business_unit.fields.organization_id.help reads only '租户范围。' (the en help's second sentence is not rendered)."]
    }
  10. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

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

    ACCEPT → PR #30951 comment 6686945552 · 2026-11-06T14:18Z · platform-objects PR 1 of 7 (zh-Hant), head e8d9055e, contract review PASS 6686780589. Over the 3000-line human-merge line: pm:awaiting-merge set and review requested from os-zhuang and hotlong. The seat lands it after an APPROVE. The card stays pm:dispatched; the ar PR waits for this one to land.

  11. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-tesla · session_01L9qibyvxbrLP4jm4PargoH

    Landing · 2026-11-06T17:31Z · PR #30951 (zh-Hant) MERGED 2026-11-06T17:10Z as a11ef71e, landed by this seat on domain:server#1's hand-over (6690664327 on mailbox #30985).

    The card stays open: the remaining locales are not on main. domain:server#1 left the thread handoff draft for them in its project files (server-lane-seat1/30512/handoff/). The card goes back to pm:queue with no assignee; the next claimant resumes from that handoff and this comment.

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

    @objectstack-fleet
    ContributorAuthor

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

    Handoff: #30512 stops here. The lane is winding down, so nothing after #30951 is opened from this seat, and this comment is for whoever resumes the card.

    Landed

    Package 11 (@objectstack/platform-objects) therefore ships en, zh-CN, ja-JP, es-ES and zh-Hant.

    What remains

    1. platform-objects in ar, fr, pt-BR, ru, de and ko, one PR per locale (the seat's ruling B). Each PR opens only after the previous one lands.
    2. The final PR moves the root pnpm i18n:extract --locales and scripts/check-i18n-bundles.mjs to the platform locale table (PLATFORM_LOCALES) and carries Fixes #30512. Every earlier PR says Part of #30512.

    What is parked, and where

    Everything below is in the project files under server-lane-seat1/30512/handoff/. The container branch that held it will not survive this session.

    • ar: done but not opened. ar-2671d677-on-e8d9055e.patch is commit 2671d677, cut on the zh-Hant head e8d9055e. git apply --check applies it cleanly on today's main (bcf8a37e08, after i18n(platform-objects): ship the platform objects, Setup, Studio and Account in zh-Hant #30951's squash). At 2671d677 the lock run passed (platform-objects 1681 tests; plugin-security, plugin-approvals, service-settings and the cli page-parity test all green), and all 63 derived gates exited 0 (gates-ran-po-ar-2671d677.txt). The 9 extra commands and the 56-command docs & code guards lane were not run for ar. The PR body draft is po/pr-po-ar-body.draft.md inside the tarball.
    • fr: translated, not in the repo. The tarball holds po/loc/fr/00..17.tsv (every generated leaf), po/loc/fr/inline.json (the inline page maps), po/out-fr/fr.ts (the hand bundle draft) and po/entries-fr.json. It too still needs the four feat(console): put Connect an AI Assistant where each person looks, and call it that #30935 keys (ui/packages/i18n fr: «Assistant IA», «Connecter un assistant IA»).
    • pt-BR, ru, de, ko: work lists only (po/loc/<locale>-work.json and -chunks.json). po/ui-ai-assistant-wording.txt lists the UI package's wording for the feat(console): put Connect an AI Assistant where each person looks, and call it that #30935 keys in each locale.
    • Generators: po-scratch-generators-and-data.tgz. In pipeline order:
      1. mkwork.py builds the work list and chunks;
      2. showchunk.py and loccheck.py help with review;
      3. gen-loc.py turns the translated TSVs into an entries file;
      4. write-gen-loc.mts writes the generated bundles;
      5. write-hashes-loc.mts writes the hand-bundle hashes;
      6. write-hand-loc.py / write-hand-loc-ar-tpl.py write the hand bundle;
      7. inline-loc2.py (dict key prevKey files…) fills the 42 inline maps;
      8. lint-loc.py runs the per-leaf mechanical lint against en;
      9. ar-commas.py normalizes the Arabic comma (ar only).
      • Also in the tarball: zhhant.py and gen-zhhant.py, the zh-Hant path (OpenCC s2twp plus the house glossary). Next to the tarball are the gate lists cmds-po-extra.txt, cmds-docs-guards-run.txt and run-gates.sh.

    Traps a successor needs


    Generated by Claude Code

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

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · marchtian · session_017ihL2fBJ6xsLWJsnNJGMMx

    Claim: PM loop round 1 · #30512 platform-objects ar (locale PR 1 of 6, then the final PR) · 2026-11-07T11:13Z · resumes hand-off 6691405940 (domain:server#1)
    Session: session_017ihL2fBJ6xsLWJsnNJGMMx
    Account: marchtian (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-bmf2vu (the card thread's harness-pinned branch, platform exception to claude/issue-<n>-<slug>; each later locale gets its own branch, cut fresh from main after the previous PR lands)
    Worktree: objectstack-issue-30512
    Domain: domain:server
    Seat: domain:server#2
    File surface (this PR): packages/platform-objects/** (the ar generated and hand bundles, source hashes, registration lines, extract config, setup.translation.ts, the 42 inline page maps, locale lists in its tests); the cross-package locale-list tests in plugin-security, plugin-approvals, service-settings and packages/cli/test/platform-page-i18n-parity.test.ts; one .changeset/30512-*.md. ⛔ packages/spec/**, ui/**, the built-in email templates and EMAIL_TEMPLATE_FLOOR_LOCALE. Stop on breach; explain in the report.
    Container & model: L, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: default (the project's default effort)
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6691405940
    Premise: holds. On origin/main aa3e21cc, packages/platform-objects/src/apps/translations carries en, zh-CN, ja-JP, es-ES and zh-Hant only; the root i18n:extract still lists zh-CN,ja-JP,es-ES; check-i18n-bundles.mjs does not read PLATFORM_LOCALES. The parked ar patch named in 6691405940 lives in another account's project and is not reachable, so ar is translated afresh.
    Serial constraints cleared: no other claim edits packages/platform-objects/src/apps/translations; #28107 (fr) waits on this card's fr PR and is not dispatched. Open PR #31013 (service-settings, plugin-auth) may touch service-settings tests; merge main before opening and before landing.

    Seat call B is kept (one PR per locale, ar → fr → pt-BR → ru → de → ko, then the final PR with Fixes); ruling F of #29349 governs (every platform language complete on every surface, no new gate). Each PR is over 3000 lines, so it owes the seat's contract review and a human merge. Order: project file server-seat-2/orders/30512-ar.md, delivered as the card thread's opening message.

  16. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · marchtian · session_017ihL2c6VJSYt3p57JSNBqP
    os-dev-report

    {
     "issue": 30512,
     "status": "done",
     "branch": "claude/project-thread-bmf2vu",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/31120",
     "head_sha": "4281e7faafd9540fea3f11d2e22704de9d69ef8d",
     "session": "session_017ihL2c6VJSYt3p57JSNBqP",
     "premise_still_valid": true,
     "summary": "Adds the ar locale to @objectstack/platform-objects exactly as #30951 added zh-Hant: generated objects (1676) and metadata-forms (1263) bundles with their provenance table, the hand bundle ar.ts (139) with ar.source-hashes.ts recording the en digest of every hand leaf, registration in the extract config, setup.translation.ts, the apps barrel and metadata-translations/index.ts, 42 inline maps, and ar in every locale-list test #30951 widened plus the four cross-package tests. Translated from scratch from main's en, terminology aligned with ui/packages/i18n ar; only identifiers and code examples stay byte copies of en. Changeset .changeset/30512-platform-objects-ar.md (patch).",
     "leaf_counts": {
      "en": 3078,
      "ar": 3078,
      "untranslated": 0,
      "identifier_echoes": 17,
      "echo_note": "16 recorded in ar.source-hashes.generated.ts (JWKS, JWKS URI, Message-ID, cron, API option, SSO placeholders, JSON examples, snake_case) plus Studio in the hand bundle"
     },
     "inline_maps_filled": {
      "sys-user.page.ts": 35,
      "sys-organization.page.ts": 6,
      "system.datasets.ts nullLabel": 1,
      "total": 42
     },
     "pins_checked": [
      "grp_account_ai_assistant = مساعد الذكاء الاصطناعي",
      "nav_connect_agent (account and setup) and pages.connect_agent.label = ربط مساعد ذكاء اصطناعي",
      "nav_account_approvals = plugin-approvals my_pending label بانتظار موافقتي (approval-status-vocabulary test green)",
      "nav_assignment_rules = sys_assignment_rule pluralLabel قواعد الإسناد",
      "nav_settings_* = service-settings hub titles, all 10 (setup-nav-hub-parity test green for ar)",
      "nav_sso_providers = sys_sso_provider pluralLabel",
      "nav_approval_requests/delegations = plugin-approvals object plural labels, as zh-Hant does",
      "Position: add-record الموضع, job position المنصب; hook Body المتن"
     ],
     "tests": "platform-objects vitest run: 117 files, 1683 tests passed. plugin-approvals approval-status-vocabulary 6/6, plugin-security people-org-assignment-nav-contribution 5/5, service-settings setup-nav-hub-parity 13/13, cli platform-page-i18n-parity + i18n-inline-locale-map-coverage 44/44. os i18n extract with --locales=zh-CN,ja-JP,es-ES,zh-Hant,ar regenerated the ar bundles byte-identical and left every other locale unchanged. Mechanical lint over all 3078 leaves: 0 missing, 0 placeholder/backtick/template mismatches except the deliberate translated default in update_member_role.description, 0 strings opening with os, 0 glued proclitic waw before a Latin token, 0 ASCII-comma identifier lists.",
     "gates": "dispatch-gates --ran on the merged tree: 64 derived, 64 run, 0 NOT-MEASURED, all exit 0 (check-plugin-teardown-shape --self-test first exit 3, prerequisite fetched, then 0). pnpm lint exit 0; platform-objects typecheck exit 0; all 57 commands of Lint docs and code guards exit 0 incl. check:cli-command-ids. PR check-runs at 4281e7fa: every lint, type-check, changeset, PR-body, size, queue-guard and Test Core shards 1,2,4,5,6,7,8 success; Test Core (3/8) failure (and the Test Core roll-up), see open_questions.",
     "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
     "mcp_calls": "5 — read only: subscribe_pr_activity 1, pull_request_read get_check_runs 2, get_job_logs 2",
     "api_writes": "2 — git push of the branch (2 pushes); pr_create via fleet-write relay request fw-20261107T130420Z-f12368 (run 42375264933, read-back identical, PR #31120 draft, no assignees); this comment via post-stamped",
     "open_questions": [
      {
       "question": "Test Core (3/8) is red on runtime src/domains/mcp-object-schema-mask.test.ts (ADR-0106 D1 CONTROL, REST cached arm, usr_author item st_ping). Expected and received bodies are byte-identical except the Last-Modified header, one second apart: the secured and unsecured deployments are booted on either side of a second boundary. This PR touches no runtime code and the test passes 45/45 locally on the same head. It is a timing flake in the test #31104 added. A dev never re-runs, so the re-run is the seat's.",
       "options": [
        "A seat re-runs the failed jobs of run 42375309941 once with scripts/pm/rerun-failed.mjs",
        "B leave red until a fix to the test lands"
       ],
       "recommendation": "A, because the only difference is a wall-clock header unrelated to this diff; a second failure would be real"
      }
     ],
     "security_findings": "none",
     "out_of_scope_findings": [
      "class: a · reach: named producer, runtime mcp-object-schema-mask.test.ts CONTROL arms compare wireText including Last-Modified across two separately booted deployments, so any run straddling a second boundary fails · evidence: PR #31120 run 42375309941 job 128412039985, Expected Last-Modified 13:09:41 vs Received 13:09:40, all other bytes equal · dedupe words: mcp-object-schema-mask Last-Modified flake",
      "carrier: seat · noted, not filed"
     ]
    }
  17. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · marchtian · session_017ihL2fBJ6xsLWJsnNJGMMx

    Landed — ar · 2026-11-07T16:18Z

    PR #31120 merged 2026-11-07T16:16Z as eb68b98149: the ar bundles for @objectstack/platform-objects (objects, metadata forms, hand-authored app strings, provenance tables), level with main as of the merge. The card stays open for the remaining locales; fr is next (it unblocks #28107). The seat dispatches it when the lane is under its concurrency cap.

  18. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · marchtian · session_017ihL2fBJ6xsLWJsnNJGMMx

    Claim: PM loop round 1 · #30512 platform-objects fr (locale PR 2 of 6, then the final PR) · 2026-11-07T17:35Z · ar landed as PR #31120 (eb68b98149)
    Session: session_017ihL2fBJ6xsLWJsnNJGMMx
    Account: marchtian (the card's assignee)
    Branch: claude/project-thread-0xddsd (the fr card thread's harness-pinned branch, cut from main 4c318214; platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-30512-fr
    Domain: domain:server
    Seat: domain:server#2
    File surface (this PR): packages/platform-objects/** (the fr generated and hand bundles, source hashes, registration lines, extract config, setup.translation.ts, the inline page label maps, locale lists in its tests); the cross-package locale-list tests #31120 touched (plugin-security, plugin-approvals, service-settings, packages/cli/test/platform-page-i18n-parity.test.ts); one .changeset/30512-*.md. ⛔ packages/spec/**, ui/**, the built-in email templates and EMAIL_TEMPLATE_FLOOR_LOCALE.
    Container & model: L, mode:thread, model: TIER_DEFAULT, effort: default
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6691405940
    Premise: holds. On origin/main 4c3182140e, packages/platform-objects/src/apps/translations carries ar but no fr; #28107 (French users read English sys_user labels) is still open.
    Serial constraints cleared: ar landed; no other claim edits packages/platform-objects/src/apps/translations. #28107 is claimed on this same branch, and this PR carries Fixes #28107.

    Seat call B is kept (one PR per locale, ar → fr → pt-BR → ru → de → ko, then the final PR with Fixes #30512). The PR is over 3000 lines, so it needs the seat's contract review and a human merge. The order is the project file server-seat-2/orders/30512-fr.md.

  19. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · marchtian · session_017ihL2ec75dnuTosWYEaazT

    os-dev-report

    {
      "issue": 30512,
      "status": "done",
      "branch": "claude/project-thread-0xddsd",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/31233",
      "session": "session_017ihL2ec75dnuTosWYEaazT",
      "premise_still_valid": true,
      "summary": "Added the fr locale to @objectstack/platform-objects file by file as #31120 added ar: generated objects and metadata-forms bundles, the hand bundle fr.ts with its source digests, 43 inline record-page maps, registration, and fr in every test locale list ar widened. The PR also carries Fixes #28107 with one plugin-audit test that a fr or fr-FR reader's activity summary names sys_user fields in French. Head dd9303ac18 includes a merge of origin/main.",
      "leaf_counts": {
        "en": 3100,
        "fr": 3100,
        "untranslated": 0,
        "detail": "objects 1697 + metadata-forms 1263 + hand fr.ts 140; deliberate byte copies of en recorded by the extract: 183 generated (cognates, identifiers, JSON examples) + 16 hand (Notifications, Sessions, Studio, Webhooks, Hooks, Pages, ...)"
      },
      "inline_maps_filled": "43 (sys-user.page.ts 36, sys-organization.page.ts 6, system.datasets.ts 1), same as ar",
      "pins_checked": "nav_account_approvals = plugin-approvals fr my_pending 'Mes approbations en attente'; nav_assignment_rules = sys_assignment_rule fr pluralLabel 'Règles d’attribution'; nav_settings_* incl. access_policy = service-settings fr hub titles; nav_settings_hub = ui fr backToHub 'Tous les paramètres'; grp_account_ai_assistant 'Assistant IA'; both nav_connect_agent + pages.connect_agent.label 'Connecter un assistant IA'. approval-status-vocabulary, people-org-assignment-nav-contribution, setup-nav-hub-parity green with fr.",
      "tests": "platform-objects vitest 119 files / 1746 tests passed; platform-objects typecheck exit 0; plugin-approvals approval-status-vocabulary 6/6, plugin-security people-org-assignment-nav-contribution 5/5, service-settings setup-nav-hub-parity 15/15, cli platform-page-i18n-parity 27/27, plugin-audit activity-summary-fr-sys-user-labels 5/5. Ablation: dropping SetupAppTranslations.fr from the service fails 3/5 with 'A modifié User « Carl Edited » : Banned et Ban Reason'. os i18n extract --locales=zh-CN,ja-JP,es-ES,zh-Hant,ar,fr reproduces both fr bundles byte-identical, before and after the merge.",
      "gates": "dispatch-gates --commands at dd9303ac: 64 families, each run with exit captured before any pipe; --ran: 64 derived, 64 run, 0 NOT-MEASURED, all exit 0. pnpm lint exit 0. Lint · docs & code guards lane: 52/53 steps exit 0 locally (incl. check:i18n-stale-fill, check:cli-command-ids); step 53 lane-verdict.mjs exits 3 locally (GITHUB_JOB unset), CI-only. CI check-runs not yet read.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "mcp__github__issue_read only (reads of #30512 and #28107, at least 3); no write tool",
      "api_writes": "2 — relay pr_create (fleet-write run 42404428572, #31233); this os-dev-report comment via post-stamped; plus git push (not REST)",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [],
      "deviations": "PR left unassigned with no labels, as the order says. Fixes #28107 placed on line 4 after Part of #30512 per the order. 7535 changed lines: over the 3000 human-merge threshold."
    }

    Generated by Claude Code

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