muse-agent-example/docs/实现回顾/专项检查-台账.md
zizi faef454ac7 refactor(提示词): 批次2身份与术语统一——身份句唯一归角色层,JF-03销项
- 删除4份登记模板身份句(生成正文/生成作品规划/细化章节计划/创作质量审阅);
  装配后身份句只来自角色层,消除双自我介绍
- 正典名统一规划员:角色合同 displayName 与章节标题两处文字(红线收窄豁免,
  .agent/角色/规划员.md 不动);生成规划.py 错误文案与受控规划测试断言同步
- A3(JF-03,用户已授权):删除未登记孤儿模板 核对实体歧义.md;研究命令与
  「检查与维护拆书结果」技能话术改为"歧义只登记,由作者人工判定",人工核对
  步骤与合同承接进技能;实体归并.py 话术核实已合规无需改
- C4:创作质量审阅英文状态词首现处补中文对照(insufficient_evidence/ask/
  uncalibrated/reviewed/repair/retain/judgment);continuity/craft/voice 已有对照
- D2:生成正文.md"戏剧化叙述"并入可操作判据(用动作、对白与细节呈现事件,
  不复述或概括事件),写手模板净增0行
- docs:B03-资料研究.md 同步(拆书分析改资源模板加载、新增模板行、删孤儿行、
  备注更新);专项检查台账收口节记录 JF-03 处置;历史目标文档按先例保留原时点

证据:全仓 grep 规划师/核对实体歧义 活跃区零残留;离线全量1153项通过;
受影响数据库集成45项通过(受控规划/完整文学审校/两阶段写手/写手声音/章后/拆书);
资源包已重建,索引检查通过。
2026-09-19 22:08:16 +08:00

468 lines
180 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- 导航元信息: {"内容描述": "2026-09-16 全仓专项检查的 294 条原发现、复核更正与收口状态", "使用场景": "追溯某条检查发现的原始位置与最终处置时", "使用要求": "原级别分布不是当前未修数;位置为检查时快照,路径以当前仓库为准"} -->
# 全仓专项检查台账
> 日期:2026-09-16 | 编排:主代理 | 依据:[专项检查-计划.md](专项检查-计划.md) 第 5 节严重度分级、第 6 节报告格式
> 范围:`src/muse`、`tests`、`web`、`数据库`、`工具`、`.agent`、`docs`、根文件;不含缓存、构建产物、小说正文与数据库内容。
> **本台账保存 2026-09-16 原发现及复核更正,不再单独充当修复输入;2026-09-17 已按用户裁决进入[优化执行](../系统架构/新版设计/优化执行合同.md),2026-09-18 收口(见下节)。下表是原级别分布,不能当作尚未修复数。**
## 复核更正(2026-09-17)
- **不能直接据原台账逐条实施**:原报告306个编号,原合并表实际294行,12个编号被并入;原总计295为算术错误。本次从报告恢复被截断的现状及建议全文,保留原报告作为发现来源。
- 13项源码抽样(全部5项P0、5项P1、2项P2、1项P3)结果为11项证据成立、2项证据不实、0项无法复现;六份报告22项证据抽查为8成立、7不实、7无法复现。覆盖映射不是306项全部已证实。
- R2“846/889”缺原快照、脚本和口径,判定为**无法复现**;当前范围统计不能证伪历史数字。AGENTS的旧路径中有明确“已退出”标记,不能统称至少六处物理谎报;只修现行错误声明及缺失导航。
- 合并更正:JF-02是资料研究未消费模板,恢复独立;JS-03与JW-02分别保留审校和规划消费者验收。AG-07/DR-13归DR-01,TL-13归DR-14。JR-09只复用JR-06共有的报告读取部分。
- JS-01按P1处理:规则仍为candidate,新版不承继旧豁免;旧evidence出处未核不改同版本载荷。AG-25撤回标题锚点误判;JS-06撤回“例证未校验污染指纹”前提;TS-34保留独立工厂;TL-02保留受测method协议;DR-26区分旧59项承接与现行46个物理技能;AG-10缺操作frontmatter实际7项;DR-12/TS-60保留网络隔离标记。
- AG-01关于“无双向核对”的说法不完整:已有架构测试双向核对。后续提取共享发现实现,不再增设第二套同义门禁。
- 2026-09-16复核原命令 `make 检查`、`make 测试` 均exit 0,后者1005 passed/927 deselected/2 warnings;这是旧源码基线证据,优化后的验收必须重新覆盖变更。
逐条三值判定及原始日志:`/tmp/muse-qc-review-20260916-2112/`。已裁决的全量编号处置、五要素与依赖计划已留存于实施区 `.agents.local/优化-20260917/已裁决计划/`;新增全局设计问题一并承接,不能只按原严重度逐项打补丁。原模块报告保留检查时表述,本节纠偏优先于其冲突结论。
## 收口与现状(2026-09-18)
- **处置链已闭环**:294 条主编号(另 12 条并入编号)经 2026-09-17 用户六项裁决后进入[优化执行合同](../系统架构/新版设计/优化执行合同.md),由 O00–O14 工作包承接;逐条处置、五要素与验收断言存于本地实施区(不入库),本条只记结论与边界。
- **裁决处置分布(294 条主编号)**:修正 203、由新机制消除 43、保留 37、条件性延期 7、撤回不实前提 4。原 306 编号中的 12 条为并入别名;另有 7 组前期系统复核与 16 项全局机制发现随批承接。
- **执行与边界**:O00–O14 的离线可验部分已按六批提交(`0658d17`、`d909d1b`、`ae02fd1`、`af08551`、`0260bcd`、`c154ca9`)合入 `main`,其后完成测试成本优化与旧库迁移退场;真实接缝验收(真实模型、浏览器、隔离 PG 真接缝、发布包与恢复演练)按各自批次记录,未完成部分不计作已修。
- **位置时效**:条目位置为 2026-09-16 检查时快照。优化执行重组了提示词、模块与测试文件结构,**路径一律以当前仓库为准**;本台账不逐条追改路径。
- **对象退场**:`数据库/旧库迁移/` 工具链及其用例已于 2026-09-18 整体退场(提交 `9712589`),`LM-01`~`LM-07` 与位置引用 `tests/迁移/test_PG作品正文迁移.py`、`test_作品资产迁移.py`、`test_混合知识分流.py`、`test_隔离目标台账.py` 等已删文件的条目(`TS-20`、`TS-50`、`TS-55`、`TS-61`、`TS-62`)失去核查对象,保留为历史发现。
- **过程材料留存口径**:14 份模块报告(`专项检查-报告-*.md`)与 `/tmp` 探针日志均为过程材料,受 `.gitignore` 忽略、不入版本库;台账中指向它们的路径仅在本地可读时有效。
- **JF-03 处置(2026-09-19)**:经用户授权采纳删除方案——`src/muse/资料研究/提示词/核对实体歧义.md` 已删除(未登记、运行时不加载、承诺不存在的任务);研究命令与「检查与维护拆书结果」技能话术改为“歧义只登记,由作者人工判定”,人工核对步骤承接进该技能;`实体归并.py` 话术检查时已合规。原行保留为历史快照。
## 0. 汇总
| 严重度 | 原始条目 | 合并同事实后 | 说明 |
|---|---|---|---|
| **P0** 红线与风险 | 6 | **5** | 门禁红 2(同一根因 1 组)、误导性权威声明 2 |
| **P1** 事实错误 | 95 | **84** | 悬空引用、死代码/零消费者资产、一致性断裂、标准缺失、门禁恒真 |
| **P2** 熵增 | 171 | **171** | 重复、泔水、孤儿、复杂度热点、依赖冗余 |
| **P3** 记录不改 | 34 | **34** | 历史留痕与有意保留项,已注明理由 |
| 合计 | 306 | **294** | 另有 6 条「未发现问题」覆核行(各报告零发现节),不计入条目 |
**原检查的覆盖边界**:离线绿测只证明实际选中行为,不能据此宣称全仓设计合理或全部链路健康。后续复核发现连接、资源核验、测试底座、索引、调用费用、授权撤回、上下文与工作面等全局问题,按优化执行合同处理。
**来源与去重**:**14 份模块报告**(后端 8 组:接入 / 基础设施+共享 / 审校修订+效果评测 / 任务运行+编排 / 交付连载+上下文+资料研究 / 作者经验+正文写作+作品规划 / 知识方法+正式变更+故事世界+元数据;非后端 6 份:tests+资源 / web / 数据库迁移 / 旧库迁移 / 工具 / `.agent` / docs+根文件——详见 `docs/实现回顾/专项检查-报告-*.md`)合并去重。9 组同事实重复项已合并,主条目与被并入项对照如下(被并入项不再单列,原始行仍在各自报告):
| 保留条目 | 并入 | 同一事实 |
|---|---|---|
| `JC-01` | `TS-01` | CI「离线测试」步无生成步骤 → 干净检出必红 |
| `JC-02` | `DR-11` | Pi 版本口径 CI 0.84.4 vs 代码/文档/部署 0.85.1 |
| `AG-01` | `DR-04`、`DR-05` | `skills.json` 不存在 + 「59 个技能」实为 46 |
| `AG-07` | `DR-13` | 「审查标准」原文缺失(AGENTS.md:60 权威引用落空) |
| `JT-03` | `JS-03`、`JW-02`、`JF-02` | 提示词未登记资源、绕过发布包直读源树(跨 3 模块同模式) |
| `DR-10` | `JW-04` | B07 声明 `作者经验/提示词/整理偏好与改进建议.md`,目录不存在 |
| `LM-02` | `TS-10` | 「混合知识分流」用例断言在真实旧结构上不成立 |
| `DR-02` | `JK-07` | `AGENTS.md:53` 结构契约指向已退出路径 + 「23 型」实为 24 |
| `TS-05` | `AG-11` | `tests/架构/test_模块依赖.py:353` 技能登记断言恒真 |
## 1. 门禁结论(主代理实测,2026-09-16 历史快照)
| 门禁 | 首轮 20:30 | 生成物刷新后 20:42 | 证据 |
|---|---|---|---|
| `make 检查` | 绿 | 绿 | ruff `All checks passed!`;pyright `0 errors, 0 warnings`;架构 `15 passed`;索引通过 |
| `make 测试` | **红**:`1 failed, 1004 passed` | 绿:`1005 passed, 927 deselected` | `/tmp/qc/门禁结果.txt`、`/tmp/qc/门禁结果-复跑2.txt` |
| `make 资源核对` | 绿 | 绿 | 发布身份 `muse-foundation-r2`,131 项 |
| `make 前端检查` | 绿 | 绿 | exit 0 |
| `make 前端测试` | 绿 | 绿 | `28 passed` 文件 / `91 passed` 用例 |
| `uv run python 工具/维护索引.py --检查` | 绿 | 绿 | exit 0 |
首轮红的原因、处置与**残余的 CI 风险**见 `JC-01`;本轮门禁只覆盖本机工作区,**干净检出/CI 的结论是红**(同一根因)。
**环境限制(非产品缺陷,但影响证据强度)**:`uv run` 在受限沙箱下拒绝写 `~/.cache/uv`(exit 2),子代理普遍改用 `.venv/bin/*` 等价命令;`pytest` 不带 `--外部环境` 时因 `tests/conftest.py:110-121` 的 macOS `sandbox_init` 被拒而 exit 4(OS 离线隔离按设计拒绝无防护执行)。因此**测试类结论以主代理在授权环境下的 `make 测试` 为准**(1005 passed)。
## 2. 原机械复核与更正边界
| 项 | 口径 | 结果 | 结论 |
|---|---|---|---|
| Markdown 相对链接 | 393 个 .md、1680 条链接(全 docs + .agent + .github + 根文件) | 死链 **4** 条 | 主代理与 docs 子代理两套独立脚本收敛到同一数字 |
| Markdown 链接(docs 权威区 + 根文件) | 1196 条 | 死链 **4** 条;`docs/系统架构/新版设计/` 单独 1076 条**零死链** | 权威区链接健康 |
| 反引号仓内路径引用 | 2722 条(主代理口径)/3000 条(docs 子代理口径) | 失效 1236/574 条 | 量级大但绝大部分落在历史执行记录与「文件清单」形态引用上 |
| **R2 旧结论「证据死链 846/889」** | 穷举「范围 × 引用类型」组合 | **无法复现**:当前探针未得到889/846,但缺原统计输入和算法 | 仅保留当前快照的独立结果,不能据此推翻历史数字 |
| `.gitignore` 与跟踪文件交集 | `git ls-files` 1320 个 × `.gitignore` | **0 命中** | 计划第 2 节「零误跟踪」目标本轮成立(20:43:37 快照) |
| 全新检出模拟 | 临时移走 `src/muse/资源/清单.json` 与 `运行资源.zip`(gitignore 生成物) | `tests/迁移/test_备份恢复与切换核对.py` **收集期**即报 `资源缺失错误`,整套中断(0 collected) | 坐实 `JC-01` 的 CI 风险 |
| `AGENTS.md` 已知过期点 | 逐条 `ls`/`find` 验证 | ① `muse/content/meta/schemas/` 不存在;② `muse/lifecycle/flow/chains/` 不存在;③ 全仓无 `skills.json`;④ `.venv-旧` 不存在;⑤ 父仓 `../AGENTS.md`、`../design-docs` 存在 | 旧路径已标退出者仅缺现行导航;当前skills.json、运行态、数量、审查口径及旧解释器声明分别核对,撤回“至少六处”笼统结论 |
| 链接文字≠目标 | `.agent`+`docs`+根文件 | 8 类(`AGENTS.md` 11 处、历史文档 2 处) | 与 `DR-07` 一致 |
| 技能物理计数 | `find .agent/skills -name SKILL.md` | **46**(诊断 1、规划 6、操作 31、写作 8);`能力/目录.json` 仅 22 operation + 5 role,`method` 恒 0 | 「59」既非物理数也非登记数 |
## 3. 问题清单
## P0(原始 6 条 → 去重后 5 条)
| 编号 | 模块 | 位置 | 方向 | 现状摘录 | 建议 | 所需授权 |
|---|---|---|---|---|---|---|
| **AG-01**(并入 DR-04、DR-05) | agent层 | `.agent/skills/规划/目录.md:3`(同文 `写作/目录.md:3`、`诊断/目录.md:3`)、`AGENTS.md:55` | D4 | 「技能名和物理路径来自 manifest,技能说明来自 SKILL.md frontmatter;本文件手工维护,`工具/维护索引.py --检查` 核对清单与技能目录一致」;AGENTS.md「59 个技能…(物理清单以 `skills.json` 为准)」。全仓无 `skills.json`/manifest;被点名的门禁只校验"磁盘技能目录有合规 SKILL.md",**不做清单↔物理一致核对**;物理与索引实为 46 个 `SKILL.md`。 | 删除 manifest/skills.json 口径或回填该文件;在 `工具/维护索引.py` 增加一轮「`目录.md` 表行 ↔ 磁盘技能目录」双向核对,使声明与门禁对齐;AGENTS.md 数量改 46 或写明 59 的构成 | 需用户授权(改门禁与入口声明) |
| **DR-01** | docs与根文件 | AGENTS.md:60 | D4 | `| 审查标准 | [`.agent/规范/审查标准.md`](.agent/rules/文档与资源生成.md) | 智能体提示词 4 问、技能质量 7 问 + D8 复利审查规程与严重度定义。 |` —— 链接文字所指 `.agent/规范/审查标准.md` **全仓不存在**(`find . -name '审查标准*'` 零命中),目标 `.agent/rules/文档与资源生成.md` 是「文档与资源生成规则」6 条,内容不含 4 问/7 问/D8/严重度 | 二选一:①把该行改为指向真实存在的审查标准文件并把原文落盘;②若已无原文,改引 `专项检查-计划.md` 附录 A/B 并将附录转正。在此之前该行不得再作为权威引用 | 需用户授权(改 AGENTS.md) |
| **JC-01**(并入 TS-01) | 后端-基础设施共享 | `tests/单元/test_备份发布身份.py:18,31`;`src/muse/基础设施/备份恢复.py:311`;`.github/workflows/检查.yml:42-52` | D1 门禁 | 用例红:`AssertionError: Regex pattern did not match … Actual message: '当前程序、资源或配置不一致,须先核对安装产物'`;探针实测 `运行代码哈希()=3b2f775f…` ≠ 清单 `代码哈希=11bc9044…`,`src/muse/资源/清单.json` 构建于 18:46、HEAD 提交于 19:09 | 根因是本地资源包(gitignore 生成物,`.gitignore:36`)早于当前 HEAD:先 `make 构建` 重建资源包复核;同时给 `检查.yml` 的"离线测试"步补构建步骤,否则全新检出下 `加载清单()` 直接抛 `资源缺失错误`(同一用例的登记环境为"离线/已知发布构建",见 `tests/用例清单.json:13732-13741`) | 需用户授权(`make 构建` 会重写 web/dist、接口生成物与索引) |
| **JC-02**(并入 DR-11) | 后端-基础设施共享 | `.github/workflows/检查.yml:59`;`src/muse/基础设施/宿主/Pi.py:28`;`tests/集成/test_受控模型调用.py:717` | D7 一致性 | CI 钉 `@earendil-works/pi-coding-agent@0.84.4`,而代码按 `包["version"] != self.固定版本` 精确比对、测试构造 `Pi宿主(..., "0.85.1")`;`README.md:28`、`docs/系统架构/新版设计/模块设计/S02-任务运行.md:56` 均写 0.85.1 | 统一为 0.85.1(改 CI 钉版本或改代码/文档,只能二选一);本轮未执行宿主测试,结论由三处静态证据推断 | 需用户授权(改 CI 或改版本口径) |
| **JS-01** | 后端-审校效果评测 | `src/muse/审校修订/内置规则/密度/d001.yaml:30`(另有 15 处同文:密度 d002-d006、词汇 l005/l006、结构 s002-s007、语义 sem002/sem003 各自 `evidence:` 行) | D2 | `2026-08-16 所有者决定跳过 holdout 直接激活(激活门豁免,留痕供审计)`。仓内工作树零留痕(全仓 grep `2026-08-16`/`激活门豁免` 非规则文件命中 0);当前实现也不存在豁免开口:`机器味规则.py:133-134` 强制安装包规则必须 `candidate`、`:145-147` 无条件抛"缺少B10逐例评测和正式批准",`规则启用.py:163-170` 启用必须持 B10 规则诊断凭据。留痕只在**已退出工作树**的旧 `humanization/` v0 库(git `476bb71`,其 README 写明这 16 条 holdout 是"欠账…必须补齐"),而新版规则文本把"欠账"限定删掉了 | 二选一:删掉"(激活门豁免,留痕供审计)"括注,或改写为可核路径并保留欠账限定(例:`依据 git 476bb71 旧 humanization v0 库豁免;新版 holdout 仍欠账`);同时把豁免是否延续写进 B06 文档 `规则候选与只读诊断合同` 节 | 需用户授权 |
## P1(原始 95 条 → 去重后 84 条)
| 编号 | 模块 | 位置 | 方向 | 现状摘录 | 建议 | 所需授权 |
|---|---|---|---|---|---|---|
| **AG-07**(并入 DR-13) | agent层 | `.agent/规范/目录.md:1-5`;计划 D4/D5 | D4 | 「审查标准(提示词 4 问、技能 7 问、D8 复利审查规程)」原文在 `.agent/规范/`、`.agent/rules/` 与设计文档中均无对应文件;计划只能用附录 A/B 作替代口径。 | 把本计划附录 A/B 与 D8 规程转正为 `.agent/规范/审查标准.md`,并在 `.agent/规范/目录.md` 登记 | 需用户授权 |
| **AG-10** | agent层 | `工具/资源登记.json`(`能力文件` 22 条);`.agent/skills/操作/写下一章/SKILL.md:2`、`.agent/skills/操作/核对内容一致性/SKILL.md:2` | D4 | 资源登记含 22 个 `.agent/skills/操作/*/SKILL.md`;`写下一章`、`核对内容一致性` 声明了完整能力身份(`id: write-next-chapter`、`id: check-consistency`)却未登记;另 9 个操作技能(导入资料、拆解书稿、检查与维护拆书结果、采集资料与榜单、维护故事世界、确认事实增量、整理写作方法 等)无 `id/category/contract_version`,按 `src/muse/资源加载.py:40-55` 无法通过能力声明校验。 | 明确"能力化技能"清单:要么补齐 9 个技能的能力 frontmatter,要么删除未使用的 `id` 并成文"方法/工具技能不打包" | 需用户授权 |
| **AG-05** | agent层 | `.agent/rules/正式变更.md:3`、`.agent/rules/任务与证据.md:3`、`.agent/rules/审校与修订.md:3`、`.agent/规范/中文正文与界面.md:3` | D4 | 四份规则各自点名机械门禁:`tests/架构/test_正式写入入口.py`(S01 已落地,该文件不存在且全仓无此字符串)、`tests/集成/test_取消恢复与未知调用.py`、`tests/单元/test_正文格式与选段.py`(两处引用)——三个文件均不存在。 | 改指真实门禁(如 `tests/集成/test_正式提交原子性.py`、`tests/集成/test_任务租约与恢复.py`、`tests/单元/test_审校覆盖.py`),或回填被点名文件 | 需用户授权 |
| **AG-06** | agent层 | `.agent/目录.md:3,4,5`;`AGENTS.md` §3 同源 | D4 | 索引描述列点名「执行流程」「红线」「审查标准」「指令集」「去 AI 味道」,五项在 `.agent/` 均无对应文件(`.agent/rules/` 9 个、`.agent/约束/` 3 个、`.agent/规范/` 3 个)。AGENTS.md 用这些名字指到了另外三个真实文件(`.agent/rules/模块依赖.md`、`.agent/约束/作者主权.md`、`.agent/rules/文档与资源生成.md`)。 | 回填缺失文件,或改写索引与 AGENTS.md 的文字使其与物理文件同名 | 需用户授权 |
| **AG-02** | agent层 | `.agent/角色/角色合同.md:6,13,20,27,34`(`promptFile`)与 `:43` | D5/D2 | frontmatter 五个 `promptFile: .agent/agents/{writer,planner,extractor,detector,judge}.md`;正文称「`.agent/agents/*.md` 保存 Agent-facing 的身份、Skill 路由与工作方法」。`.agent/agents/` 不存在;真实文件为 `.agent/角色/{写手,规划员,知识抽取员,检测员,评委}.md`(`tests/架构/test_模块依赖.py:406` 亦按此路径断言),且五份提示词实测**不含任何 Skill 路由**。 | `promptFile` 改为 `.agent/角色/<中文名>.md`;删去"Skill 路由"或把路由回填进提示词 | 需用户授权 |
| **AG-03** | agent层 | `.agent/角色/角色合同.md:7-8,14-15,21-22,28-29,35-36,45,103` | D5 | 合同:`modelPolicy: fixed-opus|governed-chain-or-fixed|judge-fixed`、`modelPolicyVersion: fixed-opus-v1|muse-governed-chain-v1|judge-fixed-v1`、`toolPolicy: task-spec-allowlist`;并自称「本文件是模型策略的事实源;执行侧的常量与校验是该事实的镜像,两者不一致即为缺陷」。执行侧 `配置/角色策略.yaml:1` 是 `version: role-policy-r2-v2`,策略名为 `fixed|governed|judge-fixed`,工具面为 `readonly_tools`;上述 5 个策略名/版本串与 `task-spec-allowlist` 在 `src/`、`配置/`、`tests/` 全零命中。白名单成员(`deepseek-v4.1-flash`、`muse-spark-1.3-contributor`)与实现一致。 | 把契约改为显式引用 `配置/角色策略.yaml` 并同步策略名与版本号,或把 `modelPolicyVersion`/`toolPolicy` 登记进配置由校验读取 | 需用户授权 |
| **AG-09** | agent层 | `.agent/作者/场景/写下一章.md:10-11`、`.agent/作者/场景/查作品.md:12` | D5/D2 | 「正式技能」章节把实现模块登记为技能:`[准备任务上下文](../../../src/muse/上下文/材料装配.py)`、`[固定任务上下文](../../../src/muse/上下文/冻结快照.py)`、`[分析质量短板](../../../src/muse/作者经验/改进提案.py)`;三者不在任何技能目录,"分析质量短板"全仓无同名技能或入口。 | 该章改为"实现模块"表述并另给真实技能指针(核对内容一致性/评估内容质量),或补齐同名技能 | 需用户授权 |
| **AG-12** | agent层 | `.agent/rules/计划与提交.md:31,33` | D4 | 两处链接 `../../../.agents/rules/verification-principles.md`:目标落在**仓外**父仓 `/oh-my-muse/.agents/rules/`(本机存在,`git ls-files` 零命中)。单仓克隆即死链,L3 判据在本仓不可读。 | 复制进仓或显式标注"父仓规则、不随本仓分发" | 需用户授权 |
| **AG-04** | agent层 | `.agent/角色/角色合同.md:49` | D2 | 「两阶段…派发实现见 `写下一章/scripts/two_phase_writer.py`」。该路径不存在,`.agent/skills/` 下无任何 `scripts/` 目录;`.agent/rules/模块依赖.md:8` 明令「技能不携带实现…禁止在技能目录放可执行脚本」。 | 改指真实实现(`src/muse/正文写作/`,`tests/集成/test_两阶段写手.py` 为证)或删除该句 | 需用户授权 |
| **AG-08** | agent层 | `.agent/skills/规划/提炼故事概念/SKILL.md:92-93` 等 15 处(规划 6、写作 8、诊断 1) | D5/D2 | 15 个方法技能的 `## 复利合同` 逐字相同:「本 Skill 的选型判断指导后续 `制定作品规划` / `准备任务上下文` 的范式绑定」;`审核知识卡` → 用户确认(批次 3)。`制定作品规划`、`准备任务上下文`、`审核知识卡` 均不在 46 个技能中;`准备任务上下文` 仅在 `.agent/作者/场景/写下一章.md:10` 作为指向 `src/muse/上下文/材料装配.py` 的链接文字出现。 | 改写为真实目标(如 `确认规划候选`、`写下一章`、`整理写作方法`),或删除该段 | 需用户授权 |
| **DR-09** | docs与根文件 | 目标文件清单.json(`.agent/skills/方法/` 171 条)、文件设计/执行知识-方法技能.md(124 条反引号引用) | D7 | `docs/系统架构/新版设计/目标文件清单.json` 把 `.agent/skills/方法/` 写作技能分类;物理树只有 `诊断/规划/操作/写作` 四个分类目录。1432 条目标条目中 **279 条物理不存在,其中 171 条属 `.agent/skills/方法/`**;16 个技能名实为搬迁(`呈现人物`→写作、`增强叙事动力`→规划、`诊断作品问题`→诊断 …),`build` 后按图索骥必 404。该 JSON 是 `执行知识-方法技能.md` 等文件设计页的投影源(页首自述「本页从目标文件清单.json 投影」) | 分类目录改名对齐物理树(`方法`→按实际的 `写作`/`规划`/`诊断` 拆分),并重跑 `工具/维护索引.py`;同时确认 `执行知识-操作技能.md` 中 4 个物理不存在的技能名(`制定作品规划`、`合并故事方案`、`规划下一章` 等)是待建还是废弃 | 需用户授权 |
| **DR-26** | docs与根文件 | docs/系统架构/新版设计/技能承接表.md:3;docs/功能规格/技能身份中文化与作者创作入口.md:20,338(另 :85,:320,:321,:323 同类) | D4 | `skills.json` 幻路径不只在 AGENTS.md,已扩散进权威区正文:`技能承接表.md:3`「以当前 **skills.json** 登记的 **59 个技能**为输入,逐项定义新版位置」;`技能身份中文化与作者创作入口.md:20`「正式技能 | `muse/lifecycle/quality/harness/manifests/skills.json` 登记且磁盘存在的 59 个项目技能」——该路径全仓不存在(`find . -type d -name lifecycle` 零命中);`:338` 的机械验收条款「`.agent/skills/目录.md` 与 `muse/技能目录.md` 的每个链接均可打开,并与 manifest 对账一致」要求校验一个不存在的文件,**该条款无法执行**;`:85,:320,:321,:323` 另引 `muse/sot/domains/05-创作流程领域.md`、`07-Agent与Skill领域.md`、`muse/技能目录.md`,均不存在 | 把 manifest 基准从 `skills.json` 改为 `.agent/skills/目录.md`(技能目录)+ `工具/维护索引.py --检查`(已能核索引与磁盘一一对应);`:338` 的验收条款按新基准改写;`59` 统一改 `46` | 需用户授权 |
| **DR-20** | docs与根文件 | docs/目录.md:4,5,6,9,10,15-19、docs/根 8 个 `2026-*.md` | D4 | 索引与实体三处脱节:① `docs/目录.md:4,5,6,9,10` 把「领域模型 / 数据模型 / 模块设计 / 业务需求 / 调用链路」的相对地址标为 **`暂无`**,但这 5 个主题在 `docs/系统架构/新版设计/` 下真实存在(分别 2 / 6 / 15 / 2 / 2 篇 .md)——索引读者会得出「不存在」的错误结论;② 同文件只登记了 1 篇 `2026-09-01-*`,漏掉同目录另外 **7 篇** `2026-*`;③ `acceptance`/`design`/`plans`/`research`/`write-chapter` 五行(:15-19)只填了名称与相对地址,`内容描述`/`使用场景`/`使用要求` 三列**全空**。这 5 个目录 + 7 个文档既不在计划第 4 节「docs 权威区」,也不在「实现回顾 留痕」豁免面内,属口径缺口 | 五行「暂无」改为指向 `系统架构/新版设计/<主题>/目录.md` 的真实相对地址;补登 7 篇 `2026-*` 并统一标注「R2 期历史执行记录,表述不复查」;补全 5 行的三列描述。这样口径缺口一并闭合 | 需用户授权 |
| **DR-27** | docs与根文件 | docs/系统架构/新版设计/研究依据/选型比较/比较约束.md:7 | D4 | `- 功能比较基准:`docs/业务需求/小说创作共性功能清单.md`,20 个功能域、117 个功能点;原本地草稿已移走。` —— `docs/业务需求/` 目录不存在,`docs/系统架构/新版设计/业务需求/` 下只有 `目标系统完整功能清单.md` 与 `目录.md`。同行虽有「原本地草稿已移走」的弱标注,但**未给出替代路径**,而该行自称「功能比较基准」(下游比较的依据) | 把基准指到实际存在的 `docs/系统架构/新版设计/业务需求/目标系统完整功能清单.md`,并复核「20 个功能域、117 个功能点」与现存文档是否对得上(我未能把 117 对上现存文件,需原作者确认是口径变更还是笔误) | 需用户授权 |
| **DR-25** | docs与根文件 | AGENTS.md:13 vs docs/运行手册.md:10、配置/本机正式.toml:2 | D7 | 同一「正式内容库」两套库名:AGENTS.md:13「PostgreSQL(`muse-example` 库)是系统正式内容的唯一权威」;运行手册:10「infra(`100.64.0.8:5433`)PG 实例,库 `muse_migration_1fe755ea37684f9d926f3a0cb3e9c7f2`」,`配置/本机正式.toml:2`(Git 已跟踪)同此。全仓检索 `muse-example` 仅 AGENTS.md:13 一处命中 | 以实际部署为准统一:把 AGENTS.md:13 的库名改成 `muse_migration_1fe755ea37684f9d926f3a0cb3e9c7f2`(或改为不写死库名,指向运行手册与 `配置/本机正式.toml`)。另注:运行手册:10 把内网地址 `100.64.0.8:5433` 写进 Git 跟踪文档,D6 范围不属本任务,仅登记 | 需用户授权 |
| **DR-07** | docs与根文件 | AGENTS.md:14,50,51,54,55,57,58,60,61(×3) | D4 | 11 处链接**文字**是仓内不存在的路径、**目标**存在(机械核对逐条:14 `muse/authority/db/表映射.md`→`数据模型/存储与对象关系.md`;50 `muse/sot/domains/`→`阅读指南.md`;51 `muse/sot/边界合同.md`→`总体架构.md`;54 `muse/sot/创作周期与Skill导读.md`→`调用链路/关键旅程.md`;55 `muse/技能目录.md`→`.agent/skills/目录.md`;57 `.agent/约束/红线约束.md`→`.agent/约束/作者主权.md`;58 `.agent/rules/执行流程.md`→`.agent/rules/模块依赖.md`;60 `.agent/规范/审查标准.md`→`.agent/rules/文档与资源生成.md`;61 `去AI味道工程规范.md`→`审校与修订.md`、`指令集规范.md`→`命名.md`、`术语规范.md`→`术语.md`) | 逐条把链接文字改成目标的真实文件名(11 处均为「文字未更新」,目标本身可达) | 需用户授权 |
| **DR-08** | docs与根文件 | docs/功能规格/阶段0交互式作品探索.md:31 | D4 | `[\u2026](../../muse/lifecycle/flow/skills/book/完善故事基础设定/references/candidate-contract.md)` —— `docs/功能规格/` 属计划第 4 节明列的 docs 权威区,该相对链接目标不存在(`muse/…` 旧实现路径) | 改指现行落点(`.agent/skills/操作/完善故事基础设定/`),或标注为 R2 期历史方案并归入留痕 | 需用户授权 |
| **DR-10**(并入 JW-04) | docs与根文件 | docs/系统架构/新版设计/模块设计/B07-作者经验.md:43 | D7 | 内部职责表声明 `` | 提示词/整理偏好与改进建议.md | 保留原话及区分推断的提案模板 | ``,但 `src/muse/作者经验/提示词/` 目录本身不存在(`ls` No such file or directory)。B07 是 14 个模块文件中唯一声明与代码不符的一个 | 二选一:补建该提示词模板;或从模块设计表删去该行(B07 其余 11 个声明文件全部存在) | 需用户授权 |
| **DR-02**(并入 JK-07) | docs与根文件 | AGENTS.md:53、AGENTS.md:15 | D4 | `| 结构契约 | `muse/content/meta/schemas/`(原路径…已随旧实现退出,见固定基线) | 23 型结构本体与规划产物的字段合同 |`;`ls muse/content/meta/schemas` 与 `src/muse/content/meta/schemas` 均 No such file or directory。同一路径在 `:15`(「Git 是代码、技能、智能体提示词、`muse/content/meta/schemas/`、文档和 DDL 的权威」)**裸引、无「已退出」标注**——同文件对同一路径两套写法 | 路径改指现行物理位置 `src/muse/元数据/内置结构/`;「23 型」改为实测值 24(`读取内置种子()` 返回 24 个 `builtin:<type>:1`,目录内 25 个 yaml 含 `公共字段.yaml`);`:15` 与 `:53` 的标注口径统一 | 需用户授权 |
| **DR-03** | docs与根文件 | AGENTS.md:56 | D4 | `| 创作链条 | `muse/lifecycle/flow/chains/`(原路径…已随旧实现退出,见固定基线) | scenario、purpose、功能 skill、角色槽位和保护节点的链路登记 |`;该目录及其 `src/` 同名路径均不存在 | 改指现行落点 `src/muse/编排/流程登记.py`、`流程版本.py`、`槽位约束.py`(`流程登记.py:45` 登记「必需保护」) | 需用户授权 |
| **DR-12** | docs与根文件 | pyproject.toml:60-65 | D7 | `markers` 只声明 `数据库`/`网络`/`真实模型`/`浏览器` 4 个。实测:`网络` 在 `tests/**/*.py` 中 **0 个文件**使用(多余);`宿主` 在 2 个文件使用(`tests/集成/test_受控模型调用.py:528-529` 等)却**未声明**(缺失),靠 `tests/conftest.py:27,50` 运行时 `addinivalue_line` 补登记;`Makefile:49,54,60-62` 也直接用 `-m 宿主` | `pyproject.toml` markers 删 `网络`、补 `宿主`;或明确「标记以 conftest 为权威」并把 pyproject 的 4 条改为注释。当前未红是因为 conftest 兜底 | 需用户授权 |
| **DR-06** | docs与根文件 | AGENTS.md:69、.gitignore:32-34 | D4 | AGENTS.md:69「新版工程统一使用仓内解释器 `.venv`(uv 管理;旧代码用 `.venv-旧`)」;`ls -d .venv-旧` → No such file or directory。.gitignore:33 同源注释「旧代码运行环境在 .venv-旧(旧入口保持可运行)」 | 两处一并删去 `.venv-旧` 表述(README:153-155 已声明旧实现完全退出,旧入口不再存在) | 需用户授权 |
| **WB-02** | web | `web/tests/旅程/资料对照.spec.ts:7`(登记见 `tests/用例清单.json`)、`世界维护.spec.ts:7`、`方法库.spec.ts:7`、`单元/中文显示与动作.test.tsx:30` | D7 | 清单登记 `case_id: "NC-w17-browser"`,文件内用例名却是 `test("NC-browser-source-workbench:资料对照页与榜单失败态"`;设计文档 `前端-应用与通用界面.md:787` 引用的是清单 id `NC-w17-browser`、`NC-w18-browser` | 以文件内 symbol 为准回填清单 `case_id`,并同步 `前端-应用与通用界面.md:787,797,807` 的引用(同 `NC-w19`/`NC-w20`/`TC-00f820aca9ee-动作` 共 5 条) | 需用户授权(与 tests 模块共担) |
| **WB-01** | web | `web/src/功能/创作对话/数据.ts:16` | D1 | `export const 粒度标签: Record<string, string> = {` / `new_chapter: "新章", expand_scene: "扩写", edit_selection: "选段修改",` —— 在 `src` + `tests` 全量 grep 仅命中定义行本身,零消费者 | 删除该常量;若确为待接入位,改为在 `作者动作` 里实际渲染粒度 | 需用户授权 |
| **JF-01** | 后端-交付连载上下文资料 | src/muse/交付连载/提示词/全书审阅.md:1、src/muse/交付连载/提示词/整理交付材料.md:1 | D3 | 两模板已登记并打包(工具/资源登记.json:200,204;src/muse/资源/清单.json:5,8),但 `src/`、`tests/`、`.agent/` 全仓零引用;`配置/流程模板/` 11 个流程中唯一交付流程是 `定稿交付.yaml`(deterministic、`model_calls: 0`,src/muse/编排/定稿交付.py:97)。 | 二选一:为跨章审阅/材料起草接一个真实模型任务并在流程模板登记;或删两文件并撤资源登记条目(同时停发打包字节)。 | 需用户授权 |
| **JF-03** | 后端-交付连载上下文资料 | src/muse/资料研究/提示词/核对实体歧义.md:4;src/muse/资料研究/实体归并.py:67;src/muse/接入/cli/研究命令.py:123 | D2 | 模板写"歧义只登记不调用模型,本模板供后续语义核对阶段装配使用";代码与 CLI 都对作者说"歧义保留;待核对实体歧义任务澄清",但仓内无该任务的流程模板、入口或消费者。 | 要么实现该任务并接线;要么把三处话术改成"歧义只登记,由作者人工判定",删掉"后续/待…任务"的无判据承诺。 | 需用户授权 |
| **JF-04** | 后端-交付连载上下文资料 | src/muse/资料研究/榜单快照.py:62 | D6 D7 | `"captured_at": 时刻.isoformat() + f"+{sha256(...)[:8]}"`;实测得 `2026-09-16T12:37:00.121045+00:00+ae27547f`,`datetime.fromisoformat` 抛 ValueError。库内真实时刻是 V0007__资料研究.sql:58 的 `clock_timestamp()`,`列出快照`(存储.py:262)返回的又是另一个值;B03 模块设计:20 声明 `capture_ranking` 输出"带采集时刻及质量状态的快照"。 | 直接返回 `时刻.isoformat()`(或回读库内 `captured_at`);若哈希确有用途,另立字段名并写进接口契约。 | 无需授权 |
| **JF-05** | 后端-交付连载上下文资料 | src/muse/上下文/索引维护.py:96;src/muse/资料研究/分析版本.py:58、src/muse/资料研究/分析版本.py:187;src/muse/资料研究/实体归并.py:89 | D3 | 四个函数全仓零调用(含 docs/`.agent` 文本检索)且未进各域 `接口.py` 的 `__all__`:`文档关键词检索`、`待重试窗口`、`基准引用`、`归并哈希`;重跑窗逻辑实际由 编排/研究拆书.py:149-150 自行实现。 | 删除或接入真实消费者;删除时同步清各文件 `__all__`。 | 无需授权 |
| **JT-02** | 后端-任务运行编排 | `src/muse/基础设施/模型/角色探针.py:92`(旁路点);`src/muse/任务运行/配置版本.py:277`(生产强制 runtime 验证) | D6/D7 | `结果: 模型结果 = asyncio.run(self._宿主(提供方, 凭据).准备(请求).调用())` —— 逐角色真实外发,不走 `模型执行器`:无 `预算管理.预留/标记已发送/结算`,无 `muse_runtime_evidence`,无 `调用发出` 事件;而 `if self.数据库.用途 is 用途.生产 and 证据.模式 != "runtime": raise` 强制生产配置必须持有 runtime 证据。等于每次启用生产配置都会产生一笔**不入 5 小时窗口账本、不留运行留痕**的真实费用 | 探针调用纳入预算账本与留痕(或为其登记独立的探针账户与窗口),并在 S02 文档写明探针费用的记账口径;本项主责在基础设施组,任务运行组需配合提供记账接口 | 需用户授权 |
| **JT-03**(并入 JS-03、JW-02、JF-02) | 后端-任务运行编排 | `src/muse/编排/生成规划.py:147` | D1/D7 | `模板 = (Path(__file__).resolve().parents[1] / "作品规划/提示词" / 模板名).read_text()` —— 规划提示词从源树直读;该文件在 `运行资源.zip` 的 85 个条目中不存在(zip 内 `规划/` 只有 `探索交付结构.json`)。同包其它旅程都走发布包:`生成正文.py:342` `生成正文模板()` → `打开资源("正文/生成正文.md")`、`审校修订.py:216` `修订模板(auth)` → `打开资源(...)`。结果是该提示词不受资源发布身份/清单哈希约束,只在检查点留运行时 `模板哈希` | 把两个规划提示词登记进 `工具/资源登记.json` → `运行资源.zip`,`模型规划` 改用 `打开资源`;与审校组 JS-03(`审校修订/完整审校.py:20` 同类直读)一并处理 | 需用户授权 |
| **JT-04** | 后端-任务运行编排 | `src/muse/编排/章后处理.py:153-154`、`src/muse/编排/研究拆书.py:136-137` | D1 | `except 预算状态冲突: pass # 恢复重试时包络已登记且哈希一致;不一致会被上一步骤拒绝。` —— 没有"上一步骤"做这件事:抛错的正是 `登记任务预算于` 自己(`预算管理.py:215-216`,既有 `plan_hash` 不等即抛)。因此同一任务重算包络不一致(例如包络公式随部署变化)会被静默吞掉并继续用旧包络,注释断言与实现相反 | 改为只吞"哈希一致"的重复登记(先读既有哈希比对再决定忽略),不一致时照常抛;同步删掉不成立的注释 | 需用户授权 |
| **JT-01** | 后端-任务运行编排 | `src/muse/任务运行/接口.py:503`(对账入口);`src/muse/任务运行/恢复控制.py:32-33`(前置条件) | D3/D7 | `def 对账调用(...)` 只在 `接口.py` 定义与 tests 中被调用;`src/muse/接入` 全目录 grep `对账`/`reconcil` 命中 0,任务 HTTP 路由的 16 个 `operation_id` 里没有对账端点,CLI 也无对应命令。而恢复被硬性拦住:`if 存储.未知调用(任务ID): raise 状态冲突("调用结果未知,必须先对账再恢复")`。后果:任何在"标记发送事务提交后、响应证据落库前"中断的调用会把任务锁进 `reconciling`,Web 任务页对 reconciling 显示的"核对并恢复"按钮必然报状态冲突,唯一出口是取消 | 补一个受控对账入口(HTTP 或 CLI,带命令幂等键与回执),或在 S02 文档把 `对账调用` 明确标注为"仅运维/测试可达、产品面暂不可达"并同步 Web 按钮可用状态 | 需用户授权 |
| **JW-01** | 后端-写手规划经验 | src/muse/正文写作/提示词/生成正文.md:25 | D2 | "每段是完整段落文本,不含换行符;段内换行由系统处理。" 实测:`写作输出合同` 不禁止段内换行(探针 1 通过 schema 校验),`模型.py:22-23` 的 `文本节点` 直接抛"段内换行必须使用显式换行节点";`编排/生成正文.py:422-426` 无归一,`任务运行/模型调用.py:49-66` 只做 JSON Schema 校验 | 删除"段内换行由系统处理",或在 `生成正文.py:422` 前按 `选段编辑._新文本` 同法拆成显式换行节点 | 需用户授权 |
| **JW-03** | 后端-写手规划经验 | src/muse/正文写作/正式提交.py:96-105 | D1 | B05 用裸 SQL `SELECT verdict FROM muse_review_report WHERE candidate_id=%s AND candidate_revision=%s` 直读 B06 私表,违反 `docs/系统架构/新版设计/总体架构.md:59`"跨业务调用只穿过接口.py 暴露的合同;存储、内部对象和私有函数不跨模块使用";B06 已有公开读取(`审校服务.读取报告`,同法见 `src/muse/作者经验/运行观察.py:80`) | 改经 B06 公开接口读报告判定,或由 B06 暴露"候选必需检查结论"窄读取合同 | 需用户授权 |
| **JC-11** | 后端-基础设施共享 | `配置/提供方.example.toml:4` | D7 模板过期 | 模板写 `"角色策略版本" = "role-policy-r2-v1"`,权威 `配置/角色策略.yaml:1` 为 `role-policy-r2-v2`;`角色探针.py:63` 会以"与当前发布包不一致"拒绝按模板生成的配置 | 模板升到 `role-policy-r2-v2`;模板值应与发布的 `角色策略.yaml` 同步(或改为占位符并注明取值来源) | 本批修复候选 |
| **JC-06** | 后端-基础设施共享 | `src/muse/基础设施/资料来源/网页读取.py:10-13`、`榜单读取.py:10-13` | D3 孤儿入口 | 两个 Protocol 在 `src`、`tests`、`工具`、`数据库` 零引用;`src/muse/资料研究/榜单快照.py:17-20` 另有一个同形 `榜单读取器` Protocol 承接了真实消费 | 二选一:删 `资料来源/` 两个协议,或让 `资料研究` 改为依赖基础设施协议(避免两套同义抽象) | 本批修复候选 |
| **JC-08** | 后端-基础设施共享 | `src/muse/共享/标识.py:11-14` | D3 死代码 | `作品标识`、`命令标识`、`审阅版本标识` 除本文件与 `共享/__init__.py` 的再导出外零引用(仅 `任务标识` 有消费者) | 删除三个 NewType 与对应再导出;未来需要时再按真实调用点引入 | 本批修复候选 |
| **JC-04** | 后端-基础设施共享 | `src/muse/基础设施/模型/ChatCompletions.py:19-25`;`src/muse/基础设施/模型/Messages.py:20-31` | D1 错误合同 | 探针:`usage={"prompt_tokens":1}` → 裸 `KeyError: 'completion_tokens'`;Messages 缺 `index`/缺 `delta.type` → 裸 `KeyError: 0`/`'type'`。同族 `Responses.py:47-53` 统一转 `模型协议错误` | 三个协议解析器统一把缺字段/坏帧转成 `模型协议错误`(上层 `任务运行/模型调用.py:367` 只按该类型分流) | 本批修复候选 |
| **JC-09** | 后端-基础设施共享 | `docs/系统架构/新版设计/文件设计/后端-基础设施.md:36,214,215`;`src/muse/基础设施/模型/嵌入.py:3` | D2/D7 口径对立 | 设计文档写 `向量.py # pgvector 查询实现`、职责"pgvector 查询实现",而 `嵌入.py:3` 写"裁决 A:不依赖外部嵌入服务与 pgvector",`检索/向量.py` 实际是纯 Python 余弦;"裁决 A"在 `docs/` 内查无出处 | 统一口径:更新 `后端-基础设施.md` 的 向量.py 条目(改述为纯函数余弦/或标注裁决变更),并把"裁决 A"落到可检索的裁决记录 | 需用户授权(改设计文档) |
| **JC-07** | 后端-基础设施共享 | `src/muse/共享/时间.py:51,58` | D3 死代码 | `截止于`、`单调秒` 全仓零消费者;实际调用方直接 `from time import monotonic`(`任务运行/步骤执行.py:8,51`、`接入/http/应用.py:5,80,89`),期限也各自 `+ timedelta(...)`(如 `效果评测/逐例执行.py:136`) | 删除两个无人调用的入口,或让调用方改用它们并在模块 docstring 保留"期限计算只在此处一种解释"的口径 | 本批修复候选 |
| **JC-05** | 后端-基础设施共享 | `src/muse/基础设施/数据库/连接.py:92-96` | D3 孤儿入口 | `连接范围()` 全仓零消费者(含测试),实现只是 `with 连接(...) as 连: yield 连` 的一层转发 | 删除,或改为在调用方直接使用 `数据库工厂.连接`;保留则需给出消费者 | 本批修复候选 |
| **JC-03** | 后端-基础设施共享 | `src/muse/配置.py:167-175` | D1 校验断裂 | `原文暂存 = ""` 被静默解析为**配置文件所在目录**、`探索草稿 = " "` 被解析为带空格的目录;同一函数对 `备份目录` 有显式非空校验(`:171-173` 抛"文件.备份目录需要明确路径") | 给 原文暂存/探索草稿 补与 备份目录 一致的非空与 `strip()` 校验,空串直接 `配置错误` | 本批修复候选 |
| **JC-10** | 后端-基础设施共享 | `docs/系统架构/新版设计/目标文件清单.json:8856`;`后端-基础设施.md:32,287`;`工具/维护索引.py:246-264` | D3/D7 门禁盲区 | 清单与设计文档登记 `src/muse/基础设施/文件保留.py`,仓内不存在该文件;`维护索引.py --检查` 只核对设计文档锚点存在,不核对目标文件是否存在,实测退出 0(未发现) | 删除该目标条目(或补实现);把"清单登记路径必须在树上存在"加入 `检查文件定位`,让门禁能发现同类悬空目标 | 需用户授权(改清单/门禁) |
| **JS-05** | 后端-审校效果评测 | `src/muse/审校修订/提示词/诊断机器味.md`、`src/muse/审校修订/提示词/提取作品声音.md` | D3 | 两个提示词文件既无加载点(全仓无 `诊断机器味.md`/`提取作品声音.md` 的资源路径引用),也未登记发布资源(`工具/资源登记.json` 无条目、`运行资源.zip` 内不存在)。对应能力已由确定性代码实现:`诊断服务.生成诊断`→`机器味诊断.诊断文本` 纯规则、`声音基线.统计声音样本` 纯统计 | 删除两个孤儿提示词并同步 B06 文档:59-60,或补上真实调用点并登记进发布资源 | 需用户授权 |
| **JS-07** | 后端-审校效果评测 | `src/muse/审校修订/诊断服务.py:26-32` + `src/muse/审校修订/机器味诊断.py:436` | D1 | 无任何激活记录时 `读取诊断规则` 返回空库 `核对规则库([], [])`;生产诊断(`预览候选=False`)随即产出 `mode:"active"`、`coverage.deterministic:[[0,全文长度]]`、`executed_rules: []`、`unreviewed_rules: []`、`findings: []`。下游无法区分"扫了全文、零命中"与"一条规则都没启用"(实测见证据指针 P3) | 报告增加 `active_rule_count`/`empty_library`(或 `coverage.rules_executed`)标记;或在空库时拒绝出具 `active` 报告 | 需用户授权 |
| **JS-02** | 后端-审校效果评测 | `src/muse/审校修订/内置规则/密度/d002.yaml:31`(另有 12 处:d003-d006、l005/l006、s003-s007、sem002/sem003) | D2 | `129 条研究目录 D-01 机制候选`/`D-07`/`L-14`/`P-11`/`N-05`/`S-11`…。该目录真实存在过(旧 `humanization/research/20-project-humanization-rule-catalog.zh-CN.md`,自述"目录规模:129 个归一化条目"),但已随旧实现整目录退出工作树,规则文本未给任何可定位路径 | 引用改为可定位形式(补 `git 476bb71:humanization/research/...` 或标注"依据已随旧实现退出");同批处理 d001/s002 的"20 项开源研究机制候选" | 需用户授权 |
| **JS-09** | 后端-审校效果评测 | `docs/系统架构/新版设计/模块设计/B06-审校修订.md:37-61`、`B10-效果评测.md:32-47` | D7 | 内部职责表与物理文件不一致:B06 表列 18 个 .py,缺 `诊断服务.py`/`案例规则.py`/`模型修订.py`/`离线回放.py`;B10 表列 13 个 .py,缺 `启用凭据.py`/`工作面.py`/`文学执行.py`/`文学评分.py`/`方法对照.py`/`条件第三.py`/`标定.py`/`标定消费.py`/`混淆项.py`/`角色行为.py`/`语义检测.py`,也未列 `提示词/文学评分.md` | 补齐两表,或在表上显式标注"节选,完整清单见目标文件清单" | 需用户授权 |
| **JS-06** | 后端-审校效果评测 | `src/muse/审校修订/规则例证/regression.yaml:52`、`:81` | D3 | `reg-004`、`reg-006` 两条例证 `rules: []`,不被任何规则 `samples` 引用。实测:规则库 107 条例证中仅 105 条被引用(`读取内置规则` 只对引用到的例证做合同核验,这两条既不校验也不消费,却计入 `fingerprint`) | 为两条补挂真实规则,或从例证库删除 | 需用户授权 |
| **JS-10** | 后端-审校效果评测 | `src/muse/效果评测/混淆项.py:224`、`:227` | D1 | 判定 `panel["status"] == "unstable"` 并把它列入可收尾状态,但生产者 `文学评分._仲裁文学评分` 只会返回 `stable_report`/`adjudicated_report`/`needs_third_reviewer`/`invalid_unstable`/`invalid_report`,从不产出 `"unstable"` | 改为 `invalid_unstable`,或删掉该分支并让 `invalid_report`/`invalid_unstable` 明确计入 `incomplete` | 需用户授权 |
| **JS-08** | 后端-审校效果评测 | `src/muse/审校修订/接口.py:374`(`import _核验, _读提案`)、`模型修订.py:13`(`import _准备`)、`持久返修.py:360`(`存储._要求返修会话`);`src/muse/效果评测/接口.py:587`(`import _数据库身份`)、`逐例执行.py:188` 与 `:540`(`import _要求数据集`) | D1/D7 | 跨模块导入/调用下划线私有名共 6 处,与 B06 文档 `:33`、B10 文档 `:28` 的"外部不导入私有模型或 SQL"声明不符 | 把被跨模块使用的私有名提升为公开名(去下划线)或下沉到同模块;若是有意例外,在文档写清例外范围 | 需用户授权 |
| **JS-04** | 后端-审校效果评测 | `src/muse/审校修订/持久返修.py:757`(导出:`接口.py:542`;文档:`B06-审校修订.md:30`) | D3/D7 | `def 读取返修比较来源(...)` 是 B06 文档列明的公开用例,但全仓零调用方(精确匹配只命中定义行与 `接口.py` 的 import/`__all__` 两处)。B10 实际走的是 `读取返修比较来源于`(`效果评测/返修比较.py:19,117`) | 删除该公开入口并在 B06 文档:30 改为 `读取返修比较来源于`,或让 B10 改经它调用 | 需用户授权 |
| **JR-05** | 后端-接入 | `src/muse/接入/cli/入口.py:4` | D2/D7 | 模块 docstring:`已实现子命令:自检、迁移(显式维护命令,不在启动时自动执行)。`;而 `_解析参数`(`:25-277`)实际注册 **19** 个子命令(数据维护/行为评测/评测/经验/自检/交付/迁移/服务/任务/创作/审校/研究/结构/作品/审阅/探索/规划/配置/管理) | 改为"子命令清单以 `--help` 为准(当前 19 个)"或直接列举;同文件 `:5` 的"不返回伪成功"实测成立,可保留 | 无需授权 |
| **JR-04** | 后端-接入 | `src/muse/接入/执行器.py:8-34`;唯一调用点 `tests/集成/test_任务租约与恢复.py:426`;对照 `后端-装配与接入.md:489-496` | D3/D7 | 设计文档把该文件写成"后台进程入口、用途装配和优雅停机",实测生产代码零消费者:全仓 `接入.执行器` 只命中那条测试;`cli/入口.py:508-519` 的 `服务` 只起 uvicorn,Makefile/`工具/`/`配置/` 无任何 worker 启动目标。仓内不存在文档声明的后台入口 | 二选一:补真实后台领取入口(发布目录脚本或 `python -m muse` 子命令)并接线;或把文档改为"预留的领取循环实现,当前仅测试可达"并把它定位为测试夹具 | 需用户授权(新增入口或改文档口径) |
| **JR-06** | 后端-接入 | `cli/创作命令.py:14-22,61-62`;`http/路由/创作生成.py:22,109-110`;`http/路由/作品规划.py:42-61`;`http/路由/正文写作.py:127-149`;对照 `后端-装配与接入.md:374,396` | D7/D1 | 设计文档要求"命令与 HTTP 用例保持相同结果与拒绝条件"。实测三处不一致:① 读候选审校报告缺报告时,CLI `raise 配置错误(f"候选 {目标} 版本 {当前版本} 没有审校报告")`,HTTP `raise HTTPException(404, "该候选版本没有审校报告")`;② 发起生成正文(`发起生成正文` 同一用例)HTTP 请求模型有 `budget`(`创作生成.py:22`),CLI `生成发起请求` 没有(`创作命令.py:14-22`);③ HTTP 有 `POST /works/{id}/planning-tasks` 与 `POST /chapters/{id}/post-derivations`,CLI 的动作表(`入口.py:214-230,247-260`)无对应动作 | 请求模型抽一份放 `接入/创作操作.py`(照 `审校操作.py` 的做法,两侧共用);报告缺失统一走带 `NOT_FOUND` 的错误;CLI 补"规划 发起""作品 章后重建",或把这两条 HTTP 入口在文档标注"仅工作台可达" | 需用户授权(改接口面) |
| **JR-03** | 后端-接入 | `src/muse/接入/http/路由/上下文.py:57-65`(对照 `src/muse/上下文/依赖校验.py:202,211-216,236-241,255-256`、`src/muse/上下文/任务范围.py:292,296,315`) | D1/D7 | 逐来源 `current_state` 只分三档:`状态.有效`→全"有效";来源等于细纲或文稿→查 `锁定身份`;`else: 当前 = "有效" if 事实锁定 else "SOURCE_STALE"`(注释写"事实对象没有逐对象锁定")。但 `来源绑定` 还含 voice/preference/method 三类(偏好 id、声音 version_id、方法 binding_id),快照失效时它们被按"事实系统是否锁定"整体标注,会把真正漂移的声音/方法/偏好来源报成"有效"(反之亦然) | 分类改为:仅事实键 `f"{作品ID}:事实系统"` 用 `事实锁定`,其余来源一律用 `绑定.来源ID in 锁定身份`;补一条含 voice/method 绑定的断言用例 | 无需授权 |
| **JR-01** | 后端-接入 | `src/muse/接入/http/路由/资料研究.py:92-95`;根因 `src/muse/资料研究/模型.py:14-15` | D1/D7 | `try: return 装配.要求资料().读取版本(连, source_id, revision)` / `except Exception: raise HTTPException(404, "来源版本不存在") from None`。数据库连接失败、事务错误、代码缺陷都被报成"来源版本不存在";`后端-装配与接入.md:175` 明写边界「转换已有错误;**不吞异常**、不伪造成功」。根因是 `资料错误` 只有 `错误码 = "SOURCE_INVALID"`(不以 `NOT_FOUND` 结尾),走统一错误壳会落 422,路由于是自己造了 404 | 让 B03 为"来源版本不存在"给出 `*_NOT_FOUND` 错误码(该文件第二条同类错误亦同),删除这处 `except Exception`,统一由 `错误响应.py` 映射 | 需用户授权(跨域改 B03 错误码) |
| **JR-02** | 后端-接入 | `src/muse/接入/http/路由/知识方法.py:247-249`(对照 `作品规划.py:51,78,118`、`故事世界.py:82,101,112`) | D7/D1 | `def 绑定方法(work_id: str, 请求: 方法绑定请求, ...)` 函数体没有 `核对路径(work_id, 请求.work_id)`,直接 `...绑定方法(..., 请求.command_id, 请求.命令())`;而 `请求.命令()`(`:107-110`)用的是请求体自己的 `self.work_id`。全层 28 处 `核对路径` 调用 + 2 处等价内联检查(`任务运行.py:104`、`知识方法.py:206`),只有这一条写路由完全没有身份核对 | 补 `核对路径(work_id, 请求.work_id)`,或删掉路径参数改成 `/api/v1/method-bindings`;二选一但必须与其他写路由统一 | 无需授权 |
| **JK-02** | 后端-知识方法故事世界 | `src/muse/知识方法/提示词/提炼写作方法.md:1` | D3 | 17 个提示词文件中属"完全孤儿"(未登记 `工具/资源登记.json`,`.py/.yaml/.json` 零引用),`B04-知识方法.md:36` 仍列为模块文件 | 与 JK-01 同一处置:删文件或补消费者 | 需用户授权 |
| **JK-01** | 后端-知识方法故事世界 | `src/muse/故事世界/提示词/抽取章节事实.md:3` | D2 D3 | 「章后派生按本模板语义组装系统提示」;实际抽取提示是 `src/muse/编排/章后处理.py:175-176` 的内联字符串,全仓无任何读取该模板的代码 | 删除该文件并同步 `B02-故事世界.md:36` 的职责表,或让章后抽取改读该模板 | 需用户授权 |
| **JK-05** | 后端-知识方法故事世界 | `src/muse/知识方法/模型.py:24-26` | D1 | `方法结构.effective_schema_hash` 属性恒返回 `""`,全仓无消费者(`评测材料.py:59,82,120` 读的是元数据 `有效结构` 的同名属性) | 删除该 property | 无需授权 |
| **JK-03** | 后端-知识方法故事世界 | `src/muse/元数据/内置结构/generation_context.yaml:25-105` | D2 D3 | 「严格合同」WriterContext/WriterOutput(`writer-context-v1` 等)在 `src/` 与 `tests/` 零读取(`内置导入.py:36-50` 只读 `类型/结构/种子身份/原定义哈希/合入公共内容`);该结构 `字段: []`,`type_id` 仅 `tests/契约/test_动态结构投影与版本.py:147` 引用 | 或实现该合同并给出消费者,或删块并把空结构降级为显式说明 | 需用户授权 |
| **JK-04** | 后端-知识方法故事世界 | `src/muse/元数据/模型.py:30` + `src/muse/元数据/字段校验.py:84` | D1 | `引用规则.作品范围` 只被定义与枚举校验(`same_work` / `authorized_source`),全仓无任何分支读取它;`authorized_source` 无实现,各 owner(如 `故事世界/设定修订.py:59`、`事实提案.py:64`)一律按 `work_id` 相等判定 | 定为文档则删字段,定为合同则实现 `authorized_source` 判定 | 需用户授权 |
| **JK-06** | 后端-知识方法故事世界 | `src/muse/故事世界/人物关系.py:53-56` | D1 | `try: 结果 = 校验值(结构, 行["content"] or {})` / `except Exception: return 引用对象集`——静默返回空集:`列出关系` 会输出 `端点: []`,`设定修订.py:363` 的 `评估修订影响` 会漏报受影响对象 | 只捕获 `元数据错误`,其余异常失败关闭;或把失败原因显式回传前端 | 无需授权 |
| **JK-08** | 后端-知识方法故事世界 | `src/muse/元数据/内置结构/power_system.yaml:124` | D2 | 「设计发现:2026-07-09《焚忆》立项……(待回填专题-06/后端-04)」:`专题-06` 已随 design-docs 退出,`docs/系统架构/新版设计/文件设计/` 下无「后端-04」文件 | 删除该待办,或改指现行文件并转台账 | 无需授权 |
| **TL-05** | 工具 | 工具/生成接口.py:20-21、43-45、46-48 | D6/D1 | `输出 = 仓库根 / 条目["输出"]` 由登记驱动且无越界校验,`输出.parent.mkdir(parents=True, exist_ok=True)` 后直接覆盖写;登记文件缺失时按空登记 `return 0`(`构建资源包.py:34-35` 对缺 资源登记.json 是 SystemExit)。删掉 生成输入.json 即可让 `make 生成` 静默通过并沿用旧合同 | 登记输出路径加包含性校验;登记文件缺失统一改为非零退出 | 需用户授权 |
| **TL-04** | 工具 | 工具/构建资源包.py:108、112 | D6 | `源 = 仓库根 / str(条["源路径"])` 未做包含性校验(同文件 :53 对能力文件有 `文件.is_relative_to(根.resolve())`);`zipfile.ZipInfo(打包路径, date_time=…)` 不校验 `../` 与绝对路径。登记可把仓外文件打进随包发行的 zip,也可造 zip-slip 条目;`构建发布.py:73` 却对 wheel 显式排除 `.git/.env/tests` | 按 :53 同源加包含性校验,并规范化打包路径(拒绝绝对路径与 `..`) | 需用户授权 |
| **TL-03** | 工具 | 工具/资源登记.json:183-193、235;工具/构建资源包.py:115-116、138;src/muse/资源加载.py:134 | D7 | V0041、V0042 既直登「资源」(打包路径 迁移/…)又落在「迁移目录」投影;实测 运行资源.zip 85 条含 迁移/ 2 条、清单 131 条含 迁移/ 45 条,而 `打开资源` 对 `迁移/` 前缀只读目录投影,这 2 条 zip 条目永不可达;`已打包[打包路径]` 在 :116 与 :138 被静默覆盖(对比 :118-119 能力资源有显式查重) | 删除这 2 条直登,或对同名打包路径加「重复即失败」校验 | 需用户授权 |
| **TL-01** | 工具 | 工具/资源登记.json:236-263;.agent/skills/操作/写下一章/SKILL.md:1-6;.agent/skills/操作/核对内容一致性/SKILL.md:1-6;tests/架构/test_模块依赖.py:332-337、353 | D7 | 两个操作技能的 frontmatter 声明完整(`id: write-next-chapter`、`commands: [start_writing_task,read_task,read_task_events]`;另一条 `read_candidate_review_report`),三条命令均在合同 211 个 operationId 内,却未进「能力文件」;实测 `能力/目录.json` 的 `operation` 仅 22 项、不含二者。唯一相关门禁 `登记能力 = {Path(条目).name ...}` 取到的是 "SKILL.md",`assert Path(相对).name in 登记能力` 对 `.agent` 技能恒真,检不出漏登记 | 补登这两条能力文件;把 `test_模块依赖.py:332-337` 改为按技能身份/目录名比较,使漏登记可见 | 需用户授权 |
| **TL-02** | 工具 | 工具/资源登记.json:236-263;工具/构建资源包.py:49;docs/系统架构/新版设计/编排与能力资源.md:41 | D7 | 46 个 `SKILL.md` 中 22 个无 `id/category/contract_version` 声明:7 个操作技能(导入资料/拆解书稿/整理写作方法/检查与维护拆书结果/确认事实增量/维护故事世界/采集资料与榜单,frontmatter 只有 `name`+`description`)+ 15 个写作·规划·诊断方法技能;`目录: dict = {"role": {}, "method": {}, "operation": {}}` 的 method 桶实测恒为 0 项 | 补声明并登记,或明确「方法技能不进能力目录」后删除 method 死桶 | 需用户授权(跨 .agent 与 工具,可能与 .agent 报告重叠) |
| **LM-05** | 旧库迁移(已退场) | docs/系统架构/新版设计/目标文件清单.json | D1/D7 | `PG作品映射.py`、`PG台账接线.py`、`转换PG作品.py`、`转换PG正文.py` 四个文件不在清单内,也没有文件设计逐文件合同小节 | 其余 17 个模块 .py 全部登记(`src/muse` 为 300/300),只有这 4 个 PG 承接文件漏登;`docs/系统架构/新版设计/文件设计/数据库与迁移.md` 的树与逐文件小节同样缺这 4 条。四者在代码中有真实消费者(如 导入新库.py:361-362、映射台账.py:90/268、核对结果.py:65),不是死代码。补登清单与文件合同即可,不动代码 | 无需授权 |
| **LM-03** | 旧库迁移(已退场) | 数据库/旧库迁移/切换检查.py:24 | D1 | 全文件只返回 `核对` + `source_delta` + `data_checks_passed` + 两个恒 False;无任何回退条件判定 | 文件合同 `docs/系统架构/新版设计/文件设计/数据库与迁移.md:421-422` 声明该文件「意图/职责:增量对账与回退条件」,实现里没有回退条件。补回退条件判定,或把合同文字改为「增量对账(不含回退条件)」 | 无需授权(改文档)/需用户授权(加判定) |
| **LM-01** | 旧库迁移(已退场) | 数据库/旧库迁移/知识记录分流.py:350 | D1/D3 | `work_id = 行.get("work_id")` / `if work_id is None: raise 迁移错误("unknown_use", …)`;而 `旧结构/SQLite/0003_snapshots.sql:1` 的 `snapshots` 只有 id/kind/payload_json/created_at | `snapshots` 的 K08 镜像分支(同文件 489、505 行)与 `docs/系统架构/新版设计/数据模型/旧知识记录分流.md:92`「K08 承接 snapshots」是死声明:每条 snapshots 记录必在 351 行前抛错并被 535 行兜成「隔离/unknown_use」。二选一:把快照作品身份改为可选映射来源,或删掉 snapshots 承接声明 | 需用户授权 |
| **LM-02**(并入 TS-10) | 旧库迁移(已退场) | 数据库/旧库迁移/知识记录分流.py:373 | D1/D3 | `if 行.get("source_status") not in {"active","authorized"} or 行.get("source_action_policy") != "allowed":`;`旧结构/SQLite/0001_init.sql:56` 的 `cards` 无这两列 | 非 embedding 的 `cards` 行必在 373 行抛 `permission_conflict`,到不了 489 行镜像分支。用例 `tests/迁移/test_混合知识分流.py:339-355` 用合成行(含 source_status/action_policy/draft_payload,见同文件 78-91 行)断言 K08 镜像通过,断言在真实旧 SQLite 结构上不成立。补一条真实 DDL 形状的卡表用例,或按真实列改判定 | 需用户授权 |
| **TS-06** | 测试与资源 | `tests/用例清单.json`(1358 条机械核对) | D1 | 238 个用例符号带 pytest 参数行却无 `parameter_ids`(734 个实际参数行未登记);249 条登记无 `then` | 与《测试隔离》§3「与…参数行绑定」不一致(另 85 条登记了、5 个同符号多 ID 也登记了):补齐或把「参数行可选」写进规则;缺 `then` 者补预期结果 | 需用户授权 |
| **TS-02** | 测试与资源 | `tests/单元/test_备份发布身份.py:20-31`(20:35 快照) | D1 | `with pytest.raises(备份恢复错误, match="构建身份"):` | **根因**:门禁颜色取决于带外 `make 生成`(20:42 主代理经授权重生成后转绿并复验)。目标守卫(`备份恢复.py:216`)被 `:215 _核对安装` 抢先(`:311-312` 抛「当前程序、资源或配置不一致…」),用例未自建「代码哈希与安装清单一致」前置、`核对备份` 被 3 键替身整体替换:把生成物耦合写成明文纪律并加固前置 | 需用户授权 |
| **TS-11** | 测试与资源 | `tests/单元/test_受控文件CAS与恢复.py:21-22` | D1 | `with pytest.raises(受控文件错误): 管理器.写入(身份, 哈希, b"different")` | 命中的是「输入字节与授权哈希不符」前置校验,不是「内容哈希排他发布」冲突分支;该分支错误串「现有暂存内容不一致」(`src/muse/基础设施/受控文件.py:144`)在全仓测试零出现 → CAS 保护零覆盖 | 无需授权 |
| **TS-04** | 测试与资源 | `tests/端到端/test_交付归档与恢复.py:87-88,218`、`tests/集成/test_实际运行装配.py:217`、`tests/集成/test_发布包独立运行.py:220`,共 16 文件(11 文件带 `浏览器` 标记) | D1 | `if os.environ.get("MUSE_RUN_BROWSER") != "1": pytest.skip("需显式启用浏览器")`;`"MUSE_BROWSER_EXECUTABLE": "/Applications/Google Chrome.app/…"` | `MUSE_RUN_BROWSER` 只出现在 tests(Makefile/CI 0 处);`make 前端测试`=`vitest run`,24 个 `web/tests/旅程/*.spec.ts` 无门禁入口;`:220` 的分支还不报 skip → 真后端浏览器旅程与「备份带走」端到端验收没有执行入口 | 需用户授权 |
| **TS-08** | 测试与资源 | `tests/真实调用/test_诊断技能行为.py:162-166`;`tests/夹具/行为评测/诊断机器味场景.json:52` | D1 | `if prepared["task_id"] is None: assert …["preflight_only"] …; return True` | `missing-work-ref` 场景 `"work_ref": null` 使其挂 `真实模型` 标记却零模型调用仍计通过:改标离线预检或补真实对照 | 无需授权 |
| **TS-13** | 测试与资源 | `tests/集成/test_上下文快照与索引写入.py:177-183` | D1 | 用例名「同哈希去重与owner冲突」,去重半句只有 `assert 再`(首次回执 `:180` 被丢弃) | 未比对提案身份、未验第二张卡不存在:补身份比对与计数断言 | 无需授权 |
| **TS-03** | 测试与资源 | `tests/conftest.py:252-259`;`tests/架构/test_测试依赖与执行证据.py:138-160`;`tests/集成/test_数据库连接与迁移.py:74` | D1 | `pytest.skip(f"未设置 {数据库环境变量}…")`;架构用例断言「全跳过 → 退出码 5」 | 与《测试隔离》§2「缺 `MUSE_TEST_DATABASE_URL` 时**直接失败**,不跳过」冲突。实测:环境变量未设置时 `pytest tests/集成/test_数据库连接与迁移.py --外部环境 -q` → **2 passed, 20 skipped, 退出码 0**,绕过 §5 全跳过守卫:夹具改 `pytest.fail` 或改规则口径 | 需用户授权 |
| **TS-05**(并入 AG-11) | 测试与资源 | `tests/架构/test_模块依赖.py:330-353` | D1 | `assert Path(相对).name in 登记能力` | `登记能力` 由 `Path(条目).name` 构成(实测 `{SKILL.md, 写手.md, …}`),技能路径取 name 恒为 `SKILL.md` → 「场景只路由已登记技能」永不拒绝:改后缀匹配 | 无需授权 |
| **TS-07** | 测试与资源 | `tests/端到端/test_改进验证与版本启用.py:371-392`、`:330-332` | D1 | docstring「此处以最小红例固定『运行观察不产生任何 skill/lesson 落盘』的合同」;用例体只断言 `saved["state"]` 与列表首元素 id | 从不检查 `.agent/skills` 或提示资源是否被改写:补文件字节/哈希断言;`:330` 同调用自比只证读取确定性 | 无需授权 |
| **TS-09** | 测试与资源 | `tests/架构/test_模块依赖.py:442-468` | D1 | `characters={"甲": ["嗯"], "乙": ["嗯"]}` → `pytest.raises(ValidationError)` | `characters`/`untouchable_verbal_tics` 都不是 `声音提案请求` 的字段(`src/muse/审校修订/声音确认.py:67-76`,`extra="forbid"`):只能命中「未知 kwarg」,用例名承诺的角色级归属规则无判据 | 无需授权 |
| **TS-12** | 测试与资源 | `tests/集成/test_审校报告与案例持久化.py:1037-1049`;登记条目 `TC-873f1d93b7df` | D1 | 用例名「CLI诊断默认持久化且**同一作者可读回**」,函数体只有 `assert 结果["report"]["persisted"] is True`;登记 `environment="离线,固定样张、规则和四类反例"` | 该用例经 `诊断环境`→`章后环境`→`应用测试库` 依赖隔离 PostgreSQL,登记环境与真实依赖矛盾、用例名与断言不符 | 无需授权 |
## P2(原始 171 条 → 去重后 171 条)
| 编号 | 模块 | 位置 | 方向 | 现状摘录 | 建议 | 所需授权 |
|---|---|---|---|---|---|---|
| **AG-13** | agent层 | `.agent/skills/操作/{扩写场景,润色正文,重写选段,压缩正文}/SKILL.md`;15 个方法技能公共段 | D2 | 四份选段技能逐行比对**仅 3 行不同**(`id`、`description`、`mode` 与一句动作描述),其余 20 行完全一致;15 个方法技能的输入首行/输出首行/复利两行逐字相同(各 15/15)。 | 抽成一份受控选段修订合同 + `mode` 参数;方法技能保留各自特有的输入差异、删除复制的"当前不…"段 | 无需授权 |
| **AG-16** | agent层 | `.agent/skills/操作/建立作品声音档案/SKILL.md:2`、`.agent/skills/操作/评估内容质量/SKILL.md:2` 等 24 处 | D4 | 24 个有 `id` 的技能中 16 个带 `operation.` 前缀、8 个不带(`write-next-chapter`、`inspect-task`、`check-consistency` 等);`operation.build_voice`、`operation.review_content` 用下划线,其余用连字符。 | 统一 `id` 命名口径并在规范中成文 | 无需授权 |
| **AG-15** | agent层 | `.agent/skills/操作/目录.md:3,4,8,10` | D5 | 四行使用场景="需要该项操作时"、使用要求="只使用已实现的具名入口",无任何触发信息;其中 `:8` 是核心入口 `写下一章`,`:10` 是 `核对内容一致性`。 | 按 SKILL.md 的"何时使用/命令"补写具体触发场景 | 无需授权 |
| **AG-20** | agent层 | `.agent/作者/场景/定故事.md:16` | D4 | 「方法子阶段在方法技能迁移前可参考旧版 [完善故事基础设定](../../skills/操作/完善故事基础设定/SKILL.md) 主文档」——链接文字称"旧版",目标与 `:9` 是同一个新版路径;"主文档的「整理交付」"在 SKILL.md 中已变为 `references/整理交付.md`。 | 删去"迁移前/旧版/主文档"表述,改指 `references/整理交付.md` | 无需授权 |
| **AG-23** | agent层 | `.agent/skills/操作/完善故事基础设定/SKILL.md:16`、`.agent/skills/操作/记录机器味案例/SKILL.md:20` | D4 | `完善故事基础设定/references/` 有 8 个文件,SKILL.md 只提到 `交付结构.json`,未给 `references/目录.md` 索引指针(其余 6 个指令文件不可从 SKILL.md 发现);`记录机器味案例/references/目录.md` 未被 SKILL.md 引用。 | 在 SKILL.md 补 `references/目录.md` 指针 | 无需授权 |
| **AG-14** | agent层 | `.agent/skills/操作/目录.md:31,32` | D2 | `整理定稿与导出` 与 `登记连载与反馈` 两行的内容描述("作者定稿、实际文件与版本反馈")、使用场景("交付连载时")、使用要求("明确版本和作者动作")三列**逐字相同**,派发者无法区分,且描述与导出技能实际职责(冻结/导出/下载)不符。 | 按各自 SKILL.md 重写两行 | 无需授权 |
| **AG-22** | agent层 | `.agent/skills/规划/铺设并回收伏笔/SKILL.md:49-56`、`写作/打磨小说场景/SKILL.md:63-73`、`写作/打磨小说语言/SKILL.md:41-52`、`写作/表达主题与立场/SKILL.md:66-75`、`写作/运用展示与留白/SKILL.md:53-63` | D4 | 这 5 个技能的 `references/_coverage.md`(自述"唯一追溯文件")未出现在 SKILL.md 的引用索引;另外 10 个方法技能逐条登记。 | 统一:引用索引补 `_coverage.md` 行 | 无需授权 |
| **AG-24** | agent层 | `.agent/skills/诊断/诊断作品问题/SKILL.md:58-74` | D2 | 「症状→专精 Skill 路由」15 行表与 15 个方法技能 description 的"与 X 交接"段、`.agent/skills/诊断/目录.md:11` 的交接清单三处维护同一批关系,改一处必须同步三处。 | 保留一处为定义、其余改为指针 | 无需授权 |
| **AG-18** | agent层 | `.agent/skills/规划/搭建故事结构/SKILL.md:61`、`.agent/skills/写作/设计人物/SKILL.md:81`、`.agent/skills/诊断/诊断作品问题/SKILL.md:94` 等 14 处 | D2 | `## 脚本` 段列出的全部是 `references/*-checklist.md`、`*-worksheet.md`、`*-ledger-template.md` 之类 Markdown 台账,没有任何脚本;而 `.agent/rules/模块依赖.md:8` 禁止技能目录放脚本,两处叠加造成"声称有脚本、实际无脚本、也不允许有脚本"。 | 段名改为「台账/清单」,并在需要机械判定的台账上注明由谁校验 | 无需授权 |
| **AG-17** | agent层 | `.agent/skills/` 全目录;`工具/维护索引.py:64-75` 与 `src/muse/资源加载.py:40-55` | D5 | 同一目录两套 frontmatter 最低要求:24 个技能要求 `id/category/contract_version`,22 个只要求 `name/description`;索引门禁只校验 `name`,打包校验才要全套,口径未成文。段落结构同样不统一:31 个操作技能全部没有 `## 输入`/`## 输出` 分段,5 个方法技能没有 `## 红线` 段。 | 成文最小技能合同(必填字段 + 必填段落),并按合同补齐或明确豁免 | 无需授权 |
| **AG-19** | agent层 | `.agent/skills/写作/打磨小说场景/SKILL.md:80` | D4 | 「来源」列写 `/scene-mission-driven;/fiction-打磨小说场景;/scene-enter-late-exit-early;/cinematic-distances`——旧英文技能调用名,与技能身份中文化(`chinese_only`)口径冲突;其余技能已改用中文源单元名。 | 换成中文源单元名或删除该列 | 无需授权 |
| **AG-21** | agent层 | `.agent/skills/规划/提炼故事概念/SKILL.md:93` 等 15 处 | D2 | 「当前不自动登记 `example_lesson`,避免无效果信号的公共卡膨胀(批次 3)」——历史批次号与阶段性状态写入长期技能正文;`example_lesson` 仅存在于旧库冻结域(`数据库/旧库迁移/旧结构/PostgreSQL/108-example经验升格.sql`)。 | 删除批次号与阶段性状态,或迁到 `docs/` 计划留痕 | 无需授权 |
| **DR-15** | docs与根文件 | .github/workflows/检查.yml、构建.yml vs Makefile | D7 | **CI 有、本地无独立入口**:`数据库/初始化/用途角色.sql` 初始化步(检查.yml:54)、`宿主测试`(:58-60)、`检查` 整体(CI 拆成 `格式`+`类型`+`维护索引 --检查`,不走 `make 检查`)。**本地有、CI 无**:`make 检查` 里的 `模块边界` 无显式步(仅被 `make 测试` 收集间接覆盖)、`make 资源核对`(Makefile:81)无任何 CI 步。**版本不一致**:构建.yml:22 `node-version: "22"` vs 检查.yml:34 `"24.15.0"`;Pi 版本见 DR-11 | 在 CI 显式补 `make 模块边界` 与 `make 资源核对`;统一两个 workflow 的 Node 版本;`make 检查` 与 CI 步骤表对齐后同步到运行手册 | 需用户授权 |
| **DR-28** | docs与根文件 | docs/系统架构/新版设计/文件设计/*.md、各 `目录.md` | D2 | (c)投影页逐字重复:`文件设计/` 四字段去重率极低——**边界**字段 1331 行只有 301 条不同(1030 行逐字重复,如 `执行知识-方法技能.md:566,588`「仅辅助对应 Skill;不定义第二套业务字段、权限、写入或评分权威」全目录出现 133 次)、**目标** 1265 行仅 275 条不同、**意图** 1237/1008、**职责** 1359/1212;`目录.md` 的「内容描述」列逐字复制「名称」列共 64 行(`新版设计/目录.md:16`、`功能规格/目录.md:7` 8 行、`决策/目录.md:7` 7 行、`技能承接表.md:23` 的「承接要求」列 33 行同句);`目录.md` 固定填充单元格合计 170 处(`设计、实现或评审对应主题`×18、`逐文件目标合同`×27 等);跨文件重复句族 20 个(`后端-B09-上下文.md:3` 的页首页脚 ×27、`文档与研究证据.md:237` 的「意图」句 ×95) | 投影页的字段本应逐文件不同;建议改投影器:字段为空时输出「—」而不是复制模板句,`目录.md` 的「内容描述」在等于名称时留空。属生成器问题,不逐页手改 | 需用户授权 |
| **DR-19** | docs与根文件 | .gitignore:2-3,5-6,13-14,32-34 | D4 | 残留旧实现条目:`works/*/评审/`(`works/` 不存在)、`requirements.txt`(已由 `pyproject.toml`+`uv.lock` 取代,文件不存在)、`muse/content/entity/skills/review/审核知识卡/golden/calibrate-stamp.json`(路径不存在)、`.venv-旧/`(见 DR-06) | 逐条删除或加「历史保留」注释;`docs/write-chapter/artifacts/`(:16-19)对应的目录仍存在,可留 | 需用户授权 |
| **DR-14** | docs与根文件 | Makefile:4、Makefile:65 | D7 | `.PHONY` 列出 16 个目标(安装 格式 格式写入 类型 模块边界 检查 测试 数据库测试 宿主测试 真实模型测试 前端安装 前端检查 前端测试 生成 构建 资源核对),漏掉实际存在的 `迁移`(65-66) | `.PHONY` 补 `迁移` | 无需授权(一行) |
| **DR-17** | docs与根文件 | AGENTS.md:4、68、89-90;AGENTS.md:82、100 | D2 | (c)同义重复:「技能发现走 AGENTS.md → 索引 → SKILL.md、不依赖宿主自动发现」在同一文件说了 **3 遍**(:4 页首、:68 §4.1、:89-90 harness 块);「清理过时内容/控制长期熵增」说了 **2 遍**(:82 §5 工程复利、:100 维护纪律) | 保留一处权威表述(建议 §4.1),其余改为指针 | 需用户授权 |
| **DR-16** | docs与根文件 | AGENTS.md:22-38 | D7 | §2「目录导航」物理树漏列 8 个顶层条目:`部署/`(含 Dockerfile/启动.sh/停止.sh/compose.yaml,README:277-289 有正式用法)、`upstream/`(`溯源.yaml`)、`.github/`(两个 workflow)、`data/`、`uv.lock`、`.editorconfig`、`.gitattributes`、`.gitignore` | 补 `部署/`、`upstream/`、`.github/`、`data/`(README:157-172 的「目录速览」亦同缺) | 需用户授权 |
| **DR-21** | docs与根文件 | web/package.json:31,40 | D8 | `@testing-library/user-event` 在 `web/src`、`web/tests`、全部配置文件**零命中**(仅 package.json + pnpm-lock);`prettier` 无 `.prettierrc`、无 npm script、Makefile 无入口,同样零命中 | 删除这两条 devDependency。**注意**:`itsdangerous`(`pyproject.toml:17`)虽三目录零 import,但 `src/muse/接入/http/应用.py:9,70` 的 starlette `SessionMiddleware` 在 `sessions.py:8` 无条件 `import itsdangerous`,属隐式必需,**不得**列入未使用 | 需用户授权 |
| **DR-23** | docs与根文件 | AGENTS.md:80、AGENTS.md:100 | D2 | (a/b)无判据的表述::80「系统的核心价值在于复利:每一次创作与开发任务后,系统必须比上一次更强」(「更强」无判据,紧随其后的两条机制才是可判定内容);:100「优先保持代码可读、简单、局部且可维护」(四个形容词无机械标准) | :80 删首句直接进两条机制;:100 改为可判定的既有门禁指针(`make 检查` + `维护索引` 规则) | 需用户授权 |
| **DR-18** | docs与根文件 | README.md:126、208、212、236 | D2 | (c)同义重复:同一免责语义在 4 处以不同措辞重复——「隔离合成测试不替代真实模型验收,也不授予生产启用许可」(:126)、「合成调用不认证真实外部模型行为」(:208)、「合成验证不作为真实外部模型效果验收」(:212)、「不能把合成提供方或读取报告当作通过」(:236) | 收敛为一处总的验证边界声明 + 各节指针 | 需用户授权 |
| **DR-22** | docs与根文件 | README.md:146-148、279 vs 其余各处 | D2/D7 | 同一份 README 混用两套命令口径:`uv run muse 研究 …`(:146-148)、`uv run python 工具/构建发布.py …`(:279),而全文其余 30+ 处统一用 `.venv/bin/python -m muse …` | 统一为 `.venv/bin/python -m muse`(或全量改为 `uv run` 并在开头声明唯一口径) | 需用户授权 |
| **DR-29** | docs与根文件 | docs/系统架构/新版设计/文件设计/前端-功能工作台.md:309、docs/系统架构/新版设计/文件设计/前端-应用与通用界面.md:768 | D7 | 两个文件用了**同一个锚点 ID** `<a id="file-529b1c403b83b56f"></a>`(跨文件撞号)。`目标文件清单.json` 的 `design_location` 字段形如 `文件设计/<页>.md#file-<hash>`,锚点是投影器的定位键 | 重跑投影器生成唯一哈希;或在校验里加一条「锚点 ID 全仓唯一」 | 需用户授权 |
| **WB-13** | web | `web/tsconfig.tsbuildinfo` | D3/D1 | `git ls-files web/tsconfig.tsbuildinfo` 命中(已被跟踪),`git check-ignore` 退出码 1(未被忽略);文件内容是 `{"root":["./src/main.tsx",...]}` 全量文件清单+增量构建缓存,每次增删文件都产生噪声 diff | `git rm --cached web/tsconfig.tsbuildinfo` 并在 `.gitignore` 加 `web/tsconfig.tsbuildinfo` | 需用户授权 |
| **WB-12** | web | `web/package.json:12,29` + `web/vitest.config.ts:7` + `Makefile:18-19` | D1/D7 | `"test": "vitest run"`,`include: ["tests/**/*.test.{ts,tsx}", ...]` 排除 `*.spec.ts`;`web/tests/旅程/` 有 24 个 `*.spec.ts`;`package.json` 无 playwright 脚本,`Makefile` 的 `前端测试` 只调 `pnpm --dir web run test`。24 个旅程用例**无任何声明入口**(设计文档 `前端-应用与通用界面.md:166` 只说配置文件,未给命令) | 加 `"test:journey": "playwright test"`,并在 `Makefile`/运行手册登记为需真后端的独立入口(不入 `make 检查`) | 需用户授权 |
| **WB-11** | web | `web/package.json:13` | D1 | `"lint": "eslint src"` —— 53 个测试文件(`web/tests`)不在任何 lint 范围;`tsconfig.json` 的 `"include": ["src", "tests"]` 使 typecheck 覆盖了它们,检查面不对齐 | 改 `"lint": "eslint src tests"` | 需用户授权 |
| **WB-17** | web | `web/src/功能/审校修订/问题清单.tsx:13`;`web/src/功能/创作对话/消息流.tsx:7` | D1 | `export function Ui问题清单({ items }: { items: 发现[] })` 与 `export function 折叠消息(事件: 任务事件[]): {` —— 两者仅在本文件内被调用(`问题清单.tsx:61,85`、`消息流.tsx:26`);同类「导出但无跨文件消费者」的符号共 34 个(其余 32 个是类型),均属多余 `export` | 去掉多余 `export` 关键字 | 需用户授权 |
| **WB-04** | web | `web/src/功能/资料研究/资料页.tsx:17` 与 `:22` | D1 | `const { data, error } = await (await import("../../接口/生成/客户端")).客户端.POST(` —— 连续两行对内联动态导入同一模块;该模块在其余 30+ 文件一律顶部静态导入 | 顶部 `import { 客户端 } from "../../接口/生成/客户端";` | 需用户授权 |
| **WB-07** | web | 12 文件 20 处:`界面/结构表单/字段渲染.tsx:39,79,136`;`交付连载/全书整理页.tsx:229`;`效果评测/逐例比较.tsx:139,175,185`;`正文写作/版本分支.tsx:187,237`;`正文写作/选段改写.tsx:175,183,242,259`;`创作对话/消息流.tsx:43`;`创作对话/作者动作.tsx:86`;`审校修订/独立比较.tsx:138`;`审校修订/审校页.tsx:219`;`审校修订/声音档案.tsx:173`;`审校修订/规则页.tsx:39`;`审校修订/修订对照.tsx:290`;`作品规划/探索工作区.tsx:297` | D1 | `<p key={序}>{段}</p>` / `<div className="array-item" key={i}>` / `<option key={i} value={i}>` —— 索引作 key | 列表项改稳定身份;纯静态 `enum`/`anyOf` 分支列表可保留索引 key 并加注释说明 | 需用户授权 |
| **WB-05** | web | `web/src/功能/资料研究/资料页.tsx:43` | D1 | `<a className="text-button" href="/research">研究工作区</a>与<a className="text-button" href="/rankings">榜单与选题</a>。` —— 全仓唯一两处裸 `href` 站内跳转,触发整页刷新 | 改 `<Link to="/research">` / `<Link to="/rankings">` | 需用户授权 |
| **WB-08** | web | 13 文件 36 处,最密 `web/src/功能/知识方法/数据.ts:76,84,95,109,123,132,146`(7 处);另见 `审校修订/数据.ts`(5)、`故事世界/数据.ts`(4)、`资料研究/数据.ts`(4)、`正文写作/版本分支.tsx:73`、`任务运行/任务预算.tsx:49` 等 | D1/D7 | `(await 客户端.GET("/api/v1/methods/types", { signal })).data as unknown as 方法类型行[],` —— 断言绕过生成类型。根因在契约:211 个带 JSON 响应的操作里 **135 个(64%)未声明任何字段**(83 个 `additionalProperties: true` 空对象 + 11 个无字段数组 + 41 个空 `schema`),生成类型只能给出 `object`。同仓 `web/src/功能/系统管理/数据.ts:78-233`(`对象`/`文本`/`布尔`/`数字`/`读系统状态`)走运行时逐字段校验,两种纪律并存 | 二选一并成文:补契约字段后删断言,或统一引入运行时校验层(照 `系统管理/数据.ts` 的写法) | 需用户授权 |
| **WB-03** | web | `web/src/应用/路由.tsx:77-116` | D1 | `const 值 = window.location.pathname.split("/").filter(Boolean);` / `const 索引 = 值.indexOf(name === "work_id" ? "works" : name);` —— 已在 `BrowserRouter` 内却绕过 `useParams` 自行拆路径,同文件出现 3 种取参写法(`:78`、`:109`、`:114`),`Ui版本绑定壳` 用 `段[1]` 硬编码段位,且 `:109`/`:114` 未 `decodeURIComponent` | 五处壳组件统一改 `useParams()`,删除 `取路径参数` | 需用户授权 |
| **WB-09** | web | `web/src/功能/正文写作/编辑会话.ts:78`+`编辑缓冲.ts:52-57`+`正文页.tsx:188` | D1 | `if (!alive || JSON.stringify(draft) === JSON.stringify(state.draft)) return;`(每次输入 1 次全文序列化)→ `persist()` → `storage.setItem(key, text)`(第 2 次)→ `keys().filter(...)`(`:55-57` 遍历整份 localStorage 全部键);渲染侧 `Array.from(正文文本(state.draft)).length` 每次按键按码点建数组。单次按键成本随正文长度线性上升 | 变更判定改脏标/浅比较;字符数缓存在编辑会话快照里;localStorage 写入去抖并只维护当前范围一个键 | 需用户授权 |
| **WB-06** | web | `web/src/界面/结构表单/字段渲染.tsx:79` | D1 | `values.map((v, i) => (<div className="array-item" key={i}>` —— 索引 key 与下方 `:94` 的「移除第 {i + 1} 项」按钮、`:106` 的「添加」同时存在,构成可增删数组项配索引 key | 为数组项生成 client id 并以其为 key | 需用户授权 |
| **WB-10** | web | `web/src/功能/正文写作/候选审阅.tsx:93-98`;`web/src/功能/作品规划/规划工作区.tsx:270-275`;`web/src/功能/正式变更/决策面板.tsx:15` | D2/D7 | 同一 decision 枚举三份中文映射且互相矛盾:`undecided: "未决定"`(候选审阅)vs `undecided: "待决定"`(规划工作区);`adopt: "已采纳"`(候选审阅、决策面板)vs `adopt: "已确认"`(规划工作区) | 收敛为单一导出常量,三处共用 | 需用户授权 |
| **WB-15** | web | 模板 `to=` 链接共 50 处,未编码 30 处 vs 已编码 20 处。未编码示例:`web/src/功能/交付连载/全书整理页.tsx:200,304,434`、`web/src/功能/交付连载/连载计划页.tsx:154-156,505,534`、`web/src/功能/交付连载/跨章校对.tsx:115`、`web/src/功能/作者经验/偏好页.tsx:217`、`web/src/功能/作品规划/探索工作区.tsx:72`;已编码示例:`web/src/应用/路由.tsx:81`、`web/src/功能/正文写作/候选审阅.tsx:108` | D6/D1 | `to={\`/works/${workId}/write/${c.chapter_id}\`}` 与 `to={\`/works/${encodeURIComponent(work)}/write/${encodeURIComponent(chapter)}?branch=…\`}` 并存 —— 同类服务端 id 拼路由,一半编码一半不编码 | 统一:集中一个路由构造函数(内部 `encodeURIComponent`),或全部就地编码 | 需用户授权 |
| **WB-16** | web | `web/src/功能/作品规划/规划工作区.tsx:332` | D2 | `// 冲突提示立即可见,但最新基线可能仍在迹;重看必须等待新数据,不用渲染时序。` —— 「在迹」为错字,语义应为「在途」 | 改字为「可能仍在途」 | 需用户授权 |
| **WB-14** | web | `web/src/功能/交付连载/连载计划页.tsx:497`;`web/src/功能/交付连载/读者反馈页.tsx:248` | D6 | `<a href={r.payload.evidence_url} target="_blank" rel="noreferrer">` —— 直接渲染作者填写并落库的地址;来源表单 `:433` 是 `type="url"`,而 `javascript:`/`data:` 同样能通过 url 类型校验,React 不拦截 `href` 协议 | 渲染前校验 `new URL(x).protocol` ∈ {http:, https:},否则降级为纯文本 | 需用户授权 |
| **JF-07** | 后端-交付连载上下文资料 | src/muse/上下文/材料装配.py:4、src/muse/上下文/材料装配.py:26;src/muse/上下文/任务范围.py:494-503;src/muse/编排/生成规划.py:272、生成正文.py:608、审校修订.py:131、审校修订.py:190、完整审校.py:137 | D1 | 预算单位(UTF-8 字节、明确不是 tokenizer)与来源(任务冻结 `budget.context_bytes`)只写在代码注释;默认值 `65536` 在编排侧重复 5 处,其中 审校修订.py:190 直接以常量传 `字节上限=65536` 绕过任务预算。 | 把"字节单位 + 预算取自任务冻结输入"写进 B09 模块设计与文件设计;`65536` 收敛到单一常量并禁止绕过任务预算的调用。 | 无需授权 |
| **JF-09** | 后端-交付连载上下文资料 | src/muse/资料研究/榜单快照.py:17-20、src/muse/资料研究/榜单快照.py:23;src/muse/基础设施/资料来源/榜单读取.py:10-13、网页读取.py:10-13 | D6 | 外部抓取只有 Protocol:无实现、无超时/重试/退避口径,"真实网络实现必须显式标记"没有判定机制;基础设施两个同形 Protocol 全仓零消费者;`登记榜单` 与 HTTP 路由(接入/http/路由/资料研究.py:147-151)不校验 URL scheme/主机,而 交付连载/发布登记.py:21-22 校验 http/https,口径不一致。HTTP 层 fail-closed(路由:159-161 无读取器返回 503),无静默降级。 | 在 B03 写死外部抓取合同(超时、重试次数、退避、编码、礼貌策略、失败保留失败态),实现落地时复用同一 Protocol,并给 `登记榜单` 加 scheme 白名单。 | 需用户授权 |
| **JF-06** | 后端-交付连载上下文资料 | src/muse/上下文/任务范围.py(835 行);src/muse/上下文/依赖校验.py:34;src/muse/上下文/回放材料.py:56 | D1 | `任务范围.py` 835 行超 500 行阈值;单函数 `核对依赖` 225 行、`读取回放材料` 172 行、`上下文服务.授权任务范围` 123 行、导出格式/EPUB.py:137 `读取` 123 行,均为最深嵌套热点。 | 按来源类型拆 `核对依赖`(目录/文稿/细纲/事实/声音/方法/偏好各一支),`读取回放材料` 拆"选材"与"三臂组装"两段,`任务范围.py` 按"授权/恢复/校验"分文件。 | 无需授权 |
| **JF-10** | 后端-交付连载上下文资料 | src/muse/接入/cli/交付命令.py:39-41 | D6 | `with Path(output).open("xb") as stream: stream.write(bytes(row["data"]))`:实测写入中途失败留下残件(104 字节),重试因排他创建抛未捕获 `FileExistsError`;无"临时文件 + rename"原子落盘。排他创建已能阻止覆盖既有文件,路径由本地作者给出。 | 同目录临时文件写完再 `os.replace`;捕获 `FileExistsError` 给作者中文提示。 | 无需授权 |
| **JF-11** | 后端-交付连载上下文资料 | src/muse/上下文/回放材料.py:140(`def choose`)、该文件 47 个非中文本地变量;src/muse/交付连载/导出格式/EPUB.py 55、Word.py 53、导出格式/__init__.py 31 | D1 | `.agent/规范/命名.md:5` 要求自有业务目录/文件/模块/类/函数/测试名中文优先;同包 `任务范围.py`(9)、`资料研究/分章切窗.py`(0)已是中文风格,两种风格并存。 | 统一改为中文局部名与中文私有函数名;请求/载荷里已是稳定身份的英文字段(work_id、branch_id 等)不动。 | 无需授权 |
| **JF-08** | 后端-交付连载上下文资料 | src/muse/交付连载/接口.py:158(与同文件 :14 重复);src/muse/资料研究/存储.py:31;src/muse/上下文/依赖校验.py:245-247;src/muse/资料研究/接口.py:98;src/muse/资料研究/文本清理.py:100 | D1 | 三域函数体内延迟导入 45 处,其中至少 5 处没有循环依赖理由:同包 上下文/冻结快照.py:17、资料研究/分析保存.py:16 已在模块顶层导入同一符号。 | 无循环依赖的提到模块顶层;确因 知识方法↔上下文 循环必须延迟的,补一行原因注释(见 JF-13)。 | 无需授权 |
| **JT-09** | 后端-任务运行编排 | `src/muse/任务运行/原文生命周期.py`(905 行)、`接口.py`(682)、`预算管理.py`(661)、`存储.py`(632);`src/muse/编排/生成正文.py`(639) | D1 | `find src/muse -name "*.py" -exec wc -l {} +` 显示本组 5 个文件超 500 行。圈复杂度热点(ast 脚本,含推导式/布尔运算计 1):`生成正文.py:168 登记生成正文` cc=46、`配置版本.py:86 __post_init__` cc=36、`运行证据.py:220 保存` cc=32、`模型调用.py:242 _执行回合` cc=31、`研究拆书.py:87 登记研究拆书` cc=24、`预算管理.py:351 预留` cc=23、`完整审校.py:158 登记完整审校` cc=21、`行为评测.py:132 准备` cc=20。两项都不在门禁内:`pyproject.toml` 的 `[tool.ruff.lint] select = ["E","F","W","I","B","UP"]` 不含 `C901`(mccabe) | 门禁加 `C901`(阈值先设 25)把热点固定下来;随后按"旅程壳 + 处理器工厂"拆 `登记生成正文`(46 个闭包同处一函数)与 `运行证据.保存`(字段校验矩阵) | 需用户授权(改 pyproject 门禁配置) |
| **JT-08** | 后端-任务运行编排 | `src/muse/编排/接口.py:14-21` | D1/D3 | `流程服务` 三个方法中 `.发布` 有 6 个生产消费者,`.发起`(一层转发 `运行.创建任务`)只有 tests 调用,`.查询`(转发 `运行.读取任务`)生产与测试**均零调用**;生产发起实际都直连 `装配.任务运行.创建受控任务/创建任务`(`生成正文.py:624`、`研究拆书.py:300`)。这是无消费者的转发面 | 删除 `.发起/.查询`,只保留有消费者的 `.发布`;或让业务入口统一经 `流程服务` 发起,避免两套发起口径 | 无需授权 |
| **JT-13** | 后端-任务运行编排 | `AGENTS.md:14` 对照 `src/muse/任务运行/存储.py` 全体 SQL | D7 | 文档:`本地 SQLite(data/muse.db,gitignore)是默认派发与单机工作面的运行态账本…运行留痕(runs/events)…落在其中`。实现:`grep -rn "sqlite" src 工具 Makefile pyproject.toml` 命中 0;运行留痕实际全在 PG(`muse_task`/`muse_step`/`muse_attempt`/`muse_task_event`,见 `存储.py:571-599` 追加事件)。按 SQLite 口径去查 runs/events 会查空 | 更正 `AGENTS.md` 运行态账本一行(或如果 SQLite 账本确有独立实现,补路径);本项主责在根文件组,本组只提供实现侧证据 | 需用户授权 |
| **JT-12** | 后端-任务运行编排 | `docs/系统架构/新版设计/调用链路/关键旅程.md:23` 对照 `src/muse/编排/章后处理.py:373-380` | D7 | 文档:`S01 事务登记派生任务 → S02 租约执行 → 固定正文版本 → 摘要/B02 事实提案/B09 索引 → 完成前来源复检。` 实现:`来源复检`(post.verify)是**第一步**,之后 4 步只按冻结 revision 读历史正文(`读取正文依据(..., int(来源["revision"]))`),最后一个"登记摘要与索引"不再核对当前版本;另有 `登记恢复检查` 在恢复时复检一次(`:120-123`)。"完成前复检"在实现里不存在 | 二选一:把文档改为"入口来源复检 + 恢复时复检",或在 `登记摘要与索引` 前补一次当前版本核对(不一致即拒绝登记) | 需用户授权(改文档口径或改流程步骤) |
| **JT-11** | 后端-任务运行编排 | `src/muse/编排/研究拆书.py:31`;`src/muse/启动.py:288` | D1 | `from muse.编排.章后处理 import _工厂, 前步检查点` 与 `from muse.编排.运行装配 import _登记默认运行` —— 下划线私有符号被跨文件导入(`_工厂` 还是 3 个旅程共用的数据库工厂构造)。`AGENTS.md` 与本组对外口径均要求"外部不导入私有模型或 SQL"(S02 文档 `:26`:`所有接口在本模块的接口.py 暴露…外部不导入私有模型或 SQL`) | 把 `_工厂` 提升为公开名(如 `编排.装配工厂()`)或下沉到独立模块;`_登记默认运行` 去掉下划线并写进 `运行装配.__all__` | 无需授权 |
| **JT-05** | 后端-任务运行编排 | `src/muse/编排/载入模板.py:40-63`(解析);`src/muse/任务运行/模型.py:134-143`(步骤计划无保护字段) | D3/D7 | 11 个流程模板里有 7 个写了 `protection: 冻结上下文`(如 `流程/生成正文.yaml` 冻结回放),但 `解析流程文本` 只取 `step_id/processor/processor_version/depends_on/tools/role`,`protection` 无任何读取点(全仓 grep 该键命中 0)。真正生效的是 `登记类型(必需保护=...)` + `步骤处理器.保护职责`(`槽位约束.py:42-46`)。模板里这个字段是**登记了但没人读**的第二事实源:改它不会改变保护,删它也不会削弱保护 | 二选一:解析时读入并与处理器 `保护职责` 核对(不一致即拒绝),或从模板删除该字段并在模板注释写明"保护节点由处理器登记决定" | 无需授权 |
| **JT-14** | 后端-任务运行编排 | `src/muse/任务运行/预算管理.py:66-73` | D1/D7 | `归属窗口` docstring:`沿用每日 00/05/10/15/20 边界;末窗到午夜`,而 `AGENTS.md` 口径是"严格遵守 5 小时额度窗口"。实现末窗 20:00–24:00 只有 4 小时;且边界小时数是硬编码常量,`额度策略.时区` 可配但边界不可配 | 文档写明"四段 5 小时 + 末段 4 小时",或把边界提成 `额度策略` 字段(默认不变) | 无需授权 |
| **JT-10** | 后端-任务运行编排 | `src/muse/编排/生成正文.py:91-100` 与 `src/muse/编排/章后处理.py:357-364`;`src/muse/任务运行/预算管理.py:27`、`配置版本.py:26`、`角色策略.py:29-35`;`src/muse/任务运行/存储.py:37-38` 与 `接口.py:514-528`、`预算管理.py:606-646` | D1/D2 | ① `前步检查点` 在 `生成正文` 与 `章后处理` 各实现一份,逻辑相同仅错误类型不同(`研究拆书.py:31` 又跨文件 import 了后者)。② 五角色集合硬编码三份:`预算管理._角色`、`配置版本._角色` 逐字相同,`角色策略.py:29-35` 再校验一次;权威声明在 `策略/角色.yaml`(`roles:` 五键)。③ `存储.查询` 的自述是 `仅本模块固定 SQL 使用 schema 占位,不接收外部 SQL 或表名`,但 `接口.py:514-528` 与 `预算管理.py:606-646` 都把外模块 SQL 常量传进来(schema 仍走 `sql.Identifier` + 参数化,无注入风险,但边界声明失真) | ① 抽到一个公共模块(如 `编排/步骤上下文.py`)。② 角色集合从 `角色策略目录.从发布包()` 取,删除两份 frozenset。③ 或把 `存储.查询` 的自述改为"供任务运行所属模块共用,schema 由调用方指定不得来自外部输入",或把这两处 SQL 下回收进 `存储` | 无需授权 |
| **JT-15** | 后端-任务运行编排 | `src/muse/编排/研究拆书.py:300-304` 对照 `src/muse/任务运行/接口.py:548-557` | D7/D1 | `任务ID = 装配.任务运行.创建任务(请求, 流程身份, 流程版本)` 之后才 `if 配置ID: 配置版本管理(...).冻结到任务(...)`。而 `接入/http/路由/资料研究.py:45` 的 `config_id: str | None = None` 是可选字段,因此不传配置时**会创建一个注定在"绑定分析配置"步骤失败的任务**。同一仓的 `任务登记参与者` 明确避免这种任务:`# 部署未声明抽取配置时不登记注定失败的任务`(`接口.py:555`),`发起章后处理` 也先 `raise 配置错误` 再创建 | 对齐口径:`发起研究拆书` 在 `配置ID is None` 时直接 `raise 配置错误`(或与章后一致走 `创建受控任务` + 配置必填),并把 HTTP 的 `config_id` 改为必填 | 需用户授权(改接口契约字段) |
| **JT-06** | 后端-任务运行编排 | `src/muse/任务运行/接口.py:493-501` | D2/D3 | 公开方法 `登记外部调用` 的 docstring:`发送前持久化调用引用;模型治理与预算按策略接入。`——"按策略接入"无判据;且它与 `对账调用` 一样只有 tests 调用(生产派发实际走 `预算管理.标记已发送(登记尝试=True)` → `存储.登记调用`)。三个公开入口(`登记外部调用`/`对账调用`/`核对可登记任务`)里前两个在生产面零消费者 | docstring 改为陈述实际语义("供无 S02 派发能力的受控外部调用登记引用;当前仅测试与运维对账使用"),或按 JT-01 的结论决定去留 | 无需授权 |
| **JT-07** | 后端-任务运行编排 | `src/muse/编排/生成正文.py:527,537`、`章后处理.py:373,383`、`研究拆书.py:225,235`;`src/muse/任务运行/模型.py:50` + `事件记录.py:5-7` | D3 | `流程定义_生成正文/生成正文步骤`、`流程定义_章后处理/章后处理步骤`、`流程定义_研究拆书/研究拆书步骤` 六处只自引用(定义行 + 本文件 `__all__`),全仓 grep 零外部消费者;实际流程来自 `运行资源.zip` 的 `流程/*.yaml`(`运行装配.py:44-59`)。同理 `事件类型.等待作者`("task.waiting")在 `事件记录.py` 白名单内,但无任何生产者,`web/src/功能/任务运行/数据.ts` 的事件名表也没有它 | 删除这六处代码内流程定义(流程模板是唯一来源),或反过来让模板缺失时回退到它们;删除 `等待作者` 枚举与白名单项 | 无需授权 |
| **JW-18** | 后端-写手规划经验 | src/muse/作品规划/提示词/细化章节计划.md:1;src/muse/作品规划/近期细化.py:29;docs/系统架构/新版设计/模块设计/B01-作品规划.md:41 | D1 | 一个概念两个名:提示词文件名"细化章节计划",而同模块代码与模块设计一律称"细纲"(`查章规划(..., "fine_outline")`、`读取已确认细纲`、文件合同"章级细纲任务模板"),违反 `.agent/规范/命名.md` 第 6 条"一个概念一个名" | 统一为"细纲"(改名随 JW-02 的登记一并做) | 需用户授权 |
| **JW-08** | 后端-写手规划经验 | src/muse/正文写作/提示词/生成正文.md:3-4 | D2 | 面向维护者的装配元信息("资源身份随发布包加载并记录哈希;角色身份、字段结构、权限和预算从各自权威装配…")随模板进入模型系统提示(`编排/生成正文.py:342` → `:159` → `任务运行/角色会话.py:21-29` 拼接),对写手无写作指令价值;同文件 文件合同 :146-149 已声明"边界:仅定义本任务提示" | 移出模板(改放文件合同或代码注释) | 需用户授权 |
| **JW-09** | 后端-写手规划经验 | src/muse/正文写作/提示词/生成正文.md:18 | D2 | 单条要求堆叠五处否定:"不把口癖强塞到每句;…不是必须新造或照抄的剧情。声音条目不取代…不把词表命中直接判为缺陷",判据互相缠绕,模型难以机械对齐 | 拆成 2~3 条各带单一判据的正向要求 | 需用户授权 |
| **JW-16** | 后端-写手规划经验 | src/muse/正文写作/写作任务.py:20-23、61-64、115-118;src/muse/正文写作/接口.py:382 | D3 | `写作粒度集()` 的 `expand_scene`/`edit_selection` 无生产消费者:唯一调用点 `编排/生成正文.py:557` 先拒绝非 `new_chapter`(HTTP/CLI schema 亦为 `Literal["new_chapter"]`);且 `创建写作任务` 只在基线为 0 时约束粒度,实测 `写作任务合同(粒度="expand_scene", 基线=3, 选区=())` 通过(仅 `edit_selection` 强制选区) | 明确保留为 API 能力并在文件合同注明无生产调用,或收窄 `其他粒度` 的接受条件 | 需用户授权 |
| **JW-13** | 后端-写手规划经验 | src/muse/作品规划/进度查询.py:21;src/muse/作品规划/探索交接.py:109 | D1 | 生产代码用 `assert 身份.作者 is not None` / `assert 作品 is not None` 做控制流;`python -O` 下断言被剥离,前置不变量静默消失 | 改为显式 `raise 作品错误(...)` | 需用户授权 |
| **JW-14** | 后端-写手规划经验 | src/muse/作品规划/进度查询.py:23-25 | D1 | 逐章调用 `正文.读取正文` 与 `正文.列出候选`,二者各自 `with self.数据库.连接(只读=True)`(`正文写作/接口.py:224-232`、`:324`),500 章即约 1000 次连接获取 | 增加批量读取入口或由调用方传入连接 | 需用户授权 |
| **JW-17** | 后端-写手规划经验 | src/muse/正文写作/候选版本.py:38;src/muse/作品规划/模型规划.py:1;配置/流程模板/生成规划.yaml:1 | D2 | 术语偏差:代码 docstring 与流程模板注释出现 `Shadow`("任务事务内保存 Shadow 与模型来源"、"受控规划的动态输出合同与 Shadow 候选出口"、"规划只产出 Shadow 候选"),与 `.agent/规范/术语.md` 第 4 条"`Shadow/Canonical` 等内部词在界面与文档中用候选/正式"不一致 | 三处改称"候选" | 需用户授权 |
| **JW-07** | 后端-写手规划经验 | src/muse/作品规划/探索交接.py:48 | D2 | 错误文案硬编码"整理稿须按导航顺序包含根设定、九章和待决与取舍";章数实际来自资源 `.agent/skills/操作/完善故事基础设定/references/交付结构.json`(实测 9 项),资源改章数后文案失真 | 由 `树["chapters"]` 长度生成文案 | 需用户授权 |
| **JW-15** | 后端-写手规划经验 | src/muse/作者经验/存储.py:49、119 | D1 | `INSERT INTO muse_preference VALUES (%s,%s,%s) ON CONFLICT(preference_id)…` 与 `INSERT INTO muse_improvement VALUES (%s,%s,%s)…` 不写列名,依赖物理列序;同文件其他语句均显式列名 | 补列名,避免后续迁移加列即错位 | 需用户授权 |
| **JW-19** | 后端-写手规划经验 | src/muse/作品规划/分层规划.py:85-184;src/muse/作者经验/运行观察.py:20-145;src/muse/作品规划/探索交接.py:28-73 | D1 | 复杂度热点(AST 计圈复杂度):`核验规划` CC≈36/100 行、`_业务依据` CC≈26/126 行、`校验交付格式` CC≈24/46 行;本组 37 文件无超 500 行(最大 `规划版本.py` 483 行) | 前两者按"结构/投影校验"与"来源/哈希校验"、"各类业务来源"拆分 | 需用户授权 |
| **JW-10** | 后端-写手规划经验 | src/muse/正文写作/接口.py:145 | D1 | 函数内 `from muse.正文写作.候选版本 import 段落差异`,而模块顶部 `:18` 已导入同名符号,重复导入 | 删除函数内重复导入 | 需用户授权 |
| **JW-12** | 后端-写手规划经验 | src/muse/作品规划/存储.py:152、162;src/muse/作者经验/存储.py:22-45;src/muse/正文写作/写作任务.py:67-69 | D1 | 同一文件内中英混用:`存储.py:152 行 = …` 与 `:162 row = …`;`作者经验/存储.py` 全用 `row/pid`,同包 `作者偏好.py:50 行 = store.读偏好(pid)` 混搭;`写作任务.py:67-69` 用 `甲/乙` 作选区循环变量(语义弱),与 `.agent/规范/命名.md` 第 1 条"中文优先"取向不一致 | 统一为中文局部名(技术约定名如 `payload` 除外) | 需用户授权 |
| **JW-06** | 后端-写手规划经验 | src/muse/作品规划/分层规划.py:249-337 | D3 | F06.05 节奏簇(`内置题材档位`/`校验节奏标注`/`检查节奏分布`/`登记题材档位`)消费者只有 `tests/单元/test_规则节奏与伏笔.py`,`src/muse/接入/`、`src/muse/编排/` 全无引用(grep "节奏" 在接入目录零命中) | 明确登记为"已实现未接线"并注明接线路标,或接入规划表单/进度查询 | 需用户授权 |
| **JW-05** | 后端-写手规划经验 | src/muse/作品规划/分层规划.py:275-283;src/muse/作品规划/接口.py:290 | D1 | `节奏分布` 进入 `接口.py` 的 `__all__`,但全仓(含 tests、web、接入)零消费者;空输入实测 `ZeroDivisionError: division by zero`(`总数 = len(场景们)` 后直接相除,无空校验) | 空输入显式抛 `作品错误`,并取消无人使用的 `__all__` 导出 | 需用户授权 |
| **JW-11** | 后端-写手规划经验 | src/muse/正文写作/接口.py:352-387 | D1 | `__all__` 分两段:`:352-384` 一块,`:387` 再 `__all__ += ["写作输出合同", "生成正文模板"]`;同仓其他模块单块书写 | 合并为单块 `__all__` | 需用户授权 |
| **JC-12** | 后端-基础设施共享 | `src/muse/基础设施/备份恢复.py`(1018 行)、`数据归档.py`(547 行) | D1 复杂度 | 两个文件超 500 行;`创建备份` 102 行、`恢复备份` 99 行、`_数据库摘要` 93 行、`直接调用.准备` 96 行、`Pi.运行` 83 行(AST 实测) | 按职责拆分(备份的"清单校验/数据库摘要/客户端调用"三段可独立成模块),拆前先补该文件的单元覆盖 | 择机修 |
| **JC-16** | 后端-基础设施共享 | `配置/测试.example.toml:1-14`;`tests/conftest.py:248` | D3/D7 孤儿配置面 | 该模板的 `连接环境变量`/`允许用途`/`真实调用` 三个键全仓无读取方(`grep 配置/测试` 零命中);测试侧另行硬编码 `数据库环境变量 = "MUSE_TEST_DATABASE_URL"` | 要么让测试引导真的读该模板,要么把它降级为纯纪律说明并删键,避免"成文协议无实现" | 择机修 |
| **JC-19** | 后端-基础设施共享 | `src/muse/基础设施/检索/向量.py:1` | D2 描述失真 | 模块 docstring 写"余弦相似与倒数排名",本文件只有 `余弦相似`/`向量得分`;RRF 融合实现在消费者 `src/muse/上下文/混合检索.py:19` | 改述为"余弦相似打分;倒数排名融合由上下文层承担" | 择机修 |
| **JC-20** | 后端-基础设施共享 | `src/muse/基础设施/资料来源/网页读取.py:1,11` | D2 自相矛盾 | 模块 docstring"失败如实上抛",协议 docstring"失败返回失败结果"(同一文件两种失败语义) | 与该模块的最终处置(JC-06)一并定稿,只留一种失败语义 | 择机修 |
| **JC-22** | 后端-基础设施共享 | `配置/本机正式.toml:2,7,22,30`、`本机维护.toml:5,14`、`运行配置/章后抽取-本机.toml:21,26` | D6 环境信息入仓 | 三个"本机"配置入库(`git ls-files 配置/` 确认),含个人绝对路径(`/Users/qingse/.local/share/muse/正式环境/…`)、内网地址与端口(`100.64.0.8:5433`、`http://100.64.0.8:3000/v1/messages`)、正式库名;文件内自述"非敏感配置由 Git 管理" | **无凭据值泄漏,不构成 P0**;建议把"本机"配置移出跟踪(保留 `.example` 模板纪律),或明确仓库不外发并保持现状 | 需用户授权(改跟踪清单) |
| **JC-17** | 后端-基础设施共享 | `src/muse/共享/__init__.py:6-38`;`src/muse/配置.py:187` | D3 导出面大于消费者 | `from muse.共享 import …` 全仓零命中(18 个再导出名无消费者,消费方一律直接导入子模块);`配置.py` 的 `解析配置`、`运行装配配置` 也无外部消费者 | 共享包保留子模块导入路径即可,收窄 `__init__` 再导出面;`配置.py` 的两个名字从 `__all__` 移出或注明为装配入口保留 | 择机修 |
| **JC-18** | 后端-基础设施共享 | `后端-基础设施.md:17,30,61-62,302-303` | D7 文档-实现不符 | 文档声明 `连接.py` "连接池和生命周期/仅构造受控连接池",实际 `连接.py` 每次调用新建连接、无池;声明 `可观测性.py` "日志、关联身份、指标和脱敏",实际只有 `记录运行`/`配置日志`,无指标 | 改为如实描述(受控连接与生命周期、日志与脱敏),或按目标补齐实现;两处均属"目标未落地",须与 JC-10 同批处置 | 需用户授权(改设计文档) |
| **JC-21** | 后端-基础设施共享 | `src/muse/基础设施/检索/向量.py:19-24` | D1 重复计算 | `向量得分` 对每个语料项调用 `余弦相似` 两次(过滤一次、取值一次),语料大时重复全部点积 | 改为一次计算后判正(海量语料下同时省一半算术) | 择机修 |
| **JC-15** | 后端-基础设施共享 | `src/muse/基础设施/数据库/迁移.py:20`、`备份恢复.py:41`、`tests/集成/test_数据库连接与迁移.py:233` | D1 重复常量 | 三处各写一份 `0x6D757365` 迁移互斥锁键,无任何断言保证迁移与备份仍锁同一键 | 抽到单一位置(如 `数据库/迁移.py` 导出 `迁移锁键`)并让备份引用;补一条"两模块取同一锁"的断言 | 择机修 |
| **JC-14** | 后端-基础设施共享 | `src/muse/基础设施/受控文件.py:83-93` | D1 错误质量 | `_根句柄` 的 `except OSError` 覆盖了 `yield` 之后的调用方代码:探针实测 `读取(不存在的对象ID)` 报"受控暂存不可访问"(真实原因是对象目录不存在) | 把 `except OSError` 收窄到 `os.open(self.根,…)` 一处,调用方 OSError 按各自语义转 `受控文件错误` | 择机修 |
| **JC-13** | 后端-基础设施共享 | `备份恢复.py:874-1006`、`系统运行.py:18-34`、`受控文件.py:191-213` | D1 命名规范 | 自有局部名纯英文:《命名》第 1 条要求中文优先;实测 `备份恢复.py` 15 个(`manifest/entry/created/seen/process/chunks/environment/candidates/directory/member/archive/root/child/expected_id/entry_id`)、`系统运行.py` 10 个(`config/conn/database/manifest/status/files/directory/parts/actual/visit`)、`受控文件.py` 5 个(`file/info/out/stream/root`) | 新改的代码统一中文命名;不做全仓批量重命名(收益低于 diff 风险) | 择机修 |
| **JS-18** | 后端-审校效果评测 | `src/muse/审校修订/接口.py`(函数内 import 21 处)、`src/muse/效果评测/接口.py`(25 处) | D1 | 两个公开面模块大量在方法体内做 import(多为规避循环依赖),读公开面时无法一次看到该用例的真实依赖与落点 | 把不参与循环的 import 上提;确实循环的用模块级 `TYPE_CHECKING` + 运行时延迟导入并加一行原因注释 | 无需授权 |
| **JS-14** | 后端-审校效果评测 | `src/muse/效果评测/逐例执行.py`(991 行)、`效果评测/接口.py`(946)、`审校修订/存储.py`(901)、`审校修订/持久返修.py`(812)、`效果评测/规则诊断.py`(717)、`审校修订/接口.py`(588)、`效果评测/文学评分.py`(503);复杂度:`指标汇总.py:13 汇总实验` C≈150/L272、`启用判据.py:107 判定效果` C≈115/L215、`文学评分.py:371 _仲裁文学评分` C≈114/L132、`逐例执行.py:152 固定执行计划` C≈80/L266、`持久返修.py:514 _读取返修比较来源于` C≈73/L241 | D1 | 7 个文件超 500 行(占本组 48 文件的 15%);497 个函数中 67 个圈复杂度 ≥15,5 个 ≥70,均在"应保持确定性可复核"的报告组装与判据路径上 | 按职能拆文件(如 `逐例执行` 拆计划/交付/核验、`指标汇总` 把五类指标拆成子函数),或抽出具名私有步骤函数 | 无需授权 |
| **JS-16** | 后端-审校效果评测 | `src/muse/审校修订/返修策略.py:15`、`持久返修.py:39`(`le=5`)、`持久返修.py:125`(`1 <= 最大轮数 <= 5`)、`持久返修.py:273`(`1..5`);`src/muse/效果评测/文学评分.py:83`(`ge=0, le=10, multiple_of=0.5`)、`:236-239`、`:420-425`(`0.5`/`10` 再写一遍);`src/muse/审校修订/机器味诊断.py:58`(`width=12`)与 `:411`(调用点硬编码 `32`) | D1 | 同一阈值在多处重复字面量:返修轮数上限 5 出现 ≥4 次、评分 0-10/0.5 出现 ≥4 次;语境窗口同时存在 12 与 32 两个默认 | 集中为具名常量(`最大返修轮数`、`评分上下限/步长`、`语境窗口宽度`)并只留一个定义 | 无需授权 |
| **JS-15** | 后端-审校效果评测 | `src/muse/审校修订/存储.py:19-20` | D1 | 查询助手命名为 `_声音查询`,实际是全类通用查询入口(本文件 30+ 处调用,覆盖案例、规则、诊断、文学片、报告等无关领域) | 改名 `_查询`(或 `_行查询`),声音专用语义留到调用点 | 无需授权 |
| **JS-19** | 后端-审校效果评测 | `src/muse/审校修订/机器味规则.py:23-40` | D1 | 单一 `规则触发` 模型用全部可选字段(`pattern`/`criteria`/`handler`/`max_chars`/`min_run`/`window_chars`/`min_hits`/`tolerance`)同时承载 regex/handler/density/model_judgment 四类触发器,合法性只能靠 `核对规则:73-97` 的手写分支补 | 改判别联合(`type` 为判别字段),让非法组合在合同层就被拒 | 无需授权 |
| **JS-11** | 后端-审校效果评测 | `src/muse/效果评测/返修比较.py:34` | D3 | `数据集版本 = 诊断数据集版本` 为兼容别名,仓内零消费者(同文件只用 `诊断数据集版本`/`选段数据集版本`) | 删除该行 | 无需授权 |
| **JS-12** | 后端-审校效果评测 | `src/muse/审校修订/机器味规则.py:145-147` | D3 | `def 核对规则启用(规则, 样例, 评测依据=None): 核对规则(...); raise 规则启用不可用(...)` —— 无条件抛错、第三个参数从未使用;除 `tests/单元/test_机器味诊断合同.py:28`、`test_声音与规则合同.py:109` 外零调用者,真实启用走 `规则启用.py:145-181` | 删除;若要保留拒答桩,去掉未用参数并在 docstring 写明真实入口 | 无需授权 |
| **JS-17** | 后端-审校效果评测 | `src/muse/效果评测/标定.py:310` | D1 | `agreement = sum(verdicts) / len(verdicts) if verdicts else None` —— 上一行 `:308-309` 已 `if not verdicts: return`,`else None` 是永不执行的死分支 | 去掉条件表达式,直接相除 | 无需授权 |
| **JS-13** | 后端-审校效果评测 | `src/muse/审校修订/接口.py:516-587`、`src/muse/效果评测/接口.py:127-199` | D3 | 15 个 `__all__` 名在仓内无任何跨模块调用方,只有 `接口.py` 自身的 import 与 `__all__` 字符串:`准备模型修订`、`基础检查报告`、`连续性报告`、`返修比较来源类型`、`返修比较选段授权`、`返修比较选段来源`;`读取规则诊断凭据`、`样本分层`、`标定引用`、`标定报告`、`文学评判依据`、`核对评判依据`、`写手审计声明`、`混淆项报告`、`裁决行为`(符号本身在同包内另有消费者,故非死代码,只是转发层冗余) | 从 `__all__` 收回未消费项,避免把内部合同误当公开面 | 无需授权 |
| **JR-08** | 后端-接入 | `src/muse/接入/创作操作.py`(546 行)、`src/muse/接入/cli/入口.py`(527 行) | D1 | 全域仅这两个文件超 500 行(`wc -l` 全量核对)。`创作操作.py:31-546` 全是 pydantic 请求/结果模型,作品、规划、探索、故事世界四域混住;`入口.py:25-277` 是 19 个子命令的 argparse 声明 | `创作操作.py` 按域拆成作品/规划/探索/事实四个模型模块;`入口.py` 的解析器按命令族下沉到各 `cli/*命令.py`(导出 `注册(子命令解析器)`) | 无需授权 |
| **JR-17** | 后端-接入 | `http/路由/元数据.py:1` 对照 `:13-16` | D2/D7 | 模块 docstring 自称"读取固定的公共基础结构;作品扩展与启用由具名业务授权入口提供",但同文件 `POST /api/v1/schemas/commands` 直接调 `执行结构操作`,可完成 `登记候选`/`发布版本`/`兼容检查` 三类写动作 | docstring 改为"读取已发布结构 + 受控结构维护命令(登记候选/发布版本/兼容检查)";若要保留"不提供实例启用"的边界,就在此文件显式写出 | 无需授权 |
| **JR-18** | 后端-接入 | `src/muse/接入/主会话.py:1,40-84`;对照 `后端-装配与接入.md:471` | D7 | 设计文档把 `主会话.py` 职责写成"中文意图和已授权作者动作接入,关联对话及任务",实际文件只有任务控制/额度 DTO、`参数合同错误`、`呈现结构` 与两个转交函数(`执行任务控制`/`执行预算批准`,`:55-84`),没有任何中文意图或对话实现;文件名 `主会话` 与内容也不相符 | 二选一:把文档职责改为"HTTP/CLI 共用的任务控制与结构呈现合同"(并考虑改名 `任务控制.py`);或补齐对话/意图接入面(新功能,须另立计划) | 需用户授权(改文档或改名) |
| **JR-10** | 后端-接入 | `cli/研究命令.py:15,24-46`;`http/路由/资料研究.py:51-52` | D1 | ① `拆解请求` 设了 `ConfigDict(populate_by_name=True)` 却没有任何 `alias`(该开关在此无作用),另加 6 个只读转发 property(`命令ID`/`来源ID`/`配置ID`/`理由`/`重跑窗`/`窗口章数`),一对一映射同名字段,无任何转换语义;② `_装配(request)` 是一行 `return request.app.state.装配`,被同文件 11 处调用 | ① 删掉 6 个 property 与 `populate_by_name`(同层 `生成发起请求` 直接用英文字段名);② 直接用 `request.app.state.装配` 或提升为 `依赖.py` 的 `Depends` | 无需授权 |
| **JR-13** | 后端-接入 | `cli/入口.py:31-276` 覆盖的 19 子命令 / 149 动作项 | D3 | 机械核对:文档里 72 处 `python -m muse` 用法中命令名 0 处不匹配、39 处动作名成对可校验且 0 处不匹配;但 **115 个动作项在权威文档(README/`.agent`/`docs`/`配置`/Makefile)从未出现**;18 个 CLI 适配函数中 **10 个无任何测试引用**(`运行交付命令`/`运行作品命令`/`运行探索命令`/`运行规划命令`/`运行创作命令`/`运行审阅命令`/`运行维护任务命令`/`运行角色行为命令`/`运行行为评测`/`运行评测命令`) | 对无文档无测试的动作做一次清点:保留的补进 README 或对应 SKILL(至少写用途与前置配置),确无产品用途的删掉;不必逐条补测试,但每个动作要有明确使用方 | 需用户授权(删减 CLI 面) |
| **JR-11** | 后端-接入 | `审校操作.py:38-39,108,115`;`cli/角色行为命令.py:23`;`评测操作.py:14,20`;`http/应用.py:74`;`http/事件订阅.py:89` | D1 | ① 返修轮数上限 5 写三次(`max_rounds le=5`、`expected_round le=5`、域内 `审校修订/持久返修.py:273` 的 `1 <= 最大轮数 <= 5`);② 审校切分默认与边界 `4000 / ge=2,le=12000 / 240` 两处(`审校操作.py:38-39`、`审校修订/审校报告.py:48,53`),且接入另加域内不存在的 `context_size le=2000`;③ `command_id max_length=200` 三处;④ 会话有效期 `max_age=12*3600` 硬编码;⑤ SSE 轮询 `asyncio.sleep(1)` 硬编码 | 每个上限给唯一定义处(域内常量或 `接入/契约常量.py`)并被两侧引用;`context_size` 若确要收紧,在文档写明理由;会话有效期与轮询间隔提升为配置项 | 无需授权 |
| **JR-07** | 后端-接入 | `cli/审校命令.py:46`、`cli/评测命令.py:60`、`cli/入口.py:292`、`cli/研究命令.py:49`、`cli/交付命令.py:15`、`cli/经验命令.py:43` | D1 | 圈复杂度(ast 自算,含 if/for/try/with/布尔/推导/断言):`运行审校命令` **cc≈45**、`运行评测命令` **cc≈45**、`main` **cc≈36**、`运行研究命令` **cc≈27**、`运行交付命令` cc≈21、`运行经验命令` cc≈20。`审校命令.py:96-153` 是一张 18 项动作表 + 18 个 if 的线性派发。`pyproject.toml:64` 的 `select = ["E","F","W","I","B","UP"]` 不含 `C901`,无机械门禁 | 改为 `{动作: (schema, 执行函数)}` 单表派发(多数分支只差一个调用);门禁加 `C901`(阈值 25 起)——改 pyproject 属另一批授权 | 无需授权(本域重构)/需用户授权(改门禁配置) |
| **JR-19** | 后端-接入 | `http/应用.py:49,71` | D6 | `secret_key=hashlib.sha256(("muse-session:" + 口令).encode()).hexdigest()`:会话签名密钥由作者口令确定性派生,同一口令同时承担登录校验与会话签名。口令(`读取凭据("受控存储", 服务.口令文件)`)熵不足时,拿到一个会话 cookie 即可离线爆破口令并伪造会话。本项无凭据泄漏,属加固项 | 会话密钥改为独立随机值(受控存储第二个值或环境变量),与登录口令解耦;`itsdangerous` 已在依赖内 | 需用户授权(改部署配置与密钥来源) |
| **JR-16** | 后端-接入 | `cli/入口.py:51,99` | D2 | 作者可见的 CLI 帮助夹内部代号与英文:`help="固定场景裁决或显式S02角色行为执行"`、`help="具体改进、真实评测关联与目标owner启停"`。`.agent/规范/中文正文与界面.md` 第 4 条要求作者可见的界面与说明用简体中文白话 | 改为"S02"→"角色行为评测"、"owner"→"目标责任人(改进所在目标的作者)" | 无需授权 |
| **JR-15** | 后端-接入 | `http/路由/作品规划.py:52 vs :87`;`http/路由/知识方法.py:116 vs :216`;`cli/交付命令.py:18` vs `cli/作品命令.py:131` vs `cli/审阅命令.py:16`;`http/路由/作者经验.py:67,164`;`只读工具.py:5,42 vs :13,33` | D1 | 同一概念多名的实例:① 应用装配在 `作品规划.py` 内先叫 `app`(:52)后叫 `装配`(:87),`知识方法.py` 同样混用;② 调用身份在 CLI 四个模块里分别叫 `identity`/`actor`/`作者`/`身份`;③ 服务对象叫 `svc`(`作者经验.py:67`)又叫 `service`(:164);④ 只读工具 docstring 写"历史文稿"(:5,:42),同文件代码写"历史正文"(:13,:33)。违反 `.agent/规范/命名.md` 第 6 条"一个概念一个名" | 全层统一:装配→`装配`、调用身份→`身份`、服务→`服务`、历史正文为唯一术语;本次已列全清单,逐条机械替换即可 | 无需授权 |
| **JR-09** | 后端-接入 | `cli/研究命令.py:66,83` ↔ `http/路由/资料研究.py:181,201`;`cli/创作命令.py:54-64` ↔ `http/路由/创作生成.py:101-110`;`http/路由/交付连载.py:53-55` ↔ `http/路由/作者经验.py:60-62` | D1 | ① 拆书状态回退字典**逐字重复**:`return 状态 or {"台账": [], "对照": None, "说明": "该来源尚无拆书任务"}`;② `样本 = {"理由": ...} if ... else None` 两处;③"取候选当前版本→读审校报告→无则报错"两处各写一遍(含 `数据库工厂(装配.配置.数据库, 装配.配置.运行用途)` 直连构造);④ 同名 `_服务(request, 作者)` 在交付连载与作者经验各写一份,功能相同 | ①②③ 收到 `接入` 的单一转交函数(如 `接入/研究操作.py`、`接入/创作操作.py`),HTTP/CLI 都调它;④ 合并为 `接入/http/依赖.py` 的共享助手 | 无需授权 |
| **JR-14** | 后端-接入 | `http/路由/任务运行.py:250`;`http/路由/审校修订.py:97,214,220`;另 25 条见下 | D3 | 211 条路由中 4 条除生成合同(`web/src/接口/生成/类型.ts`、`openapi.generated.json`)外**全仓零引用**:`POST /tasks/{id}/raw-recovery`、`GET /voice-proposals/{id}`、`POST /quality-case-withdrawals`、`POST /quality-case-rules`(对应服务方法仅在 `tests/集成/test_案例采集与复核.py`、`tests/迁移/test_作品资产迁移.py` 以域层调用出现)。另有 25 条在 `web/src`(非生成物)无调用点,其中 raw-*/evidence 系列部分由 `tests/集成/test_原文归档与恢复.py:420-441` 以 `base + "/raw-leases"` 拼接覆盖 | 4 条零引用路由交主代理确认产品用途:工作台要用就接线,不用就删并重新生成 `openapi.generated.json`;另外 25 条建议在文档标注"仅 CLI/测试可达" | 需用户授权(删路由) |
| **JR-12** | 后端-接入 | `cli/入口.py:296-324,523` | D1/D3 | `只读动作` 是跨命令的 27 项动作名白名单,用来在写入前跳过迁移兼容门禁;它与同文件 argparse 的 `choices` 重复声明、无机械校验(`grep 只读动作 tests` 命中 0)。同名动作在别的命令里一旦变成写动作就会静默免检。另有 `main` 尾部 `return _退出码_用法错误`:对"已注册但未接线"的子命令静默返回 2,不打印任何说明 | 白名单改为 `{命令: frozenset(动作)}`,与 `choices` 同源生成;未接线子命令先 `print(..., file=sys.stderr)` 再返回 2;补一条"白名单 ⊆ choices 且每个写动作都过门禁"的用例 | 无需授权 |
| **JK-11** | 后端-知识方法故事世界 | `src/muse/知识方法/方法卡.py:1,172` + `docs/系统架构/新版设计/模块设计/B04-知识方法.md:31,42` | D7 | 「六类范式/六类内置」;内置结构里 `实例族` 含 `method` 的实为 8 型:character/combat/craft/emotion/pacing/scene_pattern/style/trope | 改为"内置范式类型以 S04 method 族为准(当前 8 型)" | 无需授权 |
| **JK-14** | 后端-知识方法故事世界 | `src/muse/故事世界/接口.py:1` | D2 | 「当前提案依据校验,后续同表面接入确认和查询」已过期:`决定事实`、`查询世界` 已在本文件实现 | 改为现状陈述 | 无需授权 |
| **JK-09** | 后端-知识方法故事世界 | `src/muse/正式变更/依赖锁.py:15-17` | D1 D7 | `{"schema": "SCHEMA_STALE", "projection": "PROJECTION_STALE"}` 不可达:全仓 22 个依赖维护者的 `种类` 无 `schema`/`projection`;`S01-正式变更.md:41` 的「锁序覆盖结构、投影」实际由 `元数据/结构版本.py:257-291` 在参与者内部完成 | 删死映射;S01 文档改写为"结构/投影由 S04 参与者保护" | 无需授权(文档改动需授权) |
| **JK-10** | 后端-知识方法故事世界 | `src/muse/元数据/内置结构/公共字段.yaml:25-97` vs `src/muse/元数据/扩展合成.py:23-36` | D2 | 「受保护骨架」8 项(无 `created_at`/`updated_at`),代码 `保护属性` 10 项;yaml 自述"仅用于描述",两份清单已漂移 | 由代码清单派生成文档,或补齐两行 | 无需授权 |
| **JK-15** | 后端-知识方法故事世界 | `src/muse/元数据/内置结构/narrative_state.yaml:34` | D2 | 字段说明内嵌「设计发现:2026-07-09——字段隐含"已有前章"假设……(待回填)」,无目标文件、无判据 | 移入台账或删除 | 无需授权 |
| **JK-17** | 后端-知识方法故事世界 | `src/muse/知识方法/存储.py:119,325`;`存储.py:148,150`、`方法版本.py:82,191`、`故事世界/接口.py:204` | D1 D6 | 两处 f-string SQL 只拼接固定字面片段、值全部 `%s` 绑定(逐条核对无注入);`__import__("json")`/`__import__("muse.…")` 反模式散落 5 处 | 统一 `psycopg.sql.SQL` 组合与顶部 import | 无需授权 |
| **JK-16** | 后端-知识方法故事世界 | `src/muse/元数据/内置结构/style.yaml:124-138` | D2 | 「达标样张……(余华/毕飞宇/经典网文实证片段),写手对照校准」:与全仓「严禁抄录原文」(`craft.yaml:267`、`证据反例.py:37-39` 静态资源只登记路径与哈希)纪律冲突,字段无授权约束 | 改为只登记定位/哈希,或加版权授权前置 | 需用户授权 |
| **JK-12** | 后端-知识方法故事世界 | `src/muse/元数据/内置结构/reference_work.yaml:137-153` | D2 | 「产出范式清单」只引用 craft/combat/emotion/scene_pattern/trope 五型(漏 pacing/style,二者同为 method 族),且 `作品范围: same_work` 用于系统侧档案对象 | 补齐 method 族目标类型,并核对系统侧档案的作品范围语义 | 需用户授权(涉及结构发布) |
| **JK-18** | 后端-知识方法故事世界 | `src/muse/知识方法/方法版本.py`(536 行);`src/muse/元数据/字段校验.py:198-306` | D1 | 本组唯一超 500 行文件;`校验字段变更` 为 108 行嵌套闭包手工路径穿越,属复杂度热点(未装复杂度工具,按结构判断) | 拆出参与者类与路径解析辅助 | 无需授权 |
| **JK-13** | 后端-知识方法故事世界 | `src/muse/知识方法/方法版本.py:296-321` + `src/muse/知识方法/模型.py:75` | D2 | enable 无凭据分支读完消费回执后必然抛 `METHOD_ACTIVATION_UNAVAILABLE`(预留路径,无判据);`状态命令` docstring「启用需指向实际消费回执」与实现(必须 B10 启用凭据,`状态参与者` 亦然)冲突 | 删预留分支;docstring 改「启用必须提供 B10 凭据」 | 无需授权 |
| **JK-19** | 后端-知识方法故事世界 | `src/muse/知识方法/方法版本.py:515-536`、`方法卡.py:190-200`、`故事世界/人物关系.py:122-128` | D1 | `__all__` 导出 13 个本包外零引用的名字(8 个参与者类、`读取方法结构`、`列出人物`/`列出关系` 等),公开面宽于真实消费者 | 收窄 `__all__` 到对外合同 | 无需授权 |
| **TL-07** | 工具 | 工具/构建发布.py:25-39;Makefile:70-74 | D1 | 生成序列(生成接口.py → openapi-typescript → pnpm build → 构建资源包.py)在工具与 Makefile 各写一份,当前逐条一致,任一侧改序或加步都会静默漂移 | 序列只留一处(Makefile 目标或共享函数),另一处调用它 | 需用户授权 |
| **TL-09** | 工具 | 工具/生成接口.py:29 | D1 | `argparse.ArgumentParser(description="生成 Schema、OpenAPI 和 TypeScript")` 与实际不符:只写 OpenAPI 与固定 客户端.ts;类型.ts 由 Makefile:71 与 构建发布.py:26-37 的 openapi-typescript 产出,「Schema」从不产出 | 描述改成实际产物 | 需用户授权 |
| **TL-08** | 工具 | 工具/维护索引.py:48(同族 :169) | D6 | `根.rglob("目录.md")` 无法剪枝忽略目录,`_在忽略目录` 只在命中文件上判定(:49-50);实测仍下钻 .venv(1140 个目录)与 web/node_modules(2381 个目录),整轮 1.5s。实测 Python 3.12.6 的 `rglob` 与 `glob("**")` 均不跟随符号链接,无软链风险 | 改 `os.walk` 剪枝,或把忽略目录收进显式候选根 | 需用户授权 |
| **TL-11** | 工具 | 工具/环境预检.py:91-97;工具/生成接口.py:39 | D1 | 前者把 `OSError/ValueError/KeyError/SubprocessError` 归并为一条通用 JSON,丢掉实际原因(退出码仍为 1,未伪成功);后者 `条目["工厂"].split(":", 1)` 在缺冒号时抛裸 ValueError 回溯 | 通用分支保留原始异常文本;工厂格式先校验再报错 | 需用户授权 |
| **TL-10** | 工具 | 工具/构建资源包.py:146 | D6 | `shutil.copytree(web_dist, 工作台目录)` 默认 `symlinks=False`:web/dist 内符号链接会被解引用,把链接目标内容复制进发行包(本组唯一跟随软链处) | 用 `symlinks=True`,或逐文件复制并按清单校验 | 需用户授权 |
| **TL-12** | 工具 | 工具/资源登记.json:237-263;工具/构建资源包.py:67 | D1/D2 | 22 个已登记操作技能身份两套命名:16 个带 `operation.` 前缀(operation.polish-text 等),6 个不带(expand-scene、inspect-task 等);包内路径 `能力/operation/operation.polish-text.md` 与 `能力/operation/expand-scene.md` 并存 | 统一身份命名口径后重建资源包 | 需用户授权 |
| **TL-06** | 工具 | 工具/维护索引.py:269-274;Makefile:74 | D1 | `--检查` 解析后从未被引用(死参数);`--写入` 仅 `print("索引写入:当前无可写生成物,执行幂等检查")`,随后执行与默认完全相同的只读检查。实测默认态与 `--检查` 态退出码均 0 且输出一致,Makefile「生成索引」为虚设语义 | 删除两个空开关,或在 `生成` 目标改调 `--检查` 并在注释写明无索引生成物 | 需用户授权 |
| **MG-01** | 数据库迁移 | `src/muse/基础设施/数据库/迁移.py:52-54` | D3 | `if 版本 in 已见: raise 迁移错误(f"迁移版本重复:V{版本:04d}")` —— 执行器只拦重号,从不校验编号连续性,空洞无法被机械发现 | 在 `列出迁移` 末尾加一条连续性或白名单校验;同步在 `数据库/迁移/` 加 README 或 `迁移登记.json`,逐个写明 10 个空缺的成因(当前仅 V0011 有) | 无需授权(新增校验与登记文件) |
| **MG-02** | 数据库迁移 | `docs/系统架构/新版设计/文件设计/数据库与迁移.md:76-77`(另 `:242`、`:264`) | D3 | 文件树把 `V0013__上下文与检索索引.sql`、`V0015__运行配置版本.sql` 与既有迁移并列列出,`docs/系统架构/新版设计/项目目录与文件职责.md:1603-1604` 同;两文件实际不存在 | 在这两处就地标注「目标编号,实现落于 V0022/V0004」;或在目标清单里改挂实际编号 | 无需授权(文档标注;与 docs 模块检查方向 D4/D7 重合,建议由 docs 报告统一处置) |
| **LM-04** | 旧库迁移(已退场) | 数据库/旧库迁移/切换检查.py:30 | D1 | `"data_checks_passed": 核对["data_checks_passed"] and not any(增量.values())` | 空输入即放行:`--快照 '[]' --当前快照 '[]'` 时 核对结果.py:99 的 `data_checks_passed` 为 True、增量为空 → 入口.py:185 打印「本范围数据检查通过」并返回 0;`导入目标` 同理(入口.py:175 的 `all_accounted` 在 0==0 时成立)。全链路不接收表清单,也不校验快照是否覆盖旧表白名单。建议:快照为空直接报错,并增一条"声明覆盖表 ⊇ 本次分流触及表"的机械断言 | 需用户授权 |
| **LM-06** | 旧库迁移(已退场) | 数据库/旧库迁移/知识记录分流.py:348 | D1 | `return 结果("隔离", "unknown_table")` | 覆盖差集(机械核对):旧结构 DDL 白名单共 66 张(PostgreSQL 58 + SQLite 8),分流规则显式承接 26 张,其余 40 张无任何规则(PG 39 张 + SQLite `schema_migrations`),全部落 `unknown_table` 隔离。fail-closed 本身正确,但「白名单可读 ⊃ 规则可承接」这一差集在代码与文档里都没有成文清单,易被读成"全部旧表可迁"。建议在 `旧知识记录分流.md` 增一张「已登记但暂无承接的表」清单 | 无需授权 |
| **TS-54** | 测试与资源 | `tests/契约/test_盲评与引文合同.py`(31)、`tests/架构/test_技能与文档索引.py`(26)、`tests/单元/test_离线修订回放.py`(18) 等 12 文件 | D2 | `def test_unregistered_scenario_and_policy_drift_fail_before_model_call__c80022` 等纯英文用例名 132 个 | 违背《命名规范》§1「测试名使用中文」:批量改中文名(case_id 身份不变) | 需用户授权 |
| **TS-56** | 测试与资源 | `tests/用例清单.json`(45 条 environment、249 条缺 then) | D2 | `"隔离PG/合成HTTP及浏览器"`、`"隔离PG与合成资料;含实际CLI子进程和HTTP"` 等表述挂在无对应依赖的符号上 | 环境字段区分「本用例执行」与「同文件另有旅程/子进程」;与 TS-04、TS-06、TS-12 一并收口 | 无需授权 |
| **TS-58** | 测试与资源 | `tests/夹具/`(25 文件) | D3 | 计划 §3 D3 写「`tests/夹具` 是空目录」,实测 25 个文件 | 更新计划口径;对 20 个无消费者文件标注「计划内/历史」 | 无需授权 |
| **TS-25** | 测试与资源 | `tests/单元/test_受控文件CAS与恢复.py:1` | D2 | `"""合成私人暂存的字节、权限与清理边界。"""`(文件名含「恢复」) | 全文无恢复/历史归档用例:改名或补用例 | 无需授权 |
| **TS-44** | 测试与资源 | `tests/集成/test_上下文快照与索引写入.py:4,121,462,573,578,603,619,644,657,736` | D1/D2 | `assert f"r{来源.revision}" in 文本`(两字符子串必中);`assert all(m["method_id"] != method_id for m in 材料)`(空表恒真);`from muse.共享.错误 import Muse错误 as _Mus`(与 `:640` 重复) | 模块 docstring「参数上限来自版本策略」全仓无该来源;`:462` docstring 声称「经服务读取确认存在」但只重算 uuid5;段注释自称「不引用旧 SQL」而 `:593-594` 用裸 SQL;多处只断基类异常;`:121` 与 `:584-600` 是同套流程两份实现 | 无需授权 |
| **TS-29** | 测试与资源 | `tests/契约/test_语义检测合同.py:10,21` ≈ `test_盲评与引文合同.py:41,52`;`test_盲评与引文合同.py:619` = `test_角色能力与配置.py:61`;`test_文学评分与仲裁.py:124,204`;`test_工具范围.py:1` vs `test_探索回放合同.py:151-173` | D1 | `def 材料():` / `def _语义材料():` 逐字同构;同一 `工具定义`/`只读工具集` 夹具各建一份 | 抽共享夹具模块或参数化 | 无需授权 |
| **TS-34** | 测试与资源 | `tests/契约/test_运行观察合同.py:13,22,31` | D1 | `_请求()` 单例夹具被 `:22` 与 `:31` 两处变异复用 | 新增字段会同时放宽两处断言:按用例构造 | 无需授权 |
| **TS-47** | 测试与资源 | `tests/集成/test_原文归档与恢复.py:27,140,152,251,258` | D1/D2 | `"""保留LC-d6e3f58513a1;…"""`;`服务.清理(任务, 租约)`(裸调用当幂等证据) | 样本 ID 在用例清单与全仓均查不到;`:140`(临时授权)与 `:152`(哈希不符)两条拒绝理由都只断类型;`:258-267,:296-305,:320-329,:519-528` 四处 diff 完全相同 | 无需授权 |
| **TS-30** | 测试与资源 | `tests/契约/test_判据来源合同.py:31-32`、`test_行为场景执行.py:37-46` | D1 | `del request["samples"][0]["candidateBody"]`;`report.update(persisted=True, target=…)` | 用同一 pydantic 模型重解析自造 dict 当「公开输入」证据;观察对象就地改写成「已持久」再交裁决且无负例 | 无需授权 |
| **TS-32** | 测试与资源 | `tests/契约/test_流式终态.py:34-42`;`tests/契约/test_混淆项合同.py:7` | D1 | 逐字节喂入只覆盖 ASCII 帧内 `\u0085`;`import test_效果判据 as 判据测试` | 补多字节中文跨块用例;跨测试模块导入私有 `_输入()` 改共享夹具模块 | 无需授权 |
| **TS-14** | 测试与资源 | `tests/单元/test_声音与规则合同.py:44-45,62,294-297,337-338` | D1 | `assert 文本[候选["start"]:候选["end"]] == 候选["quote"]`(实现同式,`声音基线.py:82`);`assert 统计声音样本(文本) == 统计声音样本(文本)`;`assert 校验声音节(None) is None` | 断言与实现同源/恒真:引入独立期望 | 无需授权 |
| **TS-22** | 测试与资源 | `tests/单元/test_离线修订回放.py:46,60-66,127-129,186` | D1/D2 | `monkeypatch.setattr(cli, "构建", 禁止构建)`;`assert 可见文本(doc) == text`;docstring「独立成对选择由原观察集成测试另行核验」 | 守卫在 `--离线` 路径不可达(`入口.py:480` 三元短路);只断异常类型;恒真断言;承诺的集成核验不存在 | 无需授权 |
| **TS-23** | 测试与资源 | `tests/单元/test_事实时点与有效性.py:46,52,100,264,271` | D1/D2 | `# 保留原LC-e3eca2942895样本…`;`assert escaped_body.endswith("\\n舱灯闪了一下")`;`with pytest.raises(元数据错误):` | 样本 ID 全仓仅此一处(不可核实);恒真断言;引文断言用 `in` 而非等值;两处违约只断类型 | 无需授权 |
| **TS-17** | 测试与资源 | `tests/单元/test_探索交接与规划.py:50-51,125,265,359-360,421-427` | D1 | `assert 校验交付格式(原探索稿)["valid"]`(用例名承诺「局部展开+不设编号篇幅门」);`assert "不进入 Canonical" in 入口` | 名实不符的单断言、10 组参数共用无 `match` 的 `raises`、文档子串代替行为判据、配置两处逐字复制 | 无需授权 |
| **TS-27** | 测试与资源 | `tests/契约/test_工具范围.py:50`、`test_运行观察合同.py:31`、`test_动态结构投影与版本.py:93`、`test_角色能力与配置.py:103`、`test_文学评分与仲裁.py:242` | D1 | `with pytest.raises(模型协议错误):` 等只吃异常类型;四组变异共用一句 `assert … == "invalid_report"` | 补错误码/字段/`match` 判据 | 无需授权 |
| **TS-28** | 测试与资源 | `tests/契约/test_正文与模型输出.py:57`、`test_探索回放合同.py:184,203`、`test_效果判据.py:32+220`、`test_诊断入口原观察.py:27-30,46-51` | D1 | `assert 可见文本(草稿) == 可见文本(另名)`;`校验清单(清单, 范围) # 不抛异常即通过`;`assert report["rule_library_version"] == first["fingerprint"]` | 期望值改为独立常量/夹具;裸调用处补返回值核对 | 无需授权 |
| **TS-57** | 测试与资源 | `tests/架构/test_技能与文档索引.py:61,79,87`;`tests/端到端/test_改进验证与版本启用.py:141,162,181,199,219,237`;`tests/集成/test_生产评测权限隔离.py:172` vs `test_回放资料封存.py:123-127` | D1 | 三连/六连同构用例(相似度 0.93–0.97);跨文件逐字断言块 | 参数化合并,保留参数分支 | 无需授权 |
| **TS-20** | 测试与资源 | `tests/单元/test_上下文快照哈希.py:68`、`test_声音与规则合同.py:62`、`test_端到端/test_改进验证与版本启用.py:330`、`tests/迁移/test_PG作品正文迁移.py:231` | D1 | `assert PG目标ID(w, "a", "work") == PG目标ID(w, "a", "work")` | 全仓机械扫描出的 4 处「同参自比」,只证确定性不证行为 | 无需授权 |
| **TS-18** | 测试与资源 | `tests/单元/test_评测数据集.py:72,97-98` | D1 | 7 组参数命中 3 类守卫却共用 `with pytest.raises(评测错误):`;5 个字段同由 `extra="forbid"` 拒绝 | 补 `match`/错误码,或删减无区分度参数行 | 无需授权 |
| **TS-19** | 测试与资源 | `tests/单元/test_角色探针.py:76,92` | D1 | 用例名「逐角色真实调用」,`_配置()` 只声明 extractor 一个角色;`:92` 的 `raises(Muse错误)` 无 `match`(同文件 `:98,:123` 有) | 扩到全部角色或改名;补拒绝原因判据 | 无需授权 |
| **TS-40** | 测试与资源 | `tests/集成/test_数据库连接与迁移.py:76,233,255,261` | D1/D2 | `"options", ["", "-c application_name=readonly-probe"]`;`SELECT pg_advisory_lock(%s)", (0x6D757365,)`;`assert main([...]) == 预期码` | options 行与 default 等价;锁键字面量硬编码;只核退出码不读 stderr;`:261` 名「受控文件」但未设 `0o600`、实现不校验权限 | 无需授权 |
| **TS-51** | 测试与资源 | `tests/架构/test_模块依赖.py:76,88,121,205` | D2 | `"""src/mude 不以代码依赖 .agent 技能目录…"""`;`getattr(节点.func, "attr", "") == "run"`;`业务模块 = {p.parent.name for p in 源码根.glob("*/接口.py")}` | 拼写错误;子进程检查漏 `Popen`/`create_subprocess_exec`;相对导入与基础设施域不受跨域限制 | 无需授权 |
| **TS-21** | 测试与资源 | `tests/单元/test_文件归档恢复.py:82,100,118,135,162,175,183,196,222` | D1 | `with pytest.raises(归档错误):`(8 处同类裸断言) | `数据归档.py:80/109/147` 把内部异常也包装成 `归档错误`:篡改/逃逸/软链/未知根/中断清理无法与内部崩溃区分 | 无需授权 |
| **TS-41** | 测试与资源 | `tests/集成/test_生产评测权限隔离.py:98,155,172,188,194,237,258,264,348` | D1/D2 | `with pytest.raises(psycopg.Error), conn.transaction():`;`assert result["conditions"]["generator"]["config_hash"]`(只断真值) | 13 条登记同一 `environment="隔离PG与合成资料;含实际CLI子进程和HTTP"`,实测仅 2 条用 CLI/HTTP;防篡改只核基类异常(`V0028…sql:28` 有固定消息可用);`:172-176` 与 `test_回放资料封存.py:123-127` 逐字重复;`:194/:237/:264` 多参数共用无 `match` 断言 | 无需授权 |
| **TS-46** | 测试与资源 | `tests/集成/test_结构接入.py:105`;`tests/集成/test_故事事实确认与时点.py:105,396,622` | D1 | `assert client.get("/api/v1/schemas/new-schema/versions/1").status_code != 200`;`with pytest.raises(Muse错误):` | 只要求非 200(500/401 也算「候选未启用」);`:396` 不查错误码(本域已有 `事实错误`);`:622` 计划模式分支只断 `["results"]` 为真值;`:105` 与 `:183,:201` 是同一段替换正文的 7 行复制 | 无需授权 |
| **TS-15** | 测试与资源 | `tests/单元/test_声音与规则合同.py:108-109` | D1 | `核对规则启用(next(iter(规则库["rules"].values())), 规则库["samples"], {"pass": True})` | 该函数无条件抛错且第三参数从未被读取(`机器味规则.py:145-147`)→「逐例评测与正式批准」门禁判据没进入被测逻辑 | 无需授权 |
| **TS-31** | 测试与资源 | `tests/契约/test_动态结构投影与版本.py:111-148` | D1 | `assert 总字段 == 216` | 文件哈希自比 + 总量抵消(删一加一仍 216)+ 公共字段只采样 2 个结构:补逐结构清单核对 | 无需授权 |
| **TS-16** | 测试与资源 | `tests/单元/test_声音与规则合同.py:112-119` vs `:122-129`;`:190-201` vs `:94-109`;`:413-422` vs `:342-351` | D1 | 同读内置规则、同 `deepcopy l002`、同改 `regression`、同 `match="四类例证"` | 三组复制/真子集用例:参数化合并 | 无需授权 |
| **TS-24** | 测试与资源 | `tests/单元/test_结构合成与字段校验.py:118,216,269,274,285,344-345` | D1/D2 | `# 细纲读取与落库门禁(原 FineOutlineReader/FieldCoverage)`;`键 = next((k for k in self.行集 if k in sql), None)` | 两个「原」类名全仓不存在;SQL 替身未命中静默 `None`;docstring 的「在进库前/可保存」无对应动作;多例违约只断同一异常类型 | 无需授权 |
| **TS-42** | 测试与资源 | `tests/集成/test_评测执行与失败收敛.py:118-119,235,246,608-610,911,934,1031-1033,996,1038,747-750/957-960` | D1/D2 | `assert all(u["output"] is None for u in result["units"])`(无数量前置);`assert costs[0]["has_unknown"] or Decimal(...) > 0`;`assert not request.get("previous_response_id")` | `all()` 可空集恒真;四变异共用基类异常无 `match`;`读取任务绑定(...).内容哈希` 只判真值;`allow_failure=True` 静默吞 Muse错误;`previous_response_id` 在 src 从不产生(半句恒真);注释「7项盲评原观察」「旧"错误适配器角色拒绝"」全仓唯一且无对应;四处逐字同构执行序列 | 无需授权 |
| **TS-45** | 测试与资源 | `tests/集成/test_任务租约与恢复.py:131,175,331,365` | D1/D2 | `assert [e.序号 for e in 续接.事件] == list(range(1, 续接.最后序号 + 1))`;`with pytest.raises(任务错误, match="不存在|用途")` | 期望值由被测对象的 `最后序号` 生成(空事件时恒真);`:175` 只证结果非 None;`:365` 用基类异常+或匹配、`:396` 连 `match` 都没有;`:131` 为全仓唯一孤儿助手 | 无需授权 |
| **TS-59** | 测试与资源 | `tests/单元/test_结构合成与字段校验.py:132-155`、`tests/集成/test_审校报告与案例持久化.py:850`、`tests/契约/test_动态结构投影与版本.py:124` | D2 | 参数表与 `ids` 表 9 个字符串逐字重复;`TypeAdapter(案例采集请求).validate_python({**asdict(请求), "carrier": "unknown"})` 与 `:443-453` 同构 | 低价值冗余与同构负例:合并参数、抽助手 | 无需授权 |
| **TS-36** | 测试与资源 | `tests/集成/test_受控模型调用.py:141,499,716,837/858` | D1 | SSE 载荷块 5 处近似复制(`:124-146,231-251,472-489,644-654,781-802`);宿主装配块 7 处(`:150,499,668,808,846,867,892`) | Pi 行与 direct 行在 `:720-732` 观测完全相同,无观测区分真 Pi 与直接循环:抽公共夹具并补可区分证据 | 无需授权 |
| **TS-48** | 测试与资源 | `tests/集成/test_发布包独立运行.py:161` | D1 | `assert not (tmp_path / ".git").exists()` | 刚建的空目录本就无 `.git`,该断言恒真,证不了「无 Git 安装包」 | 无需授权 |
| **TS-49** | 测试与资源 | `tests/迁移/test_备份恢复与切换核对.py:175,249,469,494,525,550,585,664,485,515,540,575,597,621` | D1 | `assert 连.execute("SELECT to_regclass('public.muse_migration')").fetchone() == (None,)` 逐字 7 次;`def 记录(命令, 参数, 引用, 动作名):` 逐字 6 份;`assert 敏感标记 not in str(捕获.value.呈现())`(该配置从未带口令) | 抽公共助手;删恒真断言 | 无需授权 |
| **TS-53** | 测试与资源 | `tests/真实调用/test_诊断技能行为.py:177`;`tests/端到端/test_诊断入口与只读边界.py:39`;`tests/契约/test_诊断入口原观察.py:81` | D1 | `assert report["runtime_verified"] and report["model_verified"]`;`assert result["mode"] == "service" and not result["model_verified"]` | `model_verified` 由提供方名推导(`编排/行为评测.py:340-349`)与 `执行行为场景` 写死 `False`(`效果评测/行为场景.py:234-246`)→ 断言不可能失败;诊断入口断言只回显输入长度 | 无需授权 |
| **TS-33** | 测试与资源 | `tests/契约/test_角色能力与配置.py:189` | D6 | `for 文件 in (仓库根 / "配置").glob("*.toml"):` | 凭据扫描漏 `配置/角色策略.yaml`(当前该文件无凭据形状内容,属覆盖缺口) | 无需授权 |
| **TS-43** | 测试与资源 | `tests/集成/test_案例采集与复核.py:201,239,551,654` | D1 | `with pytest.raises((Muse错误, ValidationError)):`;`match="作品|四类"` | 三类非法输入接受任一异常族不核错误码;5 处用全局基类异常;或分支匹配无法区分规则;`:654-668` 与 `:689-703` 15 行块逐字相同 | 无需授权 |
| **TS-55** | 测试与资源 | `tests/夹具/`(20 文件)、`tests/conftest.py:263`、`tests/集成/test_任务租约与恢复.py:131`、`tests/迁移/test_作品资产迁移.py:15` | D3 | 25 个夹具文件中 20 个全仓无测试消费者(`去味/*.yaml` 8、`方法审核/历史标定/*` 6、`旧看板/*` 3、`模型事件.json`、`旧库样本.sql`、`宿主事件/DSH历史事件.json`);`def 夹具根()` 无人请求;`def 完成所有(…)` 从未被调用 | 删除或登记用途;死代码一并清理 | 需用户授权 |
| **TS-52** | 测试与资源 | `tests/架构/test_技能与文档索引.py:272,281,383`;`test_元数据不能跨模块写值.py:20`;`test_测试依赖与执行证据.py:119,164,402,419,439` | D1/D2 | `assert 资源["name"] == 条目["name"]`(`读取能力` 返回 `{**条目,…}`,恒真);`if isinstance(节点, ast.Constant)…`;docstring「--case 与标记取交集」 | 三条架构门禁弱化/恒真 + 两处近似逐字用例(`:402` vs `:439`)+ 三处无判据承诺 | 无需授权 |
| **TS-37** | 测试与资源 | `tests/集成/test_两阶段写手.py:275,622,756,825,802-832,834` | D1 | `except Exception: self.send_error(500)`;`with pytest.raises((Muse错误, RuntimeError, OSError)):`;`assert any(s["state"] == "failed" for s in 终态.步骤)` | 宿主吞异常+宽泛 raises 使宿主自身故障可冒充被测失败;`:802-832` 与 `:733-763` 复制;`:834` 未核对登记 `then` 的「输出合同 additionalProperties=false 拒绝」 | 无需授权 |
| **TS-50** | 测试与资源 | `tests/迁移/test_隔离目标台账.py:788,1586-1587,1892,2275,2308`、`test_质量资产迁移.py:355,499`、`test_作品资产迁移.py:15,105` | D1/D2 | `必表 = ("runs","events","reviews","revisions","cards")`;`"card_id": "case-legacy-9"`;`assert records[1]["original"]["record"]["status"] == "confirmed"`(上一行已全等) | 用例名「旧账本五表」实为 8 张;`card_id` 不符合真实 CHECK `^case-[a-z0-9]{20}$`;`:1892` 参数行只断言自建快照构造失败;`:15` 死夹具别名、`:105` 与 `:243-263` 近似复制;`:2275` 套话 docstring | 无需授权 |
| **TS-35** | 测试与资源 | `tests/集成/test_受控模型调用.py:832,834,621,893,55,375` | D1 | `assert 行 is not None and 行[0] == …`(终态证据);全部费用断言等于自带替身常量(`:87 Decimal("0.125")`) | 合成载荷的 model/usage/`structured_output_hash` 零断言;期望值由被测 `组装角色请求` 产出;三种故障共用基类异常无 `match`;合成提供方不校验 `Authorization`/`model`(tests 全目录无凭据外发正向断言);步骤入口为恒真空壳 | 无需授权 |
| **TS-26** | 测试与资源 | `tests/契约/test_盲评与引文合同.py:854,931,939` | D1 | `calls = []` … `assert calls == []` | 三处 `calls` 从未被写入(无替身/spy 引用)→ 恒真 | 无需授权 |
| **TS-39** | 测试与资源 | `tests/集成/test_审校报告与案例持久化.py:1021/1037/962/1052`、`:241/249/267`、`:261`、`:850` | D1 | 四例结构相似度 0.91(登记 `then` 为 `None`);`replace(请求, verbal_tics=("样张中不存在",))` 三处复本;`for 假审阅 in ("missing", "", "00000000-…")` 与 `:100-102` 逐字 | 复制用例成组:合并/参数化并补齐 `then` 登记 | 无需授权 |
| **TS-38** | 测试与资源 | `tests/集成/test_审校报告与案例持久化.py:1105,744,688,710,959,501,414,533,237` | D1/D2 | `assert 运行审校命令(…) == 服务读回`;`assert not list(tmp_path.glob("*.inventory.json"))`;`match="connection refused"`(消息由测试 stub 自写) | 同实现自比 4 处;`*.inventory.json` 全仓无产出代码 → 恒真;`match` 只证异常透传;`:533` 引用全仓不存在的「旧烟雾开关」;`:237` 的 `verbal_tics` 到 `声音确认.py:176` 才校验、本用例走不到 | 无需授权 |
## P3(原始 34 条 → 去重后 34 条)
| 编号 | 模块 | 位置 | 方向 | 现状摘录 | 建议 | 所需授权 |
|---|---|---|---|---|---|---|
| **AG-26** | agent层 | `.agent/skills/操作/` 18 个技能(压缩正文、备份与恢复数据、导入资料、建立作品声音档案、拆解书稿、提出并验证改进、整理写作方法、整理定稿与导出、查看与恢复任务、检查与维护拆书结果、登记连载与反馈、确认事实增量、确认作者偏好、维护元数据结构、维护故事世界、记录机器味案例、运行效果评测、采集资料与榜单) | D3 | 除 `操作/目录.md` 的索引行外,无任何作者场景、角色、规则或其他技能引用它们。索引行本身构成合法入口(AGENTS.md → 目录 → SKILL.md 的渐进披露合同),故记录不改。 | 若期望由作者层直达,需在 `.agent/作者/场景/` 增入口 | 无需授权 |
| **AG-28** | agent层 | 15 个方法技能 `## 输出` 段 | D5 | 方法技能产出为对话内 Markdown,明确声明"不直接落库、不代替 `写下一章`/`决定正文候选去留` 写 Canonical",因此没有持久留痕与查询入口。 | 有意保留:留痕由承接的操作技能负责;若要沉淀,应在复利链落库 | 无需授权 |
| **AG-29** | agent层 | `.agent/skills/操作/` 30 个技能 | D5 | 未写 lesson/范式卡升格接入;这些是 CLI/HTTP 确定性入口,不产生经验资产(`整理写作方法` 已接入方法卡升格链)。 | 有意保留 | 无需授权 |
| **AG-30** | agent层 | `.agent/约束/数据与读取范围.md:6` | — | 写入旧正式库地址 `100.64.0.8:5433/muse-example` 作为"禁止回退"的反面清单。这是内网地址而非凭据(无账号口令),且服务于明确禁令。 | 有意保留;若仓要外发,改为占位符 | 无需授权 |
| **AG-27** | agent层 | `.agent/skills/操作/查看与恢复任务/SKILL.md:22`、`.agent/skills/操作/运行效果评测/SKILL.md:54` | D2 | 各有一处连续空行;`.agent/` 内无行尾空白。 | 随手清理 | 无需授权 |
| **AG-25** | agent层 | `.agent/skills/操作/备份与恢复数据/SKILL.md:25` | D4 | 链接 `迁移与验收.md#备份与恢复入口` 用的是标题锚点,目标文档 `docs/系统架构/新版设计/迁移与验收.md:69` 确有同名标题(可达);但本仓 `工具/维护索引.py:261` 的锚点约定是 `<a id="…">`,该文档零处使用。 | 统一锚点约定(或在该标题加 `<a id>`) | 无需授权 |
| **DR-24** | docs与根文件 | docs/实现回顾/(既有 4 文件) | D4 | 仅机械计数,不复查表述、不提修改建议。既有留痕(`专项检查-计划.md`、`技能身份中文化迁移实现回顾.md`、`目录.md`、`R2改造历史留痕.md`):Markdown 仓内链接 6 条、死链 0 条;反引号仓内路径引用 30 条、死引用 4 条(`专项检查-计划.md:44` ×2 指向 `muse/content/meta/schemas/`、`muse/lifecycle/flow/chains/`;`:97` 指向尚未创建的 `专项检查-台账.md`;`技能身份中文化迁移实现回顾.md:59` 指向 `tests/architecture/test_author_instructions.py`) | 保留(历史留痕豁免),仅登记 | 无需授权 |
| **WB-18** | web | `web/src/应用/工作台布局.tsx:35-54` | D2 | `<NavLink to="/works">我的作品<span>01</span></NavLink>` … `<NavLink to="/system">系统管理<span>07</span></NavLink>` —— 序号是硬编码装饰,与路由、顺序无数据关系,增删导航需手改两处 | 记录不改;若接受改造则由数组 `.map` 生成 | 记录 |
| **WB-19** | web | `docs/系统架构/新版设计/文件设计/前端-应用与通用界面.md:298,309,320,342,430,441,613,624,647,658,669,680,703`;`前端-功能工作台.md:475,486,739,805,871,992,1003,1014,1025,1036,1047` | D7 | 24 个 web 目标文件(17 源码 + 7 测试,如 `web/src/界面/分栏.tsx`、`web/src/功能/元数据/结构管理页.tsx`、`web/tests/交互/报告失效.test.tsx`)在设计文档有条目但磁盘不存在。该文档首行已声明「本页从目标文件清单投影…文件和目标合同不代表实现或验收已完成」,且这些条目**未携带** `现行用例身份`(与已落地条目写法一致区分) | 保留为设计目标;若某目标已废弃,从 `目标文件清单.json` 撤下 | 需用户授权 |
| **JF-13** | 后端-交付连载上下文资料 | src/muse/交付连载/接口.py:44-158;src/muse/上下文/任务范围.py:104-310 | D1 D3 | `接口.py` 的单层转发与多数函数体内导入并非无证据抽象:tests/架构/test_模块依赖.py:203-234 强制跨模块只经 `接口.py`,且 知识方法/接口.py:257-271 反向 import 上下文,构成真实循环。 | 有意保留;只清 JF-08 列出的无理由延迟导入。 | 无需授权 |
| **JF-12** | 后端-交付连载上下文资料 | src/muse/资料研究/实体归并.py:73、src/muse/资料研究/实体归并.py:84、src/muse/资料研究/实体归并.py:92;src/muse/资料研究/分析保存.py:183 | D2 D1 | 载荷键 `canonical` 与 `canonical_written` 是英文键,与 `docs/系统架构/新版设计/领域模型/术语表.md:37`"避免使用:自动正典"的口径不合;但两键已被 tests/单元/test_分章切窗与实体归并.py:59 与 tests/迁移/test_隔离目标台账.py:1966 断言。 | 记录不改:随下次契约版本一并改名为"规范名/已写正式",本次只登记。 | 需用户授权 |
| **JT-16** | 后端-任务运行编排 | `配置/流程模板/*.yaml`(11 个)与 `src/muse/资源/运行资源.zip` 内 `流程/*.yaml` | D3 | 机械核对:11/11 文件名对应且**逐字节相同**(`配置/角色策略.yaml` 与 zip 内 `策略/角色.yaml` 亦相同)。属有意保留的"可审副本 + 发布投影"双物理副本,当前零漂移,本次不动 | 保留,但需同步纪律成文(改模板必须重打资源包,`工具/资源登记.json` 是唯一变更入口),否则下次改一份就漂移 | 无需授权 |
| **JW-21** | 后端-写手规划经验 | src/muse/作者经验、src/muse/正文写作、src/muse/作品规划(全组) | D3 | 三模块内 grep `lesson`/`范式卡`/`升格` 零命中,无升格链入口;`docs/系统架构/新版设计/模块设计/B07-作者经验.md:65` 已声明"Skill及其他用途尚无完整owner链时明确保持未实现" | 保留并在此台账登记为"有意未接",避免下一轮重复发现 | 无需授权(记录) |
| **JW-20** | 后端-写手规划经验 | src/muse/作者经验/存储.py:19 | D6 | `self.连.execute(f"SELECT {fn}(hashtextextended(%s,0))", …)`,`fn` 取自 `"pg_advisory_xact_lock_shared" if 只读 else "pg_advisory_xact_lock"` 二选一字面量,无用户输入进入 SQL 文本,实测不可注入;按 D6"SQL 字符串拼接"口径记录 | 拆成两条静态 SQL 更干净;保留亦可,理由:不可注入 | 无需授权(记录) |
| **JC-24** | 后端-基础设施共享 | `src/muse/基础设施/受控文件.py:1` vs `:96-101` | D1 术语漂移 | 模块 docstring 称"不透明租约ID",实现与错误信息一律称 `对象ID`/`对象身份`;`租约`在 `共享`与 S02 另有既定义 | 保留(改 docstring 属可选清理,无行为影响) | 记录不改 |
| **JC-23** | 后端-基础设施共享 | `src/muse/基础设施/宿主/Pi工具桥.ts:47` | D6 占位字面量 | `apiKey: "local-callback", baseUrl: "http://127.0.0.1:1"` —— 进程内回调提供方的占位值,紧邻注释已写明"这是进程内回调提供方,不发HTTP",不是可用凭据 | 保持现状;如需零扫描噪音可改名为 `apiKey: "in-process-callback-no-secret"` 之类自证非凭据的常量 | 记录不改 |
| **JC-25** | 后端-基础设施共享 | `src/muse/基础设施/系统运行.py:65-67` | D1 吞错判定 | `读取系统状态` 捕获 `(Muse错误, psycopg.Error, OSError)` 后只回 `error` 错误码、不抛;这是健康/系统状态接口的既有合同(docstring 声明"不暴露凭据值"),且不含凭据与异常正文 | 保留;若后续要求诊断可追溯,改为同时落一条 `可观测性.记录运行`(仍不带正文) | 记录不改 |
| **JS-20** | 后端-审校效果评测 | `src/muse/审校修订/存储.py:680`、`:688`;`src/muse/效果评测/存储.py:129` | D6 | `f"SELECT {lock}(hashtextextended(%s,0))"`:插值只取 `pg_advisory_xact_lock` / `pg_advisory_xact_lock_shared` 两个字面量,锁键仍走 `%s` 绑定;无用户输入进入 SQL 文本,无注入面。记录不改 | 保留;若要更严可改 `psycopg.sql.SQL` 常量组合 | 无需授权(仅记录) |
| **JS-21** | 后端-审校效果评测 | `src/muse/审校修订/存储.py:684-697` | D1 | `+ (" FOR SHARE" if 共享 and 锁行 else "" if 共享 else " FOR UPDATE")` 三元嵌套可读性差,但语义正确(共享且不锁行时不取行锁,与 `诊断服务.py:24` 只锁库级共享的调用一致)。记录不改 | 保留;后续若改动加注释说明三态 | 无需授权(仅记录) |
| **JR-20** | 后端-接入 | `pyproject.toml:27`(`muse = "muse.__main__:main"`) | D3 | 仓内没有调用点使用安装后的 `muse` 控制台脚本:Makefile(`:66`)、README、`.agent/skills`、测试全部用 `python -m muse`;`muse.__main__.main` 本身有 55 处测试引用。属安装面有意保留 | 保留不改。理由:安装后 `muse <子命令>` 与 `python -m muse` 等价,删除会破坏已发布安装方式 | 无需授权 |
| **JK-20** | 后端-知识方法故事世界 | `docs/write-chapter/artifacts/`(125 文件) | D2 D3 | 历史运行产物引用 `writer-context-v1` 等合同,仓库内已无生产者(JK-03 的对照面) | 按计划第 1 节历史留痕豁免,不改 | 无需授权(记录不改) |
| **JK-21** | 后端-知识方法故事世界 | `src/muse/知识方法/模型.py:33-39` 与 `事实提案请求` | D1 | `证据引用` 用英文 `kind` 而相邻字段中文;库内 payload 键混用(`work_id`/`known_to`/`reader_visible`)属 DB 合同 | 保留;改动需迁移,不属本轮 | 无需授权(记录不改) |
| **JK-22** | 后端-知识方法故事世界 | `src/muse/知识方法/方法版本.py:470-476` | D6 | `B04.binding` 依赖用 `对象ID.split(":")[1]`/`rsplit` 解析 `work_id` 与 `target_ref`,构造方唯一(`方法版本.py:416`)故当前安全 | 改结构化依赖对象,去掉字符串反解析 | 无需授权 |
| **TL-13** | 工具 | Makefile:4、65 | D7 | `.PHONY` 未列 `迁移`(:65 定义该目标);实测仓库根无名为 `迁移` 的文件或目录,当前不会触发「目标被跳过」 | 把 `迁移` 补进 .PHONY | 无需授权(仅记录) |
| **TL-14** | 工具 | 工具/环境预检.py、工具/构建发布.py;README.md:55、279 | D7 | 5 个工具中 3 个由 Makefile 目标承载(:43、:70、:73、:74),环境预检与构建发布只在 README 给出 `uv run python 工具/…` / `.venv/bin/python 工具/…` 命令 | 记录为有意保留(发布与预检属人工步骤) | 无需授权(仅记录) |
| **MG-04** | 数据库迁移 | `数据库/迁移/`(45 文件全量) | D3 | 全量 `IF NOT EXISTS` 出现 **0** 次、`DROP ... IF EXISTS` **0** 次;128 `CREATE TABLE` + 18 `CREATE INDEX` + 5 `CREATE VIEW` + 4 `CREATE TYPE` + 22 `ADD CONSTRAINT` + 51 `CREATE TRIGGER` + 7 `CREATE FUNCTION` 全部无重跑保护,全仓无一条 `BEGIN;`/`COMMIT;` | 属有意设计(事务与幂等由执行器统一承担,见证据指针),但迁移文件自身无一句说明。建议在 `数据库/迁移/` README 写清「单文件不自幂等、不可单独执行、必须经 `python -m muse 迁移`」 | 无需授权(补文档) |
| **MG-03** | 数据库迁移 | `数据库/迁移/V0024__模型派发授权依据.sql:9`;`数据库/迁移/V0041__评测语义检测单元.sql:2` | D6 | `'ALTER TABLE %I.muse_runtime_evidence DROP CONSTRAINT muse_runtime_evidence_kind_check'` / `ALTER TABLE evaluation.muse_evaluation_unit DROP CONSTRAINT muse_evaluation_unit_kind_check;` —— 硬编码名直接 DROP,无存在性前置校验 | 对齐 V0021/V0023 的写法:先 `SELECT conname INTO ... FROM pg_constraint`,`IS NULL` 时 `RAISE EXCEPTION`。风险有限:两处均在 `迁移.py:109-110` 的逐版本事务内,失败整体回滚不留半成品 | 无需授权 |
| **MG-06** | 数据库迁移 | `数据库/迁移/V0009__正文写作.sql:30`;`数据库/迁移/V0004__任务运行与证据.sql:189`;`数据库/迁移/V0035__评测逐例执行.sql:13`;`数据库/迁移/V0030__模型修订结果.sql:7` | D3 | 基线定义已被后续迁移改写:`origin text NOT NULL CHECK(origin='author')` 被 `V0021:16-20` 扩为 `('author','model')`;`kind IN (4 值)` 被 `V0024:8-16` 扩为 5 值;`kind IN ('generation','comparison')` 被 `V0041:2-4` 扩为 3 值;`diagnosis_id` 的 `NOT NULL` 被 `V0032:2` 解除 | **不改**(历史留痕)。已应用迁移受校验和冻结,回改会被 `迁移.py:98-102` 拦截并拒绝启动,改基线等于制造事故。可选:在基线文件加「本定义已被 V00xx 扩展」注释,纯可读性收益 | 无需授权(仅注释);不改则保留理由已成立 |
| **MG-05** | 数据库迁移 | `数据库/迁移/V0002__元数据结构与策略.sql:83` | D6 | `GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA metadata TO muse_app;` 整 schema 一次性授予;而 `数据库/迁移/V0001__共享标识与版本.sql:55-56` 的默认权限反而含 `DELETE` | 统一为逐表 `REVOKE ALL` + 最小 `GRANT`(V0043–V0055 已用该风格);或写明整 schema 授予的理由 | 无需授权(但改动涉及已应用迁移,须以新迁移追加,不可回改) |
| **MG-07** | 数据库迁移 | `src/muse/元数据/存储.py:189-196` | D3 | `"INSERT INTO metadata.schema_binding (target_ref, work_id, ...) VALUES (%s,...)"` 的实参是 `tuple(asdict(绑定).values())`,列序隐式绑定 dataclass 字段序 | 改为具名传参或显式列出取值顺序。当前三方一致(`元数据/模型.py:178-185` 字段序 ↔ `V0002:40-53` 列序),故仅记风险 | 无需授权 |
| **LM-07** | 旧库迁移(已退场) | 数据库/旧库迁移/导入新库.py:305 | D6 | `raise 迁移错误("target_denied", "本次新库身份缺失或改变,保留定位文件不清理")` | 目标库身份无法复核时保留 `维护连接.txt`/`应用连接.txt`(含口令,0600、目录 0700)。属有意设计(同文件 237 行注释与 `旧知识记录分流.md`「先落私有连接引用」),记录不改 | 无需授权 |
| **TS-60** | 测试与资源 | `pyproject.toml:62`、`tests/conftest.py:27,35` | D3 | `"网络: 需要真实网络访问;必须显式标记"`;`--用例清单` 选项 | 全仓 0 用例使用 `网络`;`--用例清单` 无任何入口传入:保留为防护阀/维护能力并注明理由 | 无需授权 |
| **TS-62** | 测试与资源 | `tests/集成/test_审校报告与案例持久化.py:1105`、`tests/集成/test_任务租约与恢复.py:175`、`tests/迁移/test_隔离目标台账.py:2308` | D2 | `assert 运行审校命令(…) == 服务读回`(CLI 分支即同一次实现调用) | 只证实现内部一致、无独立期望的冗余断言:低优先清理 | 无需授权 |
| **TS-61** | 测试与资源 | `tests/迁移/test_隔离目标台账.py:2275` | D2 | `"""真实PG用例;…需要父代理显式外部环境运行。"""` | 上游派发流程套话(实际由 `pytestmark`/Makefile 决定):保留或改写 | 无需授权 |
## 各模块一句话结论(14 份报告;检查时规模,`数据库/旧库迁移` 域已退场,见收口节)
| 模块 | P0 | P1 | P2 | P3 | 一句话结论 |
|---|---|---|---|---|---|
| 后端·接入(48 文件) | 0 | 6 | 13 | 1 | 骨架干净:211 条路由零重复零缺 id、合同与实现 211/211 一致、零凭据零拼接零穿越;问题是一处异常伪装 404、两处身份/状态核对断裂、一个只有测试在用的「后台入口」。 |
| 后端·基础设施+共享(37) | 2 | 9 | 11 | 3 | 错误合同、路径约束与凭据纪律扎实(零硬编码、零拼接、零关闭 TLS、零裸 except);塌陷在「生成物/外部版本」这条门禁边(`JC-01`/`JC-02`)与一批零消费者导出面。 |
| 后端·审校修订+效果评测(48) | 1 | 9 | 9 | 2 | 确定性规则引擎无模型调用、两次运行字节一致;塌陷在规则数据与提示词资源的权威口径已与实现脱钩(16 条规则写「激活门豁免」而实现无此开口)。 |
| 后端·任务运行+编排(35) | 0 | 4 | 11 | 1 | 派发主链留痕完整、白名单与 5 小时窗口真实落地;问题是恢复链断头(`JT-01`)、角色探针旁路预算与留痕(`JT-02`)。 |
| 后端·交付连载+上下文+资料研究(47) | 0 | 5 | 6 | 2 | 定稿冻结、四格式导出与复读校验、来源漂移拒绝都失败关闭;问题是 4 个提示词孤儿、榜单快照采集时刻不是合法时间戳、导出落盘非原子。 |
| 后端·作者经验+正文写作+作品规划(37) | 0 | 4 | 15 | 2 | 模型锁定与「先审后入」经调用点复核成立(正典写入仅 2 处、无绕过口);问题是提示词承诺与实现不符、两条规划提示词直读源树、B05 直读 B06 私表。 |
| 后端·知识方法+正式变更+故事世界+元数据(44) | 0 | 8 | 11 | 3 | 正典写入无旁路、结构字段与库内断言逐数字一致;问题是资产无消费者(2 提示词、1 结构合同、2 合同字段)与 AGENTS.md 结构契约路径。 |
| tests + 资源(157 测试 + 资源) | 1 | 10 | 33 | 2 | 隔离纪律与登记骨架干净(446 个库夹具用例全部带标记、1219 个用例 ID 双向对齐、迁移双副本逐字节零漂移);风险是门禁依赖生成物、一批断言弱于用例名、浏览器旅程无可执行入口。 |
| web(114 + 53) | 0 | 2 | 15 | 2 | 全仓最干净的一块:零 `dangerouslySetInnerHTML`、零凭据、零 `any`、零幻路径注释;问题是同一件事多文件各写一遍、用例 id 与清单/文档三方不一致。 |
| 数据库迁移(45 SQL + 初始化) | 0 | 0 | 2 | 5 | 双副本零漂移、账本与事务纪律由执行器承担、凭据为零、157 个定义对象对代码零悬空;只有编号空洞成因未成文与少量标注熵增。 |
| 数据库/旧库迁移(21 + 旧结构,已退场) | 0 | 4 | 2 | 1 | 台账与隔离闭环扎实(零凭据、SQL 全参数化、目标库随机新建);两条已声明的 K08 镜像路径在真实旧结构上不可达,切换检查缺回退条件。 |
| 工具(7) | 0 | 5 | 7 | 2 | 无凭据、无 `shell=True`、无硬编码绝对路径,Makefile 工具命令参数一致且等价实跑绿;风险是登记驱动的写入路径缺包含性校验、能力登记与技能/生成物的差集无人看守。 |
| .agent(252 文件) | 1 | 11 | 12 | 6 | 方法技能正文与作者层合同质量高、泔水零命中、338 条链接全可达;塌陷在元数据与绑定层——自称的 manifest/门禁不存在、角色合同指向无物、4 处规则点名的 3 个门禁文件不存在。 |
| docs 权威区 + 根文件(147 md + workflows) | 1 | 16 | 11 | 1 | 权威区链接几乎全绿(1196 条仅 4 条死链,`新版设计/` 零死链);但 `AGENTS.md` 本身是最大污染源(11 处链接文字失效、4 项陈述与物理事实不符、1 处权威引用落空)。 |
## 豁免与边界(本轮查了什么、没查什么、为什么)
**已全量精读/全量机械核对**
- 后端 `src/muse` **300 个 .py**(按 17 个业务子包分 8 组,无一抽样);`src/muse/资源` 仅一致性(产物不读)。
- `tests` **157 个 .py**:架构 5、契约 19、迁移 10、端到端 3、真实调用 1 全读;单元抽 10、集成抽 15(抽样清单在各报告「豁免与边界」节)。
- `web/src` 114 + `web/tests` 53:门禁全量 + 精读抽样 37 个 TS/TSX + 16 项机械全量扫描。
- `数据库/迁移` 45 SQL 全量机械 + 基线 V0001 与最新 3 个精读;`数据库/旧库迁移` 21 .py 机械门禁 + 3 个关键文件精读(映射台账/切换检查/入口)。
- `工具` 7 文件全读;`.agent` 252 文件全读(46 个 SKILL.md 全文 + 117 个 references 存在性 + 9 规则 + 3 约束 + 3 规范 + 作者层 + 5 个目录索引)。
- `docs` 权威区 + 根文件 + 两个 workflow 全读;`docs/实现回顾` 既有留痕仅机械计数。
**免检与豁免(照计划第 1、4 节)**
| 对象 | 处置 | 理由 |
|---|---|---|
| `docs/实现回顾/` 既有留痕(计划、R2 留痕、迁移回顾、本目录索引) | 只计数死链,不复查表述、不提修改建议 | 计划第 1 节「历史留痕:表述不复查、内容不修改」;本轮计数:md 链接 6/死 0,反引号路径引用 30/失效 4(含本计划自身引用的 `<模块>` 占位与 `skills.json`) |
| `数据库/旧库迁移` 的命名/风格/注释 | D2 泔水与风格要求**豁免** | 计划第 4 节明示「有意 legacy 域」;仍查事实错误、链路、安全 |
| `src/muse/资源/工作台`、`运行资源.zip`、`docs/接口契约/生成/openapi.generated.json`、`web/src/接口/生成/类型.ts` | 只验与权威同步,不评质量 | 生成物/构建产物;web 侧实测重新生成后逐字节一致 |
| `docs/接口契约/生成/` 之外的 `.venv`、`node_modules`、`__pycache__`、`.zcode`、`data/`、`.agents.local/` | 不查 | 缓存、本地环境、个人配置、创作数据 |
| 数据库内容、创作正文(含 `data/sources/`)、`data/muse.db` | 不读不改 | 硬边界:不动数据库、不读创作正文 |
| `make 数据库测试`、`make 真实模型测试`、`make 宿主测试`、备份恢复演练 | 未跑 | 计划「本轮不跑数据库测试(CI 记录为证)」;无隔离库/真实模型/固定 Pi 路径 |
| `make 生成`、`make 构建`、`make 格式写入`、`维护索引.py --写入` | 子代理一律未跑(只静态核对);主代理经授权跑过一次 `make 生成` | 写模式会覆盖生成物;`make 生成` 的授权与证据见 §4 |
| `tests/迁移` 对真实 PG 的行为、`数据库/迁移` 在真实 PG 上可跑通 | 无证据 | 未连库;10 个迁移用例只做清单级核对 |
**未取得原始退出码的门禁**:`make 模块边界` 原样命令在本沙箱不可执行(`uv` 缓存 + macOS `sandbox_init` 双重被拒);内容侧等价证据为 `--外部环境` 下 15 passed,主代理另在授权环境跑到 `make 测试` 1005 passed(含该文件)。
## 处置声明与硬边界(2026-09-16 检查期;后续处置见收口节)
- 本轮为**只读专项检查**。除下列三项外未改动任何文件:`docs/实现回顾/专项检查-报告-*.md`(14 份子代理报告)、本台账、`docs/实现回顾/目录.md` 的登记行。
- **唯一一次越出「只读」的动作**:经用户 2026-09-16 明确授权(问题「P0 门禁红 · 处置选择」→ 选项「授权我跑 make 生成 就地刷新生成物,再重跑 make 测试复绿」),于 20:42 执行 `make 生成`,重写了被 `.gitignore:36` 忽略的生成物(`src/muse/资源/`、`web/dist`、`docs/接口契约/生成/`、索引)。**受跟踪文件零改动**(`git status --untracked-files=no` 仅剩本批报告与 `目录.md`)。
- `git add` / `git commit` 全程未执行。**修复另立计划;未获授权不动手。**
- 台账每条二值收口:`待授权`(需用户点头)/ `保留(理由)`(P3 与豁免项)/ `已处置(证据)`(仅 `JC-01` 的本地部分);最终处置以收口节的裁决分布为准。
- 另一会话提交期间的时点声明:开工快照 2026-09-16T20:30:04+08:00,HEAD `f76c3cd04a8b4d461a5e004b36962900db943729`;`git status` 当时仅有 `docs/实现回顾/目录.md` 的未提交改动与未跟踪的计划文件,判定为「未收口」,故计划第 2 节的「.gitignore 与跟踪文件交集」原定延后;实际于 20:43:37 复检(跟踪 1320 / 命中 0)并记入 §2。
## 证据指针(命令 + 退出码 / 校验结果)
| 证据 | 位置 |
|---|---|
| 全部门禁首轮与刷新后原始输出 | `/tmp/qc/门禁结果.txt`、`/tmp/qc/门禁结果-uv.txt`、`/tmp/qc/门禁结果-复跑2.txt` |
| P0 门禁红证据档(时间线 + 三步根因探针) | `/tmp/qc/P0-门禁红-证据.md` |
| 代码哈希三向比对(清单/HEAD/工作树,301 文件逐一) | `/tmp/qc/probe4.py` |
| 安装核对与资源一致性探针 | `/tmp/qc/probe5.py` |
| Markdown 链接机械校验(393 文件 / 1680 链 / 4 死链) | `/tmp/qc/链接校验.py`、`/tmp/qc/死链结果.txt` |
| 反引号路径引用校验(2722 / 1236) | `/tmp/qc/反引号校验.py`、`/tmp/qc/反引号死链.txt` |
| docs 子代理链接校验(口径 A/B/C 与 R2 穷举) | `/tmp/lc2.py`、`/tmp/lc2.json`、`/tmp/lc2-summary.txt`(子代理落盘) |
| 台账条目抽取与去重(305 条 → 293 条) | `/tmp/qc/台账/生成5.py`、`/tmp/qc/台账/抽取结果.txt` |
| 各模块命令与退出码、逐条 file:line | 各报告「证据指针」节(14 份) |
> 上述 `/tmp` 路径为一次性探针与日志,不入库;报告内已保留可复现命令与判定结果。逐条裁决处置与执行证据存于本地实施区 `.agents.local/优化-20260917/已裁决计划/`(不入库);判断某条现状时以当前仓库与本地映射为准。