diff --git a/README.md b/README.md index 6f12d31..92bee52 100644 --- a/README.md +++ b/README.md @@ -21,18 +21,21 @@ M0 契约基线已建立;M1 状态、投影与持久化主链已经接通,M2 - `RuntimeState → PlayerView` 脱敏投影与隐藏信息 canary 测试; - `TurnPlan → reducer → SQLite → PlayerView` 单轮提交链; - 随故事节点持久化并恢复 scene、expression、pose、beats 与 suggestions; -- 基于 `lapp-rs` 的非流式 LAPP TurnPlan provider 与严格输出校验; +- 确定性的场景上下文编译器,按固定顺序筛选角色卡、Persona、世界书、剧情事件与可见记忆; +- 引擎掌控的类型化隐藏检定循环,模型只收到定性结果,不能指定或读取骰点、难度与精确数值; +- 基于 `lapp-rs` 原生工具消息的 LAPP TurnPlan provider 与严格输出校验; +- 从任意当前线路历史节点创建真实持久化分支,旧线路与新线路保持隔离; - Turn 请求/结果校验、Fake Provider 与确定性世界书触发; - 可交互的主演出屏、持有物/线索/许诺、关系与回溯面板。 浏览器模式继续使用确定性的本地 Turn adapter,方便无桌面壳开发;Tauri -模式已经通过 `submit_turn` 使用 SQLite 自动保存和恢复。当前桌面端 provider -仍是确定性的娜娜纵切实现。真实 LAPP provider 已实现并通过注入式测试,但会等 -上下文编译和引擎掌控的类型化隐藏检定工具循环完成后再设为默认。 +模式已经通过 `submit_turn` 使用 SQLite 自动保存和恢复,并通过 `fork_branch` +创建持久化分支。桌面端默认使用真实 LAPP provider;只有显式设置 +`NANA_STORY_PROVIDER=demo` 时才启用确定性的娜娜纵切实现。 -Rust 1.96 下的核心测试、Clippy、契约生成检查和 Tauri 全 target 类型检查已经 -通过。当前 Linux Work 环境缺少 WebKitGTK 等桌面开发库,因此真实桌面窗口启动 -与 Windows 打包仍需在具备原生依赖的环境补跑。 +Rust 1.96 下的核心测试、Clippy、契约生成检查、Tauri 全 target 类型检查与后端 +单元测试已经通过。当前 Linux Work 环境缺少 WebKitGTK 等桌面开发库,因此真实 +桌面窗口启动与 Windows 打包仍需在具备原生依赖的环境补跑。 ## 开发 @@ -55,6 +58,12 @@ pnpm verify pnpm tauri dev ``` +不配置 LAPP、仅运行确定性纵切时: + +```bash +NANA_STORY_PROVIDER=demo pnpm tauri dev +``` + 只验证前端和已提交契约时可运行: ```bash diff --git a/docs/status/2026-07-28-m1-wave4.md b/docs/status/2026-07-28-m1-wave4.md new file mode 100644 index 0000000..5bbd9e5 --- /dev/null +++ b/docs/status/2026-07-28-m1-wave4.md @@ -0,0 +1,84 @@ +# M1/M2 第四并行波次状态 + +日期:2026-07-28 + +## 基线 + +本轮从已验证归档中的 wave3 提交 `4de42e3` 恢复完整源码,并以 +`cf9507a` 记录恢复点。随后按 Context、Adjudication、Branch Store 三条互不修改 +公共契约的工作线并行开发,由集成线统一完成契约、Tauri、前端和交叉审查。 + +## 已完成 + +### 确定性上下文编译 + +- 按固定章节顺序编译 CharacterCard、Persona、依赖范围内的 WorldBook、可触发的 + PlotEvent 与三类可见记忆。 +- 世界书继续使用显式标签、关键词与 flag,不引入向量库。 +- 将玩家、主角色和共享记忆分区;不输出完整 `RuntimeState`、精确关系、时钟、 + 世界 flag、物品隐藏事实、NPC 持有物或 NPC 私密许诺。 +- 支持确定性预算裁剪,并为顺序、选择、预算和泄密边界建立测试。 + +### 引擎掌控的隐藏检定 + +- 新增类型化 `HiddenCheckRequest`、`AdjudicationCatalog` 与有界工具循环。 +- 检定随机性由故事、分支、行动和检查标识确定;模型不能提供 + `RecordCheck`,也不能伪造最终玩家视图。 +- 引擎验证角色、技能、物品、推骰与难度,持久化实际结果;模型只收到 + 成功/困难成功/极难成功/失败等定性结论。 +- `LappAdjudicationModel` 使用 LAPP 原生工具调用续写同一会话: + `request_hidden_check → tool result → submit_turn_plan`。 +- 工具返回和后续上下文不包含骰点、目标值、难度或角色精确数值。 + +### 真实回溯分支 + +- 新增 `ForkBranchRequest` / `ForkBranchResult` 及对应 Schema、TypeScript DTO、 + Tauri 命令和前端桥接。 +- 内存与 SQLite StoryStore 都能从已保存历史节点创建分支;SQLite 在单个 + `IMMEDIATE` 事务中完成校验和分支头写入。 +- 分支标识、来源节点、节点 JSON、物化状态和状态哈希均经过验证。 +- 新分支首次追加从来源节点继续,原线路头不移动;重复、未知或损坏来源均原子失败。 +- 回溯面板的“从这里继续”已经调用真实桌面命令,并拒绝过期线路头或非当前可见 + 祖先节点。 + +### 运行时接线 + +- Tauri 默认启用真实 LAPP adjudication provider;显式 + `NANA_STORY_PROVIDER=demo` 才使用确定性 provider。 +- 提交与分叉共享操作锁,避免验证来源节点后被并发提交抢先改变线路头。 +- 缺失或不可用的 LAPP 配置会返回 provider 错误,不会静默伪装成 AI 回复。 + +## 交叉审查修正 + +- CharacterCard 与 ItemSpec 使用资源标识的最后一段映射运行时角色/物品标识, + Persona 明确映射为玩家。 +- `usable=false` 的物品不能作为检定修正。 +- 困难和极难检定会将未达到所需成功等级的原始成功正确降为失败。 +- 浏览器演示适配器保留确定性回溯体验,但不冒充桌面 SQLite 的权威持久化语义。 + +## 验证门 + +最终验证结果: + +- Rust 1.96 `cargo fmt --check` 通过。 +- 107 项核心 Rust 测试通过:Domain 5、Engine 21、Runtime 53、Store 28。 +- 核心与 Tauri Clippy `-D warnings` 通过。 +- Tauri 全 target 类型检查及 8 项后端单元测试通过。 +- 18 份契约的生成、Schema 与 TypeScript DTO 哈希一致。 +- TypeScript 严格检查、14 项 Web 测试与 Vite 生产构建通过。 + +## 尚未关闭 + +- 当前 Linux Work 环境缺少真实 WebKitGTK 开发包;Tauri Rust 代码可编译检查, + 但没有宣称真实窗口启动或原生打包通过。 +- LAPP 通过脚本化传输验证了完整工具消息与续写载荷;仍需在具备用户 LAPP profile + 和网络访问的桌面环境做一次真实模型冒烟。 +- 分支已持久化且可恢复,但应用启动仍默认打开主分支;跨分支浏览、活动分支记忆与 + 分支命名留到下一波。 + +## 下一波 + +1. 增加分支列表、活动分支持久化和跨分支时间线。 +2. 完成 LAPP profile/model 设置、错误恢复界面与真实模型冒烟。 +3. 将“天亮前回来”扩成可连续游玩的完整娜娜纵切。 +4. 在 Windows CI/打包环境验证安装包、升级与存档路径。