# 2026-07-13 Session Pitfalls

## patch replace_all 污染灾难

**症状**: `replace_all=true` 将通用变量声明（如 `var h=''`, `active.length`）注入到所有同名匹配的函数中，造成 `list is not defined`、`SyntaxError` 等连锁崩溃。

**铁律**: 
- 变量声明行（`var h=''`, `var list=...`, `var active=...`）**绝不使用 replace_all**
- 超过3个同名匹配时，直接用 Python `write_file` 完整重写文件
- patch 失败2次以上 → 立即切到 write_file

## 孤儿 else-if 残留

用 Python `line-by-line` 删除 filter blocks 时，只删了 `if(TODO_FILTER===...)` 行但留下 `else if(TODO_FILTER===...)` 行 → `SyntaxError: Unexpected token 'else'`。修复：sed 用 `'/else if.*TODO_FILTER.*closed.*list=list/d'` 同时匹配 if 和 else-if。

## 变量定义顺序

`active.length` 引用在 `var active = list.filter(...)` 定义之前 → ReferenceError。JS 中变量声明必须前置于首次引用。

## Promise.all fetch 链断裂（新增）

**症状**: `H1_MONTHLY` 和 `KPI_PROGRESS` 为原始 Response 对象而非解析后的 JSON → `h1_actual` 为 undefined → 显示 0。

**根因**: `Promise.all` 内多个 fetch 共用一条 `.then(r=>r.json())`：
```javascript
// ❌ 前两个 fetch 没有 .then() ！
fetch('/a.json'), fetch('/b.json'), fetch('/c.json').then(r=>r.json())
```

**铁律**: Promise.all 内每个 fetch 必须独立链 `.then(r=>r.json()).catch(()=>null)`。

## 万元单位统一

用户明确要求所有金额统一为万元。`fmtW` 函数一次性改为 `(v/1e4).toFixed(1)+'万'`，不再使用百万/万元混用。

## KPI 数据源必须分角色

用户反复纠正 KPI 显示错误 → 每个角色必须从不同的数据源取数：
- 总经理 → h1_monthly.total（全公司）
- 总监 → h1_monthly.depts['大客户部']（仅大客户部）
- 个人 → my_kpis.json.people[name]（仅自己）

**禁止**: 不分角色一律用 h1_monthly.total，会显示错误数据。
