做了什么
v0.6 的核心目标很明确:把 v0.5 的 flat snapshot state 升级为结构化的记忆系统。
v0.5 的游戏状态是一个扁平的 JSON 对象——loop、clock、ap_remaining、known_clues、carried_memory 全塞在一起。能做存档,不能做记忆。系统不知道线索是怎么来的、什么时候来的、可信度如何。
v0.6 把这拆成了分层 Runtime:
MemoryRuntime
├── Event Log → 发生了什么(不可变事件流)
├── Knowledge → 确认了什么事实
├── Belief → 在怀疑什么(未确认)
├── Timeline → 每个循环发生了什么
├── Archive → 跨循环保留的记忆
└── Relationship → NPC 关系状态
Event Log 是源头。Knowledge 和 Belief 是从事件投影出来的视图,不是独立存储。这意味着所有事实都有追溯——LLM 不能创造事实,因为事实只能由 Engine 产生事件。
新增 Deterministic Assistant 流水线
同时建立了”询问助手”系统。许知微现在可以帮助玩家整理已知线索,但不替玩家推理。
核心机制是一条 8 步确定性流水线:ClientState → CompanionViewBuilder → VisibilityFilter → IntentClassifier → PolicyEngine → ActionPlanner → FallbackTemplateEngine → OutputValidator → ResponseRenderer → UI。
关键设计决定:Assistant 从不接触 raw state。它只读 CompanionView(安全投影),其中 hidden truth、locked clues、future plot 被从结构上排除。防剧透不是让 LLM “别说”,而是让它根本不知道。
按 Slice 推进
整个 v0.6 分 3 个 Slice,每个 Slice 独立可验证:
- Slice 0:TypeScript 编译流程、接口定义、Assistant 骨架
- Slice 1:MemoryRuntime 核心引擎、Legacy 迁移、跨循环 Reset
- Slice 2:CompanionView ↔ MemoryRuntime 对接、ActionPlanner 基于真实数据评分
每个 Slice 结束后构建、测试全部通过后再进入下一个。累计 3 轮代码审查,5 CRITICAL + 7 HIGH 全部修复,零回归。
为什么重要
这不是一次简单的技术升级。它解决了三个根本问题:
- 记忆系统:现在玩家获得每个线索都有完整的溯源链(谁给的、什么时候、什么可信度)
- LLM 安全:CompanionView 是 LLM 唯一入口,hiddenTruthAccessible 始终 false——结构上保证不剧透
- 类型系统执行铁律:Engine 裁判、LLM 表达、Assistant 只读 View——这些不再是文档约定,而是编译器强制检查
后续
详细技术设计参见 Runtime 架构文章。当前 v0.6.1 已部署至 looptrain.me/play/game。