← 返回文档库
v0.12.0-replay-echo

Added

  • 时间线回放系统:失败后从上一轮时间线选择锚点接入
  • NPC 记忆残响系统:跨轮情感残留影响开场白和 LLM 表演
  • LLM Echo Guard:禁词检测 + 回退 Mock 模式
  • Runtime 事件记录系统:IndexedDB 前端封装(5 store + 降级策略)
  • 四层版本号体系:app / channel / release / story
  • 3 个新引擎测试(replay_resume / npc_memory_echo / llm_echo_guard)
  • POST /api/replay/resume 端点
  • 前端 ReplayAnchorPicker UI(失败结算卡内嵌)

Changed

  • engine.js startDialogue() 使用 resolveNpcOpening() 替代 npc.opening
  • server.js /api/health 返回四层版本字段
  • app.js 版本常量迁移到四层体系
  • 版本号从 v0.11.0 升级到 v0.12.0-replay-echo
  • Save Schema Version 从 1 升级到 2(breaking change)

Fixed

  • portrait-intro.js getBoundingClientRect is not a function(47 次控制台错误)
  • nextLoop() 遗漏 saveState() 导致刷新后丢失新轮次状态
v0.8.2-version-source

v0.8.2-version-source

日期:2026-06-21

新增

  • VERSION 文件 — 项目唯一版本源
  • scripts/sync_version.sh — 从 VERSION 自动同步到 11 个派生位置
  • scripts/check_cross_consistency.py — 5 项跨文档一致性检查
  • AGENT.md 规则 17-20(版本号单一源 / 收尾检查全覆盖 / 文档结构同步 / changelog 验证)

修复

  • 版本号不一致 9 处(MANIFEST 停留在 0.5,site.ts 与 site-status.json 矛盾等)
  • 文档结构过期 7 处(PROJECT_STRUCTURE 引用不存在的 TBD/ 等)
  • Devlog 公开展示层 4 处陆成→赵乘警修正
  • site.ts 死代码 CURRENT_VERSION/CURRENT_PHASE 删除

已知问题

  • 当前对话引擎为 Mock 模式,NPC 对话文本为预设模板
  • 存档系统仍为 localStorage,后续需迁移 IndexedDB
  • 无 Playwright 回归测试
v0.8.1-save-versioning

v0.8.1 — 存档版本检测与 Breaking Change 强制重置

日期:2026-06-20

新增

  • 存档版本化:新增 SaveMeta 结构(6 字段:appId, saveSchemaVersion, runtimeVersion, storyVersion, createdAt, updatedAt),写入 lt:save:meta
  • lt: key 体系lt:save:metalt:save:runtimelt:save:memorylt:save:goalslt:settings,统一命名前缀
  • 版本检测与强制重置:启动时自动检测旧 looptrain.standalone.v1 存档和 saveSchemaVersion/storyVersion 不匹配,弹出重置引导模态框
  • 重置模态框:区分 legacy 数据检测(「新版试玩已重构」)和 incompatible version(「剧情版本不匹配」)两种场景文案
  • 手动重置三路径
    • UI 按钮:命令栏「🔄重置」→ 确认对话框 → 清除并重建
    • URL 参数:?reset=1,处理完成自动移除参数
    • 开发者控制台:window.LT_RESET(),清除后刷新页面
  • 旧数据归档:旧 looptrain.standalone.v1 数据归档到 lt:legacy:<timestamp>,开发侧保留可调试
  • IndexedDB 旧库清理:启动时异步删除 LoopTrainDBLoopTrainRuntimeDBLoopTrainMemoryDB,新版使用 LoopTrainMemoryDB_v0_8 隔离
  • 版本升级分级策略:Patch(不重置)→ Minor(可写 migration)→ Major/Breaking(必须重置)

变更

  • 存档从单 key looptrain.standalone.v1 迁移到双 key lt:save:meta + lt:save:runtime
  • init() 流程重构为 4 路径分流:新玩家、旧数据归档、版本不兼容强制重置、兼容存档正常恢复
  • AudioManager 静音设置迁移到 lt:settings{ muted: boolean }),跨版本保留
  • resetGame() 升级为新存档系统(detectLegacyKeys → archiveLegacyData → clearLtKeys → initNewSave
  • 数据安全:清除操作只匹配 lt: 前缀且排除 lt:legacy:lt:settings,不清空整个 localStorage

影响

  • BREAKING:旧存档(looptrain.standalone.v1)完全不兼容,首次进入新版时强制重置
  • 旧数据归档保留在 lt:legacy:<timestamp>,玩家不可见,开发侧可调试
  • 用户设置(静音偏好)跨版本保留
  • 本版不做旧数据迁移,后续 Minor 版本可写 migration 逻辑

验收

  • 14 条验收标准全部通过(代码路径覆盖 + smoke test 验证)
  • node --check 语法检查通过
  • npm test 全部 7 个测试块通过
v0.7-goal-command-xu

v0.7 — Goal Engine + 指令系统 + 许知微

日期:2026-06-19

新增

  • Goal Engine 模块:声明式 DSL 条件判定器(all/any/not/clueKnown/factConfirmed/eventOccurred/stateEquals),递归可测试,JSON 外置
  • 指令系统:12 条指令,4 分类(information/memory/action/interaction),command-registry.json 统一声明,触发词匹配
  • 许知微主动引导:游戏开始后自然入场(立绘动画),三轮渐进引导(介绍目标→轻提示→确认熟练度),对话限制(只解释不执行)
  • 指令栏:底部常驻目标栏 + 指令栏(线索/人物/记忆/帮助),第 4 轮收起
  • 目标完成正反馈:卡片弹出式通知(目标完成 + 新目标提示 + 记忆记录)
  • 立绘入场动画(PortraitIntro):NPC 头像从全屏缩放到对话框头像位,Web Animations API

修复

  • 指令结果从隐藏日志抽屉改为可见内容区域渲染
  • 许知微欢迎语触发时机从 init() 移到游戏开始后 2 秒自然触发
  • 场景 JSON 文件改为从独立文件加载

已知问题

  • Goal Engine 对传入定义对象有副作用(JSON 重新加载时影响低)
  • app.js 接近 800 行,建议后续拆分
v0.8-testplay

v0.8 — 《寒灯初醒》试玩版内容

日期:2026-06-19

新增

  • 故事重构:正式名《LoopTrain:寒灯初醒》,1939 年冬江城号列车,14:00→14:15 时间线
  • 新角色:灰衣乘客(不揭示阵营,替代沈墨寒)。赵乘警保留原名(方案中的陆成未采用)。主角代号”寒灯”(试玩结尾揭示)
  • 新场景:二号车厢、三号车厢、连接处(替代原第七节车厢)
  • 8 条核心线索:含 1 条派生线索(3 条满足后自动生成)
  • 8 个行动目标:分三轮激活,loopRange + DSL 复合条件,GoalEngine 判定
  • 3 轮结算文本:每轮含结果、新增线索、下一轮建议、许知微复盘
  • 世界时间线:8 个预编排事件(14:02-14:15)
  • 电影式开场:字幕滚动 + 许知微故事整合型首次对话
  • 试玩结尾:爆炸仍发生但三号车厢已清空,“寒灯”代号揭示
  • 内容完全外置:10 个内容文件在 materials/runtime/,代码与内容分离

修复

  • NPC 芯片改为纯名称显示,许知微绿色样式区分
  • 立绘入场动画孤儿遮罩层修复(try/finally 保证清理)
  • 许知微欢迎语不再干扰活跃对话(state.mode === 'dialogue' 守卫)
  • 对话面板从底部 35vh 扩展到场景卡片到输入栏之间的全部空间
  • 场景 JSON 文件路径统一为 underscore 命名
v0.4.3

v0.4.3

日期:2026-06-13

新增

  • 公网试玩入口:支持 ?looptrain=game Game Shell 模式,隐藏 SillyTavern 原始界面。
  • 移动端基础界面:手机竖屏游戏覆盖层初步可用。
  • window.LoopTrain.getDiagnostics():新增诊断接口,可检查资产路径、LLM 连接状态等。
  • 正式建立 LoopTrain 开发日志网站项目。
  • 新增本地 looptrain/standalone/ 原型,开始剥离 ST 的 Standalone MVP 验证。
  • 新增 LT_STANDALONE_ARCHITECTURE.md,明确 v0.5+ 独立运行时迁移方向。
  • 音效系统进入结构设计阶段,明确 AudioManager、音频 manifest 和事件绑定方案。

修复

  • LLM Raw Bridge 切换:从 generateQuietPrompt 改为 generateRaw,不再依赖 SillyTavern 当前的 chat_namechat file
  • 立绘资源路径修复:统一到 /scripts/extensions/third-party/LoopTrain/,解决小宁立绘 404 问题。

已知问题

  • Server Plugin 未连接时,部分状态无法持久化回退到本地 Mock。
  • 首次进入时 SillyTavern 原始界面可能短暂闪现。
  • 小宁立绘资源在某些部署环境下仍可能加载失败。
  • 移动端遮罩和开场字幕在不同屏幕尺寸下仍需调整。
  • 音效系统仍未接入真实素材,当前仅完成结构设计。
  • Standalone MVP 仍为本地验证版本,线上 /play/game 暂未切换。
  • 部分 NPC 对话链路和行动触发条件仍为占位。
v0.5.0-standalone

v0.5.0-standalone

架构

  • ST 完全剥离:删除所有 st-extension/st-server-plugin/st-character-cards/mock-harness/
  • SLT 独立运行时looptrain/standalone/,Node + Express 本地服务器(端口 3030)。
  • 引擎独立engine.js 保持为纯裁判引擎,不依赖 ST 或数据库。
  • LLM Bridge:DeepSeek 集成 + Mock 回退。API Key 仅在后端 .env/api/config 只暴露布尔值。

代码质量

  • 内容去重app.js 移除与 engine.js 重复的 countValidEvidencecurrentGoalgetSuggestions,改为通过 API 获取。
  • 安全清理.env.example 中的真实 API Key 已清除,新增 .gitignore
  • 空目录清理:删除 todos/architecture/
  • 文档更新:修订 6 个文件中引用已删除 ST 路径的内容。

UX/UI

  • 移除快捷行动按钮:对话模式上方的建议芯片全部移除,界面更简洁。
  • 无障碍:文本域增加 aria-label,焦点环替换为金色发光 box-shadow
  • 触控优化:NPC 芯片、频道标签、发送按钮等全部 min-height ≥ 44px。
  • color-scheme: dark:消除白色背景闪烁(FOUC)。
  • prefers-reduced-motion:尊重系统减动偏好,禁用持续性动画。
  • backdrop-filter 降级:不支持模糊的设备自动切换纯色背景。
  • stale dialogue 锁死修复:页面重载时自动清除残留的对话状态。

Devlog

  • 版本号全局统一至 v0.5.0-standalone
  • 新增 changelog/v0.5.0-standalone.md
  • play.astro / about.astro / site.ts / site-status.json 同步更新。

已知限制

  • 真实 LLM Bridge 仍需增强 NPC 表演质量。
  • 音效系统尚未实现。
  • /play/game 已切换到 standalone runtime,但仍需补充状态持久化能力。
  • 内容尚未完全外置化。
  • 角色素材风格尚未统一,沈墨寒立绘存在加载稳定性问题。

升级路径

从 v0.4.3 试玩版(ST Game Shell)到 v0.5.0-standalone:

  1. 本地启动不再需要 SillyTavern。
  2. 默认 Mock 模式,无需 API Key。
  3. 命令行启动:bash scripts/start_slt.sh,验证:bash scripts/verify_slt.sh