Repository navigation
GPT-6 lane: capacity retry, idle watchdog that ignores reconnect notices, completed-turn success, per-lane effort (ultra disclosed as xhigh + delegation) and web search - #549
Conversation
… progress; bounded reconnects on every lane; per-lane effort and web search Found while finalizing #549 against openai/codex rust-v0.159.2: - A SIGTERM'd `codex exec` exits 0: the npm wrapper re-raises the child's signal on itself while its own listener is still registered (codex-cli/bin/codex.js:270-293). The harness recorded such a job as done with empty output, and a same-input start answered "already done". Success now needs exit 0, a turn.completed event and a non-empty -o file; otherwise exit 126, failure kind incomplete (also applied to results and to the already-done check, so earlier false successes rerun). - Each stream reconnect prints a JSONL {"type":"error"} event (core/src/session/mod.rs:5030 -> app-server/src/bespoke_event_handling.rs:1054-1070 -> exec/src/event_processor_with_jsonl_output.rs:447-458), so the idle watchdog no longer counts error events as progress. The 4-hour hang printed no events at all, so it was not a reconnect loop; its cause stays unknown. - features.unbounded_connection_retries=false now applies to every lane: it is provider-independent, and the pool lane still had the default-on loop (features/src/lib.rs:1292-1297). - Budgets from observation: idle 1800 s (healthy jobs were silent for at least 473 s), total 7200 s (a research job was still working at 3000 s); both configurable in staged.json. - staged.json codex.effort follows the user's 2026-09-30 GPT standard (work lanes ultra, blind review lanes max; default max), validated against the 0.159.2 catalog. Ultra is refused for models outside the catalog, where Codex would resolve it to medium (protocol/src/openai_models/reasoning_effort.rs:10-35). codex.web_search takes an upstream WebSearchMode value (default live). Both are bound into inputs.json. Built by a native gpt-6.1-sol builder at ultra from a coordinator brief. The coordinator then corrected the out-of-catalog effort rule and restored a dropped web-search evidence comment. - Tests: 147 passing (3 skipped). - Live native checks, codex-cli 0.159.2: - SIGTERM control: before this change done 0; after it failed 126 incomplete; - the earlier false success now reads failed 126; - an ultra job: done 0, output returned. Co-Authored-By: Claude Opus 5.5 <[email protected]>
9f68193 to
ed81862
Compare
ed81862 to
941d71d
Compare
|
Darwin Diagnosis (run 36768476923, job 110068536952, artifact Fix ( Checks at SOTA sources: apple-oss-distributions/xnu 🤖 Generated with Claude Code |
|
Cross-family review of the Darwin fix delta ( |
|
Real observation: the |
1f6b20d to
daef405
Compare
|
Stacked-state fix: hosted |
…ect notices, completed-turn success, per-lane effort (ultra disclosed as xhigh + delegation) and web search Upstream reference: openai/codex rust-v0.159.2 (ff6aec96948b), the installed client. What changes: - Capacity: "Selected model is at capacity." is terminal upstream (protocol/src/error.rs:384-412). The harness retries it twice with capped, jittered backoff. - Idle watchdog: after 1800 s without a complete non-error JSONL event the process group is stopped (exit 125) and the job retries once. Reconnect notices are JSONL error events (core/src/session/mod.rs:5030 -> app-server/src/bespoke_event_handling.rs:1054-1070 -> exec/src/event_processor_with_jsonl_output.rs:447-458), so they are not progress. The upstream unbounded reconnect stays on: it rides out short outages, and the watchdog stops longer ones. - Success: exit 0 plus turn.completed plus a non-empty -o file; otherwise exit 126, incomplete. The npm wrapper exits 0 on SIGTERM (codex-cli/bin/codex.js:270-293). The same rule applies to result, wait and the already-done check. - Budgets: 4000 s total by default, which fits the sweep wrapper's 8 x 540 s wait. Ultra lanes default to idle 4200 s and total 14400 s, and a staged ultra idle of 3600 s or less is refused, because a root multi-agent wait can block up to 3600 s (core/src/config/mod.rs:257). - Effort: per-lane codex.effort, validated against the 0.159.2 catalog, default max. For gpt-6.1-sol and gpt-6-astra ultra resolves to xhigh per root request plus delegation (models-manager/models.json:22,196; protocol/src/openai_models/reasoning_effort.rs:12-35). That value is recorded as request_effort, and ultra usage is labelled primary_thread_only. - Web search: per-lane codex.web_search, default live. - Other: failure.json on every terminal path; inputs_changed on a restage; a quota probe before every attempt; a 300 s floor before any retry; completed-turn grace at the deadline; the built-in native provider is kept. - Dated amendment in docs/decisions/2026-09-29-codex-lane-default-effort.md, recording the user's 2026-09-30 GPT standard. How it was built and checked: - Built by native gpt-6.1-sol workers from coordinator briefs, with coordinator corrections. - Claude Opus cross-family review: repair. All repairs are applied in this commit. - Tests: 166 OK (3 skipped). - Live native controls on codex-cli 0.159.2: - SIGTERM control: before the fix "done 0" with empty output; after it "failed 126 incomplete"; - max probe: done 0; - ultra probe: done 0, request_effort xhigh. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…'s group holds only exited members The 2026-09-30 macOS full-suite job on this branch (run 36768476923) failed the five watchdog tests whose process group dies at TERM (idle-recover, reconnect, partial, total-timeout, completed-stuck) with exit 2 "refused": XNU's killpg1 skips zombies and returns EPERM when nothing was signalled (apple-oss-distributions/xnu xnu-12377.121.6, bsd/kern/kern_sig.c), so the SIGKILL sent after the grace period raised PermissionError, which run() reports as a refusal; Linux signals a zombie silently, and the stubborn-child test passed on macOS because its group still had a live member. signal_group() now treats ESRCH and EPERM alike for the runner's own descendants, group_alive() no longer reads EPERM as alive, ProcessGroupStopTests fix the behaviour (failing-first: 1 error, 1 failure on the previous runner) and RunnerCase.job() retains the runner's stderr.txt and failure.json whenever a started job is refused, so a future platform difference is readable in the CI log. Co-Authored-By: Claude Fable 5.1 <[email protected]>
…his PR renamed (EFFORT → DEFAULT_EFFORT) tests/test_task_model_routing.py (unit A4, below this PR in the merge train) looks each quoted value up in its cited file; this PR renamed EFFORT to DEFAULT_EFFORT and moved both constants, so the Codex sweep-vote row now quotes DEFAULT_MODEL / DEFAULT_EFFORT at their current lines. Hosted validate on the stacked head 1f6b20d failed exactly that subtest (job 110160196706); no routing changes. Co-Authored-By: Claude Fable 5.1 <[email protected]>
…-file protocol: last commit only)
daef405 to
e9ef08d
Compare
Scope
codex_job.py) against the failures seen on 2026-09-30, and adds per-lane effort and web search:11227bfdlane:foundationtools/sota-convergence/landscape-sweep/{codex_job.py,codex_call.sh,README.md}tests/test_landscape_sweep_harness.pydocs/decisions/2026-09-29-codex-lane-default-effort.md(dated amendment)manifests/evidence.json(hash re-registration only)Why. These are the failures observed on 2026-09-30, all retained in the lane work dirs:
turn.failed"Selected model is at capacity." (exit 1, no output).item.completed web_search) and then nothing for hours until it was killed by hand.SOTA sources
Every rule was checked against
openai/codexat tagrust-v0.159.2(commitff6aec96948b), which is the installed client (codex-cli 0.159.2):codex-rs/protocol/src/error.rs:384-412:retry_delay()returnsNoneforServerOverloaded. The retry therefore lives in the harness.codex-cli/bin/codex.js:270-293: the npm wrapper forwards the signal. When the child dies by signal, the wrapper re-raises it on itself while its own listener is still registered, so the listener catches it and the wrapper exits 0. The native binary handles only ctrl_c (codex-rs/exec/src/lib.rs:1126-1132). exec printsturn.completedand then writes-o(codex-rs/exec/src/event_processor_with_jsonl_output.rs:525-536,631-636). Success therefore requires exit 0,turn.completedand a non-empty-ofile; anything else is exit 126,incomplete.core/src/session/mod.rs:5030→app-server/src/bespoke_event_handling.rs:1054-1070(will_retry: true) →exec/src/event_processor_with_jsonl_output.rs:447-458. So:unbounded_connection_retries(Stable, on:features/src/lib.rs:1292-1297; backoff 5→60 s:core/src/responses_retry.rs:71-96) is kept. Codex rides out short outages, and the watchdog stops a loop longer than the idle budget.gpt-6.1-solandgpt-6-astra,ultraresolves to the model'smulti_agent_reasoning_effort"xhigh"on every root request (models-manager/models.json:22,196;protocol/src/openai_models/reasoning_effort.rs:12-35;core/src/client.rs:863-872), and it enables proactive delegation (core/src/session/multi_agents.rs:77-103). The live catalog cache (fetched 2026-09-30T18:54Z, client 0.159.2) agrees.waitmay block up to 3600 s (core/src/config/mod.rs:257;tools/handlers/multi_agents_v2/wait.rs:53-64), and exec drops sub-agent items (exec/src/lib.rs:1624-1629). Ultra lanes therefore default to idle 4200 s and total 14400 s, and a staged ultra idle of 3600 s or less is refused.exec/src/lib.rs:1636-1638), so ultra usage is labelledprimary_thread_only.models-manager/src/model_info.rs:98-106), where ultra would resolve to medium, so it is refused.protocol/src/config_types.rs:371-382.Evidence-class table
source_reviewnative_provendone 0with empty output; at headdb75ddcafailed 126 incompletenative_provendb75ddca: max probedone 0,request_effort max, usage reported (20,258 in / 52 out); ultra probedone 0,request_effort xhigh, usageprimary_thread_only(20,308 in / 19 out); argv has no provider or reconnect overrideinputs_changed,failure.jsonon every terminal pathsynthetictests/test_landscape_sweep_harness.py(3 skipped)Local commands run
Decision record
docs/decisions/2026-09-29-codex-lane-default-effort.md, "Amendment (2026-09-30)":Overturn conditions:
ServerOverloadedretryable, or fixes the wrapper's exit status: drop the matching harness rule;Review history
Draft
cc00dbd9, from a gpt-6.1-sol research lane.Finalization
9aff1344, by a native gpt-6.1-sol builder at ultra: the completion rule, the error-event rule, per-lane effort and web search.Claude Opus cross-family review: repair. Findings:
Repair round
db75ddca, by the same native builder with coordinator decisions. It fixes all of the above in the allowed paths, and is verified by the tests and the live checks above.Hot-file protocol: rebuilt as
b019b900(content, no hot file) +ed818625(last commit:manifests/evidence.jsononly) on main8fc86119; tree byte-identical to the reviewed head9f68193c; Gate A owner (6d): no objection, merge after c5's train.Residuals
These are outside this PR. All three files are also touched by the open #541, and I've notified its owner.
sweep.js:92: the 4320 s wrapper wait. Queued jobs, and ultra lanes, can still outlast it.convert.py:200-208,291: it dropsrequest_effortandfailure, and would treatprimary_thread_onlyusage as complete.build_args.py:508: it always stages max, which is correct for the sweep's blind lanes, and has no flags for effort, web search or budgets.Checklist
🤖 Generated with Claude Code