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

目标

为技能包内 runbook 的 grape 命令示例建立与 CLI 实际契约的同步校验机制,杜绝「文档写 A、CLI 只支持 B」的漂移(现状:Agent 每次需 --help 试错确认正确用法)。

现状

  • 近期一族 Agent feedback 均为 runbook 命令示例与 CLI 契约不符,均为事后试错暴露,无事前校验:
    • #154(反馈 88):vod-runbook Step 2 注解残留 issues list --state all(issues 组无 --state;--status all 实测 422)——待修;
    • #157(反馈 91/123):qa-runbook Step 6c feedback submit --category/--title/--description 独立参数(CLI 仅支持 --json 单请求体)——待修;
    • 已修复:vod-runbook Step 5b feedback submit(!67,改 --json 并注明勿用选项形式)、Step 4a printf 拼 JSON(!69)。
  • 根因:grape CLI 契约随服务端 openapi 演进而变化后,技能包 runbook / grape-cli-reference.md 中的命令样例无自动校验,纯靠 Agent 执行时试错暴露后再修。
  • 命令示例分布:skills/**/references/*-runbook.md 与 grape-cli-reference.md(已核验 vod-cli、qa-cli 两处现状)。

期望行为

建立可重复执行的校验手段(CI / lint 脚本均可):

  1. 解析各 runbook 代码块中的 grape ... 命令示例;
  2. 对照当前 CLI 契约(grape commands / 子命令 --help 输出或服务端 openapi.json)校验命令存在性与参数合法性(含选项级校验,如 issues 组 --state 不存在、git-repo 组 --state 合法的差异);
  3. 校验失败即阻断合入/发布(或输出可定位的差异清单);契约版本升级后可一键重跑,及时发现漂移点。
    (可选增强:平台侧在技能同步/部署时做同款校验,属 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

likedislike
grape_bot
grape_bot成员
6 天前 评论:

[VOD Agent] 任务已完成。

likedislike
grape_bot
grape_bot成员
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 契约快照比对 → 输出差异清单并以非零退出码阻断。

实现路径

  1. 契约采集:调用 grape commands(及关键子命令 --help)生成契约快照 JSON(tools/contract-snapshot),随脚本可重新生成
  2. 命令抽取:遍历 skills/**/references/*.md 代码块,匹配以 grape 开头的命令行(剔除注释/续行等噪声)
  3. 比对校验:命令组/子命令存在性 → 选项级校验(未知选项、组间同义差异)→ --json 请求体字段粗校验(如 feedback submit 仅支持 --json)
  4. 冒烟验证:将 #154(vod-runbook Step 2 issues list --state all)与 #157(qa-runbook Step 6c feedback submit 独立参数)作为断言用例
  5. 全量扫描 + 报告输出;接入 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

  • 无
likedislike
grape_botgrape_bot成员
6 天前 将 grape_bot 设为负责人,移除负责人 XOcto
grape_botgrape_bot成员
6 天前 添加了label:spec-readytriaged
grape_botgrape_bot成员
6 天前 关联了pull request:feat: #199 runbook 命令示例与 grape CLI 契约同步校验机制
grape_bot
grape_bot成员
6 天前 评论:

[Coding Agent] ✅ 已完成实现,请审查 PR #74。

交付:契约快照生成脚本 + 漂移校验脚本(文件:行号级报告、漂移非零退出阻断)+ 11 个单元测试(#154/#157 冒烟断言均通过)+ CONTRIBUTING 合入必跑约定。全量扫描 353 个 references/*.md 检出 26 处漂移(#154 于 vod-runbook.md:55、#157 共 4 处),报告见 PR 内 docs/issue-199/drift-report.md;正确示例零误报。skills 内容未改动,漂移修复留独立 Issue。

likedislike
grape_botgrape_bot成员
4 天前 关联了pull request:docs: #428 labels 403 归因补充「仓库作用域权限」环境差异佐证
刘冬
刘冬成员
3 天前 评论:

已合入,关闭

  • PR #74 已合入 main(2026-11-02):scripts/gen_grape_cli_contract.py / scripts/check_grape_cli_drift.py + 契约快照 + CONTRIBUTING 纳入。
  • 流水线产物(docs/issue-199)已按要求剥离,不膨胀技能包。
  • 后续建议(非阻塞):契约快照 ools/contract/grape_cli_contract.json 建议改由 CI 实时生成,避免随 CLI 演进长期漂移;本 issue 关闭。
likedislike
刘冬刘冬成员
3 天前 关闭了 issue
grape_bot
grape_bot成员
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 流程终止。

likedislike
grape_botgrape_bot成员
3 天前 关联了pull request:fix(#1188): 清理 vod-runbook conflict 残段 + 新增 merge 守卫
grape_botgrape_bot成员
1 天前 关联了pull request:feat: #1694 issue-runbook jq 用法补 python3 兜底双链路 + 错误排查表 jq 缺失条目
grape_botgrape_bot成员
1 天前 关联了pull request:feat: #992 issue-cli 版本来源标注规范化 + references 逐字节同步校验口径
grape_botgrape_bot成员
1 天前 关联了pull request:docs: #564 修正 issues detail 全貌表述,明确 state/body fallback git-repo issues get