From fa8bd0dfd37883a73606c3748946366752b3ecd0 Mon Sep 17 00:00:00 2001 From: Codex Date: Tue, 28 Jul 2026 13:07:53 +0800 Subject: [PATCH] docs: record first parallel implementation wave --- README.md | 12 +++- docs/status/2026-07-28-m1-wave1.md | 107 +++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 docs/status/2026-07-28-m1-wave1.md diff --git a/README.md b/README.md index 3f98170..a8834e3 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ ## 当前阶段 -M0:工程骨架与领域契约冻结。 +M0 契约基线已建立;M1/M2 第一批可并行能力已集成。 -已建立: +目前包括: - Tauri 2 + Vue 3 + TypeScript 工程; - Rust workspace 与模块所有权边界; @@ -14,7 +14,13 @@ M0:工程骨架与领域契约冻结。 - 生成的 JSON Schema 与 TypeScript DTO; - canonical `PlayerView` fixture; - 最小娜娜内容包; -- 静态主演出屏与窄 Tauri 命令。 +- 原子化状态 reducer,覆盖关系、许诺、知识、持有物、时钟与判定; +- 可验证追加、恢复和回溯分叉语义的内存 StoryStore; +- Turn 请求/结果校验、Fake Provider 与确定性世界书触发; +- 可交互的主演出屏、持有物/线索/许诺、关系与回溯面板。 + +浏览器模式目前使用确定性的本地 Turn adapter。SQLite、真实 LAPP Turn +循环和分支持久化仍在后续里程碑中。 ## 开发 diff --git a/docs/status/2026-07-28-m1-wave1.md b/docs/status/2026-07-28-m1-wave1.md new file mode 100644 index 0000000..0f9169e --- /dev/null +++ b/docs/status/2026-07-28-m1-wave1.md @@ -0,0 +1,107 @@ +# M1/M2 第一并行波次状态 + +日期:2026-07-28 +集成分支:`integration/v1` +契约基线:`3dacc92` + +## 本波次目标 + +在不修改公共领域契约的前提下,同时推进: + +- Core:确定性状态 reducer; +- Runtime:Turn 边界与确定性世界书选择; +- Experience:基于同一 `PlayerView` 的可交互假数据体验; +- Integrator:分支追加、恢复与回溯语义的存储接口。 + +游戏运行时仍为单模型。本波次使用 `FakeProvider` 和浏览器本地 adapter, +不引入导演 Agent 或其他运行时子智能体。 + +## 已集成 + +### State Engine + +- `apply_delta` 是状态变化的唯一纯函数入口。 +- 整个 delta 先作用于克隆状态,任一操作失败则不提交部分结果。 +- 支持全部当前 `StateOp`。 +- 六维关系使用有向键 `from->to`,数值范围为 `0..100`。 +- 单个关系操作限制为 `±8`。 +- 许诺 ID 唯一并执行生命周期约束。 +- 知识、物品和判定记录 ID 唯一。 +- 物品转移验证当前 holder,保留 owner。 +- 判定按 `action_id` 复用:完全相同的记录幂等,冲突记录拒绝。 +- 时钟推进不会超过上限。 + +### Store Seam + +- `InMemoryStoryStore` 提供无数据库的确定性集成测试实现。 +- 节点与物化状态的 story、branch 和 current node 必须一致。 +- 同一分支只允许追加到当前 head。 +- 新分支可以从同一故事的旧节点创建。 +- 创建新分支不会移动原分支 head。 +- 所有校验先于写入,失败不会留下部分节点或状态。 + +这不是 SQLite 的替代品。后续 SQLite 实现必须保持同一追加与分支语义。 + +### Runtime Seam + +- `TurnRequest` 在调用 provider 前验证。 +- `speak_or_act` 拒绝空白输入;`continue` 允许空输入。 +- provider 返回后校验 story、branch、committed node 与 `PlayerView` 一致。 +- provider 错误映射为稳定、脱敏的 `TurnFailure`。 +- `FakeProvider` 按 FIFO 返回录制结果。 +- 世界书通过 required flags、tags 和 keywords 确定性选择。 +- 选择结果保持输入顺序、按 ID 去重并限制最多 8 条。 + +### Experience + +- 自由输入和“继续”经过同一 `TurnRequest → TurnResult` 边界。 +- 点击行动建议只填入输入框,不自动提交。 +- 提交期间清空输入并显示忙碌状态。 +- 最近的短演出节拍连续显示。 +- 持有物/线索/许诺、模糊六维关系、故事回溯为互斥面板。 +- 所有面板只读取 `PlayerView`。 +- 回溯入口明确标记为尚未持久化,不伪装成已创建分支。 +- Escape、ARIA 和键盘焦点具备基础支持。 + +## 已通过验证 + +```text +node scripts/verify-contracts.mjs + 15 schemas and TypeScript DTO source hash verified + +vue-tsc --noEmit + +vitest run + 3 test files passed + 11 tests passed + +vite build +``` + +Web 侧仍未发现契约漂移,生产构建成功。 + +## 尚未通过 + +当前 Work 环境仍没有 `cargo`、`rustc` 和 `rustfmt`。因此本波次新增的 +Rust reducer、runtime 和 store 测试尚未实际编译或执行,M0 的 Rust/Tauri +门也仍然未关闭。 + +必须在 Rust 1.96 环境执行: + +```text +cargo fmt --all -- --check +cargo clippy --workspace --all-targets -- -D warnings +cargo test --workspace +cargo run -p nana-contracts -- --check +pnpm tauri dev +``` + +在这些命令通过前,不把 M0 或 M1 标记为完成。 + +## 下一波次 + +1. 在 Rust 1.96 环境修正首次编译、格式和 Clippy 问题。 +2. 为 `RuntimeState` 增加脱敏 `PlayerView` 投影实现和泄密测试。 +3. 在同一 `StoryStore` 语义下实现 SQLite 事务、节点与检查点。 +4. 将浏览器本地 Turn adapter 替换为 Tauri `submit_turn` 命令。 +5. 用“天亮前一定回来”fixture 串起许诺、希望变化、保存、恢复和回溯分叉。