一、技能重组(动作-对象命名) - 旧目录 clean/confirm/continuation/db/detect/embed/… 重组为 clean-book-text/decide-candidate/write-next-chapter/access-database/ check-content-consistency/embed-knowledge/…(git 识别为 rename,内容保持) - agents/*.md、AGENTS.md/CLAUDE.md 收编、example_skill 登记表同步新名 二、先审后入创作闭环(本次核心) 正文接受从"机械门一过就写正典"改为"机械门+语义审查双通过+用户批准+单事务原子提交", DB 级兜底,编排层跳步即被硬拒。 - candidate_cas.py + example_candidate_cas(109):持久化 CAS 状态链 - fact_delta.py + example_fact_delta/example_fact_ledger(106):结构化事实增量, 模型只提六型闭集增量+正文证据引文,仅用户批准的增量随正文同事务入账本 - projection_registry.py + example_projection_run(107):投影登记与恢复 - acceptance_state.py:接受前置实时状态重读 - lesson_registry.py + example_lesson(108):经验升格链,禁止自动升格 - DDL 105:example_candidate 增 semantic_status/semantic_report_sha256 - write_canonical.accept:语义兜底+同事务合并增量+登记投影; run_writer_pipeline/persist_writer_run/run_writer_semantic_detector/step2 接入全链 - claude_runtime:兼容新 CLI modelUsage 信息字段 三、审查修复(独立子代理四维审查后) - 事实增量 propose→approve 翻态正道,不撞唯一键 - 冻结配置探针重刷(CLI 2.1.211→2.1.231 漂移),profileSha256/adapterVersion 再登记 - 可视化合同悬空路径/五六空间矛盾、 SoT 旧技能名漂移、行尾空白清理 测试:离线 65 套 + 真实库集成 5 套(CAS/接受故障注入/事实增量/投影/经验升格)+ 回放 79 项全绿。 创作内容(docs/design、生成正文 artifacts)按"框架与创作分开"未入本提交。
116 lines
6.0 KiB
Python
116 lines
6.0 KiB
Python
#!/usr/bin/env python3
|
||
"""真写一章 · 阶段一:建立作品 + 第 1 章 + 设定/大纲/细纲(规划落库)。
|
||
|
||
新建一部科幻机甲小说《深渊机神》(宇宙/星空/机甲/人类/异族/战斗/舰队/巨舰/天才/
|
||
生物机甲/微恐/克苏鲁/黑暗/养成/收集/生存/升级/机战),创建第 1 章,
|
||
并把设定包/大纲/章级细纲经 persist_planning 落库(shadow→confirmed)。
|
||
"""
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
SCRIPT_DIR = Path(__file__).resolve().parent
|
||
DB_SCRIPTS = SCRIPT_DIR.parents[1] / ".claude" / "skills" / "access-database" / "scripts"
|
||
PLANNING_SCRIPTS = SCRIPT_DIR.parents[1] / ".claude" / "skills" / "plan-story" / "scripts"
|
||
for p in (str(DB_SCRIPTS), str(PLANNING_SCRIPTS)):
|
||
if p not in sys.path:
|
||
sys.path.insert(0, p)
|
||
|
||
from db import connect # noqa: E402
|
||
from persist_planning import write_section, confirm_section # noqa: E402
|
||
|
||
WORK_TITLE = "深渊机神"
|
||
GENRE = "科幻·机甲·克苏鲁"
|
||
CHAPTER1_TITLE = "渊临"
|
||
|
||
# 设定包(作品核心)
|
||
SETTING_PAYLOAD = {
|
||
"title": WORK_TITLE,
|
||
"genre": GENRE,
|
||
"logline": "人类舰队深入深渊星域,天才机师驾驶生物机甲对抗克苏鲁式异族,在黑暗宇宙中生存、收集、升级。",
|
||
"core_premise": "深渊星域浮现克苏鲁式异族,人类以生物机甲对抗。主角是天才机师,从底层养成机甲、收集异种核心、在黑暗森林般的星域生存升级。",
|
||
"world": "人类文明扩张至深渊星域,遭遇沉睡的克苏鲁式异族。生物机甲以异种核心为源,机师与机甲精神链接。宇宙是黑暗森林,舰队巨舰是人类的移动堡垒。",
|
||
"power_system": "生物机甲以异种核心驱动,机师精神链接深度决定机甲出力。代价:链接过深会被异族精神污染(微恐/克苏鲁)。升级=融合更强异种核心。",
|
||
"style": "冷峻、克制、微恐。战斗场面宏大(舰队/巨舰/机甲),心理描写细腻(克苏鲁式精神压迫)。句式偏短,节奏紧。",
|
||
"themes": ["生存", "升级", "收集", "养成", "黑暗森林", "克苏鲁", "机甲", "舰队"],
|
||
}
|
||
|
||
# 大纲(总纲)
|
||
OUTLINE_PAYLOAD = {
|
||
"title": WORK_TITLE,
|
||
"overall_arc": "主角从底层机师成长为驾驶神级生物机甲的存在,对抗深渊克苏鲁异族,揭开宇宙黑暗森林的真相。",
|
||
"volume_1": "第一卷·渊临:主角初遇深渊异族,觉醒生物机甲,在舰队中生存立足。",
|
||
"volume_1_chapters": "第1章 渊临(开篇:深渊异族初现,主角觉醒)→ 后续章节展开舰队生存与机甲养成。",
|
||
}
|
||
|
||
# 第 1 章细纲
|
||
FINE_OUTLINE_PAYLOAD = {
|
||
"targetChapter": 1,
|
||
"targetChars": 4000,
|
||
"chapterGoal": "开篇:深渊星域异族初现,主角(天才机师)在危机中觉醒生物机甲,建立微恐/克苏鲁基调与生存压力。",
|
||
"hardConstraints": [
|
||
"主角是天才机师,初次驾驶生物机甲。",
|
||
"深渊异族(克苏鲁式)首次出现,营造微恐/精神压迫。",
|
||
"建立黑暗森林/舰队/巨舰的世界观基调。",
|
||
"章末钩子:主角觉醒生物机甲的代价(精神污染的预兆)。",
|
||
],
|
||
"keyEvents": [
|
||
"主角所在的舰队侦察船在深渊星域遭遇异常信号。",
|
||
"克苏鲁式异族生物现身,舰队遭受精神压迫(微恐)。",
|
||
"主角在危机中被迫启动未完成的生物机甲。",
|
||
"主角与生物机甲精神链接,击退异族,但出现精神污染预兆。",
|
||
],
|
||
"adjustableBeats": [
|
||
"开场节奏(侦察船日常 → 异常信号 → 异族现身)可调整。",
|
||
"精神压迫的描写强度可调整(微恐基调)。",
|
||
],
|
||
"declaredNewFacts": [
|
||
"主角:天才机师,名字待定(建议:林深)。",
|
||
"生物机甲:以异种核心驱动,精神链接。",
|
||
"深渊异族:克苏鲁式,精神污染。",
|
||
],
|
||
"mustAppearEntities": ["主角(林深)", "生物机甲", "深渊异族", "侦察船"],
|
||
"chapterEndHook": "主角击退异族后,发现精神链接留下污染预兆——机甲的核心在低语。",
|
||
"sourceRef": {"sourceId": "outline:volume_1", "sourceVersion": "v1"},
|
||
}
|
||
|
||
|
||
def main():
|
||
with connect() as conn:
|
||
# 1) 建作品
|
||
work_id = conn.execute(
|
||
"INSERT INTO muse_content_work(owner_user_id, title, description, genre, status, "
|
||
"summary, word_count, chapter_count, revision, creator, updater) "
|
||
"VALUES (1,%s,%s,%s,'writing',%s,0,0,1,'setup','setup') RETURNING id",
|
||
(WORK_TITLE, SETTING_PAYLOAD["logline"], GENRE, SETTING_PAYLOAD["core_premise"])).fetchone()[0]
|
||
print(f"建作品: id={work_id} 《{WORK_TITLE}》")
|
||
|
||
# 2) 建第 1 章
|
||
chapter_id = conn.execute(
|
||
"INSERT INTO muse_content_chapter(work_id, title, order_no, status, revision, creator, updater) "
|
||
"VALUES (%s,%s,1,'draft',1,'setup','setup') RETURNING id",
|
||
(work_id, CHAPTER1_TITLE)).fetchone()[0]
|
||
print(f"建第 1 章: id={chapter_id} 《{CHAPTER1_TITLE}》")
|
||
conn.commit()
|
||
|
||
# 3) 设定/大纲(书级,shadow→confirmed)
|
||
setting = write_section(work_id, section_type="setting", schema_type="novel_work", payload=SETTING_PAYLOAD)
|
||
confirm_section(setting["id"])
|
||
print(f"设定包: section id={setting['id']} → confirmed")
|
||
outline = write_section(work_id, section_type="outline", schema_type="outline", payload=OUTLINE_PAYLOAD)
|
||
confirm_section(outline["id"])
|
||
print(f"大纲: section id={outline['id']} → confirmed")
|
||
|
||
# 4) 章级细纲(章级,shadow→confirmed)
|
||
fine = write_section(work_id, section_type="fine_outline", schema_type="outline",
|
||
target_chapter=1, payload=FINE_OUTLINE_PAYLOAD)
|
||
confirm_section(fine["id"])
|
||
print(f"第1章细纲: section id={fine['id']} → confirmed")
|
||
|
||
print(f"\n阶段一完成: work_id={work_id}, chapter_id={chapter_id}")
|
||
print(f"WORK_ID={work_id}")
|
||
print(f"CHAPTER_ID={chapter_id}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|