## 背景 这是一个独立的 CI 修复 PR,针对 Backend 与 Native shell 测试失败进行修复,不包含资源画布功能变更。 此前 CI 失败主要集中在: - 后台精选素材契约测试初始化缺少来源素材字段。 - `spacetime-module` host 测试因缺少 SpacetimeDB WASM 宿主 ABI 符号而无法链接。 - Native shell 自主创作模式、runtime action、provider batch 和测试初始化之间存在状态机断言不一致。 - 部分失败测试曾被临时绕过,本 PR 恢复这些测试门禁。 ## 变更内容 ### Backend - 补齐后台精选素材 payload 测试所需的来源素材字段。 - 增加 camelCase 序列化断言,防止 snake_case 字段泄漏。 - 调整 server-rs workspace 测试拆分: - 普通 workspace host 测试继续排除 `spacetime-module`,避免其 `spacetime-types` feature 污染其他领域 crate 的 host 链接。 - 新增独立的 `spacetime-module` 单元测试步骤,不再跳过该模块自身测试。 - 为 host 测试构建提供仅测试期的 SpacetimeDB ABI 链接支持。 - 同步更新 CI workflow 断言、开发流程文档和运维验证文档。 ### Native shell - 恢复被临时跳过的 Native shell 失败测试门禁。 - 修复自主创作模式下的完成条件、runtime action 执行、provider batch 和 finalization 状态流转。 - 修正 Tauri/native 测试初始化、恢复流程及断言,使测试与实际运行时协议保持一致。 - 保持自主创作模式的宽松行为,不通过忽略测试规避失败。 ## 验证 当前提交已完成以下本地验证: - `cargo test --locked -p spacetime-module --no-fail-fast` - 259 个测试 - 258 个通过 - 0 个失败 - 1 个已有的外部 fixture 测试 ignored - `cargo check --locked -p spacetime-module --target wasm32-unknown-unknown` - `cargo build --locked -p spacetime-module --target wasm32-unknown-unknown` - `cargo check --locked -p api-server --all-targets` - `npm run check:server-rs-ddd` - `npm run check:spacetime-schema` - `npm run check:encoding` - `npm run test -- scripts/project-ci-workflow.test.ts` - `cargo fmt --manifest-path server-rs/Cargo.toml --all -- --check` - `git diff --check` 没有新增 `#[ignore]` 来规避失败。 ## 测试边界说明 `spacetime-module` 的 host ABI 链接支持仅用于执行纯单元测试,不是 SpacetimeDB runtime 替身。Reducer、procedure 和真实数据库事务行为仍需要通过真实 SpacetimeDB runtime/integration harness 验证。 本机 Windows 上完整 workspace 测试中的 `wallet_refund_outbox` 测试仍有 11 项因 `os error 5(拒绝访问)`失败,表现为临时文件权限/锁定问题;该问题与本 PR 的 SpacetimeDB 模块测试改动无关,也没有通过忽略这些测试来掩盖。 Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/209 Co-authored-by: suzmii <suzmii@qq.com> Co-committed-by: suzmii <suzmii@qq.com>
5.8 KiB
开发工作流
更新时间:2026-08-27
标准流程
确认工作树与目标分支 → 读取入口和当前专题 → 查代码真相 → 小步修改 → 定向验证 → 更新当前文档/记忆 → 检查提交边界
任务开始时先写清一句话交付结果、验收判据和不做项,再按“必须项 / 风险项 / 可选项”排序。先完成修改、定向验证和边界检查组成的最小闭环;设置时间盒和检查点,新增发现只有在影响交付判据时才扩大范围,否则记录为后续事项。不要让工具探测、历史整理或验证便利自行改变任务目标。
开始前
- 运行
git status --short,保留用户已有的未提交修改;不要在共享工作树中使用破坏性 Git 命令。 - 复杂任务先读
AGENTS.md、docs/【协作规范】Agent工作入口与执行准则-2026-06-22.md、docs/README.md和对应专题。 - 后端事实以
server-rs/crates/api-server/src/app.rs、server-rs/crates/api-server/src/modules.rs、Cargo manifest、SpacetimeDB schema 和源码为准;现役 API 不从未挂载模块推导。 - External v1 以
docs/openapi/genarrative-external-v1.openapi.json与modules/external_api.rs为准。 - 本地端口的默认值只用于启动配置;实际运行端口以
.app/dev-stack.json和启动日志为准。 - 任务涉及 SpacetimeDB schema 时,先读
docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md与现有 schema 检查脚本,不依赖仓库中已不存在的旧表目录或基线文件。
修改边界
- 后端路线固定为
server-rs + Axum + SpacetimeDB,访问 SpacetimeDB 统一经spacetime-clientfacade。 module-*放领域规则,spacetime-module放表和事务,api-server放 HTTP/SSE/BFF,platform-*放外部副作用,shared-contracts放 DTO 与公开契约。- 前端不承接正式业务真相;页面状态必须来自后端投影、API 或持久化合同。
- 旧模板、旧公开作品、旧运行态、旧 Node/Express/PostgreSQL/Go/maincloud 路线和人工
spacetime --root-dir命令不作为新实现目标。 - 已退役对象没有现役 caller、公开契约、持久化迁移或活跃实例时,不添加兼容代码、兼容测试、墓碑注释或墓碑文档。
- 修改中文文件优先局部补丁,保持 UTF-8;不把中文文案替换成英文。
文档维护
- 当前稳定合同进入
docs/;长期决策、通用流程、排障经验进入shared-memory/。 plans/只保存正在执行且有明确下一门禁的计划;todos/只保存真实开放且有关闭条件的事项。完成或作废后删除或融合。- 不把分支名、一次性测试轮次、提交流水账和个人路径写成长期规则。
- H5 HostBridge 真实调用链的临时替身词扫描必须覆盖生产调用链;宿主壳真实能力以现行 HostBridge 协议与代码为准。
验证路由
SpacetimeDB 任务统一先读取 .codex/skills/genarrative-spacetimedb/SKILL.md;该项目适配层按需调用已安装的官方 spacetimedb 插件 skill,插件提供通用 SDK/CLI/MCP 知识,项目 skill 负责 Genarrative 架构边界和验证门禁。
按改动范围选择定向门禁,不以无关全量扫描代替契约验证:
| 范围 | 至少运行 |
|---|---|
| 文档 / 中文文本 | npm run check:encoding、git diff --check |
| 前端 | 相关 Vitest、类型检查;需要时做桌面/移动视口 smoke |
| Rust 后端 | 对应 crate 的 cargo test / cargo check、/healthz smoke |
| External v1 | OpenAPI 解析、实现/DTO 契约测试和鉴权 smoke |
| SpacetimeDB schema | npm run spacetime:generate、npm run check:spacetime-schema、运行时访问检查 |
| AGC / DirectProject | 使用 docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md 中的当前定向门禁;真实 Provider/登录缺失必须记为未验证 |
| 生产发布 | 当前开发运维文档、脚本门禁、主机进程、备份和公开端点证据 |
只有 cargo check/test/clippy/fmt/build、npm test、规范命名的 npm 验证脚本和精确 node --test 形成验证凭证;git、rg、cargo metadata 和普通 npm run 只作为诊断。
提交前
- 查看 staged diff 和
git diff --check。 - 确认没有密钥、
.env、Cookie、日志、缓存、数据库 dump、构建产物或个人路径。 - 确认相关当前文档与共享记忆已同步,且 docs 入口没有指向已删除或退役实现依据。
- 提交标题使用中文,标题后逐行写明本次变更。
Gitea CI 依赖闭合
.gitea/workflows/project-ci.yml 的 Native shell tests 在运行原生壳门禁前,必须使用 cargo fetch --locked 预取 server-rs/Cargo.toml、桌面壳和 AGC 壳三份依赖。Backend host workspace tests 使用 cargo test --locked --workspace --exclude spacetime-module --no-fail-fast,避免 spacetime-module 的 spacetime-types feature 统一污染普通领域 crate 的 host 测试;随后单独执行 cargo test --locked -p spacetime-module --no-fail-fast,由 spacetime-module/src/active.rs 在 host 测试构建期间提供仅测试期的 SpacetimeDB ABI 链接支持,使该 crate 的纯单元测试也纳入 Backend 门禁。spacetime-module 的 reducer / procedure 运行时行为仍必须通过真实 SpacetimeDB runtime/integration harness 验证,host 链接支持不得被当作运行时替身。Backend 另外执行 cargo check --locked -p spacetime-module 验证模块源码。AGC 壳检查还会运行 platform-llm 与 shared-contracts 的 server-rs workspace 测试,这些命令以及 AGC 壳测试必须带 --locked,避免在测试阶段重新解析 registry index;锁文件发生变化时应先更新受信任 CI 镜像缓存,再重跑门禁。