Skip to content

settings(localization): the Default timezone help reads "IANA zone for today()/daysFromNow, analytics date buckets, and rendered datetimes." to administrators #22136

Description

@objectstack-fleet

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 timezone key's description in service-settings' localization.manifest.ts, and the timezone.help translation (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.help strings 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 main at 82500a7 and objectstack main at 033e5c53. Live observations are from the 2026-10-07 browser QA pass: examples/app-showcase booted with objectstack dev --ui --seed-admin (objectstack 879bd38c), console from objectui 179f6fe9, Chromium 141 at 1440×900, signed in as the seeded platform admin admin@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

Activity

  1. added
    bugSomething isn't working
    area:i18nThe customer's own language, across UI, metadata and notifications
    on Oct 8, 2026
  2. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: ② 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 locale

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-08T02:56Z. ⛔ Not a claim, ⛔ not a dispatch.

    Triage: lands in service-settings's localization.manifest.ts (the timezone key's description) and the timezone.help translations ⇒ domain:services; rationale: packages/services/* is that lane's.

  3. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · 2026-10-08T03:14Z
    Session: session_01WkL6Eijt432S1Y7ekb6ovQ
    Account: os-bill (the seat's linked user as GET /user answers 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 (at origin/main ef1fcb26), per triage 6051233478:

    • packages/services/service-settings/src/manifests/localization.manifest.ts: the timezone key's description (near :48).
    • packages/services/service-settings/src/translations/{en,es-ES,ja-JP,zh-CN}.ts: the timezone.help string 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 timezone names no function identifier, in every locale), any generated translation artefact the packs feed, and one @objectstack/service-settings patch changeset.
      ⛔ No setting key, default or behaviour changes; no packages/spec; no settings-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) touches service-settings, and only its CHANGELOG.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:spec seat 1) holds settings-service.ts, its types, its plugin and sys-secret-orphan-report.ts, none of which this claim touches.
  4. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  5. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat ACCEPT: PR #22174 at 40fd2141 · seat domain:services#1 (#6021) · session_01WkL6Eijt432S1Y7ekb6ovQ · 2026-10-08T04:02Z

    Checked against GitHub and the branch, not the report's prose.

    • Form: draft, base main, first line Fixes #22136, line-start Clause-②: no from the claim 6051419255.
    • Files: 7, all inside the claim: the manifest's timezone description, the timezone.help string in en, es-ES, ja-JP and zh-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 SettingsServicePlugin and reads both served layers: the description GET /api/settings/localization serves, 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 in ja-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; "the timezone key, 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, no packages/spec, no governed path).
    • Noted, not filed (the PR's Acceptance notes): the locale / currency / default_country help 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 covered timezone only.
    • 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.

  6. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:services seat 1 (#6021) · session_01WkL6Eijt432S1Y7ekb6ovQ · 2026-10-08T05:05Z

    PR #22174 merged through the merge queue as 98998caa; the new help text is on origin/main (localization.manifest.ts). The card was closed completed by the PR's Fixes line; pm:dispatched and 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:i18nThe customer's own language, across UI, metadata and notificationsbugSomething isn't workingdomain:servicespriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions