Files

103 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Agent 协作说明(Codex / Cloud / Cursor / Claude / 其它 AI 工具通用)
本文件供所有在仓库内工作的 AI 编码助手阅读。仓库级开发、测试、发布规范以 [ENGINEERING_WORKFLOW_RULES.md](ENGINEERING_WORKFLOW_RULES.md) 为准;生产发布规范以 [PRODUCTION_RELEASE_RULES.md](PRODUCTION_RELEASE_RULES.md) 为准。
## 必读:单一开发分支硬闸门
以下规则适用于 Codex、Cursor、Cloud、Claude、人工操作及其它任何自动化工具,不得绕过:
1.`main` 外,同一时间只允许存在一个尚未闭环的本地开发分支;同时只允许一个开发 worktree。已有尚未闭环的开发分支或开发 worktree 时,严禁通过 `git switch -c``git checkout -b``git worktree add`、IDE、云端任务或脚本再创建第二个分支/worktree。
2. 当前开发分支未完成全部改动、仍有未提交文件、仍有未推送提交、尚未并入 `main`、其提交尚未进入 `origin/main`,或相关开发 worktree 尚未删除时,Codex、Cursor 及其它 Agent 一律不得创建新分支。不得以并行开发、临时修复、试验、续作、PR、冲突处理或“先开分支再说”等理由例外处理。
3. 一个开发分支必须完整闭环后才能开始下一分支,顺序固定为:完成开发 → 执行对应测试/verify → 提交全部应交付改动 → 取得规则要求的明确批准 → 合并进本地 `main` → 推送并确认远端 `origin/main` 已包含该分支提交 → 删除开发 worktree(如有)→ 在 [docs/branch-disposition.md](docs/branch-disposition.md) 登记该分支“已提交/已进入 main/禁止再次引用”。本地分支可保留用于只读追溯,但不得再作为开发基线、合并来源、cherry-pick 来源或发布来源;远端功能分支默认删除,发布和审计依据必须使用 `main` commit、tag、CI 记录或 runtime manifest,而不是功能分支名。
4. 新建分支前必须先执行只读检查,确认工作区干净、当前位于已同步的 `main`、不存在尚未闭环的本地开发分支、不存在其它开发 worktree,且上一分支的 HEAD 已是 `origin/main` 的祖先;若存在已登记为“禁止再次引用”的历史本地分支,它不阻塞新分支创建。任一检查不满足,必须停止并继续完成、同步或登记上一分支,禁止创建新分支。
5. 分支闭环中的 `push`、合并 `main`、删除 worktree、处置/登记历史分支等动作仍分别受本文的测试、明确批准和发布闸门约束;本节只增加“未闭环不得开新分支”的硬阻断,不构成对这些动作的预先授权。
## 必读:分支与发布闸门
生产 `103` 发布还必须完整遵守 [docs/production-release-guardian.md](docs/production-release-guardian.md)。该文档维护 187 个完整回归场景族;常规发布执行 16 项核心场景加自动影响域场景,高风险或无法识别影响范围时自动升级为全量 Gate。不得手工删减选择结果或绕过 Gate report 硬阻断。
1. 新建分支前必须先同步远端主线,推荐执行 `bash scripts/new-branch.sh feature/xxx`
2. 在“修复 bug / 开发中”阶段,默认只允许本地修改、本地运行、本地测试;**没有用户明确批准,不允许 `git push`、不允许生成或发布任何 `103` 相关 runtime/artifact、不允许合并或并入 `main`、不允许触发任何生产动作。**
3. “明确批准”必须是针对下一步动作本身的直接确认,不能把“继续处理”“先看看结果”之类表述解释成 `push`、发版、合并 `main` 的授权。
4. 即使代码已经改完,也必须先完成与本次改动对应的测试或 verify,并在测试后再次确认,才能决定是否进入 `push`、合并 `main``103` 构建或发布等下一步。
5. 分支代码必须先合并进 `main`,确认 `main` 正常后,才允许发布。
6. 发布只能从完整 `main` 打整包,禁止从功能分支、单个 commit、单个修复或局部差异单包发布。
7. 发布前必须确认 CI 已通过,且没有未合并的关键变更。
8. 发布前必须重新检查当前分支是否落后 `origin/main`
9. 发布来源必须是干净、可追溯的 Git commit。
10. 禁止从脏工作区、detached HEAD、落后主线的分支发布。
11. 发布前必须执行:
```bash
bash scripts/check-release-ready.sh
```
12. `check-release-ready.sh` 只是源码闸门,不代表业务场景闸门通过;生产发布还必须取得与同一 commit、同一 runtime artifact 绑定、且可从 Git diff 重现选择结果的风险分层或全量 Gate report。
## 必读:历史分支处置登记
复用、合并、cherry-pick 或清理任何旧本地分支/worktree 前,必须先检查
[docs/branch-disposition.md](docs/branch-disposition.md)。登记为“禁止再次引用”的分支只能用于只读追溯,
不得作为开发基线、合并来源、cherry-pick 来源或发布来源;必须以最新 `origin/main` 为准。
## 必读:已验证回归守卫(勿轻易覆盖)
下列行为经过长时间调试验证。删改相关代码前必须先读文档并跑 verify:
| 主题 | 文档 |
|------|------|
| MindSpace 公开页 `edit_file` 落盘 + 聊天 Finish 不丢消息 | [docs/regression-guards/mindspace-publish-and-chat-finish.md](docs/regression-guards/mindspace-publish-and-chat-finish.md) |
| MindSpace remote 页面 sync + storage 缺失缩略图 fallback | [docs/regression-guards/mindspace-remote-page-sync-and-thumbnail.md](docs/regression-guards/mindspace-remote-page-sync-and-thumbnail.md) |
| Page Data 数据集注册、绑定与交付验收 | [docs/regression-guards/page-data-delivery-contract.md](docs/regression-guards/page-data-delivery-contract.md) |
| H5 SSE 断线续播、Portal/Goose 游标映射与 Finish 终态恢复 | [docs/regression-guards/h5-session-stream-replay.md](docs/regression-guards/h5-session-stream-replay.md) |
| Memory V2 候选表初始化与生命周期灰度作用域 | [docs/regression-guards/memory-v2-candidate-and-lifecycle.md](docs/regression-guards/memory-v2-candidate-and-lifecycle.md) |
索引:[docs/regression-guards/README.md](docs/regression-guards/README.md)
### 改相关文件前必跑
```bash
npm run verify:mindspace-publish-guards
npm run verify:mindspace-publish-guards:full
npm run verify:mindspace-page-sync-guards
npm run verify:h5-session-patches
```
发版脚本(`scripts/release-portal-runtime-prod.sh`)当前在不跳过测试时会执行相关 verify;生产 `103` 发布禁止使用 `--skip-tests`,并且仍须通过完整生产发布守门员。
### 受保护的关键路径
- `mindspace-public-finish-sync.mjs` - `edit_file` 必须 materialize 到 `public/*.html`
- `chat-finish-sync.mjs` - Finish / UpdateConversation 必须 merge,禁止盲覆盖
- `conversation-display.mjs` + `src/utils/message.ts` - 用户消息不得展示 routing/skill 内部前缀
- `src/hooks/useTKMindChat.ts` - `syncSessionMessages` merge + 重试
- `server.mjs` - session snapshot 需 `hint_mc``hint_ua` 才走缓存
- `mindspace-pages.mjs` - storage 缺失时 HTML 页回退读 workspace `relative_path`
- `mindspace-page-sync-service.mjs` + `server.mjs` - remote 模式也必须 sync public HTML
- `session-stream.mjs` + `session-stream-store.mjs` + `tkmind-proxy.mjs` - Portal replay ID 不得直接作为 Goose `Last-Event-ID`
代码内搜索 `REGRESSION GUARD` 可定位所有内联说明。
### 相关单测
- `mindspace-public-finish-sync.test.mjs`
- `chat-finish-sync.test.mjs`
- `conversation-display.test.mjs`
### MindSpace page sync + thumbnail
- `mindspace-page-sync-service.test.mjs`
- `mindspace-pages.test.mjs`
## Cursor 专用规则(其它工具请读上文文档)
Cursor 额外加载:`.cursor/rules/mindspace-publish-chat-finish-guards.mdc`
内容与 `docs/regression-guards/mindspace-publish-and-chat-finish.md` 一致,仅为 Cursor 在编辑相关文件时自动提示。
## 仓库惯例
- 本地开发:`pnpm dev`(见 [README.md](README.md)
- Page Data API:见 [docs/page-data-api-usage.md](docs/page-data-api-usage.md);改动相关路径后执行 `npm run verify:page-data`
- 生产隔离:[docs/service-isolation-runbook.md](docs/service-isolation-runbook.md)
- 发版须 Git commit,禁止本机直 `rsync``103/105`