做了什么

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 全部修复,零回归。

为什么重要

这不是一次简单的技术升级。它解决了三个根本问题:

  1. 记忆系统:现在玩家获得每个线索都有完整的溯源链(谁给的、什么时候、什么可信度)
  2. LLM 安全:CompanionView 是 LLM 唯一入口,hiddenTruthAccessible 始终 false——结构上保证不剧透
  3. 类型系统执行铁律:Engine 裁判、LLM 表达、Assistant 只读 View——这些不再是文档约定,而是编译器强制检查

后续

详细技术设计参见 Runtime 架构文章。当前 v0.6.1 已部署至 looptrain.me/play/game