范围(不含 design-story-foundation、docs/、humanization/README.md 等进行中改动):
1. 新增 harness/ 控制平面
- skill_harness.py 静态审计:32 个运行时 Skill 的 frontmatter/manifest/文档污染,当前 0 问题
- run_selected.py 选择性执行器:manifest 与磁盘一一对账、依赖阻断、
空跑与 skip-only 失败关闭、AST 测试形状门
- manifests/skills.json:32 个 Skill 的合同责任方与协作领域登记
- manifests/test-inventory.json:81 个测试资产登记
- specs/skill-testing.md 与 README.md:测试分层、证据边界与 harness 职责
2. 实现测试从 .claude/skills/*/scripts/ 迁至 tests/skills/<skill>/
- 71 个测试文件迁移并修复项目根与临时目录运行导入
- 数据库触发器测试宽泛异常收窄为 psycopg.errors.RaiseException
- 抽取离线大测试拆出真实 PG smoke(默认阻断,不计入离线通过)
- 抽取 presence 去重边界拆出独立测试:493 + 78 = 571 项检查不变
3. 运行时文档清理
- 13 个 SKILL.md 移除自测/离线验证段落、测试命令与测试文件事实源表述,
只保留运行时合同;业务运行合同、额度、授权与离线模式均保留
4. SoT 同步
- AGENTS.md:新增 Skill 领域索引(7 个合同责任方分组,覆盖 32 个运行时 Skill)
- 领域 07:测试入口改由 harness/manifests/ 登记,SKILL.md 不承载测试命令
- humanization 覆盖矩阵:活动测试路径同步迁移
验证证据: harness 自测 15 项 + runner 自测 13 项通过;静态审计 32 Skill / 0 问题;
73 个非数据库测试通过;8 个集成条目中 6 个 PostgreSQL 项被依赖门明确阻断;
py_compile 与 git diff --check 通过。未连接 PostgreSQL、网络、真实模型或额度。
已知边界: 真正 skill_behavior_eval 仍为 0,尚未验证任何 Skill 自然语言行为;
evaluate-frozen-replay 的 raw 存储边界冲突留待单独治理。
4.4 KiB
name, description, disable-model-invocation
| name | description | disable-model-invocation |
|---|---|---|
| maintain-work-extraction | 维护既有 upgrade_book 抽取状态,包括七域备份验证与恢复、全量重抽前重置、失败窗口恢复、定向数据修复和存量迁移。需要修复或重建作品抽取结果时使用;不负责正常按窗抽取。 | true |
维护作品知识抽取
何时用:作品的 upgrade_book 派生状态需要备份、恢复、重置、定向修复或存量迁移。正常 windows/run/status 属于 extract-work-knowledge。
依赖边界
维护命令复用 extract-work-knowledge/scripts/upgrade.py 的修复算法和 upgrade_work_lock.py 的同书锁,不复制第二套数据库补偿逻辑。upgrade_book、upgrade-reset、parse_upgrade.py 等字符串是存量数据库或备份清单的兼容键,不随 Skill 改名。
维护入口
| 入口 | 用途 |
|---|---|
scripts/backup_upgrade_work.py |
七域一致性 backup/verify/rehearse/restore。 |
scripts/reset_upgrade_work.py |
全量重抽前预览或重置本书派生状态。 |
scripts/maintenance.py |
暴露 recover-legacy-failed、repair-card-quality、repair-presence-duplicates。 |
scripts/migrate_upgrade_windows.py |
将存量 [窗N] 演变条目定位到真实章号,仅 dry-run。 |
scripts/parse_rewash.py |
存量回洗工具;是否退役由现有数据状态决定。 |
同书互斥
重置预览/执行、备份、演练、恢复和所有写修复均使用 extract-work-knowledge 的 PostgreSQL session advisory lock。取锁失败时必须在业务 SQL、文件验证、嵌入或模型调用前非零退出;status 不属于本 Skill。
备份与恢复合同
reset --execute 前必须用一个 REPEATABLE READ READ ONLY 事务导出本书七域状态,并从磁盘独立复验。备份目录必须是 /private/tmp 下尚不存在的新目录。清单绑定数据库 identity、Canonical 章节与 block、窗口边界、活动字段合同、计划参数和实际代码 fileSha。
备份清单中的 parse_upgrade.py、parse-book/SKILL.md 等逻辑键保持不变,以便存量备份继续离线验证;真实路径分别指向当前 extract-work-knowledge 与 deconstruct-book 文件。
恢复前固定执行离线 verify。rehearse 在真实表的单事务中应用并强制回滚;restore --execute 必须精确匹配 backup_id + confirmationSha,逐域读回后才提交。任何 work、tenant、数据库 identity、Canonical、窗口、合同或代码漂移均拒绝。
.venv/bin/python .claude/skills/maintain-work-extraction/scripts/backup_upgrade_work.py backup \
--work-id 8 --expected-chapters 594 --expected-windows 116
.venv/bin/python .claude/skills/maintain-work-extraction/scripts/backup_upgrade_work.py verify \
--backup-dir /private/tmp/muse-upgrade-work8-before-reset
.venv/bin/python .claude/skills/maintain-work-extraction/scripts/backup_upgrade_work.py rehearse \
--work-id 8 --backup-dir /private/tmp/muse-upgrade-work8-before-reset \
--confirmation-sha <manifest-confirmationSha>
重置与定向修复
reset 软删目标 upgrade_book 草稿和无 Canonical owner 的活向量,窗口保留并回到 pending;别名、presence、card state 和 audit 按既有约束清理。执行时须持同书锁、复验备份和代码身份,并在固定表锁顺序内完成单事务重置;任一断言失败整体回滚。
# 只读预览
.venv/bin/python .claude/skills/maintain-work-extraction/scripts/reset_upgrade_work.py --work-id 8
# 真重置
.venv/bin/python .claude/skills/maintain-work-extraction/scripts/reset_upgrade_work.py \
--work-id 8 --execute --backup-dir /private/tmp/muse-upgrade-work8-before-reset \
--backup-id <manifest-backup_id> --confirmation-sha <manifest-confirmationSha>
# 定向维护命令
.venv/bin/python .claude/skills/maintain-work-extraction/scripts/maintenance.py \
recover-legacy-failed --work-id 8 --window-no 7 --preview
定向修复必须先 preview,execute 精确匹配 preview 的确认 SHA,并显式确认没有同书活进程。修复范围、行集合、revision、payload、owner 或关联状态任一漂移都失败关闭。
数据边界
- 备份与 preview 默认只读;execute 只修改目标租户、目标作品、
upgrade_book边界内的派生状态。 - 不生成新抽取内容,不提供正常
run/windows/status。 migrate_upgrade_windows.py当前只输出迁移计划,不落库;真实写入仍需另行 gate 与授权。