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

8.3 KiB
Raw Permalink Blame History

规范驱动 + 接口先行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 中启用:
[ACTIONS]
ENABLED = true
  • 启动 runner内网环境用宿主机内网 IP不要用 127.0.0.1 / host.docker.internal
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 分支后合并:
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 契约中的 requiredenumformat 等硬约束,同步补齐代码中的 @Valid 校验注解、枚举处理及单测。

5. 最终集成与收网 SOP

5.1 契约与实现双向对齐L2 升级两步走)

当实现接近完成,准备进入可合并状态时:

  1. 第一步:描述型升级。AI 仅修改 openapi.provider.yaml 将等级提升至 L2补充代码已实现的约束描述、示例、错误结构。执行 spec-only commit。
  2. 第二步:实现约束对齐。AI 根据 L2 契约中的 requiredenumformat 等硬约束,同步补齐代码中的 @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 yamlworkflow 会尝试安装 PyYAML失败则跳过 YAML parse check
  • Cannot ping Gitea instancerunner URL 不可用,换宿主机内网 IP
  • cloning https://github.com/actions/checkoutworkflow 仍在用 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 的新 PhasePhase 6),严禁删除已完成任务的历史。
  4. 契约先行:若涉及接口变动,必须先更新 openapi.provider.yaml 到 L0/L1再写实现代码。

8. 维护与迭代建议

  • 每次重大变更后更新:
    • docs/setup-gitea-actions-gate.md
    • 本文档Runbook
  • 逐步增强门禁OpenAPI 专业 diff、契约测试schema 校验、最小自测强制化runner 预装 Maven/JDK