Merge branch 'master' into codex/phaser-directproject-migration
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled

This commit is contained in:
2026-09-14 13:57:05 +08:00
21 changed files with 591 additions and 53 deletions
@@ -0,0 +1,34 @@
# 【实施计划】项目客户端占用锁收敛-2026-09-14
Version: 1
Status: in-progress
Date: 2026-09-14
Milestone: `【里程碑】项目客户端占用锁收敛-2026-09-14.md`
## 代码边界
- `apps/ai-game-creator-shell/src-tauri/src/project/write_lock.rs`
- `apps/ai-game-creator-shell/src-tauri/src/runner/project_owner.rs`
- `apps/ai-game-creator-shell/src-tauri/src/runner/protocol.rs`
- 锁恢复、Runtime 写入和 Runner owner 定向测试
## 修改顺序
1. 统一同进程嵌套调用的项目锁语义,禁止自等待。
2. 盘点并迁移 Runner 的项目级 owner 文件到统一锁,保留诊断投影与跨 boot 恢复。
3. 删除重复项目级锁路径及其专属调用,保留底层原子写和 Git 锁。
4. 补齐同进程重入、跨进程占用、崩溃恢复和锁释放测试。
## 验证命令
- `cargo fmt --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml -- --check`
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml project_write_lock_reuses_same_process_owner_and_releases_on_drop --no-default-features`
- Runner owner 与 response stream 相关定向测试
- `npm run check:encoding`
- `git diff --check`
## 风险与回滚点
- Runner 与 GUI 可能是不同进程;统一锁前必须验证同一客户端不会互相阻塞。
- 旧 `.agent/runtime/execution-owner.lock` 残留需要按 PID/启动身份安全回收,不能直接删除。
- 若跨 boot 恢复或 GUI/Runner 联动回归,回滚统一路径迁移,保留已验证的同进程重入修复。
@@ -0,0 +1,28 @@
# 【里程碑】项目客户端占用锁收敛-2026-09-14
Version: 1
Status: in-progress
Date: 2026-09-14
Parent Spec: `docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md`
## 目标
项目只保留一个面向客户端占用的项目级跨进程锁,防止多个客户端同时打开同一项目;同一客户端进程内的嵌套调用复用既有项目锁,不因自身持锁进入等待。
## 边界
- 项目客户端占用锁与项目写入调用的职责统一,跨进程竞争仍返回占用语义。
- Agent DB、session lane、manifest 原子写和 Git 自身的底层一致性机制不在本里程碑删除范围内。
- 不改变项目 revision、权限、幂等、恢复和数据格式合同。
## 验收标准
- 同一进程内嵌套取得项目锁立即返回 advisory guard,不等待、不删除真实持有者锁。
- 不同进程持有项目锁时仍保持占用失败与残留回收判据。
- 客户端项目占用入口与 Runtime 写入入口不会各自维护第二个项目级锁文件。
- 锁释放后下一客户端可重新取得锁。
- 定向 Rust 锁测试、`cargo fmt --check`、`npm run check:encoding`、`git diff --check` 通过。
## 未决事项
- Runner 的 `execution-owner.lock` 如何迁移到统一客户端占用锁,需要补充跨进程启动、恢复和诊断测试后再落地。
@@ -5495,3 +5495,10 @@ Cocos Creator 根目录由 `package.json.creator.version` 与普通 `assets/`
- **真机判据**:点进任一栏目(或展开「所有资源」)时,**每一张**卡片都从它那一摞的位置/尺寸位移并缩放到自己的位置,而不只是总览里那 3 张;同一栏目里不同类型的两摞各自飞各自的卡。`prefers-reduced-motion: reduce` 下仍不播放动画(口径未改)。
- **已知未覆盖**:① 子画布内直接切到另一个栏目(分页画布换栏目)时目标栏目的卡片在该次 `begin` 时未渲染、拿不到任何 First,整段转场仍按旧口径跳过(`play` 的 `!captured.entries.size` 早退),本次未改;② 真机动画观感由浏览器渲染,jsdom 只覆盖几何与调用契约,需要按上面那条判据人工确认一次。
- **关联**:`apps/ai-game-creator-shell/src/view/project-development/resourceBookController.ts`(`begin` 的堆锚点 / `syncNodes` 的合成 First)、`resourceBookLayout.ts`(`allOpen` 列号)、`index.tsx`(宿主 `data-resource-book-stack-*`)、`apps/ai-game-creator-shell/tests/{resourceBookController,resourceBookLayout}.test.ts`、`tests/appSurface/project-development.suite.ts`、`docs/technical/【技术方案】GameAgent资源自由画板与快速编辑-2026-08-20.md`。
## 稳定版 AGC 复用开发栈必须核对 instance identity
- 现象:端口和 `/healthz` 都正常,但 AGC 连接了另一个 worktree 的 API、SpacetimeDB 或旧 Vite,表现为登录、项目列表、Runner 状态与当前代码不一致。
- 原因:健康检查只能证明“有服务响应”,不能证明服务属于当前工作树;旧 `.app/dev-stack.json` 可能没有当前 `repoRoot`、`instanceId` 和服务级 dataDir 身份。
- 处理:先读取 `.app/dev-stack.json`,核对顶层 `repoRoot + instanceId`,再核对服务 `repoRoot + instanceId + dataDir + pid + port`;AGC Vite marker 还必须带 `repoRoot + processId + port`。任何字段缺失或不匹配都拒绝静默复用,改为启动当前工作树自己的服务或明确提示清理。
- 验证:`scripts/dev.test.ts`、`apps/ai-game-creator-shell/tests/start-dev-stack.test.ts` 覆盖 snapshot identity 和旧状态拒绝复用;运行时记录实际端口、进程命令行和 dataDir,不要只记录 HTTP 200。