Repository navigation
Landscape-sweep harness: two-family (Claude + GPT-6) saturation sweep as a reproducible repo tool - #324
Conversation
… and macOS)
tools/sota-convergence/landscape-sweep/ runs the landscape-sweep lane of recipes/saturation-sweep.md
from this repository. Before this, the lane ran only from agent-lab, which remains an alternative. The
lane has two model families:
- Discovery: Claude Opus plus GPT-6-Astra through the Codex CLI.
- Refutation: a Sonnet facts refuter, and fit refutation by one refuter from each family.
- A completeness critic, followed by one bounded follow-up round.
The harness then converts the run into the evidence saturation_ledger.py binds: returns.json,
lanes.json, ledger layers, source reviews, a sanitized child-usage record and RESULT.json.
Changes from the 2026-09-26 prototype:
- No hardcoded paths: every tool takes --work-dir or SWEEP_WORK_DIR, and build_args.py stages the
runtime into the work dir.
- The date, layer count and skills date are template placeholders. Filled with the 2026-09-26 values,
the templates reproduce that run's prompts_sha256 3adfbed7...18d4.
- The GPT-6 runner uses only the Python standard library for locking, detaching and the timeout, so
it runs on macOS bash 3.2 without flock, setsid or timeout.
- Usage-limit detection also reads the error and turn.failed events that Codex prints on stdout in
--json mode (openai/codex rust-v0.155.1, codex-rs/exec/src/exec_events.rs). It never reads model
content.
- Known-repository slugs are no longer cut by rstrip(".git"), which had shortened qdrant/qdrant to
qdrant/qdran in 30 of 32 layers.
- A layer none of whose rounds returned is excluded rather than recorded as a clean layer.
- convert.py sanitizes host paths, scans its output for PRIVATE_CONTENT, and checks each wrapper's
copy of a GPT-6 output against the file Codex wrote.
tests/test_landscape_sweep_harness.py adds 50 stdlib tests on synthetic fixtures. They use a fake
codex and gh on PATH, run sweep.js under node with stubbed agents, and append convert.py and
make_result.py output with saturation_ledger.append in a synthetic checkout.
recipes/saturation-sweep.md gains a dated section, and tools/sota-convergence/README.md gains a
pointer. That README is a registered file, so its manifests/evidence.json entry needs
re-registration.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
…ever counts as clean
A Claude Opus and GPT-6-Astra review of the first package reported nine findings. Each was checked against the
source; all were real, and the reviewers' reproductions now show the repaired behaviour.
- Failed lanes (high). convert.py wrote votes: retained for a layer whose GPT-6 fit jobs, facts refuter or one
discovery family had failed. With every GPT-6 fit job failed, both layers derived as clean (count 1).
convert.py now lists each layer's retained failures under returns.json failures/<layer>:
- lost rounds
- missing discovery families
- missing votes
- a lost critic
- a critic-flagged layer beyond the follow-up cap
- GPT-6 copy problems
Each such layer gets a retained_failure reopen entry pointing there, so it resets (the same sweep now derives 0).
make_result.py refuses a layer whose failures lack that entry, and merges --reopen entries instead of replacing
them. convert.py exits 4 on file_only (an exit-0 Codex output that never reached the workflow), no_file and
file_unparseable, as well as mismatch.
- Re-proposals. A repository proposed again in the follow-up kept its first-round row while its votes were
replaced one by one, and a vote missing in the later round fell back to the earlier round. The latest round's
proposal and all three of its votes now travel together, and a missing vote in that round counts as refuted.
A vote refutes unless it says refuted: false, and a conflicting double vote refutes.
- Effort drift. usage_record.py exits 1 on a non-zero child-usage.mjs exit or on effort_mismatches.
make_result.py refuses a non-zero measurement exit code, listed mismatches, and any child not at effort max
alone. Each Claude vote names its own worker's measured model and effort (null when not measured) instead of a
hardcoded max. The lane limits name the GPT-6 model the jobs reported.
- Lost follow-ups. sweep.js keeps a null follow-up round as {layer_id, catalog, round: followup, lost: true} and
returns lost_followups. A layer the critic names twice gets one round, since a repeat would reuse the first
round's GPT-6 job ids. convert.py attributes a null follow-up from an older run by the critic's plan, and refuses
follow-up rounds that do not match that plan.
- Shell quoting. Every argument and redirection target in the wrapper commands is POSIX-quoted (shlex.quote
rules). Layer ids must match a job-id-safe pattern. Work directories with control characters are refused by
sweep.js and by build_args.py.
- canon(). URLs are told from bare slugs before the slug is taken, so httpie/cli and branch URLs are canonical.
slug() also handles bare owner/repo with .git, and sweep.js slug() is kept identical (tested under node).
- Source reviews. They keep the 2026-09-23 <owner>-<repo>.json names. Names two repositories share get a
sha256-of-slug suffix, and a file reviewing another repository is never overwritten.
Tests: 66 stdlib tests on synthetic fixtures, 16 of them new. Every new test of a repaired behaviour fails on the
previous commit. The slug-parity check and the clean-layer contrast are guards that hold on both commits.
All 66 pass with BASH32_BINARY and shellcheck, and 64 pass with 2 skipped without them. bash -n and shellcheck
0.11.0 pass on codex_call.sh. scripts/validate.py reports only the registered tools/sota-convergence/README.md
hash, from the first commit's pointer line.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
GPT-6 cross-family review (Codex DEFECTS FOUND
Every finding comes from the reviewer's own reproduction or its pinned source reading. The author verifies each one before repairing it. |
- convert.py: collect missing-vote failures per round, so a failed round-1 GPT-6 fit stays a retained failure (and reopens the layer) after a follow-up re-proposal. - codex_job.py: bind a done job to its inputs (prompt/schema sha256, model, effort); a resumed Workflow with a regenerated prompt reruns instead of reusing a cached vote, and a running job with different inputs is refused. - codex_job.py: keep every earlier attempt unchanged under attempts/<n>/ and report each attempt's exit and usage (unavailable when none was reported); convert.py adds them to gpt6_usage.earlier_attempts. - codex_job.py: run Codex without RUST_LOG (trace level logs model response data, codex-rs/codex-api/src/sse/responses.rs at rust-v0.155.1); stderr counts for the usage limit only as an ERROR/Error line when no turn completed. - codex_job.py: timeout cleanup KILLs the whole process group after the grace period even when Codex itself already exited. - README: drop the unretained smoke cost figures and prototype-parity assertions; each run's retained record is its cost reference, parity stays unverified until compared. Eight regression tests fail on f5aaf83 and pass here; suite 71 tests OK (2 skipped). Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
…IMIT refusal GPT-6 re-check of a0988d1 (findings 1, 3, 4, 5 resolved, no new defects) left two: - codex_job.py: a start whose inputs changed but that LIMIT refuses now archives the finished attempt, so result no longer returns the old claim's exit-0 output (the wrapper would have accepted it as ok). Reproduced by the extended test before the fix. - README: the prompts_sha256 note says what was checked: the value computed on 2026-09-26 from that run's staged templates.json, a local check; the run's registered record is the evidence. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Repair of the GPT-6 review of f5aaf83 (2 high, 4 medium)
Re-check: "no new defects". Every finding has a regression test that fails on the pre-repair code (eight in 6a68feb, one extended in 04c4809). Suite: 71 tests OK (2 skipped), Evidence class: local tests and a cross-family source review; no live GPT-6 sweep run used this packaged runner yet (the running 2026-09-26 sweep uses the prototype). 🤖 Generated with Claude Code |
Scope
lane:foundation.recipes/saturation-sweep.md) becomes a reproducible repository tool, so any future session on any host (Linux/WSL2 or macOS) can rerun it without the agent-lab-only path. It lives intools/sota-convergence/landscape-sweep/, and the recipe gets a dated "Run the lane in this repository (2026-09-26)" section.What it does
discover:<layer>(Claude Opus, max effort) runs alongsidegpt6-discover:<layer>(GPT-6-Astra, max effort,codex --search exec, read-only sandbox, stdin closed, neverultra).refute-facts:<layer>(Sonnet, max effort),refute-fit:<layer>(Opus, max effort) andgpt6-refute-fit:<layer>.skills_used.codex_call.sh/codex_job.py):--jsonerror/turn.failedevents. That was a real miss in the live run, fixed there too.convert.pyproduces returns, lanes and ledger layers; lost or degraded layers are never counted as clean.make_result.pyproducesRESULT.json, andusage_record.pywrapschild-usage.mjs.source_reviews.pyusesgh apionly.build_args.pyproduces compact args, plus an embedded-args copy forscriptPathlaunches so large args never enter the coordinator's context.seeds-20260926.json.SOTA sources
scripts/saturation_ledger.py(labels,returns.jsonshapes,workflow_runequal to thetranscript_dirsegment) andrecipes/saturation-sweep.md.sota-convergence.js, cited, not copied.exec_events.rsandevent_processor_with_jsonl_output.rs, which report fatal errors as stdouterror/turn.failedevents.agent/parallel/pipeline) andchild-usage.mjsinexamples/claude-native/workflows/.Evidence-class table
convert.pyon the real smoke run reproduces the prototypesweep.jscontrol flow: labels, models, effort, cap, follow-ups, lost roundssaturation_ledger.appendwith 0 errorsCommands
Review
RUST_LOGis scrubbed so cited text on stderr cannot trigger the limit check.🤖 Generated with Claude Code