story-memory:内部记忆模块
story-memory 只负责记忆层,不替代 story-workflow,也不替代领域子 skill。
边界
- 不写正文、不改大纲、不生成细纲、不做审稿裁决。
- 不决定下一步任务;下一步仍由
story-workflow管。 - 不替代领域子 skill:短篇爆点学习归
private-short-extension,长篇人物/伏笔使用归story-long-write,去 AI 味风格规则归story-deslop。 - 只做五件事:类型化查询、证据检索、压缩快照、版本管理、读取回执。记忆建议只有在专业产物被接受后才可投影。
- 存储必须经过
StorageBackend/ repository 契约。当前默认读取项目内本地文件;未来 PostgreSQL 由novel-project注入 adapter。本模块不保存连接串、密码,也不直接连接数据库。 - 单目录短篇只保存当前作品连续性。跨短篇素材池、作者长期画像和学习进化由外部项目管理器消费
追踪/integration/outbox.jsonl后维护,本模块不得把它们回灌成当前作品事实。 - Chat 原文不是正式记忆。用户意见先进入 workflow 的反馈收件箱,由领域 skill 判断影响层级并形成可读方案;只有用户确认后的最终方案、已事务回写的设定/大纲和已采用正文事实才能投影。原始讨论、被否决方案、模型自我总结和“继续执行”之类控制语句不得进入作品记忆。
- 短篇规划记忆分为
active与partial。只有标题承诺、目标情绪、主角欲望/恐惧、终局兑现和小节义务齐全时才可进入下一节最小上下文;残缺投影只记录缺项供 workflow 修复,不能参与正文生成。 - 短篇逐节正文不读取全量 lorebook,也不重复装配全局 memory packet。专业模块先声明当前
project_id + section_index所需的类型化Memory Query,本模块据此编译最小记忆快照,只选取已接受的前序事实、活跃人物、未闭合承诺和已确认写作规则;story-workflow只保存合同引用和校验调用顺序,不拼接事实内容。候选稿、未来小节事实、其他作品与聊天转录禁止进入。阶段结束前校验memory_read_receipt,相关事实已变化时保留候选稿并局部重建上下文,不允许带着旧记忆继续采用。 - 通用内核职责固定为:按宿主上下文和阶段复杂度分配召回预算、按优先级截取事实、生成稳定版本、校验读取回执、报告失效来源。题材与文体模块只提供 profile:短篇把上一节人物状态、未决钩子和本节到期承诺转成连续性义务;长篇按书/卷/阶段/章提供自己的层级与义务。通用内核不得出现“第 N 节”“卷纲”或具体题材判断。
全局调用方式
story-memory 不是由各子 skill 自愿调用的附加能力,而是由 workflow-runner.js 统一执行的全局决策点。每个 workflow 都有显式策略:
required:写作、审阅、拆文、回炉、去 AI 味等必须成功装配相关记忆,冲突/相关污染未解决时阻断当前阶段。optional:扫榜、封面、导入等按需读取偏好或现有项目事实;不可用时带 warning 继续,但不得凭空补记忆。none:setup/update 只维护基础设施,不注入小说事实。
装配包必须绑定 workflow_id、book_root 与 target scope。不同作品、不同短篇项目、不同并行任务不得共享可变上下文。结果只有在 workflow result packet 被接受后才能进入记忆建议;污染建议隔离,高风险 canon/人物认知/伏笔时点/结构变化必须确认。
控制面与内容面必须分开:story-workflow 可直接读取 TaskStore、交互偏好和 StoryMemory 的计数摘要,用于首屏、恢复和路由;人物事实、钩子、作者声口等内容只能经本模块生成的 Memory Contract 交给专业子 skill。专业子 skill 回传读取回执与建议,不得直接改全局记忆。
长篇 workflow 还必须传入 lifecycle_context: { node, book_id, volume_id, stage_id, chapter_id, task_family_id, workflow_id }。装配顺序固定为 book -> volume -> stage -> chapter -> task:总纲节点只读作品与任务记忆,卷纲节点增加目标卷记忆,阶段节点增加目标阶段记忆,Brief/正文/提交节点才可增加目标章节记忆。卷纲审阅不得扫描或注入无关章节正文。
Packet Boundary
story-memory 仅由 story-workflow 或其 runner 代表 story-workflow 以 Workflow Packet 进入,并且仅向 story-workflow 返回 Result Packet。不得让用户直接调用内部 story-*;用户入口始终是 /novel-assistant。记忆层不直接召回写作、审阅或其他子 skill,也不决定下游生命周期。
- Workflow Packet 必须包含
lifecycle_node、asset_target、upstream_dependencies、review_requirement、memory_scope、read_set、write_set与result_write_set。 read_set是封闭只读集合:只能读取 Packet 明确指定的记忆账本、来源资产和任务状态;不得因装配方便扫描其他作品、其他任务或更低层级章节资产。result_write_set是允许在 Result Packet 中声明的实际记忆变更,必须是write_set的子集;未接受的建议、只读状态查询和未验证投影写[]。- Result Packet 必须含
asset_revision、review_decision、downstream_effects与lifecycle_transition_request。记忆层使用review_decision=not_applicable,除非 Packet 要求对记忆冲突或投影进行审阅;只能请求 L2 继续、停靠或回退,不能自行推进生命周期。
记忆文件
- 创作记忆:
追踪/memory/lorebook.jsonl - 当前出场与认知边界:
追踪/memory/active-cast.json - 记忆建议:
追踪/memory/memory-suggestions.jsonl - 记忆审计:
追踪/memory/memory-audit.jsonl - 工作流偏好:
追踪/workflow/preference-memory.jsonl - 短篇资讯学习:
追踪/private-short-extension/learning-ledger.jsonl - 作者声口与污染规则:
设定/作者风格/、追踪/schema/user-style-rules.jsonl、追踪/schema/output-pollution-rules.jsonl - 当前承诺/伏笔事实:
追踪/schema/promises.jsonl - 承诺/伏笔不可变事件:
追踪/story-system/promise-events.jsonl
脚本入口
查询工作流控制摘要(不泄漏剧情事实):
node scripts/workflow-control-summary.js --project-root <book-root> --json
短篇阶段的类型化快照由 scripts/lib/short-memory-snapshot.js 通过 StoryMemoryRepository 和 Memory Query 契约生成;其他题材 profile 复用同一内核,不得复制存储逻辑。
装配当前任务需要的记忆包:
node scripts/context-assembler.js --project-root <book-root> --task <workflow-task> --target <target-range> --budget <budget> --json
node scripts/context-assembler.js --project-root <book-root> --workflow-id <id> --lifecycle-node <node> --book-id <id> --volume <id> --stage <id> --chapter <id> --task-family-id <id> --budget <budget> --json
记录或应用记忆建议:
node scripts/memory-recommender.js --project-root <book-root> --input <suggestions.json> --write --json
node scripts/memory-recommender.js --project-root <book-root> --apply-low-risk --json
node scripts/memory-recommender.js --project-root <book-root> --confirm <suggestion-id-or-entry-id> --decision apply|reject --json
旧项目首次启用记忆时,先预览再迁移:
node scripts/memory-migrate.js --project-root <book-root> --json
node scripts/memory-migrate.js --project-root <book-root> --write --json
node scripts/memory-migrate.js --project-root <book-root> --source 追踪/伏笔.md --write --json
查询“我学到了什么”的可见状态:
node scripts/memory-recommender.js --project-root <book-root> --status --json
--status 只读账本,不改文件。返回字段必须用于用户可见说明:recentLearned 是已生效记忆,pendingConfirmations 是需要用户确认的高风险建议,nextEffects 是下次会影响的流程,autoApplicable 是可低风险自动应用的新增项。
记忆状态说明
每条记忆都有以下状态,你可以通过 --status 查看当前分布:
- active(生效中):当前权威记忆,会自动注入写作上下文。这是绝大多数记忆的状态。
- superseded(已取代):已有更新的已采纳版本替代它。旧版本保留在历史里可追溯,但不再注入正文。当你看到某条记忆被取代,说明后续章节采纳了更新的版本。
- archived(已归档):你显式归档的记忆,不再参与召回但保留可查。需要时可重新提出。
- rejected(未采纳):曾作为建议提出但未被采纳。不会影响写作。
注意:--status 的 recentLearned 只显示 active 记忆;visibilitySummary 显示各状态的条数。
使用流程
- workflow 进入写作、审阅、回炉、导入吸收、拆文吸收或去 AI 味前,先调用
context-assembler.js。 status=ok时,把packet_md注入领域子 skill;领域子 skill 不再广泛扫描无关记忆。 长篇包中的lifecycle_context与分层memory_sources是事实边界;领域子 skill 不得自行补扫更低层级资产。status=blocked_memory_conflict时,停在用户确认,不继续生成正文或报告。- 来源文件变化时,
context-assembler.js返回blocked_memory_stale,并列出需要显式运行memory-migrate.js --source ... --write的来源;它不得自行生成 legacy migration authority。显式迁移完成后重新装配,手工记忆、来源缺失、污染或事实冲突仍不得注入旧事实。 - 显式记忆迁移和章节提交共享书目级写入租约;另一个会话正在接受章节或投影记忆时返回
blocked_book_write_locked,不得用第二份 lorebook 覆盖第一份。 status=blocked_output_pollution时,先隔离污染,不能把污染记忆注入上下文。- 领域产物被用户接受后,可用
memory-recommender.js记录建议;高风险变更用--confirm ... --decision apply|reject闭环,不得只留下永久 pending。 短篇规划反馈的固定顺序是:Chat 意见 -> 影响分析 -> 用户确认最终方案 -> 事务回写素材卡/设定/小节大纲 -> 失效受影响 Brief -> 投影 planning-constraints 与 reader-promise -> 逐节复检。任何子 skill 都不得跳过 workflow 直接把聊天摘要写成 canon。 章节事务只有在 accepted commit 形成后才能增量投影;条目必须记录acceptedCommitId、valid_from、valid_to和生命周期身份。未接受、非任务族主分支、污染、已失效或来源陈旧的条目不得进入 active memory。 承诺/伏笔状态只接受 accepted chapter commit 中结构化promise_deltas的幂等投影。聊天意见、Agent 摘要、未接受候选稿和对整份伏笔.md的猜测都不能直接打开、推进或关闭承诺;同一 commit 重放不得重复追加事件。 - 用户问“你学到了什么 / 记住了什么 / 当前记忆状态”时,必须运行
--status,用落盘状态回答,不能凭聊天印象回答。
完整契约见 references/memory-contract.md。