- src/muse 新版全模块(装配/共享/上下文/任务运行/作品规划/故事世界/正文写作/审校修订/知识方法/作者经验/效果评测/交付连载/资料研究/正式变更/元数据/接入/基础设施/编排)+ 测试树(单元/契约/集成/架构/迁移/端到端/夹具) - 129 项功能全部实现与自动验证(功能覆盖.json/矩阵),含 W31 补齐的规则与代价/节奏安排/伏笔与承诺 - 旧实现按处置清单退出(702 条中 324 删,保护合同与未迁移条目留存有据);web/app.py 旧工作台退役,新工作台为唯一写入口 - 数据库/旧库迁移:真实旧库内容批次迁移链(端点守卫/PG作品正文映射/质量资产缺省投影) - 运行手册 docs/运行手册.md;W30 本机服务阶段一已运行(infra PG 为正式内容权威) - R2 执行证据与私有运行材料在 .agents.local/改造/R2-20260909/(不入库)
21 KiB
Skill 质量审查与复利改造清单(2026-08-20)
性质:一次性审查记录与改造方案,不是 SoT。 评分口径 Owner:
muse/lifecycle/quality/harness/specs/skill-quality-rubric.md。 复利链与升格判据 Owner:06-质量与复利领域 §6。
1. 结论摘要
分类换轴后,47 个 Skill 的机械阻断为零,但暴露出 152 条质量发现。最大的一条是复利缺口:43 个非平台 Skill 里 27 个(63%)compounding = none。人工审查另给出 15 个执行型阻断(合同与机制两张皮、功能并列)和 15 个方法型的集合路由冲突——后者不是 15 个独立质量问题,是一套未切分的方法被切成 15 个入口。
这个缺口此前被分类掩盖了。旧分类把 15 个创作方法 Skill 划为"参照 Skill"并豁免数据库合同,等于宣布它们天然不产生系统事实。事实是它们只是没接线:缺口不止那 15 个,而是横跨导入、规划、写作、检测四段的 27 个。
改造不需要新基建。仓里已有完整的复利链和一个跑通的范本。
2. 为什么换轴
旧分类 class = capability | reference 记录的是实现成熟度(当前有没有数据库合同),却写成了本质类别。后果有三:
- 发永久豁免证。
reference的定义里就写着"不要求数据库合同、失败关闭和meta/chains/登记",于是没有任何门禁会推动它们接入,成熟度差距被冻结为身份差距。 - 口径不可比。
reference的 D4 必备节是"方法索引 / 引用索引",capability是"输入 / 输出 / 红线"。两套必备节让 46/47 的合同缺失长期看不见——换成统一口径后立刻显形。 craft一词双关。该词同时是旧的 Skill 标签和公共范式库的范式型(draft_payload->>'型' = 'craft',技法型,1892 张卡)。同名不同义,读者与 Agent 都会误判。
新分类四个属性全部描述可变状态:lifecycle(作品创建周期九段)/ invocation / side_effects / compounding。差距不再藏在类别里,而是由 compounding 明账记录、由维度 D8 计分推动。craft 从此在本仓只有范式型一个含义。
3. 复利的定义与既有范本
复利指把"这次怎么做、效果如何"的观察沉淀成可被后续运行消费的经验资产:范式卡、AI 味规则、声音账、example_lesson 登记。作品事实(实体、知识卡、正文)不算——那是内容,不是经验;搬运素材也不算。
既有闭环范本是去 AI 味五技能,它证明这条链能跑通:
作品/反馈扫描 → 案例卡(shadow)→ 规则候选 → holdout 评测 → active 规则 → 生成前注入
可复用的承接物全部现成:
| 承接物 | 位置 | 现状 |
|---|---|---|
经验登记表 example_lesson |
DDL-108 | 已建,proposed → reviewing → promoted/rejected 由触发器强制,target_type 取 pattern/skill/tool,绑 run_id + 候选 sha256 |
| 六型范式卡 | muse_knowledge_draft,公共库 work_id = 0 |
已建,9269 张公共卡 |
| 卡审核 | review-knowledge-cards 三角色审核 → 用户确认 |
已跑通 |
| 规划期绑定 | plan-story 的 select_patterns → 已确认 assembly 行的 patternReferences |
已建 |
| 写作期注入 | assemble-context.load_confirmed_pattern_bindings → writer |
已建,尺寸上限见 03-范式领域 §5 |
改造不新建表、不新建注入路径。 缺的只是让各 Skill 接上这两端。
4. 三种改造模式
模式 A:方法 → 范式卡(补消费侧)
适用 15 个创作方法 Skill(story-structure、scene-craft、narration-pov 等)。
- 把
references/里的可操作写法单元抽成范式卡,按内容归craft/scene_pattern/trope型,入公共库(work_id = 0)。 - 走既有出卡路径:
review-knowledge-cards三角色审核 → 用户确认落为正式内容。单书或单章证据只能出作品级卡(非零work_id),不得污染公共层。 SKILL.md改为承载选型判断口径(什么场景该找哪一型、怎么判不适用),不再自己留一份方法正文;原理与例证留references/。这与 03-范式领域 §7 的"升格后卡里只留链接、不留第二份执行步骤"同向。- 消费完全走既有链,Skill 侧不写新的注入代码。
顺带清掉一个共性问题:15 个里有 12 个的 scripts/ 只装了 Markdown 清单(structure-checklists.md、theme-stance-checklist.md 等)。这些清单正是出卡原料——改造时一并处理:能变成范式卡的出卡,剩下的移到 references/,scripts/ 要么放真正的机械门,要么删除。
模式 B:观察 → lesson 登记(补回写侧)
适用全部 compounding = none 的 Skill,以及 partial 里缺回写的那些。
- Skill 产出时顺带登记观察到
example_lesson:kind ∈ lesson | win,绑run_id与候选sha256,初始proposed。 - 升格按 06-质量与复利领域 §6 的既有判据:同类问题第 3 次复发即评估固化;
reviewing→promoted时必须指明target_type(pattern / skill / tool)与落点。 - 06 §9 已登记"证据自动收集未建"为待建项——模式 B 就是补这一项。关键是产出时顺带写,不靠人事后补登记,否则又回到自觉而非机制。
模式 C:平台底座豁免
5 个 lifecycle = platform 的 Skill(access-database、call-content-model、execute-claude-task、refresh-runtime-probe、record-run-evidence)不承载创作经验,D8 不适用(compounding=none)。但 record-run-evidence 是模式 B 的落点依赖,其回执与 run_id 是 lesson 绑定的锚。
5. 改造优先级
排序依据是单位成本的复利增益:先接已经有落库位、只差一行登记的,再做需要出卡与审核的。
| 序 | 批次 | 对象 | 模式 | 理由 |
|---|---|---|---|---|
| 1 | 效果信号接线 | decide-candidate、score-content-quality、evaluate-frozen-replay |
B | ✅ 三技能均经 propose_lesson_dedup 回写;manifest=closed_loop;离线 mock 测试钉死 |
| 2 | 闭环补缺侧 | prevent-ai-flavor、revise-ai-flavor、write-next-chapter、assemble-context、plan-story |
B | ✅ 五技能均已 propose_lesson_dedup + closed_loop;复利合同与离线 mock 测试对齐 |
| 3 | 方法出卡 | 15 个创作方法 Skill | A | 增益最大但成本最高:依赖审核与用户确认门,且要先有批次 1 的效果信号才能验证卡有没有用 |
| 4 | 抽取链回写 | deconstruct-book、extract-work-knowledge、extract-chapter-knowledge、review-knowledge-cards |
B | ✅ 四技能均已 propose_lesson_dedup + closed_loop;离线 mock 测试钉死;extract-work-knowledge 补 external_call |
| 5 | 其余 none / 运维 partial |
平台四技能;freeze-context;plan-chapter 等 |
B 或维持 | ✅ 平台五技能 none=模式 C(含 record-run-evidence 落点依赖);import/clean/embed/plan-chapter/capture→closed_loop;freeze 与写作/评测辅助槽维持 partial(回写归下游,合同已写明) |
批次 3 不要先做。 15 个方法 Skill 出卡是最诱人的一步,但在批次 1 的效果信号接通之前,出的卡无法证明有效,只会把 9269 张公共卡变成 9269+N 张无证据卡——正是 03-范式领域 §4 禁止的"单章、单作品或一次高分直接产生公共 active"。
6. 机械审计结果
skill_harness.py 当前:阻断 0,advisories 152。
| 代码 | 条数 | 维度 | 说明 |
|---|---|---|---|
required_section_missing |
104 | D4 | 统一必备节口径后显形;46/47 至少缺 1 节 |
compounding_not_wired |
27 | D8 | 见第 4、5 节 |
scripts_without_implementation |
16 | D6 | 其中 12 个是方法 Skill 的 Markdown 清单误放 scripts/ |
line_budget_exceeded |
3 | D6 | design-story-foundation 174 行、evaluate-frozen-replay 147 行、capture-ai-flavor-cases 124 行 |
scripts_test_file |
2 | D6 | design-story-foundation/scripts 内有测试文件,应移 tests/skills/ |
缺节分布:输出 33、输入 28、复利合同 17、红线 14、数据边界 12。
"缺红线"和"缺数据边界"优先于"缺输入输出":前两者是安全边界,后两者是可读性。14 个缺红线的里,score-content-quality、review-knowledge-cards、clean-book-text 都带 db_write,属严重级。
全量逐 Skill 结果由 .venv/bin/python harness/skill_harness.py --json 现场产出,本文件不复制一份会漂移的快照。
7. 本次已修
- 15 个创作方法 Skill 的
domain/sourcesfrontmatter 已移除。这两个字段无任何代码消费:domain已由skills.json的lifecycle承载,sources(7 本写作书的 75 个来源单元)属历史留痕,不该常驻每次加载的运行时提示词。75 条来源对照已迁入docs/2026-08-19-craft-distillation-trace.md后再删除。 sync_agent_registry.parse_frontmatter的解析 bug 已修。它把任何含冒号的行当作字段名,于是concept-design描述里的"要求严格 1:1 复刻"被读成字段,tests/skills/access-database/test_skill_catalog.py长期为红。改为只认顶格且键名合法的行,与skill_harness.py的解析口径一致。该测试恢复为绿。
离线套件 run_selected.py --all-offline:78 通过 / 1 失败 / 8 依赖阻塞。唯一失败 tests/skills/evaluate-frozen-replay/test_run_writer_replay.py 经 stash 比对确认早于本次改动,与分类改造无关,未处理。
8. 人工审查(三批合并)
三批只读审查在分类换轴之前启动。仍有效:D1 可发现性、D2 单一目的、D3 边界与不重叠、D5 失败关闭、D7 机制优先。已失效、不收录:15 个方法 Skill 按旧 reference 口径评的 D4(当时必备节是方法索引 / 引用索引)。D8 复利接入当时未评,以第 6 节机械发现为准。
判定计数(按当时适用维度,含阻断项直接判不可用):
| 批次 | 范围 | 不可用 | 不合格 | 可用待修 | 良好 |
|---|---|---|---|---|---|
| 1 | 16 个执行型 | 9 | 1 | 4 | 3 |
| 2 | 16 个执行型 | 6 | 3 | 5 | 2 |
| 3 | 15 个方法型 | 0 | 12 | 3 | 0 |
批次 3 零阻断,是因为当时把它们当"参照"豁免了 D5;换轴后它们与执行型共用必备节,合同缺失已由第 6 节机械门记账。批次 3 的主结论不在合同,而在集合内路由冲突。
8.1 仍有效的阻断(修复前不得继续当可靠入口)
按伤害面排序,不按批次。§8.1 原表阻断项已全部落地(含本批换窗冲突门、回放完成态断言、采集 CLI 表面、前期设计选定交接闸)。下表保留审查记录与勾选状态。
| Skill | 维 | 问题 | 改法 |
|---|---|---|---|
decide-candidate |
D7 | 写 Canonical 的唯一入口自称"不得由 Agent 自行触发",实际 model_routed |
✅ disable-model-invocation: true,manifest=orchestrated |
decide-candidate |
D2 | 正文确认 / 知识卡确认 / 规划确认三条独立轨 | ✅ 本 Skill 只做正文轨;知识卡=confirm-knowledge-draft,规划=plan-story |
access-database |
D7 | 红线禁 DDL 与物理删,命令面却提供 INSERT/UPDATE/DELETE/DDL | ✅ exec/execparams 机械拒绝 DDL 与裸 DELETE;DDL 仅 apply |
call-content-model |
D7 | 不受治理的 chat() 只靠散文围栏 |
✅ 默认抛错;allow_ungoverned / MUSE_LLM_ALLOW_UNGOVERNED=1 / CLI --ungoverned |
rewrite-selection |
D7 | 并发覆盖防护只写在散文,无 revision 断言 | ✅ scripts/assert_expected_revision.py 动笔前核对 Canonical revision |
optimize-content-quality |
D2/D7 | 编排兼执行,且自称可直接 git 提交 | ✅ 合同已收敛为只出归因建议;禁止自行 git 提交 |
plan-story |
D5 | 含 db_write 却无失败路径 |
✅ SKILL 补失败关闭(整单不落库) |
review-knowledge-cards |
D5/D7 | 写库审核无失败关闭;校准门只靠散文 | ✅ 失败关闭节 + 放量写库须 calibrate-stamp(cal-* 批次除外) |
extract-chapter-knowledge |
D5 | 含 db_write 全文无失败路径 |
✅ 失败关闭节 + lesson 接线 |
maintain-work-extraction |
D2 | 备份/重置/修复/迁移并列(D2 的 0 分原型) | ✅ 已拆为 backup/reset/repair(历史项) |
score-content-quality |
D2 | 三套评分口径 + Gate 裁决并列 | ✅ Gate 终态归 adjudicate-quality-gate;本 Skill 只评分 |
deconstruct-book |
D2/D7 | 编排兼执行;换窗漏删已造成实测漏卡 | ✅ 换窗 WINDOW_PLAN_CONFLICT 失败关闭 + --replace-windows;编排上移仍可后做 |
evaluate-frozen-replay |
D2/D7 | 五类功能并列;防假绿靠叮嘱 | ✅ 完成态 assert_run_may_complete;入口仅 dry_run/execute;假绿测试钉死 |
capture-ai-flavor-cases |
D2/D7 | 采集兼规则生命周期;激活豁免只靠散文 | ✅ CLI 表面仅采集五命令;confirm/project 仅供 promote 库调用 |
design-story-foundation |
D2 | 编排 / 执行 / 统合并列 | ✅ orchestrated + 选定交接闸;统合归 merge;plan-story 红线禁偷读 |
8.2 方法 Skill 的集合冲突(D1/D3,批次 3 主结论)
15 份 description 全部堆 trigger,没有一份把会命中的相邻 Skill 全部点名交接,所以 D1 整列压在 1 或 0。5 份"不适用于"一个 skill 名都没有。这不是 15 个独立质量问题,是一套未切分的方法被切成 15 个路由入口。
本批已落地(路由切分,尚未出卡):冲突对均在 description 点名交接;character-presentation 删除重复 character-voice.md stub(owner=dialogue-craft);foreshadow-payoff 从 trigger 去掉裸「高潮/反转」;novel-diagnosis 症状→专精表写入 frontmatter(模型可读);scene-craft / character-design / story-ending / narrative-momentum 补齐易混交接。出卡仍须等 §5 批次 1 效果信号。
冲突对(双方都缺交接的优先)——原审查记录:
| 对 | 冲突面 | 建议归属 | 状态 |
|---|---|---|---|
character-presentation ↔ dialogue-craft |
各有一份 references/character-voice.md,教同一条 |
说话方式归 dialogue-craft |
✅ |
prose-craft ↔ show-and-omission |
"太抽象 / 不写他很 X、写动作"同源 | 句段修辞归前者,标签换场景归后者 | ✅(先前已交接) |
narration-pov ↔ theme-and-stance |
同一原则 + 同一案例(撒旦访莫斯科)写了两遍 | 荒诞/间离归 theme-and-stance |
✅(先前已交接+指针) |
narrative-momentum ↔ story-structure |
"中段塌陷"逐字重复 | 结构成因归后者,弃读/章末钩子归前者 | ✅ |
concept-design ↔ story-planning |
用户第一句话两边都收 | 想法→概念 / 概念→节拍表 | ✅(先前已交接) |
foreshadow-payoff 吸走高潮/反转 |
trigger 过宽 | 收窄到埋/收/契诃夫之枪 | ✅ |
novel-diagnosis 对专精 skill 开放点名 |
"等专精 skill"无法路由 | 展开成症状→skill 对照表 | ✅ |
单点严重:dialogue-craft 的 description 把已删除的 MERGE_PLAN.md 当路由目标(内部代号且文件已不存在),D1 记 0。→ ✅ 已清除(无 MERGE_PLAN 引用)。
这 15 个在接复利(第 5 节批次 3)之前,应先把路由切干净。否则出的范式卡会把同一条方法登记两次。→ 路由切分已完;出卡仍禁早于批次 1。
8.3 写作执行槽的交接空洞(批次 1+2)
expand-scene / rewrite-selection / polish-prose 输入输出都是"一段既有正文 → 一段新正文",互不点名;polish-prose 还直接做去 AI 味,绕开 diagnose-ai-flavor 前置铁律。plan-story 与 plan-chapter 都能产 fine_outline。这些与 8.2 同构:切分了入口,没切分症状。
本批已落地:三写作槽 description 互指 + AI 味铁律;polish-prose 不再自称去 AI 味入口;fine_outline 写入硬门 FINE_OUTLINE_OWNER(仅 --owner-skill plan-chapter),plan-story 产出合同去掉 fine_outline。
9. 待办
第 8.1–8.3 与 §5 批次 1/2/4/5(平台豁免 + plan-chapter/freeze 判定)✅。运维/写作槽✅:partial合同对齐capture→closed_loop(persist lesson);record-run-evidence→模式 Cnone;optimize/replay-writer-gate/check-consistency/search-knowledge/merge/load-replay/inspect-parse注明「回写归下游」;写作槽与方法 Skill 先前已对齐。D6✅:方法 Skillscripts/清单已迁走(目录已删);行预算均 ≤120;无scripts_test_file。- 仍开放:§5 批次 3 方法出卡(须先有批次 1 效果信号被消费的证据)。
9.1 批次 1 效果信号消费证据(2026-08-20 查;同日验证)
结论:批次 3 仍禁止。 可见性核对已由人通过;不等于最新生产链实测,也不等于效果信号已被产品侧消费。
| 检查项 | 证据 | 结果 |
|---|---|---|
| 回写侧已接线 | decide / score / replay 均 propose_lesson_dedup;离线 mock 绿 |
✅ 代码层 |
| 库内批次 1 行 | 历史 accept 回填 lesson #52/#53;丢弃 37 产生 live #54 | 🟡 #54 为 discard 信号;尚无 live accept |
| 看板可见 | 人打开 作品12 第1/2章可看正文;内容不满意、有 AI 味(历史生成) | ✅ 可见性通过(人确认) |
| 「最新流程实测」 | 候选 37 已 discard(decision_id=87);ch3 细纲修辞句已改;交互合同/复读门/人指令槽已落 | 🟡 重产进行中或待跑 |
| 消费侧 | 只读 /lessons + 确认通道 :8766;人已对 #53 执行 rejected |
✅ Web 人审链路通(驳回路径) |
| 升格落地 | 06 §9:promoted→范式/Skill 变更仍待建 |
❌ 升格落地未测 |
人确认(2026-08-20)
- 可见性:历史第1/2章在看板上可见 → 通过。
- 经验 #53:Web 驳回。
- #52 仍为
proposed(未审);#54 为丢弃 37 的 live proposed。 - accept 后口径已改:下游抽卡/案例草稿 auto,转正式仍须人(05 §2 / decide-candidate)。
验证进度
- ✅ 看板可见性
- ✅ 历史 accept 回填 lesson
- ✅ Web 人审(#53 →
rejected) - ✅ discard live lesson(#54)
- ❌ live accept + 自动抽卡执行(接线待建;合同已改)
- 批次 3 仍禁出卡
下一步:用当前流水线重产第 3 章(含语义门 + 人指令 + 复读门)→ 人审 → accept → 核对新 lesson。写手新设定不走补证禁写;冲突才阻断,提案交人闸。
skill_harness.py --strict可长期开启(当前阻断与质量发现均为 0)。
9.3 第 3 章 live 重产现状(2026-08-20 续跑)
| run | 结果 | 证据 |
|---|---|---|
2da11381 |
篇幅拒绝 | 旧合同 2800–5200;首轮 2601 汉字,后续盲重试未形成通过候选 |
68a7635a |
篇幅拒绝 | 新分层合同已生效,但旧生产提示未要求汉字自检;首轮 2601 汉字 |
5cda460d |
语义 detector 失败关闭 | 加强生产提示后正文 4772 汉字;引文弯引号归一化修复前,三轮均 SEMANTIC_DETECTOR_QUOTE_NOT_FOUND |
b4c114be |
机械拒绝 | 正文 4233 汉字;event-3-upgrade 未命中,候选 #119 为 rejected |
c32f1b10 |
证据缺口拒绝 | 正文 4819 汉字;机械门与语义结构通过,语义 needs_evidence 有 2 个低优先级缺口,当时生产补证未接线,未进入人闸 |
0.1 B 补证接线(2026-08-21):production_evidence_reassemble 已接入 step2;离线 4 测绿;对 c32f1b10 上下文 smoke:attempt↑、sha 变、创作输入变。下一步:重跑第 3 章 step2 进入人闸。
0.2 双通道:只读 :8765 + 经验 :8766 + 候选决策 :8767(dashboard/decision_channel.py accept/discard)。
当前有效口径:生产写手输入 4000–7000 汉字、目标 7000;可信 adapter 接受 3001–10000;生成入口只落 Shadow,已由 AST 门禁止调用 accept()。弯引号只做一对一字形定位,绑定结果返回正文原始切片;其它内容差异仍失败关闭。
当前阻塞:第 3 章尚无同时满足机械门、语义 passed、证据完整且可进入人闸的新候选。候选 #118 的语义状态为空,候选 #119 已拒绝;c32f1b10 未持久化为可接受候选。批次 3 仍禁止出卡。
9.2 交互编排(2026-08-20)
| 项 | 状态 |
|---|---|
| 05 §2.3 交互回合合同 + §2.4 节点 Skill 矩阵 | ✅ |
| accept 授权下游 shadow 草稿(next_steps auto) | ✅ 合同;执行接线待建 |
step2 --instruction 人指令槽 |
✅ |
机械门 OUTLINE_PHRASE_LEAKED |
✅ + 离线测试 |
| 候选详情决策菜单 | ✅ |
| 0.1 B 生产补证重组装 | ✅ production_evidence_reassemble + step2 + 离线测 |
0.2 可写决策通道 :8767 |
✅ dashboard/decision_channel.py |
| 候选 37 丢弃并重写 | 丢弃 ✅;重产见上 |