@ -0,0 +1,456 @@
# 全仓专项检查台账
> 日期: 2026-09-16 | 编排:主代理 | 依据:[专项检查-计划.md ](专项检查-计划.md ) 第 5 节严重度分级、第 6 节报告格式
> 范围:`src/muse` 、`tests` 、`web` 、`数据库` 、`工具` 、`.agent` 、`docs` 、根文件;不含缓存、构建产物、小说正文与数据库内容。
> **本台账保存2026-09-16原发现及复核更正, 不再单独充当修复输入; 2026-09-17已按用户裁决进入[优化执行 ](../系统架构/新版设计/优化执行合同.md )。下表是原级别分布,不能当作尚未修复数。**
## 复核更正( 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/已裁决计划/` ;新增全局设计问题一并承接,不能只按原严重度逐项打补丁。原模块报告保留检查时表述,本节纠偏优先于其冲突结论。
## 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( 含该文件) 。
## 处置声明与硬边界
- 本轮为**只读专项检查**。除下列三项外未改动任何文件:`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` 路径为一次性探针与日志,不入库;报告内已保留可复现命令与判定结果。