Repository navigation
settings(localization): the Default timezone help reads "IANA zone for today()/daysFromNow, analytics date buckets, and rendered datetimes." to administrators #22136
Description
Activity
- addedbugSomething isn't workingSomething isn't workingarea:i18nThe customer's own language, across UI, metadata and notificationsThe customer's own language, across UI, metadata and notifications
on Oct 8, 2026 objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsPath: ② the capabilities an end user meets in the app — setting the workspace timezone | 缺项 | P3
Triage: first grade,
bug·priority:p3·domain:services·area:i18n·pm:queue. Direction: the help says it in the administrator's words, in every localeTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-08T02:56Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
service-settings'slocalization.manifest.ts(thetimezonekey'sdescription) and thetimezone.helptranslations ⇒domain:services; rationale:packages/services/*is that lane's.- Why p3: an administrator reads CEL function names in a help line (filed on the maintainer's word). Nothing behaves wrong. The pre-selection half of the ask is already done (console: when the workspace timezone is still the default, prompt an administrator once to set it, pre-filled with the browser's zone (gate for #11693 / PR #11729) objectui#11758).
- Direction:
- plain language, along the body's example: "Decides what 'today' means in formulas, how reports group dates, and how dates and times are shown";
- the same meaning in every locale that carries the key (en, es-ES, ja-JP and zh-CN, if it has one).
- Pin: the served help for
timezonenames no function identifier, in every locale. Clause-②: no. Patch changeset for the settings service.
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsClaim: PM loop round 1 · 2026-10-08T03:14Z
Session:session_01WkL6Eijt432S1Y7ekb6ovQ
Account:os-bill(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-22136-timezone-help-plain
Worktree:objectstack-issue-22136
Domain:domain:services
Seat:domain:services#1(seat post #6021)
File surface (atorigin/mainef1fcb26), per triage6051233478:packages/services/service-settings/src/manifests/localization.manifest.ts: thetimezonekey'sdescription(near:48).packages/services/service-settings/src/translations/{en,es-ES,ja-JP,zh-CN}.ts: thetimezone.helpstring in each pack (near:117,:299,:299,:155).- Any other key in the same manifest and packs whose help names a function identifier or an implementation term to an administrator, only under the bounded in-place rule (same defect class, mechanical, no other claim, same gate family), each named in the PR.
- The pin (the served help for
timezonenames no function identifier, in every locale), any generated translation artefact the packs feed, and one@objectstack/service-settingspatchchangeset.
⛔ No setting key, default or behaviour changes; nopackages/spec; nosettings-service*.ts(held by feat(spec,services): deployment-level state has no organization column — settings global rung, plumbing objects, the audit ledger, #12699 made total (ADR-0131 D7) #15207's claim). Stop on breach; explain in the report.
Container & model:S,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate; default tier for wording in four locales)
Clause-②: no
Responsibility:this repository's own code: service-settings' localization manifest and its four translation packs carry developer wording in the timezone help | none: the console renders the served help as it is (objectstack-ai/objectui#11758 already pre-fills the zone) | every administrator who opens the first-run timezone prompt or Settings → Localization
Thread-read: 6051233478
Serial constraints cleared: of the open PRs, only the Version Packages PR (chore: version packages #21988) touchesservice-settings, and only itsCHANGELOG.md/package.json. feat(spec,services): deployment-level state has no organization column — settings global rung, plumbing objects, the audit ledger, #12699 made total (ADR-0131 D7) #15207 (domain:specseat 1) holdssettings-service.ts, its types, its plugin andsys-secret-orphan-report.ts, none of which this claim touches.
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 22136,
"status": "done",
"branch": "claude/issue-22136-timezone-help-plain",
"pr": "#22174",
"session": "session_01WkL6Eijt432S1Y7ekb6ovQ — the dispatching PM session (subagent = parent's), the id in the commit's Claude-Session trailer and the relay envelope",
"premise_still_valid": true,
"summary": "Rewrote the Default timezone help into plain language in the manifest description and all four packs; no key, default, accepted value or behaviour changed; one patch changeset for @objectstack/service-settings (Clause-②: no, copied into the PR body line start). H1 confirmed: exactly five copies on origin/main ef1fcb2 (manifest :48, en :117, es-ES :299, ja-JP :299, zh-CN :155); the packs are hand-written, no generator or *.generated.ts feeds service-settings/src/translations. H2 measured: objectui SettingsField renders labels.fieldHelp(key, spec.description), which resolves settings.localization.keys.timezone.help from the bundle the settings plugin loads into i18n at kernel:ready and falls back to the manifest description served by GET /api/settings/localization; both layers rewritten and both pinned at the served layer. IANA kept only as a short second sentence because the timezone control is a free-text DomainCombobox (valueDomain iana_time_zone) and the server accepts any IANA zone. H3: locale/currency/default_country help still uses standard names and implementation terms; NOT changed, because bounded-fix condition 2 (mechanical, shape already ruled) does not hold for new prose in four locales; noted in Acceptance notes. BEFORE/AFTER — manifest description: "IANA zone used to resolve today()/daysFromNow, analytics date buckets, and rendered datetimes." -> "Decides what \"today\" means in formulas, how reports group dates, and how dates and times are shown. Accepts any IANA time zone name (e.g. Europe/Paris)." · en: "IANA zone for today()/daysFromNow, analytics date buckets, and rendered datetimes." -> same text as the manifest after · es-ES: "Zona IANA usada para resolver today()/daysFromNow, los buckets de fecha de analítica y las fechas/horas renderizadas." -> "Determina qué significa «hoy» en las fórmulas, cómo agrupan las fechas los informes y cómo se muestran las fechas y horas. Acepta cualquier nombre de zona horaria IANA (p. ej. Europe/Madrid)." · ja-JP: "today()/daysFromNow の解決、分析の日付バケット、日時レンダリングに使う IANA タイムゾーン。" -> "数式での「今日」がどの日か、レポートでの日付のまとめ方、日付と時刻の表示方法を決めます。任意の IANA タイムゾーン名(例:Asia/Tokyo)を指定できます。" · zh-CN: "用于 today()/daysFromNow、分析日期分桶和 datetime 渲染的 IANA 时区。" -> "决定公式中的\"今天\"是哪一天、报表如何按日期分组,以及日期和时间如何显示。可填写任意 IANA 时区名称(如 Asia/Shanghai)。" FILES_CHANGED (7, +171/-5 vs merge base ef1fcb2): .changeset/22136-settings-timezone-help-plain.md (new); packages/services/service-settings/src/localization-timezone-help.pin.test.ts (new); packages/services/service-settings/src/manifests/localization.manifest.ts; packages/services/service-settings/src/translations/en.ts; .../es-ES.ts; .../ja-JP.ts; .../zh-CN.ts. DEVIATION: label-write.mjs --repo objectstack-ai/objectstack --issue 22174 --assign os-bill was refused by the session auto-mode classifier ([External System Writes]) before any request; not retried by another route; PR #22174 has NO assignee — the seat sets os-bill. Cleanup: worktree /home/user/objectstack-issue-22136 was clean at 40fd214 (= origin branch head); node_modules removed and git worktree remove (no --force) exit 0.",
"tests": "All at head 40fd214 (the final commit; no push after). (1) pnpm --filter @objectstack/service-settings exec vitest run --maxWorkers=2 (under os-verify-lock, slot dev-22136): "Test Files 37 passed (37)", "Tests 632 passed (632)", VERDICT command-exit 0. (An earlier run before the closure build: 10 suites failed to load with "Failed to resolve entry for package @objectstack/metadata-core" — missing dist in a fresh worktree, NOT MEASURED, cleared by the build.) (2) pnpm --filter @objectstack/service-settings typecheck: tsc --noEmit exit 0; tsc --noEmit --listFiles lists 37 service-settings test files incl. localization-timezone-help.pin.test.ts and all five edited sources. (3) pnpm --filter @objectstack/service-settings build: "check-dts-emitted: @objectstack/service-settings - 2/2 declared declaration file(s) present." after turbo run build --filter=@objectstack/service-settings^... --concurrency=1: "Tasks: 15 successful, 15 total", VERDICT command-exit 0. (4) Pin (new): localization-timezone-help.pin.test.ts boots the real SettingsServicePlugin on LiteKernel with a recording i18n stub and GETs /api/settings/localization; 4 tests pass. ABLATION (two legs, committed state, scripts/ablation-replace.mjs, expected direction red, observed red): leg A ja-JP help restored to old string — "anchor 1 -> 0, blob a3fc0989896d -> 05f68412ae70", on-disk grep -c daysFromNow = 1, "× the translated help, in every locale the plugin loads", "AssertionError: ja-JP: today()/daysFromNow の解決… expected [ today(, daysFromNow ] to deeply equal []", "Tests 1 failed | 3 passed (4)"; restore "blob == HEAD (a3fc0989896d) and git diff HEAD is empty". Leg B manifest description restored to old string — "anchor 1 -> 0, blob e9af7ed9adef -> fd0f99a11be2", grep -c = 1, "× the manifest description served by GET /api/settings/localization", "Tests 1 failed | 3 passed (4)"; restore "blob == HEAD (e9af7ed9adef)". No dist involved: subject imported by relative src paths. (5) GATES: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) derived 63 families from 7 paths vs merge base ef1fcb2; all 63 run, 62 exit 0; NOT MEASURED: pnpm check:dual-build-cjs-loads exit 3 "PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/" (reason: only the service-settings closure was built). --ran reconciliation: "63 derived famil(ies) accounted for — 62 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)", 0 UNRUN. Extra families run, exit 0: check:i18n "OK (9 package(s) — all bundles in sync, no undeclared authoring keys)"; check:i18n-stale-fill "OK (10 bundle set(s) — no new stale fills, 0 baselined)"; check:i18n-coverage "OK (13 config(s), 621 baselined untranslated string(s), none new)"; check:i18n-walk-parity "11 declared group(s), 9 walked, 2 exempted"; check:settings-bind-window "4 declared / 0 self / 1 structurally upstream / 0 ledgered". Selected derived verdicts: check:nul-bytes "OK (scanned 10135 text file(s) … no raw ASCII control bytes)"; check:test-source-alias OK; check:cross-package-test-inputs OK; check:published-files pass; check-empty-changeset "No empty-frontmatter changeset introduced (1 declaring changeset(s) added)"; check-adr-0087-registration "adds no declared-breaking changeset". (6) LINT narrowed: eslint --no-inline-config --format json on the 6 touched .ts files: 6 files, 0 errors, 0 warnings (no ignored-file warning, so all 6 are in the linted population); eslint.config.mjs enables no type-aware linting (no parserOptions.project), so untouched files cannot change verdict; repo-wide pnpm lint left to CI. CI: not awaited (in_progress at report time).",
"mcp_calls": "0",
"api_writes": "2 — (1) relay repository_dispatch to objectstack-ai/objectstack (HTTP 204) executing pr_create = POST /repos/objectstack-ai/objectstack/pulls, draft, PR #22174 (run 37725195071 success; read-back 7875 bytes sent = stored); (2) this os-dev-report comment, POST /repos//issues/22136/comments via post-stamped.mjs. Refused, zero requests: label-write --assign os-bill on #22174. git push x2 (empty-branch probe, then 40fd214) are git ops, not REST.",
"deviations": [
"label-write.mjs --repo objectstack-ai/objectstack --issue 22174 --assign os-bill refused by the session auto-mode classifier (reason: External System Writes) before any request; not re-sent by another route; the seat sets the PR assignee os-bill.",
"check:dual-build-cjs-loads NOT MEASURED (exit 3, needs every package dist; only the closure was built)."
],
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted in PR Acceptance notes, not filed (polish, no filing class) · the other Localization help strings keep standard names and implementation terms: locale "BCP-47 locale for message catalogs and number/date formatting", currency "ISO 4217 code … render code-less amounts as plain numbers", default_country "ISO 3166-1 alpha-2 code"; the issue body suggested a sweep but the triage ruling covers timezone only, and bounded-fix condition 2 fails (new prose in four locales; the locale "message catalogs" claim would need verifying first) · dedupe words: localization settings help developer wording · locale help BCP-47 message catalogs · currency help code-less amounts",
"carrier: 承接者:无 · noted in PR Acceptance notes, not filed (locale drift, no filing class) · pack drift on keys this PR leaves alone: currency has no en help (en serves the two-sentence manifest literal) while zh-CN/ja-JP/es-ES carry only the first sentence; default_country carries "Used for address and phone defaults." in es-ES and ja-JP but not in en or zh-CN · dedupe words: settings localization translation drift currency help · default_country help missing sentence"
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsSeat ACCEPT: PR #22174 at
40fd2141· seatdomain:services#1(#6021) ·session_01WkL6Eijt432S1Y7ekb6ovQ· 2026-10-08T04:02ZChecked against GitHub and the branch, not the report's prose.
- Form: draft, base
main, first lineFixes #22136, line-startClause-②: nofrom the claim6051419255. - Files: 7, all inside the claim: the manifest's
timezonedescription, thetimezone.helpstring inen,es-ES,ja-JPandzh-CN, one new pin file, one changeset. The packs are hand-written, so no generated artefact moves. - Wording: the first sentence names no function or standard ("Decides what "today" means in formulas, how reports group dates, and how dates and times are shown"), in all four locales with the same meaning. A second sentence keeps "IANA" with an example zone because the field is a free-text combobox over
valueDomain: 'iana_time_zone'. Accepted: an administrator typing a zone needs the format. - Pin: it boots the real
SettingsServicePluginand reads both served layers: the descriptionGET /api/settings/localizationserves, and the help in every bundle the plugin loads (floor: the four shipped locales). It carries a positive control: the detector flags the old wording. Ablation: putting the old string back inja-JP, then in the manifest, each turned its own case red, and the restore matched HEAD. - Changeset, sentence by sentence:
patch; the quoted before and after strings match the diff; "thetimezonekey, its default (UTC), its accepted values (any IANA zone) … are unchanged" holds (default: 'UTC',valueDomain: 'iana_time_zone'untouched). - Not governed; no contract review owed (
Clause-②: no, nopackages/spec, no governed path). - Noted, not filed (the PR's Acceptance notes): the
locale/currency/default_countryhelp still uses standard names, and two packs drift on keys this PR leaves alone. Both are polish outside the filing gate's classes, and triage's direction coveredtimezoneonly. - One deviation: the PR assignee write was refused in the dev's session before any request was sent, so PR fix(service-settings): the Default timezone help says what the setting does, in every locale #22174 has no assignee at this stamp.
CI at this stamp: 17 success, 3 skipped, 11 in progress, 0 failed. Ready and auto-merge follow once every check on the head is green.
- Form: draft, base
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsLanded ·
domain:servicesseat 1 (#6021) ·session_01WkL6Eijt432S1Y7ekb6ovQ· 2026-10-08T05:05ZPR #22174 merged through the merge queue as
98998caa; the new help text is onorigin/main(localization.manifest.ts). The card was closedcompletedby the PR'sFixesline;pm:dispatchedand the assignee are removed in this act. Carried, not filed (in the PR's Acceptance notes): the other Localization help strings' register, and two packs' drift on keys this PR left alone.
Filing gate ① — product defect with a named location and a reproduction. reach: first app open as an administrator: the Set the workspace timezone prompt (objectstack-ai/objectui#11758) shows the Settings timezone field with the help "IANA zone for today()/daysFromNow, analytics date buckets, and rendered datetimes."; Settings → Localization shows the same.
Who acts on it: objectstack triage → the service-settings owner. ⛔ Not a claim. Filed on the maintainer's word: 「首次进入应用时,时区设置弹窗写的是 "IANA zone for today()/daysFromNow…"。应改成白话,并自动预选浏览器所在时区。」.
What happens
The prompt's own description is plain language and the field is pre-filled with the browser's zone (objectstack-ai/objectui#11758), so that half of the ask is already done. The help under the field, though, names CEL functions and an analytics term to an administrator. It comes from the localization settings manifest: the
timezonekey'sdescriptioninservice-settings'localization.manifest.ts, and thetimezone.helptranslation (en, es-ES, ja-JP carry the same wording).Expected
Help in the prompt's own terms, e.g. "Decides what 'today' means in formulas, how reports group dates, and how dates and times are shown."
Suggested direction (triage to rule)
Rewrite the manifest description and the
timezone.helpstrings in every pack; sweep the other localization keys for the same register. The missing-translation console warnings for these keys are tracked in objectstack-ai/objectui#11801.Environment
Source read on objectui
mainat82500a7and objectstackmainat033e5c53. Live observations are from the 2026-10-07 browser QA pass:examples/app-showcasebooted withobjectstack dev --ui --seed-admin(objectstack879bd38c), console from objectui179f6fe9, Chromium 141 at 1440×900, signed in as the seeded platform adminadmin@objectos.ai.Duplicate check
Dedupe words: timezone setting help text developer wording · localization manifest description today daysFromNow · workspace timezone prompt help
Filed by Claude Code (session
session_01D76mrPJrSSdaKRxR2rvrMG) from the 2026-10-07 QA pass and a follow-up source reading.Generated by Claude Code