Repository navigation
interrogate:跟进上游 #986,审查者改为用实际运行证明问题的对抗者 - #32
Merged
Merged
Conversation
- interrogate 按上游 ab1f702c 重写:对抗者在各自 worktree 里试图弄坏改动, 只报告跑出来的问题;父会话按 arena Phase F 在该对抗者的 worktree 里自己重跑, 跳过 arena C/D/E;删除 reviewer-prompt、rubric、lead-judgment、 code-quality-review 四个 references - 与上游的差异:名单从 config.mjs show 的 interrogate reviewers 读取, 对抗者是能改文件、能跑命令的 worker(不写 generalPurpose); xagent 对抗者跑 rw,掉线按 xagent 的重试与未决规则处理 - xagent skill:对抗者跑 rw、各用独占 worktree,因为 claude 和 gemini 的 ro 是 plan 模式,跑不了命令;命令受该 agent 的 rw 白名单约束 - 宿主 E2E harness:对抗者槽位只接受 rw 尝试,要求 worktree 持有最终版 stats.py 和未改的 test_stats.py,且两者都不晚于尝试开始时间 (xagent 取 prompt.md 的 mtime,原生取宿主日志里的派发时间戳),允许复现文件; 父会话把每次重跑记入 findings.json,每条都要对上宿主日志里父会话自己跑的命令 (Claude 顶层 Bash、Codex --json 的 command_execution);删除 e2e-snapshot.py - 测试先写 Given/When/Then 场景(A1–A8、F1–F4),再改两个测试文件; 对四条 harness 规则和三条原生证据规则逐一做了变异反向验证 - README、design 与 recipes 指南、poteto-help 的 interrogate 说法同步上游 - ADAPTATION 新增 interrogate 一节,替换「暂缓」状态;守卫新增 interrogate-adversaries-rw 与 interrogate-parent-rerun,各有植入丢失测试 - 插件版本升到 0.15.36-shared.2 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 写者与对抗者各用一个角色判定:写者要有「修复」证据(xagent 的 stats.py 晚于 prompt.md 写入,原生是对 stats.py 的编辑工具调用),test_stats.py 不变; 所有者按 (类型, agent 与模型) 区分,同一个 worker 不能攻击自己的修复 - 父会话重跑账本:command 按空白切分后须与父会话自己跑的某条命令完全相等, 且该命令以绝对路径或工作目录指向这个对抗者用过的 worktree;只引用命令的 heredoc、echo 不算重跑。Codex 改从父会话 rollout 读命令,带 cwd - 真实 Claude E2E 里父会话把三条重跑写进同一段带 W= 变量的脚本,账本无法逐字 对上,findings_rerun_by_parent 失败;提示词改为每条重跑单独一次 shell 调用、 绝对路径、不用变量,并加了这一真实形态的回归测试 - interrogate:告诉 xagent:claude/gemini/pi 对抗者只能跑 rw 白名单里的命令; 输出写明每个对抗者的模型、哪些共用继承模型(独立运行,不算不同模型家族), 以及哪些对抗者一条命令都没跑 - 守卫拆成 interrogate-policy-panel 与 interrogate-adversaries-rw(含白名单句), 各有植入丢失;ADAPTATION 第二段压缩为指向 docstring 的一句,Verification 段去掉「文件时间」;setup 指南改用对抗者说法 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- thermos 第 2 轮两位审查者都指出:写者证据只和本次尝试的 prompt.md 比, xagent 写者修好 stats.py 后掉线、重试只跑测试时,写者槽位会判失败, 是上一提交修 R1-Q1 时引入的回退 - 改为运行窗口规则:stats.py 最后一次写入落在同一 worker 在该 worktree 某次尝试的运行期间(prompt.md 到 meta.json 的 mtime),才算修复; 父会话在两轮攻击之间同步修复不算。审查者建议的「组内最早开始时间」 会把复用 worktree 的二次攻击误判成写者,变异测试证实了这一点 - 新增回归测试(掉线后只验证的重试填写者槽位;两次运行之间的写入不算), fixture 回执的 meta.json 时间改为尝试结束时间;三种变异写法都被测试抓到 - docstring:xagent 写者规则移到 xagent 段;无时间戳的原生派发只是不能 填对抗者槽位 - interrogate 改为引用 xagent 表里该 agent 的 rw 条目,不再手抄 agent 名单; ADAPTATION 写明原生对抗者没有 mode - 测试:账本测试用字面量期望值,父命令统一传 (script, cwd), 时间解析不再借用被测的私有函数 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- thermos 第 3 轮两位审查者都指出:运行窗口按回执里请求的模型分组, 一次 model_mismatch 掉线(实际是另一个模型回答的)留下的修复, 会被算到配置的模型名下;建组时排除这类运行,回归测试加一个子用例, 去掉过滤的变异会被测试抓到 - 跨尝试的写者判定抽成 _xagent_attempts,_xagent_attempt 只接收 repaired 布尔值,和原生路径对称 - 宿主提示词:已核实的问题在父会话自己的 checkout 修,或交回写者; docstring 写明写者窗口之外的写入会让写者槽位落空、原生写者按每次派发 各自的编辑判定、复用 worktree 的二次攻击在什么情况下会被判成写者 - xagent skill 不再在表格下方另列受限 agent;docstring 换行; 测试用 fixture 的 ran() 设运行窗口,iso() 参数改名避免遮蔽 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d328f92e15
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
- Codex 在 PR 审查里指出:Claude 父会话的 Bash 调用被权限规则或 hook 拦下、根本没执行时,解析器仍把它当成重跑证据,账本对上它就能通过 - Claude:只收 tool_result 不是错误、或错误内容以 "Exit code N" 开头的调用 (真实日志里非零退出就是这种形态),被拒绝或没有结果的调用不算 - Codex:只收父会话 rollout 里带整数 exit_code 的 CommandExecution, 被拒绝的命令不算 - 测试加入「重跑被拒绝」和「重跑被 Codex 拒绝执行」两个反例,通过的用例 改用真实的非零退出形态;去掉任一侧过滤的变异都被测试抓到; 用真实运行离线复验,两台宿主的父会话命令数不变(31、28) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
意图
跟进上游 cursor/plugins pstack #986(
ab1f702c,包含在 0.15.36 的 pinc742dd61里)。interrogate 的审查者改为对抗者:每个对抗者在自己的 worktree 里设法弄坏改动,只报告能用实际运行证明的问题。父会话按 arena Phase F,在该对抗者的 worktree 里亲自重跑每条发现的命令,并跳过 arena 的 C、D、E 三个阶段。#31 里写的「interrogate 保持原样(暂缓)」由本 PR 取代。
与上游的差异(fork 决定,见 ADAPTATION.md#interrogate)
config.mjs show --host的interrogate reviewers,是跨厂商面板:inherit-parent、另一主厂商的 xagent、xagent:gemini(辅助席位)。上游从模型表读取,并且一律用generalPurpose。xagent:对抗者跑rw,各自独占一个 worktree,原因是 claude 和 gemini 的ro是 plan 模式,不能跑命令。rw条目限制了可跑的命令(目前是 claude、gemini、pi),这个对抗者就只能跑bin/xagent-allowed-commands里的命令,所以 brief 要求它用白名单内的测试命令来证明发现。导览(建议查看顺序)
skills/interrogate/SKILL.mdcheck-fork有三条守卫锁住这些差异。skills/xagent/SKILL.md:50rw、使用独占 worktree,命令受该 agent 的rw白名单限制。scripts/pstack-host-e2e.py模块 docstringmodel_mismatch的运行实际是另一个模型跑的,也不算。rw尝试。worktree 里要有最终版 stats.py 和未改动的 test_stats.py,且这两个文件都不能晚于尝试开始时间;允许附带复现文件。validate_receipts/_rerun_by_parent:父会话把每次重跑记入findings.json。每条记录的command要满足两点:只引用命令文本的 heredoc、echo 不算重跑。
scripts/e2e-native-evidence.pyCommandExecution,带 cwd;父会话和子 agent 共用一个_codex_command。测试
pstack-host-e2e.test.py(29 个)和pstack-host-e2e-native.test.py(29 个)。文档:README、
docs/guide/01-setup.md、04-design.md、10-recipes-and-pitfalls.md、poteto-help 都改成了对抗者的说法。ADAPTATION 与守卫
### interrogate一节,删掉「暂缓」那条。interrogate-policy-panel、interrogate-adversaries-rw(这条也覆盖白名单那句)、interrogate-parent-rerun,每条都有对应的植入丢失测试。0.15.36-shared.2。验证证据
node scripts/check-fork.mjsnode --test scripts/check-fork.test.mjspython3 scripts/pstack-host-e2e.test.pypython3 scripts/pstack-host-e2e-native.test.pybash scripts/check.sh runtimeTMPDIR=$(getconf DARWIN_USER_TEMP_DIR)tla2tools.jar,下载需要另行同意;与本次改动无关model_mismatch过滤,也都被测试抓到;删掉白名单那句后守卫失败57b33f1时的 harness).pstack/e2e/host-20261030-181512/codex:写者xagent:pi用 rw;对抗者:原生 1 个,xagent:claude、xagent:gemini各 1 个;没有发现,findings.json是[]57b33f1时的 harness)findings_rerun_by_parent失败,原因见下一节9b14073)离线复验上面那次运行1b74371时的 harness,含新提示词).pstack/e2e/host-20261030-194548,Claude、Codex 各 11/11。两台宿主的写者都是xagent:pirw,一次修好;对抗者是原生 1 个加另一主厂商的 xagent、xagent:gemini,共 3 个,全部 PASS、没有发现,两边的findings.json都是[]9b14073)离线复验第 2 次运行findings.json都是[],父会话没有可重跑的命令。所以「每条重跑单独一次 shell 调用」、Claude 按 tool_result 判定是否执行、Codex 按 rollout 的整数exit_code匹配,这几条在有发现时的真实效果都还没验证;目前的证据只有 fixture,以及第 1 次运行(批量脚本的失败形态)。另外,Codex 被拒命令的形态(exit_code: null)是合成的,真实 rollout 里只见过 completed/0 和 failed/1。要验证这条路径,只能再跑一次真实 E2E 并碰上有发现的情况,对抗者能不能找到问题无法事先控制bash scripts/check.sh buildbun install(下载),且本机 Bun 是 1.4.4,不是固定的 1.4.2;交给 CI57b33f1)30b5e41修复947354d,与30b5e41同树)b0748c0修复b0748c0)d328f92修复model_mismatch掉线运行被算成配置模型的修复。两位审查者都报了,一位判 blocking、一位判 Low,按 blocking 处理d328f92)776877d修复Exit code N开头的调用,Codex 只认可带整数exit_code的命令;去掉任一侧过滤的变异都会被测试抓到9b14073)has_any_findings: falseb0748c0..9b14073,即d328f92、1b74371、776877d、9b14073)model_mismatch过滤、去掉 Claude 过滤、只去掉Exit code分支、去掉 Codex 过滤),每个都让测试失败;用 HEAD 离线复验两次真实运行,结果与上面一致。4 类 non-blocking 都没改,见「已知限制」中第 4 轮那几条。结论对应 HEAD9b14073Claude 那项 FAIL 的原因与处理
Claude 父会话确实发现了问题。第一轮 codex 和 gemini 报出 ISSUES,共保留 3 条发现,父会话修复后第二轮全部 PASS;账本格式也正确。
失败的原因是重跑方式:父会话把三条重跑写进同一段多行 Bash 脚本,先
W=/…/wt,再执行cd $W/r1-codex && python3 -m unittest …。宿主日志里没有任何一条命令能和账本逐字对上。harness 的规则是「账本里的命令必须是父会话真实跑过的那一条」,所以这里判 FAIL 是对的,不应该为了这次放宽匹配。做了两处改动:
cd <绝对路径> && <命令>,不用 shell 变量,并把这条命令原样记入账本;第 2 次真实运行(含新提示词)22/22 通过,但这次对抗者都没有发现,父会话没有需要重跑的东西,所以新提示词在有发现时的效果仍未在真实宿主上验证。
已知限制
findings.json是否完整,是宿主自己的说法。兜底靠最终的独立测试和合约探针。cp -p、rsync -a)复制了修复。提示词要求二次攻击用新 worktree;真实运行用的是git apply和普通cp,都不会触发。validate_receipts的账本检查没有拆成独立函数,检查名也没有收成常量;bin/xagent-allowed-commands首行注释和 check-fork 的一条 hint 仍只说 writer(pre-existing)。改bin/xagent*就要跑scripts/xagent-e2e.sh,它会调用所有厂商,所以这次不动;d328f92)。--host-timeout的默认值仍按三轮各一次重试计算(WORST_CASE_ATTEMPTS = 3 * 2)。4 * 2,同步改 docstring 和--help。776877d,两位审查者都提了)。findings_rerun_by_parent: false,分不清「没重跑」还是「重跑被拒」,要回 host.log 里查。NativeDispatch.usable)、由 harness 判定。可以给ShellCommand加一个ran标记,由_rerun_by_parent来判断。model_mismatch用例(d328f92,两位审查者都提了)。model是 None,而 xagent 只有在固定了模型时才会给出model_mismatch。resolved_models)做探针,结果正确。_xagent_attempts里同一个分组 key 写了两遍;ran一词有三种意思;is_error、又不以Exit code开头,那么执行过的重跑会被排除,造成误拒。真实日志和本机转录里都没有超时样本;父会话重跑的都是短单测,可能性低。披露
check.sh触发了 statechart 的render.test.ts,它对~/.cache/statechart执行了npm install,改写了那里的 lockfile。没有装新包。base 分支现在默认跳过这一步。git commit-tree原样重接到main(b605a32),树和提交信息都没变:57b33f1→65d8940,947354d→30b5e41。b605a32的树与原 base13a118a完全相同。被强推的只有本 PR 自己的分支,当时还没有开 PR。~/.config/pstack/config.json。安装刷新等合并后由你决定。🤖 Generated with Claude Code