fix: harden review and verifier governance

This commit is contained in:
phamnazage-jpg
2026-05-29 18:48:48 +08:00
parent 88833fac8b
commit e999d31b25
133 changed files with 2538 additions and 159 deletions

View File

@@ -10,60 +10,117 @@
---
## 当前未修复问题速查表(截至 2026-05-27 15:10
## 当前未修复问题速查表(截至 2026-05-29 15:10
| # | 问题 | 优先级 | 首次暴露 | 修复状态 | 影响次数 |
|---|------|--------|----------|----------|----------|
| 1 | 验证器退出码设计 | P0 | 05-07 22:50 | ⚠️ 部分(`rg` 误报已消除,但三级状态仍未实现 | 11 次 |
| 2 | session 历史工具/业务错误区分 | P1 | 05-07 22:50 | ❌ 未修复 | 12 次 |
| 3 | cron 无主动状态报告机制 | P1 | 05-07 22:50 | ❌ 未修复 | 12 次 |
| 4 | subagent spawn 未传递 workspace | P1 | 05-07 22:50 | ❌ 未修复 | 12 次 |
| 5 | 验收脚本无法检测构建 | P1 | 05-08 09:05 | ❌ 未修复 | 11 次 |
| 6 | 环境变量/API Key 缺失未自动检测 | P1 | 05-08 09:05 | ⚠️ 部分(脚本已有分类,但 review prompt 仍未强制把前置条件失败与代码失败分层叙述) | 12 次 |
| 7 | 文件修改后未触发 commit 提示 | P2→P1 | 05-08 09:05 | ❌ 未修复 | 14 次 |
| 8 | cron review 无 delta 时空转 | P1 | 05-08 09:12 | ❌ 未修复 | 13 次 |
| 9 | 验证模式伪进展artifact_present 局限) | P1 | 05-08 14:30 | ❌ 未修复 | 10 次 |
| 10 | 项目提交停滞commit stagnation | P0 | 05-08 21:30 | ⚠️ 重新活跃23 文件 +3650/-808 行核心组件改动未入版本控制BACKLOG 本身也在未提交列表中) | 23 次 |
| 11 | review 报告未触发修复动作 | P2→P1 | 05-08 21:30 | ❌ 未修复 | 10 次 |
| 12 | BACKLOG 文件膨胀导致 review 成本递增 | P1 | 05-09 09:30 | ⚠️ 部分(已分层归档,但 current 表仍持续膨胀) | 8 次 |
| 13 | untracked 核心代码未入版本控制 | P0 | 05-10 21:30 | ⚠️ 重新活跃scripts/secret_gate_lib.sh/test.sh 为新增 untracked 项) | 14 次 |
| 14 | Phase 6+ 范围未定义 | P1 | 05-10 21:30 | ❌ 未修复 | 6 次 |
| 15 | review 误报传播 | P1 | 05-11 14:30 | ❌ 未修复 | 10 次 |
| 16 | untracked 文件统计遗漏 | P1 | 05-11 14:30 | ⚠️ 部分(本轮已更精确核对 git status但能力未固化 | 6 次 |
| 17 | 验收脚本瞬时回归缺少稳定性标记 | P1 | 05-12 22:46 | ⚠️ 部分(已补充 recovered-external-incident 叙事与 Cloudflare 传输层 fallback但 release 语义尚未系统化) | 6 次 |
| 18 | 无 delta 场景缺少老化风险优先策略 | P2 | 05-12 22:46 | ❌ 未修复 | 7 次 |
| 19 | 综合验收错误聚合误导根因判断 | P1 | 05-13 00:15 | ❌ 未修复 | 5 次 |
| 20 | snapshot truth 与 current truth 漂移未被显式提示 | P1 | 05-14 09:31 | ❌ 未修复 | 6 次 |
| 21 | Phase 6 稳定性门禁失败缺少样本窗口摘要 | P1 | 05-14 15:10 | ✅ 已修复(当前输出已含 window_size / success_rate / 样本明细) | 5 次 |
| 22 | Phase 6 稳定性门禁未区分前置条件缺失 vs 真实采集失败 | P1 | 05-14 21:30 | ⚠️ 部分(脚本已输出分类,但 review 与 release 解释层仍不足) | 8 次 |
| 23 | 脚本型 Go 仓库缺少可测试入口发现能力 | P1 | 05-15 15:11 | ⚠️ 部分(本轮已优先使用仓库声明入口,但仍依赖 reviewer 主动判断) | 4 次 |
| 24 | 长命令部分回传时缺少保守结论模板 | P1 | 05-15 21:31 | ⚠️ 部分(本轮通过 process 拿到完整输出,但策略尚未固化) | 2 次 |
| 25 | backlog current truth 老化未自动撤销 | P2 | 05-16 09:30 | ❌ 未修复 | 2 次 |
| 26 | 外部 provider 失败与主链路失败聚合过粗 | P1 | 05-16 09:30 | ⚠️ 部分Cloudflare 已加 transport fallback但其他外部源仍缺统一分层 | 6 次 |
| 27 | 稳定性窗口虽已分类但缺 release 级解释语义 | P1 | 05-16 09:30 | ⚠️ 部分Cloudflare EOF 已定性为 recovered external incident但 release 文案模板尚未系统化) | 7 次 |
| 28 | 新增导入器缺少进入综合验收前的 smoke gate | P0 | 05-16 15:10 | ✅ 已缓解(`verify_importer_smoke.sh` 持续通过,本轮 importer smoke 全 PASS | 4 次 |
| 29 | 同日 review blocker 切换缺少自动老化提醒 | P1 | 05-16 15:10 | ❌ 未修复 | 2 次 |
| 30 | 历史 precondition 样本持续老化拖低 release 成功率 | P1 | 05-17 09:31 | ❌ 未修复 | 6 次 |
| 31 | 同日无主结论 delta 时缺少风险老化优先策略 | P2 | 05-17 15:10 | ❌ 未修复 | 3 次 |
| 32 | 同日 blocker 切换后 backlog current truth 缺少 freshness 提示 | P1 | 05-17 21:30 | ❌ 未修复 | 2 次 |
| 33 | 已证伪 blocker 缺少自动降级/撤销机制 | P1 | 05-18 09:30 | ❌ 未修复 | 2 次 |
| 34 | 局部 smoke 已通过后缺少全局 blocker 切换提示 | P1 | 05-18 15:10 | ❌ 未修复 | 1 次 |
| 35 | smoke gate 测试脚本老化未跟上 runtime truth | P1 | 05-19 09:32 | ✅ 已修复(`importer_smoke_gate_test.sh` 已与 runtime truth 对齐并持续通过) | 5 次 |
| 36 | 稳定性窗口持续回落85.71% → 71.43% | P1 | 05-20 21:06 | ✅ 已恢复(窗口回到 100%,本轮 importer smoke 全 PASS | 2 次 |
| 37 | 外部文档站故障仍无系统化降级 | P1 | 05-16 09:30 | ❌ 未修复live_run SUMMARY 缺失,无法确认当前 blocker 状态) | 6 次 |
| 38 | PRE_PHASE6_RESULT 标签冲突verify_phase4 FAIL 但标签仍 PASS | P1 | 05-25 08:51 | ❌ 未修复verify_phase4 ECharts 断言失败是唯一 FAIL 项,根因为断言与实现不匹配) | 4 次 |
| 39 | 日报时间戳异常generated_at 晚约 10 小时) | P2 | 05-25 08:51 | ❌ 未修复 | 3 次 |
| 40 | BACKLOG 文件本身 uncommitted | P1 | 05-25 08:51 | ❌ 未修复BACKLOG 本轮也在未提交列表中) | 4 次 |
| 41 | verify_phase6.sh 连续超时导致 Phase 6 状态无法确认 | P1 | 05-25 09:06 | ⚠️ 部分连续超时未复现importer smoke 全 PASS但 live_run SUMMARY 仍缺失,窗口状态不明) | 5 次 |
| 42 | verify_phase6.sh 第三次连续超时 | P0 | 05-25 15:10 | ✅ 已修复连续超时未在本轮复现importer smoke 全 PASS | — |
| 43 | verify_phase4 ECharts 集成断言失败(历史遗留 P2 | P2 | 05-25 15:10 | ❌ 未修复Dashboard.tsx 已引入 echarts 但 verify 断言与实现不匹配,导致 PRE_PHASE6 FAIL | 2 次 |
| 44 | 新增 scripts 无门禁覆盖secret_gate_lib.sh / secret_gate_test.sh | P2 | 05-26 15:10 | ❌ 未修复(新增文件为 untracked无对应 verify 门禁验证其正确性) | 1 次 |
| 45 | scripts 目录 go test build failureredeclared main | P1 | 05-27 15:10 | ❌ 未修复(多个脚本存在 main/ModelPricing/logger redeclared 冲突,导致 `go test ./scripts` 无法执行) | 1 次 |
| 27 | 稳定性窗口虽已分类但缺 release 级解释语义 | P1 | 05-16 09:30 | ✅ 已修复verify_phase6 已输出 RELEASE_SEMANTICS 摘要,稳定性窗口分类已升格为 release policy | 7 次 |
---
| 29 | 同日 review blocker 切换缺少自动老化提醒 | P1 | 05-16 15:10 | ✅ 已修复(已新增 same-day blocker switch freshness guardreview 不能再无提示传播旧 blocker | 2 次 |
| 30 | 历史 precondition 样本持续老化拖低 release 成功率 | P1 | 05-17 09:31 | ✅ 已修复aged precondition 样本已从 active precondition 统计剔除,不再持续拖低当前 success_rate | 6 次 |
| 31 | 同日无主结论 delta 时缺少风险老化优先策略 | P2 | 05-17 15:10 | ✅ 已修复review_status_summary 已新增 same_day_no_decision_focus显式给出同日无主结论场景的优先风险 | 3 次 |
| 32 | 同日 blocker 切换后 backlog current truth 缺少 freshness 提示 | P1 | 05-17 21:30 | ✅ 已修复(已新增 backlog blocker freshness guard旧 blocker 不得在 same-day 切换后继续留在 current 表) | 2 次 |
| 33 | 已证伪 blocker 缺少自动降级/撤销机制 | P1 | 05-18 09:30 | ✅ 已修复(已新增 backlog revocation guardreview 已宣告移除的问题不得继续留在 current 表) | 2 次 |
| 34 | 局部 smoke 已通过后缺少全局 blocker 切换提示 | P1 | 05-18 15:10 | ✅ 已修复phase6 已输出 BLOCKER_SWITCH 摘要,局部 smoke 恢复后全局 blocker 转移会被显式提示) | 1 次 |
| 47 | 工作区严重污染121 文件未 commit | P0 | 05-29 15:10 | ❌ 未修复 | 首次暴露 |
| 48 | xfyun-live smoke FAIL 导致 live_run SKIP 传导链 | P1 | 05-29 15:10 | ❌ 未修复 | 首次暴露 |
| 49 | cron 两次运行失败未闭环 | P1 | 05-29 15:10 | ❌ 未修复 | 首次暴露 |
| 50 | BACKLOG current table 退化13 条已修复项占据 + freshness > 24h | P2 | 05-29 15:10 | ❌ 未修复 | 首次暴露 |
#### 问题 27 状态更新:已修复(从 current 表移除)
- **旧缺口**:问题 17 已经让稳定性窗口具备 `stability_label`,但这些标签仍只存在于 `window_gate_result` 的自然语言描述里。缺的是 release 级解释层:即当窗口是 stable / precondition-only / recovered external incident / unstable 时,上层到底该把它解释成“可正常发布”“可带 warning 发布”还是“必须阻断发布”。
- **修复**
1. 新增 `scripts/review/release_semantics_guard.sh`
2. 新增 `scripts/review/release_semantics_guard_test.sh`
3. 新增 `scripts/review/release_semantics_capture_test.sh`
4. `verify_phase6.sh` 现在维护并输出统一的 release semantics 摘要:
- `RELEASE_SEMANTICS class=<...> gate=<...> policy=<...>`
5. 当前窗口态与 release policy 的映射包括:
- `stable-window``release-ready / release-allowed`
- `precondition-only-window``precondition-degraded / release-allowed-with-warning`
- `recovered-external-incident``degraded-external-provider / release-allowed-with-warning`
- `unstable-window``release-blocked / release-blocked`
- **验证证据**
1. `bash scripts/review/release_semantics_guard_test.sh` → PASS
2. `bash scripts/review/release_semantics_capture_test.sh` → PASS
3. 当前真实 `verify_phase6.sh` 输出已含 `RELEASE_SEMANTICS class=... gate=... policy=...`
- **结论**:问题 27 已关闭;稳定性窗口现在不只是有分类标签,还已经升格为可执行的 release 级解释语义。
## Review 日志
### 2026-05-29 15:10afternoon-review cron
> **前置说明**:距上一次 review05-28 15:10约 **24 小时**。距最后一次 commit88833fa05-27 22:01约 17 小时,无新 commit。工作区在 05-28 review 之后重新积累 75 modified + 46 untracked 共 121 个文件变更。Phase 1/2/3/4/5 全 PASSECharts FAIL 已消失Phase 6 FAILxfyun-live smoke FAILwindow_gate 全绿7/7 success_rate=100%daily report 已生成22:01但 cron 两次失败BACKLOG freshness + table 双 guard FAIL。
#### 本次新增发现
- **工作区重新污染 P0**05-28 review 之后,工作区从干净状态重新积累 75 modified + 46 untracked 共 121 个文件变更,包括 BACKLOG 本身也在 modified 中BACKLOG freshness guard FAILstale current truth snapshotBACKLOG table guard FAILresolved rows=13
- **xfyun-live smoke FAIL 替换 sensenova-live**:本轮 Phase 6 FAIL 根因从 sensenova 切换为 xfyunchromium render timeout after 45s与上轮 sensenova 属于同类外部 provider 渲染超时问题
- **live_run 被 SKIP 传导链**xfyun smoke FAIL 导致 `live_run_result=SKIPPED`,即使 window_gate 全绿7/7主链路健康状态也无法被本轮验收确认
- **ECharts FAIL 已消失**verify_phase4 恢复 PASS(10/10),问题 38 确认关闭
#### 问题 47 状态更新:工作区污染 P0新增
- **首次暴露**2026-05-29 15:10
- **根因**05-28 review 之后工作区快速重新积累 75 modified + 46 untrackedBACKLOG 本身也在 modified 中;缺乏工作区提交触发机制
- **影响**:工作区与 HEAD 严重漂移BACKLOG freshness + table 双 guard FAIL后续 review 与验证持续基于 stale artifact 判断
- **建议修复**
1. 立即 commit 所有工作区变更
2. 考虑在 `git_commit_status_report.sh` 中增加强制 commit 提醒阈值(如 total > 50 时明确告警)
3. 后续 review 应把工作区污染超过阈值作为 blocker 处理
- **优先级**P0
- **建议验证方法**`git status --short` 应无输出freshness guard + table guard 均应 PASS
#### 问题 48 状态更新xfyun-live smoke FAIL → live_run SKIP 传导链(新增)
- **首次暴露**2026-05-29 15:10
- **根因**xfyun 官方文档 chromium render timeout after 45s触发 importer_smoke_gate_result=FAIL导致 live_run_result=SKIPPED
- **影响**Phase 6 FAIL 由 smoke gate 单点驱动主链路健康window_gate 7/7无法被本轮验收确认live_run 未被真正验证
- **建议修复**
1. 调查 xfyun 页面是否可从 chromium 渲染切换为静态抓取
2. 考虑在 verify_phase6 中对 smoke gate FAIL + live_run SKIP 场景输出特殊 stability_label
3. 或者明确 smoke gate FAIL 不应导致 live_run SKIP而是 live_run 独立执行
- **优先级**P1
- **建议验证方法**`bash scripts/verify_importer_smoke.sh` → IMPORTER_SMOKE_RESULT: PASS
#### 问题 49 状态更新cron 两次运行失败未闭环(新增)
- **首次暴露**2026-05-29 15:10
- **根因**memory/2026-05-29.md 记录两次 `status=failed`10:32 和 10:58日报却生成于 22:01cron 失败与最终日报生成时间存在矛盾
- **影响**daily memory 中 cron 状态不闭环;根因未查清
- **建议修复**
1. 查看 /tmp/llm_hub_daily_2026-05-29.log 确认根因
2. 确保 cron 成功路径也写入 memory
3. 日报生成后应写入 cron success memory entry
- **优先级**P1
- **建议验证方法**memory/YYYY-MM-DD.md 中 cron 应有 success + failed entry 且根因明确
#### 问题 50 状态更新BACKLOG current table 退化(新增)
- **首次暴露**2026-05-29 15:10
- **根因**13 条 `✅ 已修复` 行持续占据 current 表;表头 freshness 时间戳超过 24 小时未刷新
- **影响**current table 失去"未修复问题速查表"语义freshness guard + table guard 双 FAIL
- **建议修复**
1. 立即清理 13 条 resolved 行
2. review prompt 应要求每次 review 必须同步更新 current table 时间戳
3. 让 freshness guard 在 stale 时自动触发表清理建议
- **优先级**P2
- **建议验证方法**freshness guard → freshtable guard → resolved_rows=0
### 2026-05-27 15:10afternoon-review cron
> **前置说明**:距上一次 review05-26 15:10约 **24 小时**。无新 commit。工作区从 22/+2819/-466 行扩大至 23/+3650/-808 行。scripts 新增 1619 行(主要是 generate_daily_report.go +1032 行及其测试 +567 行。importer smoke 16 PASS 持续。ECharts FAIL 持续 2+ 天。scripts 目录 go test 出现 redeclared main build failure新增 P1 gap
@@ -107,6 +164,90 @@
- **15:10 状态**verify_phase4 ECharts 断言失败已持续 2+ 天,本轮无变化。
- **结论**:影响次数从 1 更新为 2 次。
#### 问题 29 状态更新:已修复(从 current 表移除)
#### 问题 31 状态更新:已修复(从 current 表移除)
#### 问题 34 状态更新:已修复(从 current 表移除)
- **旧缺口**:当 importer smoke 这类局部门禁已经恢复 PASS但 phase 级主 blocker 已经转移到别的 gate例如 `live_run``api_server`)时,输出里没有显式提示“全局 blocker 已切换”。结果是:读者容易继续把 smoke gate 当成当前主 blocker而忽略真正还在阻断主链路的 gate。
- **修复**
1. 新增 `scripts/review/global_blocker_switch_guard.sh`
2. 新增 `scripts/review/global_blocker_switch_guard_test.sh`
3. 新增 `scripts/review/global_blocker_switch_capture_test.sh`
4. `verify_phase6.sh` 现在维护并输出:
- `BLOCKER_SWITCH class=<...> old=<...> new=<...>`
5. 当前已覆盖两类场景:
- `importer_smoke_gate=PASS` 但全局根因已转移到其他 gate
- `importer_smoke_gate=FAIL``live_run_result=SKIPPED`,全局 blocker 由 smoke gate 传导到 live_run
- **验证证据**
1. `bash scripts/review/global_blocker_switch_guard_test.sh` → PASS
2. `bash scripts/review/global_blocker_switch_capture_test.sh` → PASS
- **结论**:问题 34 已关闭;局部 smoke 恢复或局部 smoke 传导导致的全局 blocker 切换,现在都会在 phase 级输出中被显式提示,不再靠读者自己脑补。
#### 问题 33 状态更新:已修复(从 current 表移除)
- **旧缺口**:问题 12/32 虽然已经分别处理了 resolved 行清理和 same-day blocker 替换,但仍缺一个更直接的自动撤销机制:如果 review 日志里已经明确写出“问题 X 状态更新:已修复(从 current 表移除current 表就不该继续保留这个问题。否则就会出现日志层已证伪current truth 仍保留’的矛盾。
- **修复**
1. 新增 `scripts/review/backlog_revocation_guard.sh`
2. 新增 `scripts/review/backlog_revocation_guard_test.sh`
3. guard 会扫描 backlog 中所有:
- `#### 问题 X 状态更新:已修复(从 current 表移除)`
并检查 current 表是否仍残留对应 issue id若残留则直接 FAIL
- **验证证据**
1. `bash scripts/review/backlog_revocation_guard_test.sh` → PASS
- **结论**:问题 33 已关闭;已证伪/已宣告移除的 blocker 现在有了自动撤销 guard不会再继续挂在 current truth 上自相矛盾。
#### 问题 32 状态更新:已修复(从 current 表移除)
- **旧缺口**:问题 29 解决了 review 文本层的 same-day blocker switch 提示,但 backlog current truth 层仍没有同步约束。结果是:即使 review 已明确写出 `old -> new` 的 blocker 切换,旧 blocker 仍可能继续留在 current 表里,继续伪装成当前未修复项。
- **修复**
1. 新增 `scripts/review/backlog_blocker_freshness_guard.sh`
2. 新增 `scripts/review/backlog_blocker_freshness_guard_test.sh`
3. 规则:一旦 backlog 文本中出现:
- `freshness_hint=same-day-blocker-switch old=<...> new=<...>`
guard 就会检查 current 表中是否还残留 `old` blocker若残留则直接 FAIL
4. 这样 same-day blocker 切换不只是在 prose 层有提示,也会约束 current truth 层必须同步更新
- **验证证据**
1. `bash scripts/review/backlog_blocker_freshness_guard_test.sh` → PASS
- **结论**:问题 32 已关闭;同日 blocker 切换后,旧 blocker 不能再继续滞留在 current 表里冒充最新真相。
- **旧缺口**:问题 18 已经让 no-delta 场景输出 `aging_focus`,但还没有区分一种更尖锐的停滞态:同一天内没有新的主结论 / 没有新的 blocker 切换。此时 review 不只是“没变化”,而是“今天已经 review 过,但仍没有形成新的主判断”,需要更强的风险优先策略。
- **修复**
1. `scripts/review/review_status_summary.sh` 新增:
- `same_day_no_decision_focus=`
2. 当前输出 top2 形式:
- `same_day_no_decision_focus=<issue>:<priority>:<impact>,...`
3. 新增 `scripts/review/review_same_day_no_decision_test.sh`
4. 这样 no-delta 摘要不再只给一般 aging_focus还会单独指出“同日无主结论”场景下最值得优先处理的问题
- **验证证据**
1. `bash scripts/review/review_status_summary_test.sh` → PASS
2. `bash scripts/review/review_aging_priority_test.sh` → PASS
3. `bash scripts/review/review_same_day_no_decision_test.sh` → PASS
- **结论**:问题 31 已关闭;同日 no-delta 现在不再只是一般 aging而有独立的 same-day no-decision 风险优先输出。
#### 问题 30 状态更新:已修复(从 current 表移除)
- **旧缺口**:当前链路已经能够把 `precondition_missing` 分类出来,但历史 precondition 样本仍会持续占据最近 7 次窗口。这样即使当前链路已经恢复绿色success_rate 仍可能被很久以前的“缺钥/缺连接串”样本拖低,导致 release 语义长期停留在 degraded。
- **修复**
1.`collector_stats_window_audit.sh` 中新增:
- `aged_precondition_missing`
- `AGED_PRECONDITION_MINUTES=1440`
2.`precondition_missing` 样本年龄超过阈值时,不再计入 active `precondition_missing`,而是转入 `aged_precondition_missing`
3. `SUCCESS_RATE` 的分母会剔除 aged precondition 样本,因此历史前置条件失败不会继续污染当前 release success-rate
- **验证证据**
1. `bash scripts/collector_stats_window_audit_test.sh` → PASS
2. aged 样例输出已含:
- `precondition_missing=0`
- `aged_precondition_missing=1`
3. `bash scripts/verify_phase6.sh``PHASE_RESULT: PASS`
- **结论**:问题 30 已关闭;历史 precondition 样本现在会老化出 active release 窗口,不再持续拖低当前 success-rate 与 release 判断。
- **旧缺口**:当同一天内 review 的主 blocker 已经从 A 切换到 B例如 `xfyun-live` 替换 `sensenova-live`)时,旧 blocker 仍可能继续残留或被复述出去,但报告中没有任何显式 freshness 提示告诉读者“这是同日 blocker 切换,不要继续把旧 blocker 当成当前主 blocker”。
- **修复**
1. 新增 `scripts/review/blocker_switch_guard.sh`
2. 新增 `scripts/review/blocker_switch_guard_test.sh`
3. 规则:一旦 review 文本里出现“替换”语义,就必须同时出现:
- `freshness_hint=same-day-blocker-switch old=<...> new=<...>`
4. 这样同日 blocker 切换会被显式标记为 freshness 事件,而不再只是自然语言描述
- **验证证据**
1. `bash scripts/review/blocker_switch_guard_test.sh` → PASS
- **结论**:问题 29 已关闭;同日 blocker 切换现在会带 freshness_hint旧 blocker 不再能在 review 链里无提示继续传播。
### 2026-05-26 15:10afternoon-review cron
> **前置说明**:距上一次 review05-25 15:10约 **24 小时**。本轮距上次 afternoon review 无新 commit工作区变更从 19 文件 +1372/-281 行增长到 22 文件 +2819/-466 行。verify_phase6.sh 连续超时问题(本轮跨三次 review 的 05-25 记录本轮首次解决importer smoke 全 PASS但 live_run SUMMARY 仍缺失。PRE_PHASE6 FAILverify_phase4 ECharts 断言失败。go test 全 PASS。