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
Blocked-by: objectstack-ai/objectstack#12231 — ⛔ VOID, and it was never load-bearing. Removed from the reverse index at round 15. That upstream card was filed on 2026-08-25 asking for a face that had already shipped in @objectstack/spec17.0.0-rc.6 (measured on this card 2026-08-11, verified upstream 2026-08-14); it was closed completed on 2026-08-28. This repo is pinned at 17.1.0, so the slot exists in the package actually installed. See the round-15 claim comment.
test/i18n-references.test.ts 的 every page has translated nav copy and header copy 也照着这四个键写,并且在注释里点明了 title / subtitle 的语义:它们对应 page:header,因为 header 实例没有稳定 id,页面名是唯一能够到它的键。
Blocked-by: objectstack-ai/objectstack#12231— ⛔ VOID, and it was never load-bearing. Removed from the reverse index at round 15. That upstream card was filed on 2026-08-25 asking for a face that had already shipped in@objectstack/spec17.0.0-rc.6 (measured on this card 2026-08-11, verified upstream 2026-08-14); it was closedcompletedon 2026-08-28. This repo is pinned at 17.1.0, so the slot exists in the package actually installed. See the round-15 claim comment.发现于 #1002 实施过程(改首页
ai_briefing卡片文案时,按裁定 grep 四个语言包找对应键,发现根本没有这个键面)。#1002 的文件面是那一张卡片,故单独立单。
现状(基线 origin/main = 86010ff)
翻译契约里
pages只有四个键,而且是.strict():(
node_modules/@objectstack/spec/dist/translation.zod-*.d.ts)pages现已带components面,见 2026-08-11 / 08-14 两条评论。保留原文是为了让这张卡的论证链可读,⛔ 不要把它当作今天的契约形状。test/i18n-references.test.ts的every page has translated nav copy and header copy也照着这四个键写,并且在注释里点明了title/subtitle的语义:它们对应page:header,因为 header 实例没有稳定 id,页面名是唯一能够到它的键。于是
page:header以外的组件文案 —— 卡片标题、卡片描述、指标块 label —— 没有任何翻译位。语言包写不进去(strict 会拒),运行时也无处可读,值链就是
*.page.ts里的字面量直通
dist/objectstack.json。实测面(从 dist 产物统计,非源码 grep)
8 个页面,12 处这样的用户可见字符串:
sales_home_page是isDefault: true、发给sales_rep/sales_manager的落地页。一个 zh-CN 用户登录后看到的首页,页头是「销售看板 / 欢迎回来,…」(有翻译位),而右侧
和左侧四张卡片、四个 KPI 块全是英文 —— 同一屏两种语言。
静态证据立单,实测后判 premise-false。⛔ 不要把 12 这个数字当作已验证的影响面向前引用。
这与 AGENTS.md 的 i18n 约束(「No new feature ships without all 4 locales」)以及
仓里 9 个 locale 相关守卫的一贯口径是冲突的:那些守卫覆盖对象/字段/视图/动作/选项,
唯独页面组件文案覆盖不到,因为契约里没有那个键可查。
为什么这像是契约的不对称,而不是本应用漏写
同一个翻译契约里,仪表盘的组件是有翻译位的:
widget 用
id定位就能翻译 title/description;page 的组件同样有稳定id(
ai_briefing、kpi_revenue_won…),却没有对应的components面。两个形状几乎一样的 UI 组件树,一个能翻一个不能,更像是 spec 侧少了一个面,而不是本应用的用法问题。
处置建议(不预判,交分诊)
三条路成本差别很大:
pages加components: Record( id, { title?, description?, label?, help? } ),与
dashboards.widgets对齐 —— 一致性最好,但要动@objectstack/spec;首页卡片只有英文并在守卫里把这一点写成明示豁免,免得下一个人再查一遍;
只是那一条是
tabs[].label)。本条的静态证据比 closing_this_quarter 的切换器页签标题写作 "Closing Soon" —— 与 label / 四个语言包的第四个拼法,且 tabs[].label 没有翻译位 #760 强(strict schema 直接排除了键的存在),但「渲染出来是什么」仍值得在浏览器里看一眼再定路线。
✅ 路线 1 已由上游交付(
⚠️ 路线 3 仍未做,且它是实施的第一步,不是可选项 —— 见 R15 派发令。
@objectstack/spec17.0.0-rc.6,面比本卡所求更宽:title/description/label/placeholder/emptyText/submitLabel)。⛔ 路线 2 本车道宪章明令不可用(绕行把平台缺口藏进样板)。
关联
tabs[].label也没有翻译位 —— 那条是视图切换器,本条是页面组件;两条合起来说明「没有翻译位」不是个别键的遗漏)
test/i18n-references.test.ts(语言包内部的键漂移 —— 与本条不同,那是有键但漂了,这里是根本没有键)