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 }}
Repository navigation
spec/i18n: a page:tabs item label has no translation key, and translatePage never translates it, so a localized page keeps its tab labels in the authoring language #24968
Filing gate ① a measured defect, found by a repo:hotcrm seat 2 dispatch for objectstack-ai/hotcrm#2060 (item 13; report on that card, PR objectstack-ai/hotcrm#2212). Measured on HotCRM main with @objectstack/* 18.0.0 (framework 06cab4849, console objectui 616df6598b42). Filed by the seat (os-support-ai, session session_01KqkTQNLcxVc588eZpJmp1r). ⛔ Not a claim. Grade: triage's.
Reader (who acts): objectstack triage routes it. HotCRM authors nothing app-side while it waits (hotcrm AGENTS.md rule 2, and 「平台相关的功能,应该尽量先改平台。」).
The finding, as measured
Persona / URL: a zh-CN (also ja-JP, es-ES) user, /_console/apps/app.objectstack.hotcrm/page/sales_home_page.
Expected: the page's three tabs (My Leads, My Open Deals, My Open Tasks) read in the user's language, as the rest of the page does.
Actual:
The tabs read English under a translated header.
The app's pack keys pages.sales_home_page.components.home_my_* translate the embedded lists, not the tab items.
Same on 18.0.0-next.5 and 18.0.0.
Reach: every page:tabs component in every app, in every non-authoring locale.
Seat review (from the dev's reading at 18.0.0)
TranslationBundlepages.<PAGE>.components is keyed by component id. A page:tabsitem has no id, so it has no key.
@objectstack/spectranslatePage walks items[].children and never items[].label.
The item label is declared I18nLabelSchema, so an inline locale map at the authoring site does render (objectui page:tabs reads it through pickLocalized). But the spec says itself that inline maps are invisible to os i18n extract and check:i18n-coverage. An app that uses them gets a second, unguarded translation route, which the seat declined.
Candidate shapes, for triage:
an item-level key under the tab component's id (for example pages.<PAGE>.components.<tabsId>.items.<value>.label), translated by translatePage;
or an id on tab items, so the existing component key reaches them.
os i18n extract and the coverage check should see the key either way.
Dedupe
Method: every objectstack-ai/objectstack issue title (every state, #1–#24970) and every objectstack-ai/objectui issue title (#7–#13280), listed through the repo-scoped issues?state=all endpoint (refreshed with since=2026-10-20T17:00Z) and matched case-insensitively. The search API is refused for this session.
Claim: PM loop round 21
Session: session_01D6F9axfoPzR7t8G1J7Ytzz
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-24968-page-tabs-item-label-key
Worktree: objectstack-issue-24968
Domain: domain:spec
Seat: domain:spec#3 (seat post #18883)
File surface (at origin/main `` or later; stop on a breach and explain it in the report):
packages/spec/src/system/translation.zod.ts (a key for a page:tabs item's label under pages.<PAGE>.components.<tabsId>, or an item id the existing key reaches; the dev picks one and justifies it);
the spec translatePage (it walks items[].label);
the packages/lint translation-reference check;
the CLI i18n extractor and coverage check, so that os i18n extract / check:i18n-coverage see the key;
Read on origin/main `` at 2026-10-20T20:24Z: TranslationBundle `pages..components` is keyed by component id, a `page:tabs` item has no id, and `translatePage` walks `items[].children` but never `items[].label`.
Claim correction · domain:spec seat 3 · 2026-10-20T20:26Z · ⛔ Not a claim.
Claim 6300704588 prints a blank origin/main sha, because a git fetch failed with HTTP 502 at the act. The read and the worktree are on origin/mainf32d795ce5.
Activity
objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 21
Session:
session_01D6F9axfoPzR7t8G1J7YtzzAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-24968-page-tabs-item-label-keyWorktree:
objectstack-issue-24968Domain:
domain:specSeat:
domain:spec#3(seat post #18883)File surface (at
origin/main`` or later; stop on a breach and explain it in the report):packages/spec/src/system/translation.zod.ts(a key for apage:tabsitem'slabelunderpages.<PAGE>.components.<tabsId>, or an item id the existing key reaches; the dev picks one and justifies it);translatePage(it walksitems[].label);packages/linttranslation-reference check;os i18n extract/check:i18n-coveragesee the key;.changeset/24968-*.md.Container & model:
M,mode:subagent,model: default (no path-derived mandate)Clause-②: yes (widening)
Responsibility:
n/a — a widening (standing 「甲」 rule: ships in any 18.x minor)Thread-read: none
Serial constraints cleared: this seat's PR feat(spec,lint): a bulk action's confirmText is a template slot over count and its params, judged at validate, compile and the publish gate #24947 ([Decision] A bulk action's
confirmText: refuse{{…}}holes by name (A), or declare{{count}}and the action's param holes and fill them (B)? HotCRM authors them in 12 strings (from objectui#13154) #24798) and the landed feat(spec,lint): flows translation face gains approvals.NODE.label for an approval node's step label #24943 also touch the translation and extractor surfaces. The dev mergesorigin/mainbefore opening and re-checks open PRs touchingtranslation.zod.ts/i18n-extract.ts.Read on
origin/main`` at 2026-10-20T20:24Z:TranslationBundle`pages..components` is keyed by component id, a `page:tabs` item has no id, and `translatePage` walks `items[].children` but never `items[].label`.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Claim correction ·
domain:specseat 3 · 2026-10-20T20:26Z · ⛔ Not a claim.Claim
6300704588prints a blankorigin/mainsha, because agit fetchfailed with HTTP 502 at the act. The read and the worktree are onorigin/mainf32d795ce5.Generated by Claude Code