muse-agent-example/docs/write-chapter/step2_setup_chapter2.py
zizi 091b66a9bb 重构: 收敛 Agent/Skill 运行时与创作质量闭环
将角色与 Skill 从 .claude 迁入 .agent,移除 Claude CLI 运行时并接入固定 Opus 角色 profile、完整 schema、预算 deadline、raw 与回执证据链。

同步拆分 Skill 职责、复利 lesson、Gate 回放、Dashboard 人审入口、数据库登记和机械门禁;候选设计正文不包含在本提交中。
2026-08-22 02:12:32 +08:00

91 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

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

#!/usr/bin/env python3
"""真写一章 · 阶段二前置:建第 2 章 + 章级细纲(规划落库)。
镜像 step1 的建章 + persist_planning 模式。第 2 章细纲按总纲「舰队生存与机甲养成」
展开,硬骨架接住第 1 章已确立的事实(林深/何岚/薄雾号/左眼黑纹/脑内声音/被称量)。
细纲 payload 形状说明:
- 合同四件套(sourceRef/hardConstraints/adjustableBeats/declaredNewFacts)满足
assemble 的 _outline_contract 与 WriterContext 严格校验;declaredNewFacts 是
{factId,text,sourceRef} 对象(第 1 章 payload 的纯字符串形状只用于不过合同的基线章)。
- chapterGoal/keyEvents/mustAppearEntities/chapterEndHook 是规划侧字段,assemble 会裁剪,
留给人工审查与机械门的锚点映射。
- entities 供 build_retrieval_plan 生成检索查询(新书无卡,检索会诚实返空)。
"""
import sys
from pathlib import Path
SCRIPT_DIR = Path(__file__).resolve().parent
PLANNING_SCRIPTS = SCRIPT_DIR.parents[1] / ".agent" / "skills" / "plan-story" / "scripts"
if str(PLANNING_SCRIPTS) not in sys.path:
sys.path.insert(0, str(PLANNING_SCRIPTS))
from muse_db import connect # noqa: E402
from persist_planning import write_section, confirm_section # noqa: E402
WORK_ID = 12
CHAPTER2_TITLE = "称量"
FINE_OUTLINE_PAYLOAD = {
"targetChapter": 2,
"targetChars": 4000,
"chapterGoal": ("林深带着污染征兆回到主力舰队,被隔离审讯。舰队按黑暗森林逻辑"
"裁决他:武器还是污染源;他主动隐瞒脑内的声音,污染却在加重;"
"机甲「茧」的异种核心露出饥饿,埋下升级线。"),
"hardConstraints": [
"衔接第1章结尾:林深击退异族后回到薄雾号,左眼有扩散的黑纹,脑内留有异族的声音。",
"林深进入主力舰队控制范围,被隔离和审讯;舰队态度体现黑暗森林逻辑(称量他的价值与污染风险)。",
"污染检测查不出异常,林深主动隐瞒脑内的声音;同时污染出现新的恶化征兆。",
"机甲「茧」被舰队封存研究,异种核心表现出对同类核心的饥饿(升级线伏笔:融合更强异种核心)。",
"章末钩子:舰队决定让「茧」与林深执行实战任务——或林深察觉自己已不愿离开链接。",
],
"keyEvents": [
"林深被舰队接走并立即隔离。",
"审讯:军方追问战斗细节与污染状态,何岚作证。",
"污染检测与隐瞒:仪器查不出异常,他没有说出脑内的声音。",
"林深独自面对「茧」,发现核心对异族残骸的反应(饥饿)。",
],
"adjustableBeats": [
"审讯与检测场景的次序和比重可调整。",
"污染恶化的具体表现可调整(须与第1章结尾的左眼黑纹、脑内声音一致)。",
],
"declaredNewFacts": [
{"factId": "fact-ch2-1",
"text": "舰队设特别调查组(军方隔离审讯机构),负责污染裁决。",
"sourceRef": {"sourceId": "outline:volume_1", "sourceVersion": "v1"}},
{"factId": "fact-ch2-2",
"text": "异种核心以同类核心为食:融合更强的异种核心,机甲升级,链接加深。",
"sourceRef": {"sourceId": "outline:volume_1", "sourceVersion": "v1"}},
],
"mustAppearEntities": ["林深", "何岚", "生物机甲茧", "主力舰队"],
"chapterEndHook": ("舰队下达实战调令,让「茧」出击;林深在隔离舱里听见核心"
"满意的搏动——它等到了下一顿。"),
"sourceRef": {"sourceId": "outline:volume_1", "sourceVersion": "v1"},
"entities": [
{"id": "entity-ch2-char-linshen", "type": "character", "name": "林深"},
{"id": "entity-ch2-char-helan", "type": "character", "name": "何岚"},
{"id": "entity-ch2-item-cocoon", "type": "item", "name": "生物机甲茧"},
{"id": "entity-ch2-loc-fleet", "type": "location", "name": "主力舰队"},
],
}
def main():
with connect() as conn:
chapter_id = conn.execute(
"INSERT INTO muse_content_chapter(work_id, title, order_no, status, revision, "
"creator, updater) VALUES (%s,%s,2,'draft',1,'setup','setup') RETURNING id",
(WORK_ID, CHAPTER2_TITLE)).fetchone()[0]
print(f"建第 2 章: id={chapter_id} 《{CHAPTER2_TITLE}》")
conn.commit()
fine = write_section(WORK_ID, section_type="fine_outline", schema_type="outline",
target_chapter=2, payload=FINE_OUTLINE_PAYLOAD)
confirm_section(fine["id"])
print(f"第2章细纲: section id={fine['id']} → confirmed")
print(f"\nCHAPTER2_ID={chapter_id}\nFINE_SECTION_ID={fine['id']}")
if __name__ == "__main__":
main()