发现于 #771 的实施过程中(文件面不含 `src/translations/`),按「越界即停」单独记录。基线 `origin/main` = 7667c9b4。 ## 现象 `crm_task` ship 了 8 个已保存视图。四个语言包里,只有 `en.ts` 少了两个: | view | en.ts | zh-CN.ts | es-ES.ts | ja-JP.ts | | --- | --- | --- | --- | --- | | `all_tasks` | ✅ | ✅ | ✅ | ✅ | | `task_board` | ✅ | ✅ | ✅ | ✅ | | `task_calendar` | ✅ | ✅ | ✅ | ✅ | | `task_gantt` | ✅ | ✅ | ✅ | ✅ | | `task_timeline` | ✅ | ✅ | ✅ | ✅ | | `my_open_tasks` | ✅ | ✅ | ✅ | ✅ | | `todays_tasks` | ❌ | ✅ `📅 我的优先任务` | ✅ | ❌ | | `overdue_tasks` | ❌ | ✅ `⏰ 待办任务 · 按逾期时长排序` | ✅ | ❌ | `en.ts:946-953` 的 `_views` 块在 `my_open_tasks` 处就结束了;`ja-JP.ts:937-942` 同样只到 `my_open_tasks`。zh-CN(737-738 行)和 es-ES(991-992 行)两项齐全。 ## 为什么今天没人碰到(所以是 `finding` 而非 bug) 缺 key 时回落到视图自己在 `src/views/task.view.ts` 里声明的 `label`,而那两个 label 本身就是英文正确串(`📅 My Priority Tasks` / `⏰ Open Tasks · Most Overdue First`)。所以英文界面看起来完全正常,日文界面则会露出英文——后者是可见但轻微的。 ## 为什么值得记一笔:没有任何 gate 看得见 - `package.json` 的 `lint` 脚本写死了 `--skip-i18n`。 - 去掉该 flag 重跑(`npx objectstack lint`)也**不**报这两项:输出里只有一行 `platform built-ins: 2298 i18n issue(s) hidden — rerun with --include-platform to audit them`,即 app 自有元数据的 `_views` 完整性根本不在被检查的集合里。 所以这不属于 #494(「205 warnings hidden by `--skip-i18n`」)所盖的那一批——那批是**被 flag 藏起来的**告警,这一条是**压根没人检查**的缺口。 ## 建议修法 1. 给 `en.ts` 与 `ja-JP.ts` 的 `crm_task._views` 补上 `todays_tasks` / `overdue_tasks`(英文用视图 label 原文,日文另译)。 2. 更有价值的一半:加一条守卫,断言每个 `*.view.ts` 声明的 `listViews` 键在四个语言包的 `_views` 里都有条目——这类缺口靠人眼比对四个文件是发现不了的,本条就是逐列比对才看出来的。`test/metadata-references.test.ts` 里已有 `every navigation node has a zh-CN label` 这类按语言包断言的先例,可以挂在旁边。 Refs #771、#494
Activity
yinlianghui commentedon Aug 5, 2026
PM 分诊 + 🔒 认领(修复线):晋级派发,并入同类 #767 一并了结
裁定:#767(en.ts
crm_lead._views缺hot_leads)与本单是同一缺陷类、同一文件家族,两个 dev 分开做必在src/translations/en.ts上相撞,故并单派发——同一 PRFixes #783+Fixes #767,以本单为主单。译文遵循 #776 落地的 contract-first 口径:_views条目是 canonical label 的忠实翻译,不许自创口径(zh-CN / es-ES 的既有条目做参照)。类修复要求:两个缺口都「没有任何 gate 看得见」(
pnpm lint硬编码--skip-i18n,去掉也不报)。因此本单必须附带守卫——_views键集在各语言包间的一致性(从 canonical 视图集派生,带反真空断言),让这一类缺口从此有人看着。反向验证先声明方向再跑。认领:session_01VHrPAGEgFDoHjphqYG4BMa,分支
claude/issue-783-views-locale-key-parity,worktreehotcrm-issue-783。文件面:src/translations/en.ts、ja-JP.ts(如缺)、_views一致性守卫测试、changeset。Generated by Claude Code
yinlianghui commentedon Aug 5, 2026
复核记录:本单 premise 只成立一半 —— ja-JP 那一半不成立
在最新
origin/main上逐项复核(PR #787):en.ts缺todays_tasks/overdue_tasks—— 成立,已补。ja-JP.ts同样只到my_open_tasks」—— 不成立。ja-JP.ts:943-944早已有这两条(📅 私の優先タスク/⏰ オープンタスク · 期限超過が長い順),是 fix(i18n): complete all four locales and retire the exemption ledger (#645, #494) #679「complete all four locales」时一起落地的。关键是:这在本单自己引用的基线
7667c9b4上就已经是这样,不是派发后才被别的 PR 补上的。git show 7667c9b4:src/translations/ja-JP.ts的crm_task._views块从 937 行开到 946 行,八项齐全。正文写的ja-JP.ts:937-942停在my_open_tasks那一行,把块尾的两行漏掉了 —— 与 en 那半边(en.ts:946-953确实在my_open_tasks处结束)读法相同,但 ja-JP 的块比 en 长两行。机器证据:把新守卫留在原地、只把
en.ts退回origin/main重跑,报出 9 条缺口,全部在en,ja-JP 零命中。因此 PR #787 不改
ja-JP.ts,只修 en 那一半。守卫按本单「建议修法」第 2 条实现了 —— 从编译后 stack 的 canonical 视图集派生,而不是硬编码清单。顺带一提:本单第 2 条建议里的派生跑出来是 9 条而不是 5 条,除本单 2 条与 #767 的 3 条外,还有
crm_case.my_open_cases/sla_at_risk与crm_opportunity.stale_opportunities/closing_this_quarter。理由与处置见 PR 正文。Generated by Claude Code
yinlianghui commentedon Aug 5, 2026
✅ 验收通过 — PR #787 已转 ready 并挂 auto-merge(head ae65249,CI 9/9 绿)。本 PR 同时关闭 #767(并单裁定见两单的 PM 评论)。
两个 reviewer 判断点,PM 裁定均为 A(保留):
_views少了三个视图标签(renewals_due / at_risk_accounts / hot_leads),而其余三个语言包都有;_views没有任何跨语言覆盖守卫 #767 的头号风险(metadata 改名后英文跟走、三门翻译静默留旧名)只有它能变成一次 CI 失败;当前 61/61 本就逐字节相同(fix(i18n): complete all four locales and retire the exemption ledger (#645, #494) #679 是程序化提取),零存量成本;断言边界在注释里写得诚实(让改名变响,不能让改名变对)。「英文该与 metadata 不同」的假想场景按 contract-first 应去改 *.view.ts 里的唯一生产者。其余判定要点:
_views少了三个视图标签(renewals_due / at_risk_accounts / hot_leads),而其余三个语言包都有;_views没有任何跨语言覆盖守卫 #767 反而三项全部成立。守卫派生跑出真实缺口 9 条全在 en,反向验证第 4 方向(守卫对旧 en.ts 恰报 9 条、ja-JP 零命中)把 premise 复核变成了可重跑的断言。#783 与 #767 随本 PR 关闭。
Generated by Claude Code
fix(i18n): 补齐 en 的列表视图标签,并为「视图标签跨语言一致性」加守卫 (objectstack-ai#783, objec…