# 定时代码走查 — 第 4 轮（2026-06-15）

> 触发：定时走查 cron（每 30 分钟）。范围 = 自第3轮起 1 新提交（`94cdcdc` CR-21 修复）+ **i18n 垂直切片走查**（src/i18n 26 文件此前从未深查，最大未审区域）。
> 方法：主代理地面 git show 核 CR-21 + 1 路后台代理走查 i18n 完整性/硬编码遗漏（45 tool_uses 全量扫）。
> 性质：核对记录，不改产品代码（本会话 session-role-diagnose-only）。todo 待修项见 `docs/todo.md`。
> 关联：[第1轮](./定时走查-2026-06-15-P0复核.md)/[第2轮](./定时走查-2026-06-15-第2轮.md)/[第3轮](./定时走查-2026-06-15-第3轮.md)。

---

## 一、CR-21 修复确认（价值第 4 次闭环）

`94cdcdc` App.vue:218-222 `try { await startDataChangedListener() } catch(e){ console.error(...) }`。提交说明「cron 巡检捕获另一会话走查第3轮 CR-21」。✅ 已修。

---

## 二、i18n key 树质量 — 优秀 ✅

**466 key 全对齐**（12 命名空间 × 2 语言）：

| 维度 | 结果 |
|---|---|
| zh vs en key 树 | **0 缺 key / 0 多余 / 0 结构不一致** |
| 翻译质量 | 0 TODO/占位符，0 复制中文漏译（仅 `aiLanguageZh=🇨🇳 简体中文` 1 处合理） |
| 插值参数 | `{var}` 占位符 zh/en 逐一匹配，0 mismatch |
| 命名/嵌套 | 顶层=文件名，camelCase，嵌套≤2 层，一致 |

> i18n 文件本身无需改动。问题全在 **src/ 硬编码遗漏**。

---

## 三、硬编码遗漏 — 40+ 处（CR-08 扩展，真实问题）

CR-260615-08 原记 3 处，i18n 代理全量扫发现 **40+ 处**，按严重度分三档：

### 🔴 P1 — 直接破坏 i18n（已有 key 却硬编码）

**P1-1 `useAiEvents.ts:182`（最高优先，改一行）**：`tc.result = '用户拒绝了此操作'` 硬编码，绕过已有 `aiTool.rejectedHint`（en=`User rejected this action`）。ToolCard.vue:54 渲染 `tc.result || $t('aiTool.rejectedHint')`，`||` 短路致 **en locale 拒绝提示恒中文**，已有 en 翻译被一行废掉。修：删该赋值（让 ToolCard 走 t()）或改 `t('aiTool.rejectedHint')`。

**P1-2 `TaskDetail.vue` 整页 13 处未接 i18n**：L6/12/17/24 + 11 个 label span + L144 errorMsg。i18n 无 taskDetail namespace（只有 tasks），需新建。en locale 全中文。

**P1-3 `ProjectDetail.vue` 审批/导入 5 处**：L12 导入目录 / L201 确认(N) / L220 取消 / L392 confirmDialog / L399 Message.success / L404 Message.error / L381 未知错误 fallback。

**P1-4 `Dashboard.vue:76`** `暂无项目，去创建一个`。

**P1-5 `AiChat.vue` 3 处**：L107 title=清空 / L471 confirmDialog / L687 showToast 发送失败。

### 🟡 P2 — JS 字符串赋 UI/Toast

**P2-1 `ToolCard.vue:152-164` ARG_LABEL_MAP**：11 个审批参数标签硬编码（ID/项目 ID/名称/标题/描述/字段/新值/路径/优先级/标签/来源），aiTool.ts 无对应 key，需新增 `aiTool.argLabels.*`。

**P2-2 store error fallback 11 处全中文**：knowledge.ts:53/64/74/105 + ideas.ts:10/20/38 + projects.ts:13/25/37/63/71/81/90 + tasks.ts:10/20/38 + workflow.ts:19。en locale 下所有加载/CRUD 失败 toast 中文。

**P2-3 `useAiStream.ts:52-53`**（CR-08 行号偏差，原记 39-41）：看门狗超时两文案 `⚠ 工具已执行完成...` / `⚠ 响应中断...` 直接 push messages。

**P2-4 `useAiSend.ts:49/65/130`**：队列满 throw + 审批未送达 tc.result。

### ⚪ P3 — 边界/低优先

**P3-1 `utils/time.ts:46-51`（隐蔽）**：`formatRelative` 相对时间硬编码（刚刚/X 分钟前...）。i18n 已有 `common.justNow/minutesAgo/hoursAgo/dayAgo` key 却没用 → en locale 所有时间戳中文。

**P3-2 `router/index.ts:18-60`**：8 个 `meta.title` 中文，但 **0 消费方**（grep meta.title/document.title 无匹配），死代码/潜伏隐患。

**P3-4 `i18n/index.ts:20` `fallbackLocale: 'en'`**：zh-CN 用户缺 key 回退英文，反直觉（当前 key 全对齐不触发，设计气味）。

---

## 四、亮点

- **i18n key 树工程化扎实**：466 key 双语全对齐、插值参数一致、命名规范、无占位符 — 国际化基础设施质量高。
- **i18n index 初帧渲染处理合理**：appSettings 异步，`getInitialLocale()` 默认 zh-CN，loadAll 后回填，已知短暂态有注释。
- **TaskDetail.vue 单文件 XSS/响应式到位**（第1轮已肯定），i18n 是唯一短板。

---

## 📊 本轮摘要

| 类别 | 数 | 代表 |
|---|---|---|
| 价值闭环 | 1 | CR-21 → 94cdcdc ✅ |
| i18n key 树肯定 | 466 | 全对齐 0 缺 key（优秀）|
| 硬编码新发现 | 40+ | P1-1 useAiEvents:182（改一行最高 ROI）/ TaskDetail 整页 / ToolCard ARG_LABEL_MAP / store fallback 11 处 / time.ts 隐蔽 |
| P1 i18n 破坏 | 5 | useAiEvents:182 / TaskDetail / ProjectDetail / Dashboard / AiChat |
| P2/P3 | 6 | ARG_LABEL_MAP / store fallback / useAiSend / time.ts / router meta / fallbackLocale |

**本轮价值**：i18n 垂直切片暴露真实问题 — key 树优秀但 src/ 硬编码 40+ 处（CR-08 严重低估）。**P1-1 useAiEvents:182 是明确 i18n 破坏 bug**（一行废掉 en 翻译），改一行最高 ROI，应优先。TaskDetail 整页未接 i18n（13 处）是新页面 i18n 债。

**方法论**：换垂直切片角度（i18n 维度）有效突破前几轮按提交/改动的横切盲区，发现 40+ 处硬编码 — 印证 task2/3「功能/模块垂直走查」的价值（换角度有新发现）。

todo 映射：CR-260615-08 扩展（3→40+ 子项，标 P1-1 最高优先）+ CR-21 标 ✅。
