Files
Serena Ruan 5cd772a22d dev/resolve-agent: resolve a reproduced bug (review-or-fix) and prove it (#4127)
* dev/resolve-agent: resolve a reproduced bug (review-or-fix) and prove it

Adds the step after repro-agent: given a pointer to a completed repro run — a
local session link or a CI run URL (--ci-link) — resolve-agent recovers the
reproduction (verdict, per-facet breakdown, journey, the authored e2e test) and
drives the bug to resolution.

Two paths, decided by whether an open PR already fixes the bug:
- Review path: check out the existing PR, run the repro test against it
  (pass = it fixes the bug; fail = it doesn't), review the diff, and comment
  findings on that PR — no competing PR opened.
- Author path: audit the repro test against the unfixed tree so it fails on real
  buggy behavior, root-cause, fix, add targeted tests at the changed layer, and
  prove every live facet goes fail->pass.

Robustness on the author path: hostile-env rerun of env-default tests; an
independent cross-vendor review (a codex-native reviewer child on its own diff,
fed a recurring-pitfalls checklist) before opening the PR, reusing the server +
runner it already runs on. Opens a ready-for-review PR; does not merge.
--skip-push commits locally without pushing.

dev/resolve.py mirrors dev/repro.py; tests/dev/test_resolve.py unit-tests the
driver helpers.

Co-authored-by: Isaac

* dev/resolve-agent: address PR review — base off origin/main, stricter ci-link parse, honest guard comment

Review feedback on #4127:

- Base the fix worktree on the latest origin/main, not this checkout's HEAD.
  Running the driver from a feature branch would otherwise drag unrelated
  commits into the fix worktree and contaminate the PR/review. Adds
  _resolve_base_ref() (fetch origin/main, fall back to local main, then HEAD).

- Confirm before creating the worktree, so answering "no" no longer leaves an
  orphaned fix/<slug> worktree + branch on disk.

- Parse the --ci-link URL structurally (scheme + github.com host + anchored
  path) instead of an unanchored substring regex, so a string that merely
  contains the run path (or a different host) is rejected. Adds rejection tests.

- Soften the headless_subagent_purpose_guard comment in config.yaml: it only
  inspects sys_session_send, not the sys_session_create that launches the
  reviewer child, so it does not itself constrain that child — spawn_bounds caps
  the fan-out and the reviewer's read-only behavior rests on its prompt + the
  codex bundle's guardrails.

- Fix two inaccurate inline comments (worktree base, absolute-agent-path
  rationale) to match the actual flow.

Co-authored-by: Isaac

* dev/resolve-agent: recover the pasted test from CI logs (repro-agent #4207)

repro-agent now pastes the complete verbatim e2e test source into its final
message before the JSON handoff. The CI job log echoes that message untruncated,
so on the --ci-link path the log itself now carries the full test body — prefer
reading it from the inline block there, with gh run download as the fallback.
(A live --session transcript is still truncated, so the disk read off the repro
session's workspace stays the robust path locally.)

Co-authored-by: Isaac
2026-08-06 18:11:44 +08:00
..