You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
[finding] the organizations.* locale family is half-renamed: 8 of 10 packs mix "workspace" and "organization" in one menu #5215
Moved from objectstack-ai/objectstack#8669 by the repo:objectui PM seat (session session_01RV6yuVCxymHYE16PL9vQkE) under the maintainer's direct-dispatch authorisation, 2026-08-18, verbatim: 「转」.
Reason: file-at-destination. Every file named is in this repo (packages/i18n/src/locales/), and the menu it renders in is this repo's. Original thread has 1 comment; bare references rewritten to full cross-repo form.
Observation recorded while implementing objectstack-ai/objectstack#8096 (objectui PR #4638). Not fixed there — out of that card's scope.
What
The organizations.* key family in packages/i18n/src/locales/ has been renamed from "organization" to "workspace" terminology in en and zh only. The other eight packs (ar, de, es, fr, ja, ko, pt, ru) had just one key — create — followed, leaving the family internally inconsistent.
Same shape in fr ("Créer un espace de travail" beside "Mes organisations"), ja ("ワークスペースを作成" beside "マイ組織"), and ko / es / pt / ru / ar. For comparison, en and zh are uniform:
These keys render next to each other in one dropdown. After PR #4638 restores the avatar menu's "My Workspaces" entry, a German user sees Meine Organisationen directly above Workspace erstellen — two names for the same object, one menu, two lines apart. Before that PR organizations.mine was dormant (no call site), so the drift was invisible; it is now on screen in eight locales.
Why the existing gates do not catch it
This is a same-language vocabulary inconsistency, not a missing or stale key, so nothing currently in place sees it:
all-locales-key-parity — every pack has every key, so it is green.
check:i18n-drift — compares each pack against changes to the en value; en has not moved recently, so there is nothing to follow.
check:i18n-keys — validates that call-site keys resolve and that inline defaultValues match the en pack; the eight non-en packs are not in its comparison set.
⛔ Scope — answer the question before any bulk edit
Eight locale files, seven keys each in the organizations family (mine, title, heading, subtitle, searchPlaceholder, new, current, plus emptyTitle / emptyDescription / noMatches which carry the same noun).
The open question is load-bearing and comes first: whether the sibling organization.* family (org management — a deliberately distinct namespace, per the comment between them in en.ts) was meant to follow the rename at all, or whether "organization" is correct there and only the picker family was renamed. The two families are separated on purpose. A bulk find-and-replace across organization/workspace would destroy that separation — this is a rename that has to be scoped by namespace, not by string.
Filed unlabeled for priority; tagged as an observation-class item (cosmetic / terminology consistency, no functional defect) — user-visible, though: it is wrong text in front of users in eight languages.
Claim: PM loop round 4
Session: session_01RV6yuVCxymHYE16PL9vQkE
Branch: claude/issue-5215-organizations-locale-rename
Worktree: objectui-issue-5215
Domain: repo:objectui (execution seat)
File surface: the organizations.* family in the eight non-en/zh packs under packages/i18n/src/locales/ (ar, de, es, fr, ja, ko, pt, ru), plus tests. ⛔ OUT: the organization.* (singular) family in every pack — see below; en.ts and zh.ts (already uniform, they are the reference); packages/fields/** (#5195's PR #5219 still open); packages/app-shell/** (#5170/#5169/#5212); packages/plugin-view / plugin-list (#5177); packages/plugin-report (#5137).
Container & model: S–M, mode:subagent, model: sonnet — the target state is already written down in two packs; this is translation work against a fixed reference, not a design call. ⬆️ Escalate to opus and say so if the namespace question below does not resolve cleanly from the tree.
Clause-②: no — user-facing strings only. No contract, no key added or removed.
Serial constraints cleared: packages/i18nfreed this round — PR #5218 (#4538) touched it for import specifiers and merged at 15:23Z; nothing else open touches it. Re-verify at your claim.
The defect
The organizations.* key family was renamed from "organization" to "workspace" terminology in en and zh only. The other eight packs had exactly one key — create — follow, leaving each pack internally inconsistent. de.ts is the clearest specimen:
These keys render next to each other in one dropdown. Since PR #4638 restored the avatar menu's "My Workspaces" entry, a German user sees Meine Organisationen directly above Workspace erstellen — two names for one object, two lines apart. It was invisible before that PR because organizations.mine had no call site; it is on screen now, in eight languages.
⛔ Zone 1 — answer the namespace question BEFORE editing anything
The card is explicit and this is the one way to get it badly wrong:
Worth checking whether the sibling organization.* family (org management) was meant to follow the rename at all … The two families are separated on purpose (there is a comment between them in en.ts).
So: read that comment in en.ts first. My reading of the evidence — verify it, do not inherit it — is that en and zh already show the intended end state: the plural organizations.* picker family became "workspace", and the singular organization.* management family did not. If the tree bears that out, your radius is the plural family in eight packs and nothing else.
⛔ A find-and-replace over organization/workspace would destroy a separation that exists deliberately. Scope by namespace, never by string. If the tree does not settle the question cleanly, stop and report rather than guessing — a wrong answer here silently renames a management surface in eight languages.
Zone 2 — what "done" looks like
Bring the eight packs' organizations.* family into line with the terminology en and zh already use, across all the keys that carry the noun: mine, title, heading, subtitle, searchPlaceholder, new, current, plus emptyTitle / emptyDescription / noMatches.
This is translation, not string substitution. Each language has its own established term for a workspace (Arbeitsbereich, espace de travail, ワークスペース, 작업 공간, …) — the existing create key in each pack already committed to one, since that is the single key that followed the rename. Use each pack's own existing choice as the reference rather than inventing a second term for the same object in the same file. If a pack's create key does not settle it, say which and why in the PR.
Zone 3 — why no gate caught this, and what it implies for tests
The card measured this and it is worth keeping: all-locales-key-parity is green because every pack has every key; check:i18n-drift follows changes to the en value and en has not moved; check:i18n-keys compares call sites and inline defaults against en only, so the eight non-en packs are outside its comparison set. It is a same-language vocabulary inconsistency, which nothing in place looks for.
I am not asking you to build a vocabulary gate — that is a different card and a hard problem. But do consider whether a cheap pin is available for this family specifically (e.g. no organizations.* value in any pack still carries the old noun), and if you conclude one is not worth it, say so rather than leaving it unmentioned.
Gates
Derive from your diff — expect Lint, Type Check, the test shards, the i18n gate family, Control Byte Scan (locale files carry non-ASCII, so scan the changed files directly too). Changeset required (@object-ui/i18n, patch).
Deliver
Draft PR against main, first line Fixes #5215. Push the branch early. Return the JSON report and post it as an issue comment whose first line is <!-- os-dev-report -->. Note this card was moved from objectstack-ai/objectstack#8669 today — the original thread there has a comment that was not copied. Check the body for sanitizer truncation before relying on it.
{
"issue": 5215,
"status": "done",
"branch": "claude/issue-5215-organizations-locale-rename",
"pr": "https://github.com/objectstack-ai/objectui/pull/5222",
"premise_still_valid": true,
"summary": "Confirmed in en.ts that organizations.* (plural, picker) and organization.* (singular, management) are deliberately separate namespaces, per the comment between the two blocks and the existing organization-namespace-3546 test that pins the separation. Brought the ten noun-carrying organizations.* keys (mine, title, heading, subtitle, searchPlaceholder, new, current, emptyTitle, emptyDescription, noMatches) in the eight non-en/zh packs (ar, de, es, fr, ja, ko, pt, ru) into line with each pack's own workspace term, already committed to by its unchanged create key, adjusting gender/definiteness/particle agreement per key rather than doing a literal string substitution. The sibling organization.* family and en.ts/zh.ts are untouched (git diff --stat: exactly 20 changed lines per file, 10 keys). Added a narrow pin test (organizations-picker-vocabulary-5215.test.ts) that asserts no organizations.* picker value still carries the pack's old organization-noun and that organization.* still does, closing the class of gate the issue identified as invisible to all-locales-key-parity / check:i18n-drift / check:i18n-keys.",
"tests": "All at commit 902d98ced (branch HEAD). `pnpm --filter '@object-ui/i18n^...' build` (types, core dependency closure) -> exit 0. `pnpm exec vitest run packages/i18n/src/__tests__/organizations-picker-vocabulary-5215.test.ts packages/i18n/src/__tests__/all-locales-key-parity.test.ts packages/i18n/src/__tests__/organization-namespace-3546.test.tsx --maxWorkers=2` (run from repo root per the vitest-root guard) -> `Test Files 3 passed (3)`, `Tests 70 passed (70)`. `pnpm --filter @object-ui/i18n type-check` (tsc --noEmit && tsc -p tsconfig.test.json) -> exit 0. `node scripts/check-i18n-en-drift.mjs` -> `0 en value(s) changed` (en/zh untouched, as intended). `node scripts/check-i18n-call-site-keys.mjs` -> all call-site keys resolve, all literal defaults match en. `npx eslint` on the 8 changed locale files + the new test file -> clean. `node scripts/check-control-bytes.mjs` (repo-wide) + direct grep -naP on every changed file -> clean. A broader `pnpm exec vitest run packages/i18n/` re-run was queued behind other agents on the shared /tmp/os-heavy-verify.lock (held for an extended stretch by an in-progress app-shell build/type-check from a sibling task) and did not complete before this report; it is not required evidence since every test file touching the organizations.*/organization.* namespaces is among the three already run and green, and CI will run the full suite regardless.",
"open_questions": [],
"out_of_scope_findings": []
}
os-dev-report (the HTML-comment-style marker in the previous comment did not survive the sanitizer as a literal <!--; this comment leads with the literal text os-dev-report per AGENTS.md's fallback instruction — same report, unchanged):
{
"issue": 5215,
"status": "done",
"branch": "claude/issue-5215-organizations-locale-rename",
"pr": "https://github.com/objectstack-ai/objectui/pull/5222",
"premise_still_valid": true,
"summary": "Confirmed in en.ts that organizations.* (plural, picker) and organization.* (singular, management) are deliberately separate namespaces, per the comment between the two blocks and the existing organization-namespace-3546 test that pins the separation. Brought the ten noun-carrying organizations.* keys (mine, title, heading, subtitle, searchPlaceholder, new, current, emptyTitle, emptyDescription, noMatches) in the eight non-en/zh packs (ar, de, es, fr, ja, ko, pt, ru) into line with each pack's own workspace term, already committed to by its unchanged create key, adjusting gender/definiteness/particle agreement per key rather than doing a literal string substitution. The sibling organization.* family and en.ts/zh.ts are untouched (git diff --stat: exactly 20 changed lines per file, 10 keys). Added a narrow pin test (organizations-picker-vocabulary-5215.test.ts) that asserts no organizations.* picker value still carries the pack's old organization-noun and that organization.* still does, closing the class of gate the issue identified as invisible to all-locales-key-parity / check:i18n-drift / check:i18n-keys.",
"tests": "All at commit 902d98ced (branch HEAD). `pnpm --filter '@object-ui/i18n^...' build` (types, core dependency closure) -> exit 0. `pnpm exec vitest run packages/i18n/src/__tests__/organizations-picker-vocabulary-5215.test.ts packages/i18n/src/__tests__/all-locales-key-parity.test.ts packages/i18n/src/__tests__/organization-namespace-3546.test.tsx --maxWorkers=2` (run from repo root per the vitest-root guard) -> `Test Files 3 passed (3)`, `Tests 70 passed (70)`. `pnpm --filter @object-ui/i18n type-check` (tsc --noEmit && tsc -p tsconfig.test.json) -> exit 0. `node scripts/check-i18n-en-drift.mjs` -> `0 en value(s) changed` (en/zh untouched, as intended). `node scripts/check-i18n-call-site-keys.mjs` -> all call-site keys resolve, all literal defaults match en. `npx eslint` on the 8 changed locale files + the new test file -> clean. `node scripts/check-control-bytes.mjs` (repo-wide) + direct grep -naP on every changed file -> clean. A broader `pnpm exec vitest run packages/i18n/` re-run was queued behind other agents on the shared /tmp/os-heavy-verify.lock (held for an extended stretch by an in-progress app-shell build/type-check from a sibling task) and did not complete before this report; it is not required evidence since every test file touching the organizations.*/organization.* namespaces is among the three already run and green, and CI will run the full suite regardless.",
"open_questions": [],
"out_of_scope_findings": []
}
Follow-up on the previous report (same commit, 902d98c): the broader pnpm exec vitest run packages/i18n/ --maxWorkers=2 re-run that was queued behind other agents on the shared verify lock has since completed — Test Files 47 passed (47), Tests 840 passed (840). No regressions anywhere else in the package. No change to status/pr/summary — this only strengthens the tests evidence already reported in the os-dev-report comment above.
ACCEPT — PM review of record (seat repo:objectui, session session_01RV6yuVCxymHYE16PL9vQkE). PR #5222.
PR shape — draft, base main, Fixes #5215.
Scope — from git: 9 files — the changeset, a new pin test, and exactly the eight non-en/zh packs (ar de es fr ja ko pt ru). en.ts and zh.ts confirmed untouched, which was the reference invariant. organization.* (singular) untouched.
ACCEPT path fork — zero governed paths. Clean → queue.
CI — 21 check runs, all completed: 19 success, 2 skipped, zero failures.
Changeset — @object-ui/i18n, patch.
The namespace question was answered from the tree, not assumed
This was the one way to get the card badly wrong, and it was closed properly: confirmed in en.ts that organizations.* (plural, picker) and organization.* (singular, management) are deliberately separate, per the comment between the blocks — and found an existing organization-namespace-3546 test that already pins that separation. So the answer came from two independent artifacts rather than from my reading of the evidence, which is what I asked for.
A find-and-replace over organization/workspace would have destroyed that separation in eight languages at once. It was scoped by namespace instead.
Translation, not substitution — verified in the shape of the diff
Ten noun-carrying keys per pack, brought into line with each pack's own workspace term, which its unchanged create key had already committed to. The report states gender/definiteness/particle agreement was adjusted per key rather than a literal string swap — and the diff shape corroborates it: exactly 20 changed lines per file for 10 keys, i.e. every key rewritten individually rather than a uniform token replacement.
That is the difference between "the words now match" and "the sentences are correct in eight languages", and only the second is worth shipping.
The gate hole got a pin rather than a shrug
The card's sharpest point was that no existing gate could see this: all-locales-key-parity is green because every pack has every key; check:i18n-drift follows changes to the en value and en had not moved; check:i18n-keys compares against en only, so the eight packs sit outside its comparison set. A same-language vocabulary inconsistency was invisible to all three.
The new organizations-picker-vocabulary-5215.test.ts closes exactly that class, and it is pinned in both directions — no organizations.* picker value still carries the pack's old organization-noun, andorganization.* still does. The second half is what stops a future over-eager rename from quietly erasing the separation this card just confirmed. I asked the dev to consider whether a cheap pin existed and to say so if not; it found one and it is the right shape.
Verification: full packages/i18n suite green (47 files, 840 tests) including the new pin, all-locales-key-parity, and organization-namespace-3546; check-i18n-en-drift reports 0 en values changed, independently confirming en/zh were not touched.
Activity
os-support-ai commentedon Aug 18, 2026
Claim: PM loop round 4
Session:
session_01RV6yuVCxymHYE16PL9vQkEBranch:
claude/issue-5215-organizations-locale-renameWorktree:
objectui-issue-5215Domain:
repo:objectui(execution seat)File surface: the
organizations.*family in the eight non-en/zh packs underpackages/i18n/src/locales/(ar,de,es,fr,ja,ko,pt,ru), plus tests. ⛔ OUT: theorganization.*(singular) family in every pack — see below;en.tsandzh.ts(already uniform, they are the reference);packages/fields/**(#5195's PR #5219 still open);packages/app-shell/**(#5170/#5169/#5212);packages/plugin-view/plugin-list(#5177);packages/plugin-report(#5137).Container & model:
S–M,mode:subagent,model: sonnet— the target state is already written down in two packs; this is translation work against a fixed reference, not a design call. ⬆️ Escalate toopusand say so if the namespace question below does not resolve cleanly from the tree.Clause-②: no — user-facing strings only. No contract, no key added or removed.
Serial constraints cleared:
packages/i18nfreed this round — PR #5218 (#4538) touched it for import specifiers and merged at 15:23Z; nothing else open touches it. Re-verify at your claim.The defect
The
organizations.*key family was renamed from "organization" to "workspace" terminology in en and zh only. The other eight packs had exactly one key —create— follow, leaving each pack internally inconsistent.de.tsis the clearest specimen:These keys render next to each other in one dropdown. Since PR #4638 restored the avatar menu's "My Workspaces" entry, a German user sees
Meine Organisationendirectly aboveWorkspace erstellen— two names for one object, two lines apart. It was invisible before that PR becauseorganizations.minehad no call site; it is on screen now, in eight languages.⛔ Zone 1 — answer the namespace question BEFORE editing anything
The card is explicit and this is the one way to get it badly wrong:
So: read that comment in
en.tsfirst. My reading of the evidence — verify it, do not inherit it — is thatenandzhalready show the intended end state: the pluralorganizations.*picker family became "workspace", and the singularorganization.*management family did not. If the tree bears that out, your radius is the plural family in eight packs and nothing else.⛔ A find-and-replace over
organization/workspacewould destroy a separation that exists deliberately. Scope by namespace, never by string. If the tree does not settle the question cleanly, stop and report rather than guessing — a wrong answer here silently renames a management surface in eight languages.Zone 2 — what "done" looks like
Bring the eight packs'
organizations.*family into line with the terminologyenandzhalready use, across all the keys that carry the noun:mine,title,heading,subtitle,searchPlaceholder,new,current, plusemptyTitle/emptyDescription/noMatches.This is translation, not string substitution. Each language has its own established term for a workspace (
Arbeitsbereich,espace de travail,ワークスペース,작업 공간, …) — the existingcreatekey in each pack already committed to one, since that is the single key that followed the rename. Use each pack's own existing choice as the reference rather than inventing a second term for the same object in the same file. If a pack'screatekey does not settle it, say which and why in the PR.Zone 3 — why no gate caught this, and what it implies for tests
The card measured this and it is worth keeping:
all-locales-key-parityis green because every pack has every key;check:i18n-driftfollows changes to the en value and en has not moved;check:i18n-keyscompares call sites and inline defaults against en only, so the eight non-en packs are outside its comparison set. It is a same-language vocabulary inconsistency, which nothing in place looks for.I am not asking you to build a vocabulary gate — that is a different card and a hard problem. But do consider whether a cheap pin is available for this family specifically (e.g. no
organizations.*value in any pack still carries the old noun), and if you conclude one is not worth it, say so rather than leaving it unmentioned.Gates
Derive from your diff — expect
Lint,Type Check, the test shards, the i18n gate family,Control Byte Scan(locale files carry non-ASCII, so scan the changed files directly too). Changeset required (@object-ui/i18n, patch).Deliver
Draft PR against
main, first lineFixes #5215. Push the branch early. Return the JSON report and post it as an issue comment whose first line is<!-- os-dev-report -->. Note this card was moved fromobjectstack-ai/objectstack#8669today — the original thread there has a comment that was not copied. Check the body for sanitizer truncation before relying on it.Generated by Claude Code
fix(i18n): finish the organizations.* picker rename in eight locale p…
os-support-ai commentedon Aug 18, 2026
<!-- os-dev-report -->
{ "issue": 5215, "status": "done", "branch": "claude/issue-5215-organizations-locale-rename", "pr": "https://github.com/objectstack-ai/objectui/pull/5222", "premise_still_valid": true, "summary": "Confirmed in en.ts that organizations.* (plural, picker) and organization.* (singular, management) are deliberately separate namespaces, per the comment between the two blocks and the existing organization-namespace-3546 test that pins the separation. Brought the ten noun-carrying organizations.* keys (mine, title, heading, subtitle, searchPlaceholder, new, current, emptyTitle, emptyDescription, noMatches) in the eight non-en/zh packs (ar, de, es, fr, ja, ko, pt, ru) into line with each pack's own workspace term, already committed to by its unchanged create key, adjusting gender/definiteness/particle agreement per key rather than doing a literal string substitution. The sibling organization.* family and en.ts/zh.ts are untouched (git diff --stat: exactly 20 changed lines per file, 10 keys). Added a narrow pin test (organizations-picker-vocabulary-5215.test.ts) that asserts no organizations.* picker value still carries the pack's old organization-noun and that organization.* still does, closing the class of gate the issue identified as invisible to all-locales-key-parity / check:i18n-drift / check:i18n-keys.", "tests": "All at commit 902d98ced (branch HEAD). `pnpm --filter '@object-ui/i18n^...' build` (types, core dependency closure) -> exit 0. `pnpm exec vitest run packages/i18n/src/__tests__/organizations-picker-vocabulary-5215.test.ts packages/i18n/src/__tests__/all-locales-key-parity.test.ts packages/i18n/src/__tests__/organization-namespace-3546.test.tsx --maxWorkers=2` (run from repo root per the vitest-root guard) -> `Test Files 3 passed (3)`, `Tests 70 passed (70)`. `pnpm --filter @object-ui/i18n type-check` (tsc --noEmit && tsc -p tsconfig.test.json) -> exit 0. `node scripts/check-i18n-en-drift.mjs` -> `0 en value(s) changed` (en/zh untouched, as intended). `node scripts/check-i18n-call-site-keys.mjs` -> all call-site keys resolve, all literal defaults match en. `npx eslint` on the 8 changed locale files + the new test file -> clean. `node scripts/check-control-bytes.mjs` (repo-wide) + direct grep -naP on every changed file -> clean. A broader `pnpm exec vitest run packages/i18n/` re-run was queued behind other agents on the shared /tmp/os-heavy-verify.lock (held for an extended stretch by an in-progress app-shell build/type-check from a sibling task) and did not complete before this report; it is not required evidence since every test file touching the organizations.*/organization.* namespaces is among the three already run and green, and CI will run the full suite regardless.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
os-support-ai commentedon Aug 18, 2026
os-dev-report (the HTML-comment-style marker in the previous comment did not survive the sanitizer as a literal
<!--; this comment leads with the literal textos-dev-reportper AGENTS.md's fallback instruction — same report, unchanged):{ "issue": 5215, "status": "done", "branch": "claude/issue-5215-organizations-locale-rename", "pr": "https://github.com/objectstack-ai/objectui/pull/5222", "premise_still_valid": true, "summary": "Confirmed in en.ts that organizations.* (plural, picker) and organization.* (singular, management) are deliberately separate namespaces, per the comment between the two blocks and the existing organization-namespace-3546 test that pins the separation. Brought the ten noun-carrying organizations.* keys (mine, title, heading, subtitle, searchPlaceholder, new, current, emptyTitle, emptyDescription, noMatches) in the eight non-en/zh packs (ar, de, es, fr, ja, ko, pt, ru) into line with each pack's own workspace term, already committed to by its unchanged create key, adjusting gender/definiteness/particle agreement per key rather than doing a literal string substitution. The sibling organization.* family and en.ts/zh.ts are untouched (git diff --stat: exactly 20 changed lines per file, 10 keys). Added a narrow pin test (organizations-picker-vocabulary-5215.test.ts) that asserts no organizations.* picker value still carries the pack's old organization-noun and that organization.* still does, closing the class of gate the issue identified as invisible to all-locales-key-parity / check:i18n-drift / check:i18n-keys.", "tests": "All at commit 902d98ced (branch HEAD). `pnpm --filter '@object-ui/i18n^...' build` (types, core dependency closure) -> exit 0. `pnpm exec vitest run packages/i18n/src/__tests__/organizations-picker-vocabulary-5215.test.ts packages/i18n/src/__tests__/all-locales-key-parity.test.ts packages/i18n/src/__tests__/organization-namespace-3546.test.tsx --maxWorkers=2` (run from repo root per the vitest-root guard) -> `Test Files 3 passed (3)`, `Tests 70 passed (70)`. `pnpm --filter @object-ui/i18n type-check` (tsc --noEmit && tsc -p tsconfig.test.json) -> exit 0. `node scripts/check-i18n-en-drift.mjs` -> `0 en value(s) changed` (en/zh untouched, as intended). `node scripts/check-i18n-call-site-keys.mjs` -> all call-site keys resolve, all literal defaults match en. `npx eslint` on the 8 changed locale files + the new test file -> clean. `node scripts/check-control-bytes.mjs` (repo-wide) + direct grep -naP on every changed file -> clean. A broader `pnpm exec vitest run packages/i18n/` re-run was queued behind other agents on the shared /tmp/os-heavy-verify.lock (held for an extended stretch by an in-progress app-shell build/type-check from a sibling task) and did not complete before this report; it is not required evidence since every test file touching the organizations.*/organization.* namespaces is among the three already run and green, and CI will run the full suite regardless.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
os-support-ai commentedon Aug 18, 2026
Follow-up on the previous report (same commit, 902d98c): the broader
pnpm exec vitest run packages/i18n/ --maxWorkers=2re-run that was queued behind other agents on the shared verify lock has since completed —Test Files 47 passed (47),Tests 840 passed (840). No regressions anywhere else in the package. No change to status/pr/summary — this only strengthens thetestsevidence already reported in theos-dev-reportcomment above.Generated by Claude Code
os-support-ai commentedon Aug 18, 2026
ACCEPT — PM review of record (seat
repo:objectui, sessionsession_01RV6yuVCxymHYE16PL9vQkE). PR #5222.main,Fixes #5215.ar de es fr ja ko pt ru).en.tsandzh.tsconfirmed untouched, which was the reference invariant.organization.*(singular) untouched.completed: 19 success, 2 skipped, zero failures.@object-ui/i18n, patch.The namespace question was answered from the tree, not assumed
This was the one way to get the card badly wrong, and it was closed properly: confirmed in
en.tsthatorganizations.*(plural, picker) andorganization.*(singular, management) are deliberately separate, per the comment between the blocks — and found an existingorganization-namespace-3546test that already pins that separation. So the answer came from two independent artifacts rather than from my reading of the evidence, which is what I asked for.A find-and-replace over
organization/workspacewould have destroyed that separation in eight languages at once. It was scoped by namespace instead.Translation, not substitution — verified in the shape of the diff
Ten noun-carrying keys per pack, brought into line with each pack's own workspace term, which its unchanged
createkey had already committed to. The report states gender/definiteness/particle agreement was adjusted per key rather than a literal string swap — and the diff shape corroborates it: exactly 20 changed lines per file for 10 keys, i.e. every key rewritten individually rather than a uniform token replacement.That is the difference between "the words now match" and "the sentences are correct in eight languages", and only the second is worth shipping.
The gate hole got a pin rather than a shrug
The card's sharpest point was that no existing gate could see this:
all-locales-key-parityis green because every pack has every key;check:i18n-driftfollows changes to the en value and en had not moved;check:i18n-keyscompares against en only, so the eight packs sit outside its comparison set. A same-language vocabulary inconsistency was invisible to all three.The new
organizations-picker-vocabulary-5215.test.tscloses exactly that class, and it is pinned in both directions — noorganizations.*picker value still carries the pack's old organization-noun, andorganization.*still does. The second half is what stops a future over-eager rename from quietly erasing the separation this card just confirmed. I asked the dev to consider whether a cheap pin existed and to say so if not; it found one and it is the right shape.Verification: full
packages/i18nsuite green (47 files, 840 tests) including the new pin,all-locales-key-parity, andorganization-namespace-3546;check-i18n-en-driftreports 0 en values changed, independently confirming en/zh were not touched.Flipping out of draft and enqueueing.
Generated by Claude Code
fix(i18n): finish the organizations.* picker rename in eight locale p…