auto-ai-coding/docs/process-sop-runbook.md

209 lines
8.3 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.

# 规范驱动 + 接口先行SDD + API-First实战流程 Runbook从 0 到可合并)
本文档用于复盘并固化一次完整的“从初始化规范体系 → 落地 Gitea 门禁 → 实际业务跑通(以 ai-robot 多渠道改造为例)”的全流程。
目标:换环境/换人/换模型后,可以按此 SOP 复现同样的协作链路,并在后续迭代中持续优化。
---
## 0. 核心原则(务必先读)
1. **SSOT单一可信源优先**:以 `spec/<module>/requirements.md` + OpenAPI 契约为准,任何实现必须可追溯到 AC。
2. **Consumer-first 并行**:依赖契约由调用方先写 `openapi.deps.yaml`,提供方后补实现并以 provider-driven 校验对齐。
3. **分支治理**`main` 禁止直接 push仅允许 PR 合并feature 分支允许并行与草案L0/L1
4. **门禁物理化**:规则必须进入 Actions/脚本,否则只停留在“口头约束”。
5. **长任务可接续**:满足阈值即启用 `docs/session-handoff-protocol.md`,并维护 `docs/progress/...`
---
## 1. 仓库文档分层(最终形态)
- 方法论(详细、指导生成规范):`docs/spec-product-zh.md`
- AI 入口硬规则(极简、命令式):`agents.md`
- AI 契约硬规则L0-L3、门禁、自检`spec/contracting.md`
- 人类落地指南hooks/CI/操作细节):`docs/contracting-guide.md`
- 会话接续协议(复杂任务强制):`docs/session-handoff-protocol.md`
- Gitea Actions 门禁落地手册:`docs/setup-gitea-actions-gate.md`
---
## 2. GiteaDocker落地门禁一次性 checklist
> 若是新环境,从这里开始。
### 2.1 分支保护(必须)
在 Gitea 仓库:`设置 -> 分支 -> 保护分支(main)`
- [ ] 禁止直接推送 main
- [ ] 禁止强制推送force push
- [ ] 禁止删除 main
> 经验:不要用 `pre-receive` 一刀切拒绝 `refs/heads/main`,否则 PR 合并也会被拒绝。
### 2.2 启用 Actions + Runner必须
- 在 Gitea `app.ini` 中启用:
```ini
[ACTIONS]
ENABLED = true
```
- 启动 runner内网环境用宿主机内网 IP不要用 127.0.0.1 / host.docker.internal
```bash
docker run -d --name gitea-act-runner --restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/act_runner:/data \
-e GITEA_INSTANCE_URL="http://<HOST_IP>:<GITEA_PORT>" \
-e GITEA_RUNNER_REGISTRATION_TOKEN="<REG_TOKEN>" \
-e GITEA_RUNNER_NAME="runner-1" \
gitea/act_runner:latest
```
### 2.3 离线环境必做(避免访问 GitHub
- workflow **不要**使用 `actions/checkout@v3`
- 使用离线 checkout仓库内 workflow 已实现):
- 优先 `GITHUB_*` 变量fallback `GITEA_*` 变量
- `git clone "$SERVER_URL/$REPO_NAME.git" .` + `git checkout "$COMMIT_SHA"`
### 2.4 Required Checks必须
- 首次运行 workflow 后,在保护分支启用状态检查。
- 推荐 job 名称:
- 轻量门禁:`contract-level-check`
- 全量门禁:`sdd-full-gate`
> 注意Gitea 通常需要 **至少跑过一次 Actions** 才能在 UI 中选择/识别状态检查项。
---
## 3. 规范生成文档阶段SOP强模型执行
> 目标:把需求与契约先做对,再进入编码。
### 3.1 分支策略(文档与代码共存)
- 若“旧代码在 master新规范在 main”且历史不相关
- 推荐创建 feature 分支后合并:
```bash
git checkout master
git checkout -b feat/<feature>
git merge main --allow-unrelated-histories
```
- 若出现 untracked 覆盖:先提交 checkpoint保护性提交再 merge。
### 3.2 生成顺序(每次只生成 1 个文件)
严格按顺序:
1) `spec/<module>/requirements.md`
2) `spec/<module>/openapi.deps.yaml`
3) `spec/<module>/openapi.provider.yaml`
4) `spec/<module>/design.md`
5) `spec/<module>/tasks.md`
每生成 1 个文件:
- 人类审阅通过后,做 **spec-only commit**(只提交该文件)。
---
## 4. 编码执行实现阶段SOP弱模型可执行
> 目标:按 `tasks.md` 原子任务执行,降低长上下文导致的偏移。
### 4.1 进入编码前必须读取
- `agents.md`
- `spec/contracting.md`
- `spec/<module>/requirements.md`
- `spec/<module>/openapi.provider.yaml` / `openapi.deps.yaml`
- `spec/<module>/design.md`
- `spec/<module>/tasks.md`
### 4.2 提交节奏Git Cadence
- `spec/<module>/` 变更:必须单独 commit
- 实现代码:按 tasks 子任务完成提交
- commit message必须包含 `[AC-...]`
### 4.3 多窗口并行(推荐分工)
- 窗口 A基础设施 + DTO + 配置 + DB
- 窗口 B渠道适配层Adapter/Factory/Controller
- 窗口 C路由层 + 会话管理
- 窗口 DAI client + Resilience + fallback
- 窗口 E集成测试/回归
合并策略:各窗口在同一 feature 分支上串行提交(避免互相覆盖),或各自分支最后 rebase 合并。
### 4.4 契约与实现双向对齐L2 升级两步走)
当实现接近完成,准备进入可合并状态时:
1. **第一步:描述型升级**。AI 仅修改 `openapi.provider.yaml` 将等级提升至 L2补充代码已实现的约束描述、示例、错误结构。执行 spec-only commit。
2. **第二步:实现约束对齐**。AI 根据 L2 契约中的 `required`、`enum`、`format` 等硬约束,同步补齐代码中的 `@Valid` 校验注解、枚举处理及单测。
---
## 5. 最终集成与收网 SOP
### 5.1 契约与实现双向对齐L2 升级两步走)
当实现接近完成,准备进入可合并状态时:
1. **第一步:描述型升级**。AI 仅修改 `openapi.provider.yaml` 将等级提升至 L2补充代码已实现的约束描述、示例、错误结构。执行 spec-only commit。
2. **第二步:实现约束对齐**。AI 根据 L2 契约中的 `required`、`enum`、`format` 等硬约束,同步补齐代码中的 `@Valid` 校验注解、枚举处理及单测。
### 5.2 合拢动作
1. **本地汇总**:将所有并行窗口的分支/提交合并至主功能分支。
2. **一致性自检**:确认 `spec/` 文档与 `src/` 实现 100% 对齐AC 追踪、契约等级、任务勾选)。
3. **推送 PR**:推送到远端并发起向 `main` 的 PR。
4. **门禁验收**:观察 `sdd-full-gate` 状态。
-`Commit Message Check` 失败:补充 `[AC-...]``[TASK-...]` 标注。
-`AC Traceability Check` 失败:修正需求引用或代码注释。
5. **合并合拢**Checks 全绿后执行合并,并同步本地 `main` 分支。
---
## 6. 自动化门禁Actions 脚本)说明
### 5.1 当前已落地的脚本
- OpenAPI 等级门禁:`scripts/check-openapi-level.sh`
- AC 追踪门禁:`scripts/check-traceability.sh`
- OpenAPI Breaking change最小版`scripts/check-openapi-diff.sh`
### 5.2 常见报错与处理
- `provider contract-level must be >= L2`:提升 `openapi.provider.yaml` 到 L2
- `No module named yaml`workflow 会尝试安装 PyYAML失败则跳过 YAML parse check
- `Cannot ping Gitea instance`runner URL 不可用,换宿主机内网 IP
- `cloning https://github.com/actions/checkout`workflow 仍在用 checkout action需改离线 checkout
---
## 7. 需求迭代与生命周期管理 SOP
> 目标:确保功能演进过程中,规范文档同步滚动且历史可追溯。
### 7.1 迭代模式选择
- **微调模式**:直接在现有 `requirements.md` 追加 ACID 保持连续(如 `AC-AISVC-21`)。
- **特性模式**:在 `spec/<module>/` 下新增 `requirements-<feature>.md`,适用于独立大特性。
- **重构模式**:建立新模块目录(如 `spec/ai-service-v2/`),适用于架构级变更。
### 7.2 迭代执行步骤
1. **增量 Scoping**:分析新需求对现有 AC 的影响,明确是否涉及破坏性变更。
2. **版本滚动**:修改任一规范文件时,必须同步更新 Frontmatter 中的 `version`(如 `0.1.0 -> 0.2.0`)。
3. **任务追加**:新任务作为 `tasks.md` 的新 Phase`Phase 6`),严禁删除已完成任务的历史。
4. **契约先行**:若涉及接口变动,必须先更新 `openapi.provider.yaml` 到 L0/L1再写实现代码。
---
## 8. 维护与迭代建议
- 每次重大变更后更新:
- `docs/setup-gitea-actions-gate.md`
- 本文档Runbook
- 逐步增强门禁OpenAPI 专业 diff、契约测试schema 校验、最小自测强制化runner 预装 Maven/JDK