任务:跨版本线那一对的条目核对(6b 回归范围与维护巡检的后半句)

6b 对这项能力的验收有两句:Hub 算出的两个构建之差,等于独立脚本在原始命令树上算出的命令差;范围里的用例,正好是索引里所挂命令在差里的那些。前一句跨版本线那一对已经核过(30 条路径,口径一致)。后一句在同一版本线那一对上只核了场景里列出的 18 个条目;跨版本线那一对(回归范围 2,096 个用例、维护巡检 1,147 个)还没核。

  • 分支和工作树:hub-scope-cases,目录 circle-hub-scope-cases(依赖已装好)
  • 可以改的路径:scripts/real/accept/scope-cases.ts、scripts/real/hub-call.ts 和它们的测试。别的路径不动。
  • 规则:同前(不推送、不建 PR、不发布、不部署,不碰 7420、钥匙串、环境配置文件和任何真实系统;测试只用合成数据,照真实结构做,不带真实内容;git commit -s)。脚本自己解析导出的 JSON,不导入包或核心的函数,也不读 Hub 的结论文字。
  • 验证:npx tsc --noEmit;node --test --test-concurrency=2 "scripts/real/**/*.test.ts"。

要做的

  1. hub-call.ts 现在只打印给模型看的文字。加一个选项 --structured <文件>:每次调用的结构化结果(structuredContent)按调用顺序追加写进这个文件,一次调用一行 JSON;出错的调用照样写一行,并标明出错。屏幕上的输出不变。合成测试用一个本地的假 MCP 服务器。
  2. 输入都由集成者导出:
    • 独立命令差:scripts/real/gold/command-diff.ts 的输出,有 added、removed、modified 三张路径表;
    • 两个根在变更路径上的节点:集成者用 get_nodes 取回的应答(root 是该构建的根,paths 是变更路径,depth 为 0,按 cursor 翻页),存成 JSON Lines,每行一份应答,形状见 contracts/src/tools.ts 的 GetNodesOutput;后一个构建一份文件,前一个构建一份文件;
    • 两次运行的导出:circle-hub run show <运行> --json,条目在 run.items,条目编号写作 文档:节点。
  3. 计算:
    • 期望的回归范围:后一个根里,新增和修改路径的节点上、种类为 case 的条目,按数据里的 document 和 node 去重;
    • 期望的维护巡检:前一个根里,删除和修改路径节点上的同类条目,同样去重。
    • 和两次运行的条目逐个比较,报告相等的、只在运行里的、只在期望里的各有多少;不等的逐条列出,最多 50 条,另写总数。
    • 判“输入不全”而不判相等的情况:某个节点的应答带着下一页的游标,文件里却没有下一页;或者条目没有 data。
  4. 合成测试:
    • 两个根、三类路径的小例子:同一用例挂在两条变更路径下只算一个;挂在没变的路径下的不进期望;删除路径上的只进巡检;
    • 分页拼接;
    • 输入不全的判定;
    • 比较的正反例。

完成后在终端里回报:提交号、测试数量、没做完或拿不准的地方。