@adlc/共识-fix
失败测试的 N 版本编程 。 范恩独立LLM在同一破碎的测试中完成,通过协议评价每个候选人,组类幸存者,从最大的共识组中推荐最小的修补.
已服务阶段:C7/P4 ——单发所修复的硬虫无法破解,利用采样多样性(E1).
使用量
consensus-fix --test-cmd "..." --files a.mjs,b.mjs [options]
需要的旗帜
| 旗帜 | 说明 |
|---|---|
--test-cmd <cmd> | 壳牌命令运行失败测试. 当错误出现时必须退出非零 . |
--files <paths> | LLM 允许修改以逗号分隔的源文件列表 . |
可选旗帜
| 旗帜 | 默认 | 说明 |
|---|---|---|
--rails <cmd> | (无) | 这个 回归门:运行全能冷冻铁路套件(所有测试+类型)的指令. 候选人只有两人能活下来 --test-cmd 财务报告和审定财务报表 --rails 0号出口。 一个可以修补轨迹的人选是 被拒绝,不排序。 如果省略,只对照 --test-cmd (单位:千美元) 警告 被打印(没有无声盖). |
--n <int> | 3 | 要生成的独立固定候选人数量。 忽略当 --providers 给出(宽度变为指定供应商的数目). |
--tier cheap|mid|frontier | mid | 用于完成的 LLM 级 . |
--provider <name> | (自动检测) | 强迫单一提供者(anthropic|openai|gemini|agy整个运行,压倒性 ADLC_PROVIDER 仅此援引。 Additive——略去,单提供自动检测器不变. 相互排斥 --providers。 。 。 . |
--providers <a,b,c> | (无) | 绘制 一个 每个指定供养人家庭的候选修补 --n 1个自动检测供应商的复印件——每个供应商跨家庭多样性 ADR-0007 (英语)每名幸存者都记录了制作者。 相互独占 --provider。 。 。 . |
--apply | 关 | 写取胜法. 默认为干燥( 只有报告) . |
--allow-dirty | 关 | 跳过脏树检查。 在 CI 中有用, 仅有舞台更改 . |
--json | 关 | 机器可读输出(JSON to stdout). |
--prompt-only | 关 | 打印将发送的提示并退出 0 。 以零 API 键工作 . |
退出代码
| 代码 | 含义 |
|---|---|
0 | 门口:至少有一名候选人活了下来,有一个有2名以上成员的协商一致小组(或 --n < 3) (中文(简体) ). |
1 | 操作错误: 参数差, 文件无法读取, 下层树( 无) --allow-dirty),没有LLM提供者. |
2 | 门故障:没有候选人幸存,或者所有幸存者都是单胞胎 --n >= 3 (通通分出,分出分出分出. |
如何运作
- 飞行前: 运行
--test-cmd一次 一次吗 如果它退出0,测试已经通过——opError。 。 。 . - 抓图: 抓取每个
--files路径. - 风扇: 发送 N 独立、 无国籍的 LLM 补全与提示并行: 失败命令 + 最后一个 4000 字符的测试输出 + 一个已窗口 节选 每个源文件(在测试输出时,任何行周围的区域都引用它,或者在找不到参考物时使用长盖尾巴——从没有过小尺寸的任何东西的整个文件)。 请求 JSON
{changes: [{file, hunks: [{startLine, endLine, replacement}]}]}——线程编辑,不是完整文件内容. - 依次评估:每个候选人:
- 分析并验证JSON. 如果无效则丢弃, 如果有的话
file没有在--files,或者如果changes- 提议不作改动的候选人是无选择的,不是固定的,绝不允许成为幸存者(否则将适用干净,只根据是否--test-cmd恰好通过第二次 与未触动源. - 应用汉克,运行
--test-cmd(单位:千美元) 转接闸门) (中文(简体) ). 他的猎人startLine编号 :endLine并不完全适用于真实文件(超出界限,重叠的又一个"hunk") 抛弃的只是那个候选人——永远不要跑. 如果重新鉴定通过--rails已经提供,运行--rails(单位:千美元) 回归门对照相同的应用修改。 候选人只有0号出口才能活下来 一个通过复赛但复赛但复赛的选手被否决(Lands in the respect)failed没有survivors) (中文(简体) ). - 记录通过/失败和换行计数(直接从hunks自己的行距计算出——不需要单独的diff步骤).
- 还原快照( E)
finally不论结果如何.
- 分析并验证JSON. 如果无效则丢弃, 如果有的话
- 协定分组: 使每个幸存的变换器的hunks(每行相撞白空格,行距上键+正态替换)和组同组.
- 胜者选择:在通过两条门的候选人中,选择变化最少(按候选人指数打破的字数)的最大协议组成员。 最小的跳跃者从来不会看到一个失败了铁道的候选人,所以它不能奖励一个游戏固定.
- 产出: 默认的干燥报告;
--apply写胜利者.
全部潜水员检测
何时 --n >= 3 每个幸存者都属于自己的单子组, 工具输出2个带消息 all-divergent: spec ambiguity — escalate这是一种信号,即测试规格对负载的事物含糊不清——差异是证据而不是噪音.
实例
# Dry-run: see what the winning fix would be without writing it
consensus-fix --test-cmd "node --test test/math.test.mjs" \
--files src/math.mjs \
--n 5
# Repro gate + full rails regression gate (recommended).
# A candidate that fixes the one test but breaks any other test is rejected.
consensus-fix --test-cmd "node --test test/math.test.mjs" \
--rails "node --test test/*.test.mjs" \
--files src/math.mjs \
--n 5
# Apply the winner
consensus-fix --test-cmd "npm test -- --grep 'add function'" \
--rails "npm test" \
--files src/add.mjs,src/utils.mjs \
--apply
# Preview prompts without any API key
consensus-fix --test-cmd "cargo test test_parse" \
--files src/parser.mjs \
--n 3 \
--prompt-only
# Machine-readable output for orchestrators
consensus-fix --test-cmd "pytest tests/test_core.py::test_sum" \
--files lib/core.mjs \
--json
# Allow running against an uncommitted working tree
consensus-fix --test-cmd "node --test test/*.test.mjs" \
--files lib/broken.mjs \
--allow-dirty --n 3
# Draw one candidate fix per distinct provider family instead of 3 samples
# of one auto-detected model (requires an API key for each named provider).
consensus-fix --test-cmd "node --test test/math.test.mjs" \
--rails "node --test test/*.test.mjs" \
--files src/math.mjs \
--providers anthropic,openai,gemini
# Force a single non-default provider for the whole run
consensus-fix --test-cmd "node --test test/math.test.mjs" \
--files src/math.mjs \
--provider gemini --n 3
JSON 输出形状--json(中文(简体) )
{
"summary": {
"total": 3,
"passed": 2,
"failed": 1,
"discarded": 0,
"groups": 1,
"allDivergent": false,
"railsChecked": true
},
"groups": [
{ "groupIndex": 0, "size": 2, "candidateIndices": [0, 2] }
],
"winner": {
"index": 0,
"changedLines": 1,
"largestGroupSize": 2,
"changes": [{ "file": "src/math.mjs", "hunks": [{ "startLine": 12, "endLine": 12, "replacement": "..." }] }],
"applied": false
},
"discardedDetails": []
}
安全保障
- 肮脏的护林员:拒绝与一棵肮脏的树相撞,除非
--allow-dirty防止意外损失未完成的工作. - 抓图 + 恢复到
finally:每个候选人评价恢复所有--files即使测试崩溃或 LLM 返回垃圾. - 终止信号恢复:SIGINT,SIGTERM或SIGHUP在报告前的任意时间点(包括候选人测试或铁路命令运行期间)停止跑道:飞行中指令的流程组获得SIGTERM,再由SIGKILL在2 s后,原始文件从快照恢复出,没有应用中标,流程出局1. SIGKILL 发送到协商一致的修补本身无法处理,所以可以将候选人的修补放入磁盘;用
git checkout -- <files>。 。 。 . - 原子写:文件还原,候选hunk应用程序,和中选候选人-应用写作是原子(在同一目录中写临时文件,再重命名Sync),以防范部分写作或截取.
- 文件列表执行: 外部引用文件的任何候选人
--files用诊断信息丢弃, 绝不写.
LLM 提供者检测
继承来源 @adlc/core。检查(顺序): ANTHROPIC_API_KEY, (中文(简体) ), OPENAI_API_KEY, (中文(简体) ), GEMINI_API_KEY (那时) agy 若为 ADLC_AGY 已设定). 强制提供者使用 ADLC_PROVIDER (env,全壳)或 --provider <name> (逐项召集,推翻) ADLC_PROVIDER) (中文(简体) ). 覆盖每层的模型 ADLC_MODEL_CHEAP, (中文(简体) ), ADLC_MODEL_MID, (中文(简体) ), ADLC_MODEL_FRONTIER。 。 。 .
单一提供者自动侦查仍然是默认情况(按ADR-0007计算成本/相关性) - --provider编号 :--providers 是添加剂,而不是默认行为改变。 使用 --providers <a,b,c> 当您想要从 N 不同模型家族而不是从一个模型的 N 样本中抽取 N 候选修饰时; 每一个被请求的提供者必须配置自己的 API 密钥, 或者在 LLM 调用缺失的密钥之前运行失败 .
与兄弟姐妹工具的关系
- 闪光探测器(C6): 单剂旋转时检测出.
consensus-fix是升级路径 – 当闪光探测器向硬相机开火时运行它 . - 死前(C2): 在构建前识别失败模式.
consensus-fix修正在测试运行中发现的失败模式. - 护栏(C5):执行只读铁道.
consensus-fix尊重--files列表为自己的铁路边界. - 空心试验(C4):找到实际上没有测试任何东西的测试. 测试
consensus-fix继续失败可能是空洞的——跑hollow-test检查.
核心差距
无. fan, (中文(简体) ), complete, (中文(简体) ), extractJson, (中文(简体) ), detectProvider, (中文(简体) ), resolveModel, (中文(简体) ), PROVIDER_NAMES, (中文(简体) ), parseArgs, (中文(简体) ), pass, (中文(简体) ), gateFail, (中文(简体) ), opError, (中文(简体) ), printJson, (中文(简体) ), promptOnly,以及 isDirty 全部由 @adlc/core。 。 。 .