日期:2026-06-04 状态:草案 v1 对应 spec:
docs/architecture/plugin-runtime-hardening-spec-2026-06-04.md范围:把 spec 拆成可实施、可验收、可回退的工程计划,重点说明修改范围与影响面
本计划把 webnovel-writer 从“主要靠 Skill 文档约束流程”推进到“关键边界由 runtime 可验证”的插件形态。
核心交付:
project_phase / project-status:统一项目阶段推导和短状态摘要,保留现有 status_reporter.py 的宏观创作健康报告语义。/webnovel-doctor:阶段感知的项目体检,检查目录、文件、数据库、RAG、Python 依赖、Dashboard 配置,并给修复建议。artifact_validator:统一校验 agent 产物,避免字段漂移和 schema 错误。write-gate:在写前、提交前、提交后三个自然边界做批量校验。projection_log:把 commit 事实和 projection 执行日志拆开。projections retry/replay:投影失败后可补跑。plugin-dev 规范收束 frontmatter、description、tools、输出约束。顺序必须是:
这样可以减少一次性大改对现有写作流程的冲击。
所有新增能力默认兼容旧数据:
.story-system/commits/*.commit.json 结构。projection_status 至少一个版本周期。.webnovel/state.json、index.db、summaries/、memory_scratchpad.json 继续作为 projection / read-model。plugin-dev所有插件组件改动必须遵循:
C:\Users\lcy\.claude\plugins\marketplaces\claude-plugins-official\plugins\plugin-dev
落地要求:
plugin-structure。skill-development,保持 SKILL.md 精简,详细规则放 references/。command-development。agent-development。hook-development,插件级 hooks/hooks.json 使用 wrapper 格式。plugin-validator 思路校验 manifest、skills、agents、hooks、README、LICENSE、路径可移植性。每阶段应尽量做到:
所有新增 CLI / hook / 子进程入口必须兼容 Windows 中文路径:
enable_windows_utf8_stdio() 或等价逻辑。encoding="utf-8"。python -X utf8 或设置 PYTHONUTF8=1。Phase 0 基线审计
↓
Phase 1 project_phase + project-status + doctor
↓
Phase 2 artifact_validator
↓
Phase 3 write-gate
↓
Phase 4 projection_log
↓
Phase 5 projection retry/replay
↓
Phase 6 skill / agent 契约补强
↓
Phase 7 behavior evals
↓
Phase 8 package validator
↓
Phase 9 hooks
说明:
project_phase / project-status / doctor 可以先做,因为它们只读、风险最低,并且后续 gates 和 hooks 都依赖统一 phase。artifact_validator 应早于 write-gate,否则 gate 会重复写 schema 判断。projection_log 应早于 retry/replay,否则失败记录不稳定。在动代码前确认当前功能基线,避免重构时不知道哪里被破坏。
优先不改 runtime 代码,只新增或更新文档 / 测试清单:
docs/architecture/plugin-runtime-hardening-plan-2026-06-04.mddocs/README.mdtest_webnovel_unified_cli.pytest_story_runtime_health.pytest_chapter_commit_service.pytest_event_projection_router.pytest_rag_adapter.pytest_dashboard_app.py无用户可见行为变化。
project_phase / project-status / webnovel-doctor新增统一 phase resolver、短状态入口和只读项目体检入口,回答:
当前代码已有两个相关入口,必须先明确关系:
webnovel.py preflight:已有快速环境检查,保留并复用。webnovel.py status:已转发到 scripts/status_reporter.py,语义是宏观创作健康报告,保留不占用。新增:
webnovel-writer/scripts/data_modules/project_phase.pywebnovel-writer/scripts/data_modules/project_status.pywebnovel-writer/scripts/data_modules/doctor.pywebnovel-writer/scripts/data_modules/tests/test_project_phase.pywebnovel-writer/scripts/data_modules/tests/test_project_status.pywebnovel-writer/skills/webnovel-doctor/SKILL.mdwebnovel-writer/scripts/data_modules/tests/test_doctor.py修改:
webnovel-writer/scripts/data_modules/webnovel.pydocs/guides/commands.mddocs/README.md可复用:
webnovel.py 中现有 _build_preflight_report()story_runtime_health.pystory_runtime_sources.pyconfig.py_inspect_vector_db() / _build_env_status() 思路project_phase.py:
project-status:
webnovel.py project-status --format json|summarywebnovel.py status 现有转发,不改 status_reporter.py 语义。doctor 数据模型:
DoctorReportDoctorCheckRepairSuggestionExpectedFilesproject_phase.py 实现 phase 推导:
no_projectunknowninit_scaffoldedinit_readyplan_in_progresschapter_contract_readydraft_in_progressready_to_commitchapter_committedprojection_failedstate.json、设定集、总纲、.env.example。index.db 是否可打开。vectors.db 是否可打开、是否有 vectors 表。.env 配置。webnovel.py project-status --format json|summarywebnovel.py doctor --format json|textwebnovel.py doctor --chapter N --format json|textwebnovel.py doctor --deep --format json|text/webnovel-doctor Skill:
用户影响:
project-status 短状态命令,不改变既有 status 健康报告。代码影响:
webnovel.py 增加 project-status 和 doctor 子命令。doctor.py 只读模块。风险:
project-status 与现有 status_reporter.py 混淆。控制:
skip/info。required 和 observed,避免旧表缺失直接阻断。project-status,保留 status 原语义。_build_preflight_report(),避免 preflight / doctor 两套环境检查漂移。no_project,无 traceback。webnovel.py status 仍运行现有 status_reporter.py。webnovel.py project-status --format json 返回统一 phase。preflight 仍可运行,并与 doctor 快检结果不冲突。init_scaffolded 或 init_ready。index.db 缺关键表时能显示表名、影响、修复建议。doctor / project-status 注册。doctor.py 不被调用也不影响现有流程。project_phase.py 不被调用也不影响现有流程。/webnovel-doctor Skill 后插件仍可按原方式运行。统一校验 agent 产物,避免 review_result、fulfillment_result、disambiguation_result、extraction_result 字段漂移。
新增:
webnovel-writer/scripts/data_modules/artifact_validator.pywebnovel-writer/scripts/data_modules/tests/test_artifact_validator.py可能修改:
chapter_commit_service.pychapter_commit.pychapter_commit_schema.pyschema_errormissing_artifactblocking_reviewmissed_outline_nodepending_disambiguationprojection_failurechapter_commit_schema.py 中 commit 所需模型:
ReviewResultFulfillmentResultDisambiguationResultExtractionResultreview_schema.py 是 reviewer / review pipeline 局部模型。entity_linker.py 中的消歧模型是实体链接局部模型。validate_review_result(path)validate_fulfillment_result(path)validate_disambiguation_result(path)validate_extraction_result(path)validate_chapter_commit(path)用户影响:
代码影响:
chapter_commit_service 可以逐步改为依赖 validator。write-gate 复用 validator,减少重复校验。风险:
控制:
chapter_commit_schema.py。missing_artifact。schema_error。disambiguation.pending 非空返回 blocker。ReviewResult / DisambiguationResult 同名模型不混用。chapter_commit_service 保留旧校验路径。新增写章关键边界校验:
prewriteprecommitpostcommit新增:
webnovel-writer/scripts/data_modules/write_gates/__init__.pywebnovel-writer/scripts/data_modules/write_gates/prewrite.pywebnovel-writer/scripts/data_modules/write_gates/precommit.pywebnovel-writer/scripts/data_modules/write_gates/postcommit.pywebnovel-writer/scripts/data_modules/tests/test_write_gates.py修改:
webnovel-writer/scripts/data_modules/webnovel.pywebnovel-writer/skills/webnovel-write/SKILL.mddocs/guides/commands.md复用:
webnovel-writer/scripts/data_modules/prewrite_validator.pywebnovel-writer/scripts/data_modules/tests/test_prewrite_validator.pywebnovel.py write-gate --chapter N --stage prewrite --format jsonwebnovel.py write-gate --chapter N --stage precommit --format jsonwebnovel.py write-gate --chapter N --stage postcommit --format jsonprewrite 检查必须包装 PrewriteValidator:
precommit 检查:
postcommit 检查:
projection_status。/webnovel-write:
用户影响:
代码影响:
/webnovel-write 的执行说明会改变。webnovel.py 增加子命令。PrewriteValidator 成为 prewrite gate 的底层实现,避免两套逻辑漂移。风险:
PrewriteValidator 漂移。控制:
precommit.ok=false。precommit.ok=false。precommit.ok=false。postcommit.ok=false。prewrite 能给出明确下一步建议。test_prewrite_validator.py 继续通过。/webnovel-write 可临时回到旧流程。将 commit 事实和 projection 执行状态拆开,降低 commit 文件同时承载事实与执行日志的混乱。
开工前必须先确认现状痛点:
projection_status 与实际 read-model 不一致。如果没有真实痛点,本阶段可以延后,只保留 doctor 对现有 projection_status 的诊断。
新增:
webnovel-writer/scripts/data_modules/projection_log.pywebnovel-writer/scripts/data_modules/tests/test_projection_log.py修改:
chapter_commit_service.pyevent_projection_router.pystory_runtime_health.pydoctor.pydashboard/app.py.webnovel/projection_log.jsonlrun_idchaptercommit_pathcommit_hashwriterstatusstarted_atfinished_aterrorchapter_commit_service.apply_projections() 每个 writer 写一条 log。projection_status 双写。用户影响:
数据影响:
.webnovel/projection_log.jsonl。风险:
控制:
projection_status 仍存在。projection_status。投影失败后能按 writer 补跑,尤其是 vector / summary / memory。
本阶段风险最高,必须先完成 writer 幂等性审计和测试。
新增:
webnovel-writer/scripts/data_modules/projection_runner.pywebnovel-writer/scripts/data_modules/tests/test_projection_runner.py修改:
event_projection_router.pywebnovel.pywebnovel.py projections status --chapter Nwebnovel.py projections retry --chapter N --writer vectorwebnovel.py projections retry-failed --chapter Nwebnovel.py projections replay --from 1 --to 20 --writers state,index,summarystateindexsummarymemoryvectorprojection_status。用户影响:
数据影响:
风险:
控制:
按官方 plugin-dev 规范增强 Skill / Agent 的触发、工具范围、输出契约。
修改:
webnovel-writer/skills/*/SKILL.mdwebnovel-writer/agents/*.mdwebnovel-writer/scripts/data_modules/tests/test_prompt_integrity.py可选新增:
webnovel-writer/agents/continuity-reviewer.mdwebnovel-writer/agents/style-reviewer.mdwebnovel-writer/agents/reader-pull-reviewer.mddescription,写清触发场景和不适用场景。SKILL.md 精简。references/。name。description。tools。model。用户影响:
代码影响:
风险:
控制:
验证插件在真实行为层面是否按协议执行,而不是只验证 Python 函数。
新增:
webnovel-writer/evals/webnovel-writer/scripts/run_behavior_evals.pywebnovel-writer/evals/fixtures/修改:
docs/operations/operations.md用户影响:
代码影响:
风险:
控制:
/webnovel-write 覆盖成功链路和 blocking 链路。防止 manifest、marketplace、README、version、frontmatter 漂移。
新增:
webnovel-writer/scripts/validate_plugin_package.pywebnovel-writer/scripts/tests/test_validate_plugin_package.py修改:
docs/operations/plugin-release.mddocs/guides/commands.md.claude-plugin/plugin.json:
用户影响:
代码影响:
风险:
控制:
--strict 和默认模式。${CLAUDE_PLUGIN_ROOT} 时 warning 或失败。基于 Phase 1 的 project-status 提供轻量状态摘要,并对最危险的绕过 runtime 写入做兜底提醒 / 阻断。
新增:
webnovel-writer/hooks/hooks.jsonwebnovel-writer/hooks/session_start.pywebnovel-writer/hooks/scripts/guard-runtime-write.py修改:
webnovel-writer/scripts/data_modules/webnovel.pywebnovel-writer/.claude-plugin/plugin.json,仅在需要显式声明 hook 路径时修改。docs/operations/operations.mdSessionStart hook:
webnovel.py project-status --format summary。PreToolUse hook:
.story-system/commits。.webnovel/state.json、index.db、memory_scratchpad.json。hooks/hooks.json 使用 wrapper 格式。${CLAUDE_PLUGIN_ROOT}。用户影响:
代码影响:
风险:
控制:
webnovel.py status 仍保留宏观创作健康报告语义。hooks/hooks.json。project-status CLI 不影响旧流程。| 入口 | 当前/目标职责 | 输出 | 是否深检 | 是否写文件 |
|---|---|---|---|---|
preflight |
快速环境检查,保留兼容 | text/json | 否 | 否 |
project-status |
机器可读短状态、phase、下一步 | summary/json | 否 | 否 |
doctor |
文件/数据库/配置体检和修复建议 | text/json | 默认否,--deep 可选 |
否 |
status / status_reporter.py |
宏观创作健康报告,如角色、伏笔、爽点、关系图谱 | markdown/text | 是,偏创作分析 | 现状可能输出报告文件,语义保持 |
build_story_runtime_health() |
内部主链就绪度 helper | dict | 否 | 否 |
原则:
status 语义。新增命令:
/webnovel-doctorwebnovel.py doctorwebnovel.py write-gatewebnovel.py projectionswebnovel.py project-status现有命令保持:
/webnovel-init/webnovel-plan/webnovel-write/webnovel-review/webnovel-query/webnovel-dashboard/webnovel-learn现有 webnovel.py status 保持转发到 status_reporter.py。
新增文件:
.webnovel/projection_log.jsonl.webnovel/tmp/* 的校验约定。不改变:
.story-system/ 主链真源地位。.webnovel/* 是 projection / read-model。短期:
projection_status。中期:
风险:
默认:
vectors.db 缺失只 warning。深度检查:
新增测试量较大,需要分层:
包含:
project_phase。project-status CLI。/webnovel-doctor Skill。不包含:
包含:
PrewriteValidator。/webnovel-write 更新。包含:
包含:
包含:
包含:
包含:
包含:
完成后应满足:
/webnovel-doctor 看懂项目文件、数据库、配置是否正常。project-status 能给短状态,且不占用现有 status_reporter.py。plugin-dev 规范。如果要尽快落地一版高收益版本,建议只做前三项:
doctorproject-status / project_phaseartifact_validatorwrite-gate这三项能先解决最核心的问题:
Projection log、retry/replay、hooks 和 evals 可以在基础稳定后继续推进。