Skip to content

fix(e2e)+check-fork:被拒重跑可见、去掉交回写者、pin 一致性守卫 - #33

Merged
mtmtian merged 5 commits into
mainfrom
claude/post-sync-cleanup
Oct 30, 2026
Merged

mtmtian merged 5 commits into
mainfrom
claude/post-sync-cleanup

Conversation

@mtmtian

@mtmtian mtmtian commented Oct 30, 2026 •

Copy link
Copy Markdown
Owner

要解决的问题

收拾 #32 thermos 第 4 轮留下的 4 类非阻断项,补上 #31 时发现缺的 pin 一致性守卫,并修掉验证中发现的一个偶发失败的门禁用例。不改上游,不碰 bin/xagent*。

改动

  1. E2E 超时预算(pstack-host-e2e.py):提示词和 docstring 去掉"或交回写者"。父会话只在自己的 checkout 里修复发现,流程回到 WORST_CASE_ATTEMPTS = 3 * 2 假设的三轮,默认 --host-timeout 仍为 6246 s。
  2. 被拒的重跑在报告里可见(e2e-native-evidence.py、pstack-host-e2e.py):
    • ShellCommand 新增 ran。解析层保留被拒或没有结果的调用,并标为 ran=False:
      • Claude:结果无错误,或错误以 Exit code N 开头,算执行过;
      • Codex:有整数 exit_code 才算执行过。
    • _rerun_by_parent 要求 command.ran,判定结果与之前一致。
    • checks.json 的 parent_commands 带上 ran,能直接区分"没重跑"和"重跑被拒"。
    • Claude 父会话命令按调用顺序列出。
  3. model_mismatch 用例:拆成独立用例,回执用真实形状(固定模型、resolved_models、reason: model_mismatch)。同一用例里加对照:同形状的超时回执能填上写者槽位。
  4. 小项:
    • _xagent_attempts 的分组 key 只算一次;
    • 测试里 ran 只有一个含义;
    • docstring 写明 model_mismatch 只排除运行窗口。
  5. pin 一致性守卫(check-fork.mjs):
    • readPin 校验 UPSTREAM.json 的 repository、path、commit、version,报错写明各字段的期望格式;check-upstream.mjs 改用它,正则不再重复。
    • validatePin 要求 ADAPTATION 首行、两份 README 引用当前版本和提交(README 用 8 位短 SHA 加 tree 链接)。
    • validateManifests 要求 .claude-plugin、.codex-plugin 的 version 以 <upstream version>-shared. 开头。
    • ADAPTATION 收尾句改为:先改 UPSTREAM.json,manifest 重置为 -shared.1,其余副本由守卫点名。
  6. 偶发失败的门禁用例(已有问题,0582380 引入):
    • exercise 的夹具预检沿用了 --check-timeout。"宿主留下死循环"用例传入 1 秒,负载下 Python 启动加 unittest 会超时,报 FAILED (failures=1);审查者在负载下复现了 4 次中的 3 次。
    • 预检现在至少用 30 秒。
    • 新用例用 0.05 秒加正确 stub 验证预检不受影响:旧写法下必定失败。
    • 原用例保持 1 秒,确保死循环这个前提真正起作用。

验证(最终 HEAD 7182195)

检查 结果 证据
runtime 门禁 PASS bash scripts/check.sh runtime(macOS,gnubin 在前)退出 0。node 测试 92/92;statechart 196 个通过、0 个失败;harness 两套测试 31/31、29/29;其余三套 OK。statechart 的 differential 和 render 按设计跳过,~/.cache/statechart 没有重新创建
check-fork PASS node scripts/check-fork.mjs 输出 "… manifests, upstream pin.";check-fork.test.mjs 13/13
check-upstream 改用 readPin PASS node scripts/check-upstream.mjs 退出 0:cursor/plugins、up-to-date、0.15.36、0 个新提交
反向验证:harness PASS 以下改法都让测试失败:去掉 _rerun_by_parent 的 ran 判断;去掉 model_mismatch 过滤;Claude 的 ran 恒为 True;只去掉 Exit code 分支;Codex 的 ran 恒为 True;预检改回旧时限(只有新用例失败);死循环用例换成正确 stub(该用例失败)
反向验证:pin 守卫 PASS 以下改法都让测试失败:checkFork 不调用 pin 校验;去掉某个 manifest 的版本检查;去掉版本正则;去掉类型检查;readPin 不处理 null
thermos 第 1–3 轮 PASS 第 1 轮 2 个阻断项(manifest pin 副本、过时的契约注释)已修复;第 2、3 轮 0 个阻断项,非阻断项全部修复
thermos 第 4 轮(dd8f7c3..7182195) PASS 两位审查者都是 0 个阻断项,第 3 轮的 5 项都确认已修复。缺陷审查重跑全部测试,并做了 3 个变异:预检改回旧时限、换成正确 stub、换成无操作 stub,测试都失败了。另外试了 6 种格式错误的 UPSTREAM.json,每种都只报一行;check-upstream 在仓库外运行正常。代码质量审查剩 3 个写法小项,见「限制」。结论对应 HEAD 7182195
Codex 机器人审查 PASS 对 fcffcbf 无发现
build 半边(Bun 1.4.2) NOT RUN 本机没有 Bun 1.4.2,由 CI 运行;本 PR 没改 build 相关文件
真实宿主 E2E NOT RUN 提示词删了一个分支,但没有用真实宿主重跑(需要调用所有厂商)。有发现时父会话重跑的真实路径仍未验证,与 #32 相同

限制

  • thermos 第 4 轮剩下 3 个写法小项,没有改,改了就得再审一轮:
    • pstack-host-e2e.test.py:459-460 的注释写的是审查经过,里面的"1 s"指的是旧参数;
    • 同一文件第 446 行的 run = directory.parent 可以直接写成 directory / name;
    • check-upstream.mjs 用 fileURLToPath(new URL('..', import.meta.url)) 定位仓库根,同目录其他脚本用的是 import.meta.dirname。
  • 未处理:
    • 修复后的再攻击轮数仍不受限,最坏情况会超出默认超时,结果是误拒,不会误放行;
    • Claude/Codex 的证据仍各解析两遍。
  • 两项都是已有问题,留待以后。
  • Claude 父会话命令改为按调用顺序列出,只影响报告里的顺序,没有单独加用例。

🤖 Generated with Claude Code

mtmtian and others added 2 commits October 31, 2026 00:39
- 提示词与 docstring 删掉"或交回写者",流程回到超时预算假设的三轮。
- ShellCommand 加 ran:解析层保留被拒、无结果的调用并标 ran=False,
  由 _rerun_by_parent 判定;checks.json 因此能区分"没重跑"和"重跑被拒"。
  Claude 父会话命令按调用顺序列出。
- model_mismatch 拆成独立用例,回执用固定模型加 resolved_models 的真实形状,
  并以同形状的超时回执作对照。
- _xagent_attempts 的分组 key 只写一处;测试里 ran 不再一词多义;
  docstring 说明 model_mismatch 只排除运行窗口。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ADAPTATION 首行、README.md、README.zh-CN.md 必须引用 UPSTREAM.json 的
版本和提交(README 用 8 位短 SHA 与 tree 链接)。同步时只需改 UPSTREAM.json,
守卫会点名其余没跟上的副本。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-30T16:44:46.033117Z fcffcbf PR opened
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

mtmtian and others added 3 commits October 31, 2026 00:58
- validatePin 加入 .claude-plugin、.codex-plugin 的 version 前缀
  "<upstream version>-shared.",并先校验 UPSTREAM.json 的版本和 SHA 格式;
  ADAPTATION 收尾句写明 manifest 重置为 -shared.1,守卫清单与 docs/ci.md 同步。
- HostAdapter.parent_commands 注释改为"返回宿主自己的每次调用并标 ran"。
- _xagent_attempts 预先算好每张回执的分组 key;ran 规则只在字段注释和
  _claude_result/_codex_command 里各说一次;ran 用关键字传参。
- 测试:pin 用例断言完整消息、覆盖 manifest 和格式错误的 UPSTREAM.json;
  Claude 无结果的调用记为未执行;Codex 用例变量改名。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 宿主 manifest 的版本前缀改在 validateManifests 里按解析后的 version 字段检查,
  不再在 JSON 文本里找子串;每个 manifest 只读一次、只报一次。
- check-fork 导出 readPin,一次校验 UPSTREAM.json 的 repository、path、commit、
  version(含类型),check-upstream.mjs 改用它,commit 正则不再复制。
  格式错误单独成用例。
- 夹具预检不再沿用 --check-timeout:负载下 1 秒不够 Python 启动,会让
  "宿主留下死循环"用例偶发失败(审查者负载下 3/4 复现)。用例改用 0.05 秒,
  旧写法必定失败。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- "宿主留下死循环"用例恢复 1 秒检查时限:0.05 秒时 Python 来不及启动,
  换成正确代码也照样通过,前提不起作用。预检不受 --check-timeout 影响
  另由新用例验证(正确 stub、0.05 秒,断言夹具失败已记录且宿主运行过)。
  两个用例共用 exercise_claude_stub,宿主时限 5 秒。
- readPin 报错写出每个字段的期望格式;UPSTREAM.json 为 null 时按格式错误报。
- check-upstream.mjs 不再引入被参数遮蔽的 path,repo 按校验过的前缀截取。
- validateManifests 在判空后才拼版本前缀;validatePin 只接受非 null 的 pin。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@mtmtian
mtmtian merged commit 48cd2d3 into main Oct 30, 2026
3 checks passed
@mtmtian
mtmtian deleted the claude/post-sync-cleanup branch October 30, 2026 17:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant