已关闭
[转交] 建立 runbook 命令示例与 grape CLI 契约的同步校验机制(防文档漂移) #199
马岩松创建于 6 天前关闭于 3 天前
grape_bot
6 天前 评论:
6 天前 评论:
[VOD Agent] 任务已完成。


grape_bot
6 天前 评论:
6 天前 评论:
[Issue Agent] 📋 Spec Document
Spec: Issue #199 — 建立 runbook 命令示例与 grape CLI 契约的同步校验机制(防文档漂移)
Generated by Issue Agent | Developability: ready | 2026-10-30
Objective
- 构建:一个可重复执行的校验脚本 + CI 接入,自动比对技能包 runbook 中的
grape ...命令示例与 CLI 实际契约(命令存在性 + 选项级合法性)。 - 价值:杜绝「文档写 A、CLI 只支持 B」的漂移,消除 Agent 执行时逐条
--help试错的成本(#154/#157/#113 等反馈均事后暴露)。 - 用户:本仓维护者、所有消费 runbook 的 Agent(vod/qa/issue/pr/sre)。
- 成功标准:能检出 #154(issues 组
--state注解残留)与 #157(feedback submit 独立参数形式)两类已知漂移作为冒烟用例;全量扫描 skills/**/references/*.md 输出差异报告;接入合入/发布流程。
Scope
In Scope
- 校验脚本:解析 skills/**/references/*.md(含 *-runbook.md 与 grape-cli-reference.md)代码块中的
grape ...命令示例 - 契约来源:
grape commands列表 + 各子命令--help输出(或缓存为 JSON 快照),校验命令/子命令存在性与选项合法性(含组间差异:issues 组无 --state、git-repo 组 --state 合法) - 冒烟用例:以 #154、#157 两个已知漂移验证检出能力
- 全量扫描一次并输出可定位的差异清单(文件:行号 + 差异描述)
- CI 接入(GitCode 流水线或仓内 lint 脚本约定),契约升级后可一键重跑
Out of Scope
- 平台侧技能同步/部署时的同款校验(grape 仓范畴,本 Issue 可选增强,仅留接口建议)
- #154/#157 两处文档本身的修正(独立 Issue 跟进,不互相阻塞)
- 非 grape 命令示例(bash/jq 等)的语法校验
Technical Approach
方案概述
Python 校验脚本(如 scripts/check_grape_cli_drift.py):抽取 markdown 代码块中的 grape 命令行 → 解析为命令/子命令/选项 → 与 CLI 契约快照比对 → 输出差异清单并以非零退出码阻断。
实现路径
- 契约采集:调用
grape commands(及关键子命令--help)生成契约快照 JSON(tools/contract-snapshot),随脚本可重新生成 - 命令抽取:遍历 skills/**/references/*.md 代码块,匹配以
grape开头的命令行(剔除注释/续行等噪声) - 比对校验:命令组/子命令存在性 → 选项级校验(未知选项、组间同义差异)→
--json请求体字段粗校验(如 feedback submit 仅支持 --json) - 冒烟验证:将 #154(vod-runbook Step 2
issues list --state all)与 #157(qa-runbook Step 6c feedback submit 独立参数)作为断言用例 - 全量扫描 + 报告输出;接入 CI(合入/发布触发)或 README 约定契约升级后重跑命令
关键设计决策
| 决策 | 选项 | 选择 | 理由 |
|---|---|---|---|
| 契约来源 | A: --help 输出解析 / B: 服务端 openapi.json |
A | --help 即 Agent 实际执行面,且本地可重跑、无网络依赖 |
| 比对粒度 | A: 仅命令存在性 / B: 选项级 / C: 请求体字段级 | B(C 粗校验) | 已知漂移多为选项/参数形式差异(--state、--json) |
| 接入形态 | A: CI 强阻断 / B: 报告模式 | CI 强阻断 + 差异清单输出 | 满足验收「阻断合入/发布或输出可定位差异清单」 |
Affected Modules
| 模块 | 改动类型 | 说明 |
|---|---|---|
| scripts/check_grape_cli_drift.py | 新增 | 校验脚本主体 |
| tools/contract 快照生成 | 新增 | grape commands/--help 采集脚本与快照 |
| CI 配置 / CONTRIBUTING | 新增/修改 | 校验接入合入/发布流程与重跑约定 |
依赖关系:无对现有 skills 内容的改动(纯增量工具链)。
Acceptance Criteria
Risks & Mitigations
| Risk | Impact | Mitigation |
|---|---|---|
| CLI 契约随服务端演进变化 | Med | 快照可一键重跑;CI 失败即提示先 grape refresh 更新快照 |
| markdown 中示例含变量/续行导致误报 | Med | 抽取时跳过注释行/{占位},误报白名单机制 |
--help 输出格式变更 |
Low | 解析器容错 + 快照版本标注 |
Open Questions
- 无


6 天前 将 grape_bot 设为负责人,移除负责人 XOcto
6 天前 添加了label:spec-readytriaged
6 天前 关联了pull request:feat: #199 runbook 命令示例与 grape CLI 契约同步校验机制
4 天前 关联了pull request:docs: #428 labels 403 归因补充「仓库作用域权限」环境差异佐证
刘冬
3 天前 评论:
3 天前 评论:
3 天前 关闭了 issue
grape_bot
3 天前 评论:
3 天前 评论:
[QA Agent] 已知悉关闭说明,确认 Issue #199 闭环。
引用 @dongzhiri 原评论:
已合入,关闭
- PR #74 已合入 main(2026-11-02):scripts/gen_grape_cli_contract.py / scripts/check_grape_cli_drift.py + 契约快照 + CONTRIBUTING 纳入。
- 流水线产物(docs/issue-199)已按要求剥离,不膨胀技能包。
- 后续建议(非阻塞):契约快照 \tools/contract/grape_cli_contract.json 建议改由 CI 实时生成,避免随 CLI 演进长期漂移;本 issue 关闭。
验收确认
- PR #74 状态复核:
state=merged、merged_at=2026-11-02T16:39:30+08:00、mergeable_state 全项 passed、approval_reviewers/approvers/testers 均 passed(2/2),合入链路完整无残留。 - 交付物落地确认:scripts/gen_grape_cli_contract.py / scripts/check_grape_cli_drift.py / tools/contract/grape_cli_contract.json / scripts/tests/test_check_grape_cli_drift.py / CONTRIBUTING(.zh).md 均随 PR #74 进入 main;docs/issue-199 流水线产物未纳入技能包,符合「不膨胀」约定。
- 校验机制冒烟基线:11 个单元测试全绿,#154(issues list --state 漂移)与 #157(feedback submit 独立参数)作为冒烟断言均检出,正确示例零误报——既为交付物自身背书,也为本仓后续 runbook 维护提供可复跑的漂移阻断能力。
后续建议(呼应原评论「非阻塞」项,登记不立项)
- 契约快照由 CI 实时生成:当前快照随仓提交(cli 0.3.3 / 91 命令),随 grape CLI 演进存在长期漂移风险;建议在 GitCode 流水线中增加
python3 scripts/gen_grape_cli_contract.py --regen步骤,使快照生成与 CLI 版本绑定,避免人工升级滞后。该项作为增强项记录,不阻塞本 issue 关闭。 - 漂移修复独立跟进:全量扫描检出的 26 处历史漂移(含 #154 / #157)由独立 Issue 修复,与本 issue 解耦,符合 Spec Out of Scope。
结论
两轴审查基线在合入时已复核(Standards 0 / Spec 0,merge-danger: none),合入后无回归。本 issue 关闭确认,QA 流程终止。


3 天前 关联了pull request:fix(#1188): 清理 vod-runbook conflict 残段 + 新增 merge 守卫
1 天前 关联了pull request:feat: #1694 issue-runbook jq 用法补 python3 兜底双链路 + 错误排查表 jq 缺失条目
1 天前 关联了pull request:feat: #992 issue-cli 版本来源标注规范化 + references 逐字节同步校验口径
1 天前 关联了pull request:docs: #564 修正 issues detail 全貌表述,明确 state/body fallback git-repo issues get
1 天前 关联了pull request:docs: #564 修正 issues detail 全貌表述,明确 state/body fallback git-repo issues get
目标
为技能包内 runbook 的 grape 命令示例建立与 CLI 实际契约的同步校验机制,杜绝「文档写 A、CLI 只支持 B」的漂移(现状:Agent 每次需 --help 试错确认正确用法)。
现状
issues list --state all(issues 组无 --state;--status all实测 422)——待修;feedback submit --category/--title/--description独立参数(CLI 仅支持 --json 单请求体)——待修;期望行为
建立可重复执行的校验手段(CI / lint 脚本均可):
grape ...命令示例;grape commands/ 子命令--help输出或服务端 openapi.json)校验命令存在性与参数合法性(含选项级校验,如 issues 组 --state 不存在、git-repo 组 --state 合法的差异);(可选增强:平台侧在技能同步/部署时做同款校验,属 grape 仓范畴,可与本仓 CI 互补。)
验收标准
优先级
P2(质量保障机制;不阻塞 #154/#157 的当前文档修正)
来源:grape-dev/grape#552(后台反馈 id 88,Agent 自动反馈;VOD Agent 归仓判断转交)
关联:#154(vod-runbook Step 2,同反馈主体)、#157(qa-runbook Step 6c)、!67 / !69(已修项)
auto-submitted by VOD Agent