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.
i18n(zh-CN): "pillar" translated as 支柱 with pillar names left in English; timezone settings keys missing #11801
Filing gate ① — product defect with a named location and a reproduction. reach: Studio in zh-CN, and first open of an app in en.
Who acts on it: objectui triage → the Studio / app-shell owner. ⛔ Not a claim. Found in a manual browser QA pass of Studio on 2026-10-07; filed one card per finding on the maintainer's word: 「你发现的问题全部提交 issue」, and on the one-card-per-finding question 「覆盖规则,逐条立卡」.
What happens
zh-CN strings translate "pillar" literally as 支柱 and leave pillar names in English: "这个软件包还没有对象 — 先到 Data 支柱创建。"
The workspace-timezone prompt (first app open) logs at least 25 "[object-ui i18n] Missing translation for "workspace|sidebar|user|organization|app.settings.localization.keys.timezone.*" (language "en")" warnings; its help reads "IANA zone for today()/daysFromNow, analytics date buckets, and rendered datetimes."
Suggested direction (triage to rule)
Use 数据 / 自动化 / 界面 (the zh tab labels already used) in all zh strings; add the timezone keys and an author-facing help line.
Environment
objectstack 879bd38c · examples/app-showcase booted with objectstack dev --ui --seed-admin on an isolated port and SQLite file · objectui 179f6fe9 (HEAD; the framework pin .objectui-sha is a58626c8) served by the console's Vite dev server, perf numbers from a vite build of the same commit · Chromium 141 at 1440×900 · signed in as the seeded platform admin admin@objectos.ai unless stated.
Semantic issue search on objectstack-ai/objectui (open and closed), zh-CN Studio untranslated strings English left in Chinese UI timezone settings: 8 hits (0 open, 8 closed).
Path: ② the capabilities an end user meets in the app — the zh-CN interface | 缺项 | P3
Triage: first grade, bug · priority:p3 · domain:ui · area:i18n · pm:queue. Direction as the body proposes
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-07T17:24Z. ⛔ Not a claim, ⛔ not a dispatch.
Triage: lands in the zh-CN locale (packages/i18n/src/locales) ⇒ domain:ui; rationale: a Studio or console surface in objectui. Filed from the browser QA pass of 2026-10-07 (objectstack 879bd38c, objectui 179f6fe9); paths re-read on objectui main9990f9e122.
Why p3: wrong and missing strings, no wrong behaviour.
Direction:
use 数据 / 自动化 / 界面 (the zh tab labels already in use) wherever zh strings say 支柱
add the missing timezone keys to every locale that lacks them
Item 1, the zh pillar names: the ZH rows of packages/app-shell/src/views/metadata-admin/i18n.ts that say 支柱 or leave a pillar name in English inside Chinese text. Examples: engine.studio.nav.noObjects (:5992) and engine.studio.if.objectHintPost (:6010). Values only, in the zh tab labels already in use (数据 / 自动化 / 界面). The dev enumerates every such row with a grep and names each one.
Item 2, the timezone settings labels: measure first, then edit only on a Clause-②: no route.
apps/console/src/pages/settings/useSettingsLabel.ts: resolve()'s probing (about :70–:85), only if the ~25 "Missing translation" warnings come from it probing namespaces that hold no tree for this settings namespace.
apps/console/src/pages/settings/WorkspaceTimezonePrompt.tsx: only if the prompt renders its help text itself.
The tests beside these, and .changeset/11801-*.md.
⛔ Not on it:
Seat 3's objectui#11782 (claim 6050311093): ObjectFieldInspector.tsx's Label input and its designer.field.* rows.
packages/i18n/**.en.ts ends in as const and exports TranslationKeys = typeof en, so a new key there widens a published type. That is Clause-②: yes.
objectstack's settings manifest and its translation metadata, the server side of TranslationData.settings.<namespace>. That is another repository.
If item 2's keys can only go into packages/i18n or into objectstack, the dev stops that item and reports needs_decision with the four-axis analysis. Item 1 then lands alone as Refs #11801 (item 1). Any other file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
Container & model: M, mode:subagent, model: opus (dispatch-gates --tier --repo objectstack-ai/objectui over these paths: no path-derived mandate; default tier)
Clause-②: no
Responsibility: objectui app-shell Studio and console settings: zh strings translate "pillar" as 支柱 and leave the pillar names in English, and the workspace-timezone prompt logs ~25 missing-translation warnings and shows developer help text | item 1: none, the zh tab labels already exist; item 2: measured first, because the settings label convention reads TranslationData.settings.<namespace>, which may be the server's | every zh-CN author in Studio, and every administrator at an app's first open, measured by the filer in the 2026-10-07 QA pass
Thread-read: 6043149043
Serial constraints cleared: none blocking.
area:i18n in flight: seat 3's objectui#11782 (claim 6050311093). Its surface is ObjectFieldInspector.tsx's Label input and new designer.field.* rows. This card edits only existing ZH rows elsewhere in i18n.ts, plus console settings files, so the two are disjoint.
This seat: dispatch is parallel, batch 3, on the maintainer's word in this session's chat: 「改为并行派发,batch 3」, and 「继续派发」 today.
The batch counts working devs.
Working with this card: objectui#11823's dev and objectui#11802's.
Why Clause-②: no: item 1 changes values of app-shell's unexported ENGINE_STRINGS. Item 2 may only take a route that adds no published key and no accepted input; packages/i18n and objectstack are fenced off above, and the dev stops if the fix needs either.
os-dev-report
{
"issue": 11801,
"status": "needs_decision",
"branch": "claude/issue-11801-zh-pillar-timezone-labels",
"pr": "#11870",
"session": "session_01DrKzdPdyLLBW3qpZ4vtk7z",
"premise_still_valid": true,
"summary": "Item 1 landed. Every zh designer-table value was enumerated through readDesignerPairs, and exactly two rows said 支柱: engine.studio.nav.noObjects (also English "Data") and engine.studio.if.objectHintPost. Both now name the Data pillar by its zh tab label 「数据」 (objectHintPre ends in 「). The object-leaf hint's English "Data" was a literal span in StudioDesignSurface.tsx, not a table row, so that one line now renders t('engine.studio.pillar.data', locale). It is outside the claim's file surface and was taken under the bounded in-place exemption: all four conditions hold, no claim holds that line, and the en text is byte-identical. The seat should add it to the claim's surface. EN rows name the pillar by its en tab label, so no EN change. Item 2 split. The warnings half landed console-only: useSettingsLabel.resolve() now calls i18n.exists(key) before t(key), so convention probes that fall back by design log nothing. This adds no key, export or input (Clause-② no) and keeps the one settings-label convention (TranslationData.settings served under app, manifest literal as fallback). The help-wording half cannot be done here: the developer help line is objectstack service-settings copy (translations en/zh-CN/ja-JP/es-ES plus the localization.manifest.ts description). Its four-axis decision is in open_questions, and the PR first line is "Refs #11801 (item 1, and the missing-translation warnings of item 2; …)". Premise: the defects are real, but the triage mechanism for item 2 ("add the missing timezone keys to every locale") is falsified. objectstack already serves settings.localization.keys.timezone.label/.help in all four locales. The warnings were probes into four built-in namespaces whose settings member is a menu label or another page's strings (workspace, sidebar, user, organization), plus app.…timezone.options.ZONE probes that the server deliberately leaves untranslated.",
"tests": "HEAD for the gate union: 3c268bb (git rev-parse --short HEAD), the merge commit "Merge origin/main (456238c) into claude/issue-11801-zh-pillar-timezone-labels", made per the PM note so the branch carries objectui#11852 (5d69133, ancestor check exit 0) and its lowered eager-closure ceiling. It merged cleanly, with no lockfile or package.json change, and the item-1 rows and span survive it (0 支柱 rows; zh enumeration re-run on the merged tree: only the two non-pillar false positives). Branch commits: fe632eb (fix + pins + changeset), 4143a03 (test typing), 3c268bb (merge). files_changed (vs merge-base 456238c): .changeset/11801-zh-pillar-timezone-labels.md · apps/console/src/pages/settings/useSettingsLabel.ts · apps/console/src/pages/settings/tests/useSettingsLabel.conventionProbe-11801.test.tsx (new) · packages/app-shell/src/views/metadata-admin/i18n.ts (3 ZH values) · packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (1 line) · packages/app-shell/src/views/studio-design/StudioDesignSurface.zhPillarNames-11801.test.tsx (new). || HYPOTHESES. H1: holds with a correction. The 支柱 rows are exactly two (engine.studio.nav.noObjects, engine.studio.if.objectHintPost). Only one ZH row leaves a pillar name in English (noObjects, "Data"). The other English "Data" is a JSX literal span in StudioDesignSurface.tsx, not a ZH row. The case-insensitive probe also hit engine.inspector.appNav.mode.filters ("/data" path) and perm.posture.private.tip ("access.default" key); neither names a pillar. Tab labels measured: the tab bar renders t(engine.studio.pillar.${p.key}) = 数据/自动化/界面/权限. H2: holds with corrections. (a) The bundles: the four namespaces workspace/sidebar/user/organization are the BUILT-IN packages/i18n en pack (settings members: three menu-label strings and the organization page group). app is server-delivered TranslationData, put under app by transformSpecTranslations in apps/console loadLanguage. Every other settings namespace's labels live the same way: objectstack service-settings translations served as TranslationData.settings, manifest literal as fallback. (b) The count is larger than ~25. Measured with the real 17-option timezone spec: 93 distinct warnings with the server tree served (label 4 + help 4 + options 17x5) and 76 with none served (app not discovered). The card's 25 is a lower bound. (c) Not only namespaces without a tree: app misses every option label because the server en tree has none, by design. H3: holds. The help text "IANA zone for today()/daysFromNow, analytics date buckets, and rendered datetimes." is objectstack packages/services/service-settings/src/translations/en.ts settings.localization.keys.timezone.help (zh-CN/ja-JP/es-ES carry the same developer wording). A near-copy ("IANA zone used to resolve …") is the manifest description in localization.manifest.ts. Read at objectstack origin/main 033e5c53. Owner: objectstack service-settings. || RED-FIRST + REVERSE (all through os-verify-lock; mutations through objectstack scripts/ablation-replace.mjs: anchor x1 -> x0, blob changed; restore blob == HEAD and git diff HEAD empty in every leg). Item 2 pin on unmodified source: "Tests 2 failed | 1 passed (3)". 169 warning lines captured across the two no-warning cases. After the fix: "Tests 3 passed (3)". Reverse on the committed fix, deleting the i18n.exists line: "Tests 2 failed | 1 passed (3)" (predicted: turns red). Item 1 leg A, literal Data span restored with the zh rows kept: "Tests 1 failed | 3 passed (4)". Received "运行态列表预览 · 改字段 / 结构请到「Data」" (predicted: only the zh render pin reds). Item 1 leg B, all four item-1 edits reverted: "Tests 3 failed | 1 passed (4)". Offenders ["ENGINE_STRINGS_ZH engine.studio.nav.noObjects","ENGINE_STRINGS_ZH engine.studio.if.objectHintPost"]; the en render pin stays green (predicted). No build/dist leg is involved: every subject is imported by relative src path. || GATES (command -> exit -> verdict line). pnpm --workspace-concurrency=2 --filter '@object-ui/console^...' build -> 0 -> "VERDICT command-exit 0" (the closure includes app-shell and its dependency closure). pnpm --workspace-concurrency=2 --no-bail --filter @object-ui/app-shell --filter @object-ui/console type-check -> 0 -> "packages/app-shell type-check: Done" / "apps/console type-check: Done". The first attempt was red: TS7016 on the untyped scripts/.mjs import, fixed in 4143a03 the way sibling suites do. tsc --listFilesOnly shows both new tests in their programs (1/1). pnpm exec vitest run --maxWorkers=2 on the union (apps/console/src/pages/settings/ + every app-shell test importing StudioDesignSurface or metadata-admin/i18n + scripts/tests/check-i18n-designer-table-parity.test.ts + check-i18n-en-drift.test.ts) re-derived on the merged tree, at HEAD=3c268bb -> 0 -> "Test Files 156 passed (156) / Tests 1610 passed (1610)" (the pre-merge run at 4143a03 read 149/1538). The closure build and both type-checks were re-run at 3c268bb -> 0 -> "VERDICT command-exit 0". All check gates below were re-run at 3c268bb after the merge, i18n-designer-parity and i18n-drift included, each exit 0. pnpm check:control-bytes -> 0 -> "check-control-bytes: OK". pnpm check:new-line-citations -> 0 -> "VERDICT new-cross-file-line-citations: 0 new citation(s)". pnpm check:changeset-claims -> 0 -> "No pending changeset names a file this change touches." pnpm check:pending-changeset-literals -> 0 -> "No test source names a pending changeset." pnpm check:i18n-designer-parity -> 0 -> "Every en row has a zh row, and every shared row carries the same placeholders." pnpm check:i18n-drift -> 0 -> "No en value changed in this range. No designer-table en value changed in this range." Derived for the actual diff: pnpm check:test-path-roots -> 0 -> OK. pnpm check:vi-mock-specifiers -> 0 -> OK. pnpm check:vi-mock-inherit -> 0 -> OK. pnpm check:vi-mock-override-shape -> 0 -> OK. pnpm check:i18n-keys -> 0 -> "Every in-scope call-site key resolves against the en pack". pnpm check:shell-escape-residue -> 0 -> OK. node scripts/check-changeset-presence.mjs -> 0 -> "5 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)". node scripts/check-governed-queue-guard.mjs --test (6 paths) -> 0 -> "NOT GOVERNED". Control-byte self-scan of changed files: 0 hits. LINT, narrowed and declared, not a repo-wide run: eslint over the 5 touched TS/TSX files. (1) Population from eslint.config.js: rule blocks on **/.{ts,tsx}. (2) Count from --format json at 3c268bb: 5 files, 0 errors, 13 warnings, all 13 in StudioDesignSurface.tsx and equal to that file's count on main 456238c (and at base 5aa7f55); 0 on the changed line. (3) Invariance: no parserOptions.project (not type-aware), and no eslint-rules/ rule reads the filesystem, so the diff cannot move an untouched file's verdict. Repo-wide pnpm lint belongs to CI. CI: not awaited, in_progress at report time. NOT MEASURED locally: check:eager-closure (Bundle Analysis). Reason: it weighs a console vite build, which belongs to CI. The diff adds no import edge, and the merge brings in the lowered ceiling the PM note names. || DEVIATIONS. (1) A file outside the claim's file surface (StudioDesignSurface.tsx, the object-leaf hint's span, one line) was changed under os-dev's bounded in-place exemption. All four conditions hold: same defect class; mechanical, using the key the tab bar already renders; no in-flight claim names that line (#11823 holds the inspector studio-canvas branch; #11781/#11786/#11788/#11792 hold other regions); same gate family. The claim says "Any other file … the dev reports it before opening the PR (stop on breach)". A subagent has no channel before the PR, and os-dev prevails on conflict, so this is flagged here. The seat should extend the claim's surface or ask for the line to be reverted. (2) PR first line: "Refs #11801 (item 1, and the missing-translation warnings of item 2; item 2's help wording is left for a decision, below)" instead of "Refs #11801 (item 1)", because item 2's warnings half also lands. (3) No label or assignee writes, per the order. (4) Worktree left in place, per the order (node_modules kept). (5) The PR #11870 body was written once, at 4143a03: its Evidence bullets cite the union at 4143a03 (149 files / 1538 tests) and gates at 4143a03. The merged-head readings are 3c268bb: 156 / 1610, build, type-check and all gates exit 0. Seat rewrite asked: in the Evidence section, replace HEAD 4143a03 with 3c268bb and 149/1538 with 156/1610, and add a line naming the merge commit 3c268bb (origin/main 456238c, which carries 5d69133). Optionally add the Access bannerTitle 「Save」 note to Acceptance notes.",
"mcp_calls": "0 — no MCP GitHub tool was called",
"api_writes": "2 REST writes through the fleet-write relay (each one POST /repos/objectstack-ai/objectstack/dispatches): (1) op pr_create -> POST /repos/objectstack-ai/objectui/pulls, giving draft #11870 (read-back: 8827 bytes sent, 8827 stored, identical); (2) op comment via post-stamped.mjs -> POST /repos//issues/11801/comments, this report. Plus git push of the branch (empty probe, then fe632eb, 4143a03 and the merge 3c268bb; not REST). Reads only otherwise (gh api GET on the card, its comments, the claims of #11782/#11786/#11788/#11792/#11802/#11823/#11781, and PR #11870).",
"open_questions": [
{
"question": "Item 2, help wording. The timezone field's help line, shown in the first-open workspace-timezone prompt and on Settings, Localization, is developer wording: "IANA zone for today()/daysFromNow, analytics date buckets, and rendered datetimes." (zh-CN: "用于 today()/daysFromNow、分析日期分桶和 datetime 渲染的 IANA 时区。"). Its only home is objectstack service-settings: translations en/zh-CN/ja-JP/es-ES settings.localization.keys.timezone.help, plus the timezone row's description in localization.manifest.ts. Rewrite it for administrators, and where?",
"options": [
"A — objectstack service-settings rewrites settings.localization.keys.timezone.help in the four locale files and the manifest description, in author-facing words (for example "The time zone this workspace counts today in and shows dates and times in."). Cost: one copy-only objectstack PR touching 5 strings in one package; its settings-translation coverage test already guards the locales; no contract change; no objectui change; prompt and Settings page both follow. Axes. Business need: real; every administrator meets it at an app's first open and on Settings, measured by the filer's QA pass, and the reader is choosing a zone, not writing formulas. Long-term fit: keeps the one documented convention (the producer owns settings labels: manifest literal plus TranslationData.settings). AI-error resistance: one place to write settings copy, under an existing coverage test. Startup focus: no new surface, a copy edit only.",
"B — the objectui console overrides the help for this field inside the prompt with a new console.workspaceTimezonePrompt.* key. Cost: widens the published TranslationKeys in packages/i18n (Clause-② yes) across 10 packs, and creates a second home, so the prompt and the Settings page show two sentences for one setting. Axes. Business need: serves only the prompt. Long-term fit: a consumer-side override, exactly the second home beside the convention the dispatch forbids; it drifts when the server rewords. AI-error resistance: teaches that a console may re-word a server setting per surface, so overrides proliferate silently. Startup focus: adds a published key times 10 packs.",
"C — keep the wording. Cost: none. Axes. Business need: an administrator keeps reading formula names in a first-open dialog (P3 copy defect). Long-term fit: neutral. AI-error resistance: neutral. Startup focus: zero spend."
],
"recommendation": "A, filed on objectstack as a copy-only card (P3, service-settings, with a backlink to #11801). It is the only route that fixes both surfaces in the convention's one home, adds no surface, and is guarded by the coverage test that already exists. C is the fallback if the maintainer judges the wording acceptable for administrators. Not B: it is the second home the dispatch rules out, and it costs a published key."
}
],
"out_of_scope_findings": [
"class: a · reach: public door, measured by the filer (the first-open workspace-timezone prompt and Settings, Localization render the help line); read at objectstack origin/main 033e5c53 · evidence: packages/services/service-settings/src/translations/en.ts settings.localization.keys.timezone.help plus localization.manifest.ts timezone description; zh-CN/ja-JP/es-ES carry the same wording · to be filed in objectstack only if the decision above picks A · dedupe words: timezone settings help today() daysFromNow developer wording · service-settings localization help text administrator · IANA zone help line",
"carrier: objectui#11781 (holds the Access pillar draft banner beside it) · noted, not filed: the zh tooltip engine.studio.access.bannerTitle reads 「Save」 in English inside Chinese text, and whether the Access pillar still has a Save control (drafts autosave since objectui#5813) was not measured · the seat may add it to PR #11870 Acceptance notes",
"carrier: 承接者:无 · noted, not filed (dormant): useSettingsLabel resolveCommon probes source labels with plain t(); it only logs when a host serves a partial settingsCommon, which no served tree does today · in PR #11870 Acceptance notes",
"carrier: 承接者:无 · noted, not filed (dead code): the PILLARS array in StudioDesignSurface.tsx carries English label values that nothing renders (the tab bar reads engine.studio.pillar.KEY) · in PR #11870 Acceptance notes",
"carrier: 承接者:无 · noted, not filed (doc drift, other repo): the header of objectstack service-settings translations/index.ts says the console wires the bundle as system, but the console reads it under app via /api/v1/i18n/translations, and useSettingsLabel skips system by name · in PR #11870 Acceptance notes"
]
}
domain:ui seat 1 · session_01DrKzdPdyLLBW3qpZ4vtk7z · reviewed against the PR's file list and diff, git merge-tree, its check runs and the dev's report 6051448079, read 2026-10-08T03:19Z.
Shape:
The seat changed the first line from Refs #11801 (item 1, …) to Fixes #11801. Objectui's share is complete (ruling below).
Clause-②: no starts a later line.
The Evidence section now cites the merged head 3c268bb: 156 files and 1610 tests, plus the gates re-run after the merge. Read back identical.
two pin files and the changeset (two released packages).
The out-of-surface line, accepted.StudioDesignSurface.tsx:3307 is the object-leaf hint's English <span>Data</span>, a JSX literal and not a table row. It now renders t('engine.studio.pillar.data', locale); the EN text is byte-identical.
It sits in InterfacesPillar's canvas hint. No claim holds that line: it is not this seat's objectui#11823 inspector branch, and not seat 2's or seat 3's regions.
An in-memory git merge-tree is clean against main, objectui#11868 and objectui#11869.
The seat adds this one line to claim 6050716466's surface. It is the same defect class, a mechanical change, and in the same gate family.
Clause-② re-read:
No export is added.
useSettingsLabel.resolve() now asks i18n.exists(key) before t(key), so a convention probe that falls back by design logs nothing. No key, input or packages/i18n change.
no holds.
Item 1 (measured): every ZH designer value was enumerated, and exactly two rows said 支柱 (engine.studio.nav.noObjects, engine.studio.if.objectHintPost). Both now name the pillar by its ZH tab label 「数据」. The EN rows already name the EN tab label.
Item 2, the warnings (measured; triage's mechanism was falsified):
objectstack already serves settings.localization.keys.timezone.label / .help in four locales.
The warnings were probes into four built-in namespaces that hold no tree for this settings namespace (workspace, sidebar, user, organization), plus option probes the server leaves untranslated by design.
With the real 17-option timezone spec they number 93, not ~25. After the fix there are none, and the one convention (TranslationData.settings under app, manifest literal as fallback) stays.
Item 2, the help wording: needs_decision ruled A. This is a pure copy correction with no contract change, so it sits in the seat's discretion.
The help line's only home is objectstack service-settings (translations/*.tssettings.localization.keys.timezone.help, and localization.manifest.ts).
Merged through the merge queue at 2026-10-08T03:52:05Z, after it was queued at 2026-10-08T03:35:13Z.
CI on head 3c268bb before queueing: 40 of 43 check runs passed, and the 3 skipped are the expected ones.
check-governed-merges.mjs: not governed, +367/−4.
Content check:
d33270a is one squash commit on parent 31add5f. It changes 6 files, +367/−4, the same as the PR.
4 files are blob-identical to the reviewed head 3c268bb.
i18n.ts and StudioDesignSurface.tsx also carry other PRs that landed in between. Their per-file patch-ids match (490eb24f…, 4c379880…), and so does the whole diff's (4d562c05…).
The landed bytes are the reviewed change.
Card: closed completed by the PR's Fixes. pm:dispatched was removed and read back.
Activity
objectstack-fleet commentedon Oct 7, 2026
Path: ② the capabilities an end user meets in the app — the zh-CN interface | 缺项 | P3
Triage: first grade,
bug·priority:p3·domain:ui·area:i18n·pm:queue. Direction as the body proposesTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T17:24Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in the zh-CN locale (
packages/i18n/src/locales) ⇒domain:ui; rationale: a Studio or console surface in objectui. Filed from the browser QA pass of 2026-10-07 (objectstack879bd38c, objectui179f6fe9); paths re-read on objectuimain9990f9e122.Clause-②: no. Patch changeset in objectui.objectstack-fleet commentedon Oct 8, 2026
Claim: PM loop round 8
Session:
session_01DrKzdPdyLLBW3qpZ4vtk7zAccount:
huangyiireneBranch:
claude/issue-11801-zh-pillar-timezone-labelsWorktree:
objectui-issue-11801Domain:
domain:uiSeat:
domain:ui#1File surface (line numbers on
5aa7f55):packages/app-shell/src/views/metadata-admin/i18n.tsthat say 支柱 or leave a pillar name in English inside Chinese text. Examples:engine.studio.nav.noObjects(:5992) andengine.studio.if.objectHintPost(:6010). Values only, in the zh tab labels already in use (数据 / 自动化 / 界面). The dev enumerates every such row with a grep and names each one.Clause-②: noroute.apps/console/src/pages/settings/useSettingsLabel.ts:resolve()'s probing (about:70–:85), only if the ~25 "Missing translation" warnings come from it probing namespaces that hold no tree for this settings namespace.apps/console/src/pages/settings/WorkspaceTimezonePrompt.tsx: only if the prompt renders its help text itself..changeset/11801-*.md.⛔ Not on it:
6050311093):ObjectFieldInspector.tsx's Label input and itsdesigner.field.*rows.packages/i18n/**.en.tsends inas constand exportsTranslationKeys = typeof en, so a new key there widens a published type. That isClause-②: yes.TranslationData.settings.<namespace>. That is another repository.If item 2's keys can only go into
packages/i18nor into objectstack, the dev stops that item and reportsneeds_decisionwith the four-axis analysis. Item 1 then lands alone asRefs #11801 (item 1). Any other file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).Container & model:
M,mode:subagent,model: opus(dispatch-gates --tier --repo objectstack-ai/objectuiover these paths: no path-derived mandate; default tier)Clause-②: no
Responsibility:
objectui app-shell Studio and console settings: zh strings translate "pillar" as 支柱 and leave the pillar names in English, and the workspace-timezone prompt logs ~25 missing-translation warnings and shows developer help text | item 1: none, the zh tab labels already exist; item 2: measured first, because the settings label convention reads TranslationData.settings.<namespace>, which may be the server's | every zh-CN author in Studio, and every administrator at an app's first open, measured by the filer in the 2026-10-07 QA passThread-read: 6043149043
Serial constraints cleared:
noneblocking.area:i18nin flight: seat 3's objectui#11782 (claim6050311093). Its surface isObjectFieldInspector.tsx's Label input and newdesigner.field.*rows. This card edits only existing ZH rows elsewhere ini18n.ts, plus console settings files, so the two are disjoint.i18n.ts(objectui#11786, a11y: form-designer drag-and-drop announces internal ids ("Draggable item f:name … g:new_group") #11802, studio(interfaces): create flows for list views, dashboards, reports and pages in a writable package (ADR-0084), after #11790's nav item types #11823 and others) add rows under their own prefixes. This card changes values of existing rows, so whichever lands second mergesmain.apps/console/src/pages/settings/orpackages/i18n/. Read 2026-10-08T02:07Z.batch3, on the maintainer's word in this session's chat: 「改为并行派发,batch 3」, and 「继续派发」 today.Why
Clause-②: no: item 1 changes values of app-shell's unexportedENGINE_STRINGS. Item 2 may only take a route that adds no published key and no accepted input;packages/i18nand objectstack are fenced off above, and the dev stops if the fix needs either.objectstack-fleet commentedon Oct 8, 2026
os-dev-report
{
"issue": 11801,
"status": "needs_decision",
"branch": "claude/issue-11801-zh-pillar-timezone-labels",
"pr": "#11870",
"session": "session_01DrKzdPdyLLBW3qpZ4vtk7z",
"premise_still_valid": true,
"summary": "Item 1 landed. Every zh designer-table value was enumerated through readDesignerPairs, and exactly two rows said 支柱: engine.studio.nav.noObjects (also English "Data") and engine.studio.if.objectHintPost. Both now name the Data pillar by its zh tab label 「数据」 (objectHintPre ends in 「). The object-leaf hint's English "Data" was a literal span in StudioDesignSurface.tsx, not a table row, so that one line now renders t('engine.studio.pillar.data', locale). It is outside the claim's file surface and was taken under the bounded in-place exemption: all four conditions hold, no claim holds that line, and the en text is byte-identical. The seat should add it to the claim's surface. EN rows name the pillar by its en tab label, so no EN change. Item 2 split. The warnings half landed console-only: useSettingsLabel.resolve() now calls i18n.exists(key) before t(key), so convention probes that fall back by design log nothing. This adds no key, export or input (Clause-② no) and keeps the one settings-label convention (TranslationData.settings served under app, manifest literal as fallback). The help-wording half cannot be done here: the developer help line is objectstack service-settings copy (translations en/zh-CN/ja-JP/es-ES plus the localization.manifest.ts description). Its four-axis decision is in open_questions, and the PR first line is "Refs #11801 (item 1, and the missing-translation warnings of item 2; …)". Premise: the defects are real, but the triage mechanism for item 2 ("add the missing timezone keys to every locale") is falsified. objectstack already serves settings.localization.keys.timezone.label/.help in all four locales. The warnings were probes into four built-in namespaces whose settings member is a menu label or another page's strings (workspace, sidebar, user, organization), plus app.…timezone.options.ZONE probes that the server deliberately leaves untranslated.",
"tests": "HEAD for the gate union: 3c268bb (git rev-parse --short HEAD), the merge commit "Merge origin/main (456238c) into claude/issue-11801-zh-pillar-timezone-labels", made per the PM note so the branch carries objectui#11852 (5d69133, ancestor check exit 0) and its lowered eager-closure ceiling. It merged cleanly, with no lockfile or package.json change, and the item-1 rows and span survive it (0 支柱 rows; zh enumeration re-run on the merged tree: only the two non-pillar false positives). Branch commits: fe632eb (fix + pins + changeset), 4143a03 (test typing), 3c268bb (merge). files_changed (vs merge-base 456238c): .changeset/11801-zh-pillar-timezone-labels.md · apps/console/src/pages/settings/useSettingsLabel.ts · apps/console/src/pages/settings/tests/useSettingsLabel.conventionProbe-11801.test.tsx (new) · packages/app-shell/src/views/metadata-admin/i18n.ts (3 ZH values) · packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (1 line) · packages/app-shell/src/views/studio-design/StudioDesignSurface.zhPillarNames-11801.test.tsx (new). || HYPOTHESES. H1: holds with a correction. The 支柱 rows are exactly two (engine.studio.nav.noObjects, engine.studio.if.objectHintPost). Only one ZH row leaves a pillar name in English (noObjects, "Data"). The other English "Data" is a JSX literal span in StudioDesignSurface.tsx, not a ZH row. The case-insensitive probe also hit engine.inspector.appNav.mode.filters ("/data" path) and perm.posture.private.tip ("access.default" key); neither names a pillar. Tab labels measured: the tab bar renders t(
engine.studio.pillar.${p.key}) = 数据/自动化/界面/权限. H2: holds with corrections. (a) The bundles: the four namespaces workspace/sidebar/user/organization are the BUILT-IN packages/i18n en pack (settings members: three menu-label strings and the organization page group). app is server-delivered TranslationData, put under app by transformSpecTranslations in apps/console loadLanguage. Every other settings namespace's labels live the same way: objectstack service-settings translations served as TranslationData.settings, manifest literal as fallback. (b) The count is larger than ~25. Measured with the real 17-option timezone spec: 93 distinct warnings with the server tree served (label 4 + help 4 + options 17x5) and 76 with none served (app not discovered). The card's 25 is a lower bound. (c) Not only namespaces without a tree: app misses every option label because the server en tree has none, by design. H3: holds. The help text "IANA zone for today()/daysFromNow, analytics date buckets, and rendered datetimes." is objectstack packages/services/service-settings/src/translations/en.ts settings.localization.keys.timezone.help (zh-CN/ja-JP/es-ES carry the same developer wording). A near-copy ("IANA zone used to resolve …") is the manifest description in localization.manifest.ts. Read at objectstack origin/main 033e5c53. Owner: objectstack service-settings. || RED-FIRST + REVERSE (all through os-verify-lock; mutations through objectstack scripts/ablation-replace.mjs: anchor x1 -> x0, blob changed; restore blob == HEAD and git diff HEAD empty in every leg). Item 2 pin on unmodified source: "Tests 2 failed | 1 passed (3)". 169 warning lines captured across the two no-warning cases. After the fix: "Tests 3 passed (3)". Reverse on the committed fix, deleting the i18n.exists line: "Tests 2 failed | 1 passed (3)" (predicted: turns red). Item 1 leg A, literal Data span restored with the zh rows kept: "Tests 1 failed | 3 passed (4)". Received "运行态列表预览 · 改字段 / 结构请到「Data」" (predicted: only the zh render pin reds). Item 1 leg B, all four item-1 edits reverted: "Tests 3 failed | 1 passed (4)". Offenders ["ENGINE_STRINGS_ZH engine.studio.nav.noObjects","ENGINE_STRINGS_ZH engine.studio.if.objectHintPost"]; the en render pin stays green (predicted). No build/dist leg is involved: every subject is imported by relative src path. || GATES (command -> exit -> verdict line). pnpm --workspace-concurrency=2 --filter '@object-ui/console^...' build -> 0 -> "VERDICT command-exit 0" (the closure includes app-shell and its dependency closure). pnpm --workspace-concurrency=2 --no-bail --filter @object-ui/app-shell --filter @object-ui/console type-check -> 0 -> "packages/app-shell type-check: Done" / "apps/console type-check: Done". The first attempt was red: TS7016 on the untyped scripts/.mjs import, fixed in 4143a03 the way sibling suites do. tsc --listFilesOnly shows both new tests in their programs (1/1). pnpm exec vitest run --maxWorkers=2 on the union (apps/console/src/pages/settings/ + every app-shell test importing StudioDesignSurface or metadata-admin/i18n + scripts/tests/check-i18n-designer-table-parity.test.ts + check-i18n-en-drift.test.ts) re-derived on the merged tree, at HEAD=3c268bb -> 0 -> "Test Files 156 passed (156) / Tests 1610 passed (1610)" (the pre-merge run at 4143a03 read 149/1538). The closure build and both type-checks were re-run at 3c268bb -> 0 -> "VERDICT command-exit 0". All check gates below were re-run at 3c268bb after the merge, i18n-designer-parity and i18n-drift included, each exit 0. pnpm check:control-bytes -> 0 -> "check-control-bytes: OK". pnpm check:new-line-citations -> 0 -> "VERDICT new-cross-file-line-citations: 0 new citation(s)". pnpm check:changeset-claims -> 0 -> "No pending changeset names a file this change touches." pnpm check:pending-changeset-literals -> 0 -> "No test source names a pending changeset." pnpm check:i18n-designer-parity -> 0 -> "Every en row has a zh row, and every shared row carries the same placeholders." pnpm check:i18n-drift -> 0 -> "No en value changed in this range. No designer-table en value changed in this range." Derived for the actual diff: pnpm check:test-path-roots -> 0 -> OK. pnpm check:vi-mock-specifiers -> 0 -> OK. pnpm check:vi-mock-inherit -> 0 -> OK. pnpm check:vi-mock-override-shape -> 0 -> OK. pnpm check:i18n-keys -> 0 -> "Every in-scope call-site key resolves against the en pack". pnpm check:shell-escape-residue -> 0 -> OK. node scripts/check-changeset-presence.mjs -> 0 -> "5 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)". node scripts/check-governed-queue-guard.mjs --test (6 paths) -> 0 -> "NOT GOVERNED". Control-byte self-scan of changed files: 0 hits. LINT, narrowed and declared, not a repo-wide run: eslint over the 5 touched TS/TSX files. (1) Population from eslint.config.js: rule blocks on **/.{ts,tsx}. (2) Count from --format json at 3c268bb: 5 files, 0 errors, 13 warnings, all 13 in StudioDesignSurface.tsx and equal to that file's count on main 456238c (and at base 5aa7f55); 0 on the changed line. (3) Invariance: no parserOptions.project (not type-aware), and no eslint-rules/ rule reads the filesystem, so the diff cannot move an untouched file's verdict. Repo-wide pnpm lint belongs to CI. CI: not awaited, in_progress at report time. NOT MEASURED locally: check:eager-closure (Bundle Analysis). Reason: it weighs a console vite build, which belongs to CI. The diff adds no import edge, and the merge brings in the lowered ceiling the PM note names. || DEVIATIONS. (1) A file outside the claim's file surface (StudioDesignSurface.tsx, the object-leaf hint's span, one line) was changed under os-dev's bounded in-place exemption. All four conditions hold: same defect class; mechanical, using the key the tab bar already renders; no in-flight claim names that line (#11823 holds the inspector studio-canvas branch; #11781/#11786/#11788/#11792 hold other regions); same gate family. The claim says "Any other file … the dev reports it before opening the PR (stop on breach)". A subagent has no channel before the PR, and os-dev prevails on conflict, so this is flagged here. The seat should extend the claim's surface or ask for the line to be reverted. (2) PR first line: "Refs #11801 (item 1, and the missing-translation warnings of item 2; item 2's help wording is left for a decision, below)" instead of "Refs #11801 (item 1)", because item 2's warnings half also lands. (3) No label or assignee writes, per the order. (4) Worktree left in place, per the order (node_modules kept). (5) The PR #11870 body was written once, at 4143a03: its Evidence bullets cite the union at 4143a03 (149 files / 1538 tests) and gates at 4143a03. The merged-head readings are 3c268bb: 156 / 1610, build, type-check and all gates exit 0. Seat rewrite asked: in the Evidence section, replace HEAD 4143a03 with 3c268bb and 149/1538 with 156/1610, and add a line naming the merge commit 3c268bb (origin/main 456238c, which carries 5d69133). Optionally add the Access bannerTitle 「Save」 note to Acceptance notes.","mcp_calls": "0 — no MCP GitHub tool was called",
"api_writes": "2 REST writes through the fleet-write relay (each one POST /repos/objectstack-ai/objectstack/dispatches): (1) op pr_create -> POST /repos/objectstack-ai/objectui/pulls, giving draft #11870 (read-back: 8827 bytes sent, 8827 stored, identical); (2) op comment via post-stamped.mjs -> POST /repos//issues/11801/comments, this report. Plus git push of the branch (empty probe, then fe632eb, 4143a03 and the merge 3c268bb; not REST). Reads only otherwise (gh api GET on the card, its comments, the claims of #11782/#11786/#11788/#11792/#11802/#11823/#11781, and PR #11870).",
"open_questions": [
{
"question": "Item 2, help wording. The timezone field's help line, shown in the first-open workspace-timezone prompt and on Settings, Localization, is developer wording: "IANA zone for today()/daysFromNow, analytics date buckets, and rendered datetimes." (zh-CN: "用于 today()/daysFromNow、分析日期分桶和 datetime 渲染的 IANA 时区。"). Its only home is objectstack service-settings: translations en/zh-CN/ja-JP/es-ES settings.localization.keys.timezone.help, plus the timezone row's description in localization.manifest.ts. Rewrite it for administrators, and where?",
"options": [
"A — objectstack service-settings rewrites settings.localization.keys.timezone.help in the four locale files and the manifest description, in author-facing words (for example "The time zone this workspace counts today in and shows dates and times in."). Cost: one copy-only objectstack PR touching 5 strings in one package; its settings-translation coverage test already guards the locales; no contract change; no objectui change; prompt and Settings page both follow. Axes. Business need: real; every administrator meets it at an app's first open and on Settings, measured by the filer's QA pass, and the reader is choosing a zone, not writing formulas. Long-term fit: keeps the one documented convention (the producer owns settings labels: manifest literal plus TranslationData.settings). AI-error resistance: one place to write settings copy, under an existing coverage test. Startup focus: no new surface, a copy edit only.",
"B — the objectui console overrides the help for this field inside the prompt with a new console.workspaceTimezonePrompt.* key. Cost: widens the published TranslationKeys in packages/i18n (Clause-② yes) across 10 packs, and creates a second home, so the prompt and the Settings page show two sentences for one setting. Axes. Business need: serves only the prompt. Long-term fit: a consumer-side override, exactly the second home beside the convention the dispatch forbids; it drifts when the server rewords. AI-error resistance: teaches that a console may re-word a server setting per surface, so overrides proliferate silently. Startup focus: adds a published key times 10 packs.",
"C — keep the wording. Cost: none. Axes. Business need: an administrator keeps reading formula names in a first-open dialog (P3 copy defect). Long-term fit: neutral. AI-error resistance: neutral. Startup focus: zero spend."
],
"recommendation": "A, filed on objectstack as a copy-only card (P3, service-settings, with a backlink to #11801). It is the only route that fixes both surfaces in the convention's one home, adds no surface, and is guarded by the coverage test that already exists. C is the fallback if the maintainer judges the wording acceptable for administrators. Not B: it is the second home the dispatch rules out, and it costs a published key."
}
],
"out_of_scope_findings": [
"class: a · reach: public door, measured by the filer (the first-open workspace-timezone prompt and Settings, Localization render the help line); read at objectstack origin/main 033e5c53 · evidence: packages/services/service-settings/src/translations/en.ts settings.localization.keys.timezone.help plus localization.manifest.ts timezone description; zh-CN/ja-JP/es-ES carry the same wording · to be filed in objectstack only if the decision above picks A · dedupe words: timezone settings help today() daysFromNow developer wording · service-settings localization help text administrator · IANA zone help line",
"carrier: objectui#11781 (holds the Access pillar draft banner beside it) · noted, not filed: the zh tooltip engine.studio.access.bannerTitle reads 「Save」 in English inside Chinese text, and whether the Access pillar still has a Save control (drafts autosave since objectui#5813) was not measured · the seat may add it to PR #11870 Acceptance notes",
"carrier: 承接者:无 · noted, not filed (dormant): useSettingsLabel resolveCommon probes source labels with plain t(); it only logs when a host serves a partial settingsCommon, which no served tree does today · in PR #11870 Acceptance notes",
"carrier: 承接者:无 · noted, not filed (dead code): the PILLARS array in StudioDesignSurface.tsx carries English label values that nothing renders (the tab bar reads engine.studio.pillar.KEY) · in PR #11870 Acceptance notes",
"carrier: 承接者:无 · noted, not filed (doc drift, other repo): the header of objectstack service-settings translations/index.ts says the console wires the bundle as system, but the console reads it under app via /api/v1/i18n/translations, and useSettingsLabel skips system by name · in PR #11870 Acceptance notes"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
Review: ACCEPT — PR objectui#11870 (head
3c268bb) ·needs_decisionruled A, already carried by objectstack-ai/objectstack#22136domain:uiseat 1 ·session_01DrKzdPdyLLBW3qpZ4vtk7z· reviewed against the PR's file list and diff,git merge-tree, its check runs and the dev's report6051448079, read 2026-10-08T03:19Z.Refs #11801 (item 1, …)toFixes #11801. Objectui's share is complete (ruling below).Clause-②: nostarts a later line.3c268bb: 156 files and 1610 tests, plus the gates re-run after the merge. Read back identical.i18n.ts;apps/console/src/pages/settings/useSettingsLabel.ts(+11);StudioDesignSurface.tsx;StudioDesignSurface.tsx:3307is the object-leaf hint's English<span>Data</span>, a JSX literal and not a table row. It now renderst('engine.studio.pillar.data', locale); the EN text is byte-identical.InterfacesPillar's canvas hint. No claim holds that line: it is not this seat's objectui#11823 inspector branch, and not seat 2's or seat 3's regions.git merge-treeis clean againstmain, objectui#11868 and objectui#11869.6050716466's surface. It is the same defect class, a mechanical change, and in the same gate family.useSettingsLabel.resolve()now asksi18n.exists(key)beforet(key), so a convention probe that falls back by design logs nothing. No key, input orpackages/i18nchange.noholds.engine.studio.nav.noObjects,engine.studio.if.objectHintPost). Both now name the pillar by its ZH tab label 「数据」. The EN rows already name the EN tab label.settings.localization.keys.timezone.label/.helpin four locales.workspace,sidebar,user,organization), plus option probes the server leaves untranslated by design.TranslationData.settingsunderapp, manifest literal as fallback) stays.needs_decisionruled A. This is a pure copy correction with no contract change, so it sits in the seat's discretion.translations/*.tssettings.localization.keys.timezone.help, andlocalization.manifest.ts).domain:services,pm:dispatched), on the maintainer's word. No new card is needed.packages/i18nkey (Clause-②: yes) and a second home for the setting's help.Pins: red first on unmodified source.
Reverse checks:
existsline deleted: 2 failed;Each matched its prediction, and each restore was proven by blob hash.
Merged head
3c268bb: the closure build, both type-checks and the derivedcheck:*set all exit 0.3c268bb: converging. The branch carries objectui#11852's lowered ceiling. The PR is queued once every check completes green.engine.studio.access.bannerTitlereads 「Save」. Its carrier is seat 2's objectui#11781, which holds that banner.resolveCommon's dormant probes;PILLARSarray's unrendered labels;translations/index.tsheader drift.huangyiirene.Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
Landed: PR objectui#11870 →
maind33270adomain:uiseat 1 ·session_01DrKzdPdyLLBW3qpZ4vtk7z· verified 2026-10-08T03:53Z.Merged through the merge queue at 2026-10-08T03:52:05Z, after it was queued at 2026-10-08T03:35:13Z.
3c268bbbefore queueing: 40 of 43 check runs passed, and the 3 skipped are the expected ones.check-governed-merges.mjs: not governed, +367/−4.Content check:
d33270ais one squash commit on parent31add5f. It changes 6 files, +367/−4, the same as the PR.3c268bb.i18n.tsandStudioDesignSurface.tsxalso carry other PRs that landed in between. Their per-file patch-ids match (490eb24f…,4c379880…), and so does the whole diff's (4d562c05…).Card: closed
completedby the PR'sFixes.pm:dispatchedwas removed and read back.Item 2's help wording stays with settings(localization): the Default timezone help reads "IANA zone for today()/daysFromNow, analytics date buckets, and rendered datetimes." to administrators objectstack#22136 (ruling A,
6051480562).Landing window: other objectui cards closed after 03:30Z, each by its own PR:
This PR closes only this card.
Unblock sweep: no open
pm:blockedcard carriesBlocked-by:this card.Generated by Claude Code
fix(app-shell,console): zh names a Studio pillar by its tab label; se…
fix(service-settings): the Default timezone help says what the settin…