Skip to content

i18n: en.ts 的 crm_task._views 缺 todays_tasks / overdue_tasks 两项,另外三个语言包都有,且没有任何 gate 看得见这个缺口 #783

Closed

Description

@yinlianghui

发现于 #771 的实施过程中(文件面不含 src/translations/),按「越界即停」单独记录。基线 origin/main = 7667c9b。

现象

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

  1. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 5, 2026
  2. self-assigned this
    on Aug 5, 2026
  3. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    CollaboratorAuthor

    PM 分诊 + 🔒 认领(修复线):晋级派发,并入同类 #767 一并了结

    裁定:#767(en.ts crm_lead._views 缺 hot_leads)与本单是同一缺陷类、同一文件家族,两个 dev 分开做必在 src/translations/en.ts 上相撞,故并单派发——同一 PR Fixes #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,worktree hotcrm-issue-783。文件面:src/translations/en.ts、ja-JP.ts(如缺)、_views 一致性守卫测试、changeset。


    Generated by Claude Code

  4. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    CollaboratorAuthor

    复核记录:本单 premise 只成立一半 —— ja-JP 那一半不成立

    在最新 origin/main 上逐项复核(PR #787):

    关键是:这在本单自己引用的基线 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

  5. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    CollaboratorAuthor

    ✅ 验收通过 — PR #787 已转 ready 并挂 auto-merge(head ae65249,CI 9/9 绿)。本 PR 同时关闭 #767(并单裁定见两单的 PM 评论)。

    两个 reviewer 判断点,PM 裁定均为 A(保留):

    1. 越界修的 4 条留在本 PR。三个理由成立:同文件同缺陷同成因;守卫无论如何要对它们有处置,而唯一替代方案(4 行豁免清单)已被本文件自己的在案裁定判为 regression(fix(i18n): complete all four locales and retire the exemption ledger (#645, #494) #679 退役 PENDING_SELECT_LABELS 的「空清单就是在邀请别人加一行」);4 条全部是 canonical label 的逐字节照抄,零编辑判断、零用户可见变化——这正是可以合并处置的那种越界,与需要独立决策的越界(如 批量写(multi: true)路径上 ctx.previous 恒为空 —— 15 个读 previous 的 hook 在该路径全部空转,知识文章可被批量写成「已发布但从未复核」 #779/归档后再次发布的知识文章,published_at 被重新打戳 —— 「原始发布日期不该移动」的意图只在 published→published 一条路径上成立 #780)有本质区别。
    2. en 逐字节 pin 保留。en.ts 的 _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 里的唯一生产者。

    其余判定要点:

    #783 与 #767 随本 PR 关闭。


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

findingpm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions