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.
Settings source badges hard-code the English verbs Overrides / Inherited from (zh-CN reads "Overrides 默认") #12694
Filing gate ①: a user-visible product defect with a named landing and a reproduction. Reach: the console Settings page on a zh-CN session.
Reader who acts: the objectui console lane seat owning apps/console/src/pages/settings/SettingsField.tsx.
What
The settings source badges' verb prefixes, Overrides and Inherited from, are hard-coded English. On a zh-CN session the badge reads "Overrides 默认": the source label is translated, the verb is not.
Under Settings → Localization, save a tenant value.
Open /_console/apps/setup/system/settings/localization.
Expected: the whole badge is in zh.
Actual: "Overrides 默认".
Mechanism
apps/console/src/pages/settings/SettingsField.tsx carries literal Overrides / Inherited from strings, with no i18n key. The code path is present on objectui maind66ceea5.
Dedupe
MCP search_issues on objectstack-ai/objectui, closed included → 6 hits, none matching (by the cloud runner).
Why p3: two hard-coded English verbs on the settings source badges.
Lane:domain:ui. Re-read on main5c0846ebd8: apps/console/src/pages/settings/SettingsField.tsx:98 still prints Overrides. This is the same file as objectui#12671 (p2); check for overlap at the claim.
Claim: PM loop round 2
Session: session_01Vk15bz8xHtKGUfXfCm16h4
Account: os-elon-musk (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12694-settings-badge-verbs
Worktree: objectui-issue-12694
Domain: domain:ui
Seat: domain:ui#3
File surface: apps/console/src/pages/settings/SettingsField.tsx (the source badges' Inherited from / Overrides literals, :119 and :128 on maina8add5c); the string table that page already translates through (the console's settings strings or packages/i18n/src/locales/*.ts, the settings section only, all ten bundles if it is the latter); tests beside each; one .changeset/12694-*.md (stop on breach; explain in the report)
Container & model: S, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui over the named paths: no path-derived mandate)
Clause-②: no (no export, prop or type changes)
Responsibility: the console's settings page draws its source badges' verbs, Inherited from and Overrides, as English literals beside a translated source label, so a zh-CN badge reads "Overrides 默认" | none covers it | every non-English admin who reads a setting's source, measured on zh-CN (QA objectstack-ai/objectstack#23951); the literals stand on maina8add5c
Thread-read: 6218533870
Serial constraints cleared:
No in-flight domain:ui claim and no open objectui PR names apps/console/src/pages/settings/, read across the lane's pm:dispatched claims and all 8 open PRs' file lists 2026-10-16T22:09Z.
The card was re-read unassigned, in pm:queue, immediately before this claim's label write.
os-dev-report
{
"issue": 12694,
"status": "done",
"branch": "claude/issue-12694-settings-badge-verbs",
"pr": "#12819",
"session": "session_01Vk15bz8xHtKGUfXfCm16h4 (subagent run; the dispatching seat's id, as the claim and the Claude-Session trailer name it)",
"premise_still_valid": true,
"summary": "Reproduced on unchanged main c054d01 in a real browser (console under Vite against objectstack 66d456d01 examples/app-crm, zh-CN via the user menu, tenant Default country saved): badges read ["Overrides 默认","Overrides 默认"]; after the fix ["覆盖默认","覆盖默认"], and en reads ["Overrides Default","Overrides Default"]. InheritanceBadges now asks t() for console.settingsView.sourceBadgeInherited ('Inherited from {{source}}') and console.settingsView.sourceBadgeOverrides ('Overrides {{source}}'), one sentence per badge with the server's layer label interpolated, real translations in all ten packs (ja/ko place the layer first, ru uses a colon form), English byte-identical. Mechanism hypothesis 1 measured false: sourceText reads the SERVER-served settingsCommon.sourceLabels (spec strictObject whose only member is sourceLabels, 4 server locales) while the page's other chrome reads console.settingsView in packages/i18n (10 packs), so the verbs went into the latter (the claim surface's second option, precedent objectui#4024 lockedByEnv); a settingsCommon key would need an objectstack spec change. PR line 2 copies the claim's Clause-② line verbatim ('Clause-②: no (no export, prop or type changes)'); card assignee and labels untouched, zero label writes (objectui path labels came from labeler.yml).",
"tests": "Red-first on unchanged SettingsField.tsx and packs (prediction written in the test header first): pnpm exec vitest run apps/console/src/pages/settings/tests/SettingsField.sourceBadgeLocale-12694.test.tsx → 'Tests 12 failed | 2 passed (14)'; zh: "expected 'Overrides 默认' not to match /\p{Script=Latin}/u", "expected 'Inherited from 全局' not to match ..."; 10 pack cases "expected 'undefined' to be 'string'"; the 2 en must-not-change cases passed as predicted. After (6cedffa): 'Tests 14 passed (14)', lock VERDICT command-exit 0. Ablations at 6cedffa via objectstack scripts/ablation-replace.mjs (anchor hit 1→0, blob changed, restore proven blob==HEAD and git diff HEAD empty): (1) zh pins, both zh pack values replaced by the English sentences → 'Tests 3 failed | 11 passed (14)' (both zh cases plus the zh pack case "expected 'Inherited from {{source}}' not to be ..."); (2) en pins, en values changed to 'Overrides: {{source}}' / 'Inherited from: {{source}}' → 'Tests 2 failed | 12 passed (14)' ("expected 'Overrides: Default' to be 'Overrides Default'", "expected 'Inherited from: Global' to be 'Inherited from Global'"). No rebuild between mutation and reading: root vitest.config.mts aliases @object-ui/i18n to packages/i18n/src (the green after editing src without a build is the measured proof). Suites: pnpm exec vitest run apps/console/src/pages/settings/ packages/i18n/ at 6cedffa → 'Test Files 101 passed (101)', 'Tests 1470 passed | 13 skipped (1483)', VERDICT command-exit 0.",
"gates": "Local, all at HEAD 6cedffa, exit captured before any pipe: closure build 'turbo run build --filter=@object-ui/console^... --concurrency=2' under the lock → 'Tasks: 34 successful, 34 total', VERDICT command-exit 0; 'pnpm --filter @object-ui/console --filter @object-ui/i18n run type-check' → exit 0 (console tsc --listFiles includes the new test file: 1 hit); eslint on the 12 changed source files → exit 0, 0 errors (2 pre-existing no-explicit-any warnings in SettingsField.tsx outside the diff); pnpm check:i18n-keys → exit 0; pnpm check:i18n-drift → exit 0 ('0 en value(s) changed (2 key(s) added, 0 removed)'); pnpm check:new-line-citations → exit 0 ('VERDICT new-cross-file-line-citations: 0 new citation(s)'); node scripts/check-changeset-presence.mjs → exit 0; node scripts/check-governed-queue-guard.mjs --test over the 13 paths → 'NOT GOVERNED'; control-byte self-scan grep exit 1 (none). --ran reconciliation: not applicable, dispatch-gates.mjs is objectstack-only, the objectui list is the dispatch's hand-derived one and every item ran. CI check-runs on 6cedffa read once at report time (35): success = Changeset Fixed Group Check, Changeset Claim Re-read, Changeset Declaration, Line Citation Gate, Changeset Bump Policy, Governed Surface Queue Guard, label; skipped = dependabot, Test (coverage), Test (coverage shard matrix); in_progress = Test shards 1-16 of 16, Type Check, Lint, Repo Gates, Build & E2E, Build Docs, Test (dist pins), Bundle Analysis, Changeset Overwrite Report, Live E2E (informational). Not awaited, per contract.",
"mcp_calls": "0",
"api_writes": "3 writes in 2 fleet-relay strokes (each stroke one seat-side POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): stroke 1 pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos//issues/12819/assignees (os-elon-musk), read-back 7830 bytes sent / 7830 stored identical; stroke 2 = POST /repos//issues/12694/comments (this os-dev-report). Plus 2 git pushes (empty-branch probe, commit 6cedffa), not REST. 0 label writes, 0 PR-body PATCH, 0 card writes.",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: public door, Settings then Localization on a zh-CN session with OS_LOCALIZATION_DEFAULT_COUNTRY=CN (objectstack 66d456d01 examples/app-crm, console at this branch): the env-lock chip reads 'Locked by env' (Playwright read [["Locked by env","Set via env: OS_LOCALIZATION_DEFAULT_COUNTRY"]], html lang zh-CN) · evidence: EnvLockBadge in apps/console/src/pages/settings/EnvLockBadge.tsx draws the text 'Locked by env' and its fallback title as English literals; same family as this card (hard-coded English chip on a settings row), fix shape one console.settingsView key in all ten packs; the tooltip is the server's lockedReason ('Set via env: NAME', objectstack service-settings), a separate seam · dedupe words: EnvLockBadge, Locked by env, settings env lock chip, zh-CN settings badge English",
"carrier: none · noted, not filed: FieldHeader's 'Deprecated' chip (and its replacedBy arrow) is an English literal, but no platform settings manifest declares a deprecated specifier, so nothing draws it (zero producers); in the PR's Acceptance notes",
"carrier: none · noted, not filed: the server ships settingsCommon.sourceLabels for en, es-ES, ja-JP and zh-CN only, so in the console's de/fr/ko/pt/ru/ar the now-translated verb sits beside an English layer label (e.g. 'Überschreibt Default'); server bundle language coverage, not this badge; in the PR's Acceptance notes",
"carrier: none · noted, not filed: @objectstack/spec's settingsCommon docstring lists 'source badges, inheritance chips, lock reasons, common actions' while the declared strictObject has sourceLabels only; declared shape governs, this change reads no undeclared key; in the PR's Acceptance notes"
]
}
ACCEPT → PR #12819 comment 6226224698 · domain:ui seat 3 · session_01Vk15bz8xHtKGUfXfCm16h4 · 2026-10-16T22:55Z. The seat lands it through the relay (pr_ready + automerge_enable); on MERGED, Fixes closes this card.
Activity
objectstack-fleet commentedon Oct 16, 2026
Triage: first grade,
bug·priority:p3·domain:ui·area:i18n·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T15:12ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
domain:ui. Re-read onmain5c0846ebd8:apps/console/src/pages/settings/SettingsField.tsx:98still printsOverrides. This is the same file as objectui#12671 (p2); check for overlap at the claim.objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 2
Session:
session_01Vk15bz8xHtKGUfXfCm16h4Account:
os-elon-musk(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12694-settings-badge-verbsWorktree:
objectui-issue-12694Domain:
domain:uiSeat:
domain:ui#3File surface:
apps/console/src/pages/settings/SettingsField.tsx(the source badges'Inherited from/Overridesliterals,:119and:128onmaina8add5c); the string table that page already translates through (the console's settings strings orpackages/i18n/src/locales/*.ts, the settings section only, all ten bundles if it is the latter); tests beside each; one.changeset/12694-*.md(stop on breach; explain in the report)Container & model:
S,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuiover the named paths: no path-derived mandate)Clause-②: no (no export, prop or type changes)
Responsibility: the console's settings page draws its source badges' verbs,
Inherited fromandOverrides, as English literals beside a translated source label, so a zh-CN badge reads "Overrides 默认" | none covers it | every non-English admin who reads a setting's source, measured on zh-CN (QA objectstack-ai/objectstack#23951); the literals stand onmaina8add5cThread-read: 6218533870
Serial constraints cleared:
packages/i18n/src/locales/*.ts. If this card lands in the same bundles, it is serial by region: whichever lands later mergesmain.domain:uiclaim and no open objectui PR namesapps/console/src/pages/settings/, read across the lane'spm:dispatchedclaims and all 8 open PRs' file lists 2026-10-16T22:09Z.pm:queue, immediately before this claim's label write.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{
"issue": 12694,
"status": "done",
"branch": "claude/issue-12694-settings-badge-verbs",
"pr": "#12819",
"session": "session_01Vk15bz8xHtKGUfXfCm16h4 (subagent run; the dispatching seat's id, as the claim and the Claude-Session trailer name it)",
"premise_still_valid": true,
"summary": "Reproduced on unchanged main c054d01 in a real browser (console under Vite against objectstack 66d456d01 examples/app-crm, zh-CN via the user menu, tenant Default country saved): badges read ["Overrides 默认","Overrides 默认"]; after the fix ["覆盖默认","覆盖默认"], and en reads ["Overrides Default","Overrides Default"]. InheritanceBadges now asks t() for console.settingsView.sourceBadgeInherited ('Inherited from {{source}}') and console.settingsView.sourceBadgeOverrides ('Overrides {{source}}'), one sentence per badge with the server's layer label interpolated, real translations in all ten packs (ja/ko place the layer first, ru uses a colon form), English byte-identical. Mechanism hypothesis 1 measured false: sourceText reads the SERVER-served settingsCommon.sourceLabels (spec strictObject whose only member is sourceLabels, 4 server locales) while the page's other chrome reads console.settingsView in packages/i18n (10 packs), so the verbs went into the latter (the claim surface's second option, precedent objectui#4024 lockedByEnv); a settingsCommon key would need an objectstack spec change. PR line 2 copies the claim's Clause-② line verbatim ('Clause-②: no (no export, prop or type changes)'); card assignee and labels untouched, zero label writes (objectui path labels came from labeler.yml).",
"tests": "Red-first on unchanged SettingsField.tsx and packs (prediction written in the test header first): pnpm exec vitest run apps/console/src/pages/settings/tests/SettingsField.sourceBadgeLocale-12694.test.tsx → 'Tests 12 failed | 2 passed (14)'; zh: "expected 'Overrides 默认' not to match /\p{Script=Latin}/u", "expected 'Inherited from 全局' not to match ..."; 10 pack cases "expected 'undefined' to be 'string'"; the 2 en must-not-change cases passed as predicted. After (6cedffa): 'Tests 14 passed (14)', lock VERDICT command-exit 0. Ablations at 6cedffa via objectstack scripts/ablation-replace.mjs (anchor hit 1→0, blob changed, restore proven blob==HEAD and git diff HEAD empty): (1) zh pins, both zh pack values replaced by the English sentences → 'Tests 3 failed | 11 passed (14)' (both zh cases plus the zh pack case "expected 'Inherited from {{source}}' not to be ..."); (2) en pins, en values changed to 'Overrides: {{source}}' / 'Inherited from: {{source}}' → 'Tests 2 failed | 12 passed (14)' ("expected 'Overrides: Default' to be 'Overrides Default'", "expected 'Inherited from: Global' to be 'Inherited from Global'"). No rebuild between mutation and reading: root vitest.config.mts aliases @object-ui/i18n to packages/i18n/src (the green after editing src without a build is the measured proof). Suites: pnpm exec vitest run apps/console/src/pages/settings/ packages/i18n/ at 6cedffa → 'Test Files 101 passed (101)', 'Tests 1470 passed | 13 skipped (1483)', VERDICT command-exit 0.",
"gates": "Local, all at HEAD 6cedffa, exit captured before any pipe: closure build 'turbo run build --filter=@object-ui/console^... --concurrency=2' under the lock → 'Tasks: 34 successful, 34 total', VERDICT command-exit 0; 'pnpm --filter @object-ui/console --filter @object-ui/i18n run type-check' → exit 0 (console tsc --listFiles includes the new test file: 1 hit); eslint on the 12 changed source files → exit 0, 0 errors (2 pre-existing no-explicit-any warnings in SettingsField.tsx outside the diff); pnpm check:i18n-keys → exit 0; pnpm check:i18n-drift → exit 0 ('0 en value(s) changed (2 key(s) added, 0 removed)'); pnpm check:new-line-citations → exit 0 ('VERDICT new-cross-file-line-citations: 0 new citation(s)'); node scripts/check-changeset-presence.mjs → exit 0; node scripts/check-governed-queue-guard.mjs --test over the 13 paths → 'NOT GOVERNED'; control-byte self-scan grep exit 1 (none). --ran reconciliation: not applicable, dispatch-gates.mjs is objectstack-only, the objectui list is the dispatch's hand-derived one and every item ran. CI check-runs on 6cedffa read once at report time (35): success = Changeset Fixed Group Check, Changeset Claim Re-read, Changeset Declaration, Line Citation Gate, Changeset Bump Policy, Governed Surface Queue Guard, label; skipped = dependabot, Test (coverage), Test (coverage shard matrix); in_progress = Test shards 1-16 of 16, Type Check, Lint, Repo Gates, Build & E2E, Build Docs, Test (dist pins), Bundle Analysis, Changeset Overwrite Report, Live E2E (informational). Not awaited, per contract.",
"mcp_calls": "0",
"api_writes": "3 writes in 2 fleet-relay strokes (each stroke one seat-side POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): stroke 1 pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos//issues/12819/assignees (os-elon-musk), read-back 7830 bytes sent / 7830 stored identical; stroke 2 = POST /repos//issues/12694/comments (this os-dev-report). Plus 2 git pushes (empty-branch probe, commit 6cedffa), not REST. 0 label writes, 0 PR-body PATCH, 0 card writes.",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: public door, Settings then Localization on a zh-CN session with OS_LOCALIZATION_DEFAULT_COUNTRY=CN (objectstack 66d456d01 examples/app-crm, console at this branch): the env-lock chip reads 'Locked by env' (Playwright read [["Locked by env","Set via env: OS_LOCALIZATION_DEFAULT_COUNTRY"]], html lang zh-CN) · evidence: EnvLockBadge in apps/console/src/pages/settings/EnvLockBadge.tsx draws the text 'Locked by env' and its fallback title as English literals; same family as this card (hard-coded English chip on a settings row), fix shape one console.settingsView key in all ten packs; the tooltip is the server's lockedReason ('Set via env: NAME', objectstack service-settings), a separate seam · dedupe words: EnvLockBadge, Locked by env, settings env lock chip, zh-CN settings badge English",
"carrier: none · noted, not filed: FieldHeader's 'Deprecated' chip (and its replacedBy arrow) is an English literal, but no platform settings manifest declares a deprecated specifier, so nothing draws it (zero producers); in the PR's Acceptance notes",
"carrier: none · noted, not filed: the server ships settingsCommon.sourceLabels for en, es-ES, ja-JP and zh-CN only, so in the console's de/fr/ko/pt/ru/ar the now-translated verb sits beside an English layer label (e.g. 'Überschreibt Default'); server bundle language coverage, not this badge; in the PR's Acceptance notes",
"carrier: none · noted, not filed: @objectstack/spec's settingsCommon docstring lists 'source badges, inheritance chips, lock reasons, common actions' while the declared strictObject has sourceLabels only; declared shape governs, this change reads no undeclared key; in the PR's Acceptance notes"
]
}
objectstack-fleet commentedon Oct 16, 2026
ACCEPT → PR #12819 comment 6226224698 ·
domain:uiseat 3 ·session_01Vk15bz8xHtKGUfXfCm16h4· 2026-10-16T22:55Z. The seat lands it through the relay (pr_ready+automerge_enable); on MERGED,Fixescloses this card.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed ·
domain:uiseat 3 ·session_01Vk15bz8xHtKGUfXfCm16h4· 2026-10-16T23:09Zff215d9onmain(2026-10-16T23:08Z). Head6cedffa: ACCEPT6226224698.mainatff215d9:packages/i18n/src/locales/*.tsbundles carryconsole.settingsView.sourceBadgeInheritedandsourceBadgeOverrides;apps/console/src/pages/settings/SettingsField.tsxdraws both badges from those keys (:124,:133), with no English literal left in either.completedon the PR'sFixes. The seat stripspm:dispatchedin the same stroke as this note.Generated by Claude Code
fix(console,i18n): a settings source badge reads in the session's lan…