路径防呆与导航可达性修复报告 v5.1(2026-09-24)
驾驶舱索引: 已更新(复盘 N 份 / 归档 M 份);
路径防呆与导航可达性修复报告 v5.1(2026-09-24)
主题:根治「复盘文件能写入、但从驾驶舱导航页点不到」。
关联:00 驾驶舱(投资MOC)、框架/数据口径定义、optimization/报告/系统状态一致性修复报告_2026-09-23。
一、问题复述与根因(4 条,均已封堵)
| # | 根因 | 证据 | 后果 |
|---|---|---|---|
| R1 | 命名必须精确匹配 ^YYYY-MM-DD 收盘复盘$ | 旧 moc_index.classify() 只认精确名;2026-09-24收盘复盘.md(少空格)、…收盘复盘(终稿).md 一律落入 extra 被静默丢弃 | 文件写进去了,AUTO:INDEX 永远不收录 → 导航页查无此件 |
| R2 | 只扫 复盘/*.md 根目录直属文件 | 旧 collect() 用 REVIEW_DIR.glob("*.md"),非递归 | 写进 复盘/子目录/ 的日复盘永久不可见 |
| R3 | 同日同类型重复文件互相覆盖 | 旧版对同一 (日期,类型) 直接覆盖字典键,无冲突提示 | 终稿覆盖初稿却无告警,事后无法追溯 |
| R4 | moc_index.py 不是自动执行的 | v5.0 决策「fetch.py 不改动,发布后手动跑」;技能里是「强制步骤」但依赖人/Agent 记得 | 一旦跳过,新快照/复盘就是零入链 |
附:
/var/minis/shared/shared-F98F2D01_DUCKERRY 的小仓库是 6–7 月的历史副本(无 AUTO:INDEX、最新文件停在 07 月),不是写入目标,不构成路径错位风险,但应在文档中标明以免误写。
二、修复内容
1. scripts/moc_index.py 升级 v5.1(4 项防呆)
- 命名容错:正则改为
^(\d{4}-\d{2}-\d{2})[ _\-·—]*收盘复盘.*$等,容忍少空格/多后缀/不同分隔符。 - 递归扫描:
复盘/**/*.md(排除历史原始记录/归档区)。 - 重名冲突检测:同
(日期,类型)多份时优先规范名,并把冲突打印到 stderr。 - 未登记告警:形如
YYYY-MM-DD …、未归类、且驾驶舱全文搜不到链接的文件才报警(已挂链的合法文档如数据复盘总汇不误报)。 - 新增
--verify <路径>:一条命令确认「该文件是否已能从导航页点到」,退出码 0/1。 - 新增第 5 类
🚫 数据缺失占位:G1 失败时的占位文件也能被导航页直达。
2. scripts/review_write.py 新建(唯一合法写入入口)
- 规定唯一目录
复盘/+ 唯一命名,自动生成规范绝对路径(--print-path)。 - 支持类型简写归一化:
复盘/快照/简报/备忘/占位。 - 已存在默认不覆盖(退出码 2),符合「不覆盖人工收盘复盘」口径;
--force才覆盖。 - 写入后自动跑
moc_index.py登记 +--verify校验,输出✔ 导航页可直达。
3. scripts/fetch.py 发布后自动登记(非阻断)
- 在
doc_sync_check之前调用moc_index,结果写入latest.json.moc_index,日志打印
驾驶舱索引: 已更新(复盘 N 份 / 归档 M 份);命名不规范的会打印 ⚠️ 该文件写入了但导航页点不到:…。
- 异常一律捕获,永不阻断发布(与
doc_sync_check/ 债券腿同一模式)。
4. scripts/arch_check.py 升级 v5.1(10 项自检)
- 新增 第 10 项:
复盘/全部可从驾驶舱直达——要求驾驶舱本身有链接,而非「全库某处有链接」。 - 检查 4 的日期正则与扫描范围改为递归 + 容错命名,与
moc_index口径一致。
5. scripts/publish_status.sh
- 新增
moc_index:行,轮询时一眼看到索引是否登记、有无命名未登记文件。
6. 文档同步
- 技能
duckerry-daily-review升 1.5.0:新增 §1.9「复盘文件写入路径硬规则」;§1.7 改 10 项;§5 / OPEN_DAY 改为必须经review_write.py落盘。 - 交接提示词
optimization/每日发布运行提示词_2026-09-23.md的 §6.5 同步。
三、验证证据(可复核)
$ python3 scripts/review_write.py --print-path 2026-09-24 复盘
/var/minis/mounts/DUCKERRY_Warehouse/复盘/2026-09-24 收盘复盘.md
$ python3 scripts/review_write.py 2026-09-24 占位 --src /tmp/draft.md # 端到端自测后已删除该测试件
✔ 已写入:复盘/2026-09-24 数据缺失占位.md(88 字节)
✔ 导航页可直达:复盘/2026-09-24 数据缺失占位
$ python3 scripts/moc_index.py --verify "复盘/长期记忆-2026-08-16.md"
✗ 未在驾驶舱 AUTO:INDEX 登记(导航页点不到):复盘/长期记忆-2026-08-16
原因:文件名不符合四类命名(…)
$ python3 scripts/arch_check.py
✔ 10. 复盘/ 全部可从驾驶舱直达 | 0 个点不到 (10/10 全通过)
$ python3 scripts/doc_sync_check.py --strict
排版同步:全部一致
$ DK_DISABLE_MCAL=1 python3 tests/test_pipeline.py
Ran 29 tests in ~90s OK (含新增 PathGuardTests 4 项)四、红线与回滚
- 备份:
/var/minis/shared/backup/DUCKERRY_pre_pathfix_20260923/(fetch.py/moc_index.py/驾驶舱,含MD5_BEFORE.txt)
改动前 md5:fetch.py=7ba14f6f…、moc_index.py=4e74d026…
- 未改动:
数据/、归档区、任何人工收盘复盘、AUTO:DATA区块(仍由fetch.py生成)。 - 未触碰判据:新脚本均只读/只登记/不阻断,不参与 L0–L4 / 信号 / 发布闸门。
- 回滚:用备份目录内同名文件覆盖
scripts/与驾驶舱即可。
五、遗留
- 历史副本
/var/minis/shared/shared-F98F2D01_DUCKERRY 的小仓库仍是 6–7 月状态——建议归档或明确标注「勿写入」,本轮未处理(不在写入链路内)。 moc_index自动登记只在fetch.py成功发布时触发;Agent 手写复盘仍须走review_write.py(技能已强制)。- 简写类型别名仅覆盖常见中文简写,英文名(如
review)未支持,按需再加。