sol-max-record / STATE.md
simonycl's picture
Upload folder using huggingface_hub
9589849 verified
|
Raw
History Blame Contribute Delete
58.5 kB

AgentPTB run state

Scope and compliance

  • Objective: improve Qwen/Qwen3.5-9B-Base for agentic software engineering and shell work using weights trained in this run and/or a compliant pi harness.
  • Evaluation-only data: /root/work/shared/tasksets/terminal-bench-2 and /root/work/shared/tasksets/swe-bench-verified. Task texts and solutions will never enter training corpora or selection/filtering criteria.
  • Forbidden materials: other cells/runs, operator notes, benchmark repository, environment credentials as a model/data source, and third-party post-trained weights for initialization/merging.
  • Permitted sources planned: the base checkpoint, public generic code/agent datasets, local synthetic tasks not conditioned on evaluation items, and trajectories generated by locally run public models if useful.

Environment

  • Started: 2026-08-14 16:27 UTC
  • Deadline: 2026-08-18 20:27 UTC
  • GPUs: CUDA devices 4,5,6,7 (four NVIDIA B200 183 GB)
  • Workspace: /mnt/pvc/users/simon/agentptb/runs/sol-max-s1/workspace
  • Base: Qwen/Qwen3.5-9B-Base in the pre-staged Hugging Face cache
  • Trainer: /root/work/a/prime-rl
  • Important serving flags: --enable-auto-tool-choice --tool-call-parser qwen3_coder
  • Important trainer setting: model.attn = "flash_attention_2"
  • Important runtime settings: broker, block_network = false, exported PRIME_API_KEY

Experiment log

  • Base inference server: configs/inference-base.toml, one B200 on physical GPU 4, port 8200. Correctly emits a structured bash call on a manual smoke. Required Qwen parser and multimodal limits confirmed in the resolved vLLM arguments.
  • Base Terminal-Bench 2 smoke attempt: four fixed-seed shuffled tasks, evals/base-tb2-smoke-run. All four were invalid infrastructure results (zero model calls): two broker ready-timeout 408s and two HTTP read timeouts after first-time image preparation. Never count these as reward outcomes. The valid retry in evals/base-tb2-smoke-retry scored 1/4; this is much too small for a useful rate. One failure exhausted context and the success exhausted the episode output-token cap.
  • Public SFT source: Kwai-Klear/SWE-smith-mini_swe_agent_plus-trajectories-66k, revision 750b2c11239fd5e32f97e6cfb9bf80fb9a9a2983, MIT. The published corpus contains 65,994 successful trajectories from synthetic SWE-smith issues; its reported Qwen3-8B SFT result is 39% SWE-bench Verified.
  • Converted corpus: data/pi-swe-smith-66k (4.5 GB). Mechanical conversion only: fenced shell actions to Pi bash function calls, observations to tool messages, source terminal marker to a concise final assistant response. 65,994 rows, 2,197,438 tool calls, 147 malformed/plain actions, and 0 exact identifier overlaps with the local SWE-bench Verified task directory. Provenance is in the dataset directory.
  • Public terminal SFT source: nvidia/Nemotron-Terminal-Corpus, revision a1667c4ffdadea02a89bffe4f1bb7ca2ff19f8d9, CC-BY-4.0. Used only its three broad, novel skill-based synthetic configs, not benchmark tasks or oracle solutions. Converted 131,564 rows and 796,049 shell-action batches to structured Pi calls in data/pi-nemotron-terminal-skill-140k; 8,277 malformed or special-key trajectories were rejected and zero exact evaluation instruction/name overlaps were found. Converter: scripts/prepare_nemotron_terminal_sft.py.
  • A follow-up conservative exact normalized 14-token audit against both evaluation instruction sets removed 5,701 SWE rows and 3,835 terminal-skill rows. Clean components are data/pi-swe-smith-66k-clean14 (60,293 rows) and data/pi-nemotron-terminal-skill-140k-clean14 (127,729 rows). The active balanced mixture is data/pi-agent-mix-clean-v1: 127,729 terminal rows plus two deterministic SWE copies, 248,315 rows total, shuffled with seed 20260814.
  • The initial unfiltered production attempt was stopped and discarded after step 17 as soon as this conservative audit completed. Its data mixtures and output are renamed with quarantined-/discarded- prefixes and cannot be selected accidentally.
  • Optional broad adapter data is staged but is not part of the active run: the public Terminal-Corpus adapter split was converted to 196,767 Pi trajectories and 1,000,521 shell calls in data/pi-nemotron-adapters-226k-v1. A conservative exact normalized 14-token blacklist against both evaluation instruction sets removed 7,434 rows; interactive-key and actionless rows were also excluded. The fully clean fallback mixture is data/pi-agent-mix-clean-v2-adapters (445,082 rows).
  • Full-parameter trainer smoke at 2K was stopped before an update because the window contained no assistant tokens and the loader cycled. Preserved under outputs/sft-smoke.
  • Full-parameter trainer smoke at 8K completed one update successfully under outputs/sft-smoke-8k: loss 0.1684, grad norm 4.8696, peak 168.5/178.4 GiB on one B200. This validates data/rendering/model/backprop but shows full-parameter single-GPU memory is too tight for longer context.
  • Rank-64 LoRA at 32K succeeded both with Ulysses CP=2 (28.8 GiB/GPU, 2m02s compile step) and CP=1 (48.0 GiB, 6.8k tokens/s steady state). CP is unnecessary on B200.
  • Four-GPU full-parameter 32K training is feasible and preferable to LoRA: micro-batch 1 reached 7.3k aggregate tokens/s at 45.6 GiB/GPU; micro-batch 2 reached 11.6k at 48.1 GiB; micro-batch 4 reached 15.5k at 70.1 GiB; micro-batch 8 reached 21.3k at 115.2 GiB. All losses and gradient norms were finite. Production uses micro-batch 8.
  • The clean production recipe follows the published Terminal-Corpus setup where practical: 32K, AdamW at 2e-5, weight decay 1e-4, beta2 0.95, cosine schedule with 10% warmup, global batch 128, full-parameter training. Config: configs/sft-agent-mix-clean-full-v1.toml; output: outputs/sft-agent-mix-clean-full-v1.
  • Clean production started at 2026-08-14 18:17 UTC. Checkpoint 50 completed cleanly: loss 0.2909, recent mean 0.2697, no NaNs, 102 GiB resumable state, 18 GiB stable HF weights, and 143.8 seconds of save overhead. Step 51 then completed normally (loss 0.2772, grad norm 0.2748). Step 150 is projected near 2026-08-15 01:00 UTC including the two remaining checkpoint saves.
  • Paired evaluation tooling is ready: stock and custom runs use the same fixed seed-0 sample, scripts/run_paired_evals.sh launches isolated concurrent runs, and scripts/compare_evals.py reports paired outcomes.
  • Evaluation reporting now uses the conservative score and Wilson interval over every scheduled episode. Reward-bearing-only scores are explicitly diagnostic, and any transient errored episodes will be resumed on the same fixed sample rather than dropped from the denominator.
  • The active loader advances about 243 raw trajectories per optimizer step. At that measured rate, the prepared step-2,050 continuation lands at about 2.01 epochs, matching Terminal-Corpus's published two-epoch recipe. The first 36,500 shuffled rows retain the full mixture ratio (51.44% terminal / 48.56% SWE).
  • A structural quality audit found that 54,322/127,729 clean terminal rows end in an explicit non-tool assistant completion; the remaining source rollouts stop at a tool observation or turn limit. All 60,293 clean SWE rows finish explicitly. The independently filtered, evaluation-content-blind continuation mixture data/pi-agent-complete-mix-v1 contains two copies of each complete component (229,230 rows total). It is staged only; step 150 will be evaluated before any branch is trained on it.
  • The public Terminal-Corpus paper's own broad ablation strongly favors retaining incomplete synthetic trajectories: 12.4% TB2 unfiltered versus 6.74% complete-only and 5.06% success-only. It also favors single-stage mixed training (13.03%) over a two-stage curriculum (10.39%). Therefore the evidence-backed main continuation remains pi-agent-mix-clean-v1; the complete-only corpus is only a possible narrow stopping ablation.
  • Custom Pi now optionally advertises the true model context window and per-call generation ceiling. Custom configs set 65,536/4,096, enabling Pi's generic automatic compaction before a backend overlong-prompt error. Defaults remain unset, so stock Pi behavior is unchanged. A no-review custom variant is ready for a paired step-150 ablation of the generic review pass.
  • Custom evaluation variants now accept Pi's clean empty end-turn after its tool activity, so a modified workspace reaches the task grader instead of becoming an unscored harness error merely because no separate prose was emitted. Stock Pi remains unchanged. The option parsed successfully in the pinned run environment; an attempted broad Verifiers test collection was blocked before tests by an unrelated installed prime_sandboxes API mismatch.
  • Evaluation summaries now derive their conservative denominator from the saved num_tasks * num_rollouts configuration and explicitly count missing trace records. A client crash therefore cannot inflate the reported score by silently shrinking the denominator.

Current plan

Before any step-150 selection result was available, the continuation's purely mechanical benchmark set was extended with micro-batch 10/global-batch 120 and micro-batch 12/global-batch 96. The measured micro-batch 4-to-8 memory curve predicts both may fit on B200, and reducing accumulation could increase useful tokens per second. Each variant must still complete finite steps, remain below 170 GiB/GPU, save both resumable and HF step-152 checkpoints, and beat the same-batch-128 baseline throughput by at least 3%. The fastest eligible recipe wins. If a different global batch is selected, the deadline calculation uses its actual tokens/update and the terminal-step cap preserves the original batch-128 two-epoch token budget. This changes no data, score gate, or model branch.

The waiting agentptb-post-step150 session was restarted after this edit so its shell reads the new benchmark set. At restart the evaluation-complete marker did not exist; the live step-150 evaluator and inference process were left untouched. All six benchmark and production TOMLs parse, both new global batches satisfy Prime-RL's divisibility invariant, and the handoff script passes bash -n.

At 2026-08-14 21:04 UTC, a focused Prime-RL unit-test invocation triggered the suite's module-level pkill -f torchrun cleanup fixture and terminated the live trainer after step 63. This was a test-isolation error, not a model or data failure. Steps 51--63 were not checkpointed and were discarded.

The first resume exposed a Prime-RL CPU-offload edge case: optimizer tensor states and the scheduler counter loaded, but optimizer param-group LR did not, pinning steps 51--52 near 2e-13. That attempt was stopped and discarded. The documented workaround is now in the same resume config: skip_scheduler = true, a new 100-step cosine with no warmup, and peak LR 1.7e-5 (the actual LR at checkpoint 50). Model, optimizer moments, progress, and dataloader still load from step 50.

Active trainer tmux: agentptb-sft-clean-resume50b. At 2026-08-14 21:18 UTC it started the corrected resume; step 51 completed at 21:22 with loss 0.2772, gradient norm 0.2748, and the intended LR 1.70e-5. Do not run the root Prime-RL pytest suite alongside training unless PRIME_RL_TEST_SKIP_PROCESS_CLEANUP=1 is explicitly set. The metrics file keeps stale rows 51--63 from the killed attempt and 51--52 from the near-zero-LR attempt; later appended rows supersede them, while training_status.py will continue to show 63 until the corrected resume passes it. At 21:42 UTC the corrected run reached step 59 with finite loss 0.2824, gradient norm 0.2982, LR 1.67e-5, and 28.0k tokens/s; all corrected-resume updates through that point were healthy.

At 21:50 UTC the corrected run reached step 62 with loss 0.2786, finite gradient norm 0.2788, intended LR 1.65e-5, and 28.0k tokens/s. A deterministic 2,000-row structural sample of the active mixture found an exact SFT system prompt match in every row, only the aligned bash structured tool in assistant actions, a median/p95 of 11/51 assistant turns, and an explicit final assistant completion in 70.0% of rows. Every intermediate assistant tool turn is still rendered with its own supervised end-turn token. This supports the 64-turn custom ceiling and does not justify switching to the staged completion-only branch before seeing actual candidate stop behavior.

A direct step-50/base tensor comparison confirms lineage and nonzero updates: model.language_model.layers.0.input_layernorm.weight differs from base by mean/max absolute 7.71e-5/4.88e-4, while the frozen model.visual.blocks.0.norm1.weight is exactly identical to base.

Separate evenly spaced component samples also checked the row-level balance. Terminal-skill rows average 6.47 assistant turns and about 21.3k assistant characters; SWE-smith rows average 33.96 turns but about 25.6k assistant characters. Because the mixture has 127,729 terminal rows and 120,586 repeated SWE rows, supervised assistant volume is therefore close to balanced rather than being dominated by SWE's longer tool-output histories. The public Terminal-Corpus ablation confirms that adding all adapter sources gives only a small TB2 mean gain over skill-only data (13.03% versus 12.4%) when each recipe is trained for two full epochs. At this run's fixed remaining compute, the 445k-row adapter-expanded mixture would receive under one epoch and dilute the high-value SWE source. Keep the evidence-backed 248k-row active mixture for the long continuation unless candidate evaluation reveals a clear contrary failure.

All staged resumed-training configs now use zero-warmup cosine restarts. With CPU-offloaded optimizer state, constructing a warmup scheduler before checkpoint load mutates the param-group LR to the warmup floor, and loading tensor state does not restore that group. Fresh-from-base configs retain their normal warmup.

The guarded agentptb-post-step150 watcher now prevents an idle gap after the step-150 evaluations. Once evaluation has completed and inference has fully released the GPUs, it hard-links the resumable step-150 state into an isolated two-update selective-activation-checkpoint benchmark. The benchmark now must successfully save both the resumable and HF-compatible step-152 checkpoints, which exercises the temporary GPU staging of CPU-offloaded Adam state that its earlier train-step-only check missed. It selects selective AC only after that save, at >=29.0k tokens/s and <=170 GiB peak training memory; otherwise it uses the proven full-AC config. It then launches the same-mixture step-1,800 continuation as agentptb-sft-continuation. Decisions and the measured benchmark are written under state/; no dataset branch is selected automatically.

The handoff now also benchmarks full activation checkpointing with GPU-resident Adam state, plus full checkpointing with activation offloading disabled while Adam stays on CPU. Four-way B200 sharding may fit either despite the source paper's H100-oriented offload recipe, and avoiding one class of host traffic could improve throughput. The proven recipe and all three experimental variants independently resume step 150, perform steps 151--152 on the same dataloader state, and must show finite metrics, LR in [1.9e-5, 2.1e-5], no more than 170 GiB peak training memory, and successful resumable plus HF checkpoint saves. Because packed-document lengths make absolute throughput batch-dependent, an experimental variant must beat the paired proven-recipe baseline by at least 3%; the fastest eligible variant wins, otherwise the baseline recipe remains the fallback. The running post-step150 watcher was restarted after this change. Benchmark and inference launchers now execute through a setsid bash wrapper, and cleanup probes and kills the whole process group even when a uv leader exits before torchrun workers. The sleeping step-150 evaluation and post-evaluation watchers were restarted to load this cleanup fix; the live trainer was untouched. The initial continuous target was step 1,800 (about 1.74 corpus epochs). At the proven fallback throughput, including the three save-through benchmarks, this still leaves roughly 20 hours before the deadline for checkpoint checks and the full 1,178-episode canonical stock/custom measurement. The chosen resume file's historical max_steps = 1650 is overridden explicitly on the launch command and recorded in state/continuation-config.txt; the resolved trainer config will therefore preserve the actual 1,800-step schedule. The initial deadline guard fell back to step 1,650 if fewer than 87 hours remain after development evaluation and the three mechanical benchmarks. The preservation watcher reads the recorded resolved target, so either terminal checkpoint is retained and labelled correctly. At the expected handoff time the 1,800-step branch had about two hours of additional guard beyond this threshold. This discrete rule was superseded before evaluation by the score-independent throughput/time calculation recorded at the end of this section.

All step-150 configs now use one typed whole-episode retry limited to explicit sandbox/network infrastructure exceptions; context, model, harness, and task failures remain single-shot. Dry config validation confirmed the retry policy, and the temporary dry-run output directories were removed before evaluation. True stock configs leave every newly added Pi option unset (including text_only), while custom configs retain the aligned prompt and other opt-ins.

Canonical final configs are staged for all 89 TB2 and all 500 SWE-bench Verified tasks. The four-run stock/custom launch allocates 16 concurrent episodes to each TB2 run and 48 to each SWE run, totaling the measured-safe 128 sandbox ceiling. scripts/run_final_evals.sh requires an explicit review/no-review/stock choice plus sampling temperature and refuses to overwrite existing results. The wrapper consumes both precommitted state files. The selected model will be exposed through submission/model only after checkpoint selection.

At 22:36 UTC a takeover audit caught a completion-sentinel mismatch in the post-step-150 benchmark watcher before it ran. Prime-RL resumable checkpoints finish with checkpoints/step_N/trainer/.metadata; only HF weight exports have a root STABLE marker. The watcher had required a nonexistent resumable STABLE, which would have falsely rejected all four execution benchmarks. Both the early-return and polling predicates now require the real metadata file plus the HF STABLE marker, bash -n passes, and only the sleeping agentptb-post-step150 session was restarted. The active trainer was untouched. At the same audit the clean resume was at step 80 with finite loss 0.2646, gradient norm 0.2875, intended LR 1.37e-5, 27.6k tokens/s recent throughput, and 116.2 GiB/GPU peak memory. The SFT rows' system prompt and four-tool schema were also checked directly against the custom Pi prompt/schema.

The final sampling and review choices are fixed before candidate results are visible. Qwen's public Qwen3.5 model card recommends temperature 0.6/top-p 0.95 for thinking-mode precise coding, whereas the initially staged temperature 0.2 had not been measured. The development gate therefore evaluates aligned no-review and review at both temperatures on the same 32+32 tasks. Temperature 0.6 is the evidence-backed default; 0.2 replaces it only if it solves at least as many tasks on each suite, has a strictly positive combined paired advantage, and its combined two-sided exact sign-test p-value is at most 0.10. At the selected temperature, review is enabled under the identical non-inferiority, positive-advantage, and p-value rule; otherwise use aligned no-review. Missing or errored episodes count as failures, and reward-bearing-only rates do not select either setting. The SFT-aligned scaffold remains the default; stock replaces it only under the identical per-suite non-inferiority, positive paired advantage, and p-value gate. Ten primary development runs at concurrency 12 each keep total sandbox concurrency at 120, followed by two stock t=0.6 runs at concurrency 32 each (64 total). scripts/select_harness.py implements this rule, and the sleeping step-150 evaluation watcher writes the full decision JSON, selected temperature, and selected review mode under state/ before releasing the continuation watcher.

Final checkpoint selection is likewise score-independent. Select the recorded terminal target if its HF export has STABLE, every indexed shard exists and loads with the declared shapes, the terminal training metrics and gradients are finite, and a served structured-tool-call smoke succeeds. If and only if that artifact is corrupt or training becomes numerically unhealthy, walk backward through the scheduled stable checkpoints and take the newest one satisfying the same health checks. No intermediate checkpoint is benchmarked to make this choice.

Checkpoint 100 completed and passed the independent header/metric gate at 23:28 UTC. The resumable trainer/.metadata and HF STABLE markers exist; all four shards expose exactly 760 indexed BF16 tensors totaling 9,409,813,744 elements. Step-100 loss was 0.2561, gradient norm 0.2770, LR 8.77e-6, and NaN count zero. The trainer continued normally toward step 150.

agentptb-finalize-when-ready now closes the last idle gap. It reads the recorded continuation target, waits for the preservation watcher to hard-link that terminal HF export and for its tmux session to exit, then runs the full finite-tensor/package gate and the process-group-owned final inference/evaluation pipeline. Any health or pipeline failure stops closed and leaves logs/results for manual recovery; it never chooses a checkpoint from scores.

At 23:53 UTC the active resume reached step 110 with loss 0.2685, recent-mean loss 0.2612, gradient norm 0.2471, zero NaNs, and a 150.0-second recent mean update time. Step 150 was projected about 1.7 hours later. All five trainer/evaluation/continuation/preservation/finalization tmux sessions were alive, port 8200 was free, and every downstream state marker/output path was still clean.

At 00:01 UTC on 2026-08-15, the resumed controller reconciled this persisted state with live processes. Training was healthy at step 113 (loss 0.2558, gradient norm 0.2424, zero NaNs, 28.0k tokens/s) with 92.4 hours remaining. The step-150, continuation, preservation, and finalization watchers were all alive; no candidate/final output collision or premature readiness marker was present. A line-by-line handoff audit confirmed that stock configs leave every custom Pi option unset, scheduled-task denominators come from the saved configs, and the terminal targets remain checkpoint-aligned. The public Terminal-Corpus paper was rechecked directly: its default recipe is 2 epochs, 32,768 tokens, global batch 128, AdamW at 2e-5, cosine with 10% warmup, and it favors unfiltered mixed training. This continues to support the existing same-mixture long run.

Before the step-150 gate, the 32 fixed-seed development images from each suite were prewarmed through the documented sandbox API. Selection reproduced the evaluator's sorted task order and fixed random.Random(0) shuffle; only task.toml image fields and Dockerfile FROM lines were read, never solutions. All 64 containers reached ready in at most 62.8 seconds and all 64 were deleted. An initial API-envelope mismatch (sandbox_id versus the runbook's example id) created 64 pending probes; /resources identified the exact 64 short-ID cohort, and every one was immediately deleted before the corrected run.

The custom empty-end-turn guard was tightened before evaluation to require a nonempty ACP tool-call set, matching its documented purpose: grade a workspace after clean tool activity, but never reinterpret an immediately empty response as completion. The tracked diff archive was regenerated mechanically and its new SHA-256 is 12533f9c06b3fe79f92c193b1a2f90953e44778b0aca3b21e4b8f2166eafc22b.

A second pre-handoff audit fixed a metric-flush race in post_step150_continue.sh: each two-update execution benchmark now requires the step-152 resumable metadata, HF STABLE marker, and logged Step 152 | metric line before terminating its deliberately longer trainer. Without the third predicate a fast poll could kill between the save and metric flush, falsely invalidating every variant. bash -n passed and only the sleeping post-step-150 watcher was restarted; the live trainer was untouched.

  1. Finish the first full-parameter mixed SFT gate at step 150.
  2. Evaluate step 150 with stock and custom Pi on fixed unbiased samples from both suites.
  3. If step 150 validates the recipe, continue the same mixture with a terminal step fixed mechanically before continuation starts. The handoff uses the selected execution variant's measured throughput, a 5% step-time penalty, amortized checkpoint overhead, a 30-minute startup guard, and an 18-hour final-measurement reserve. It caps at step 2,050 (about two epochs). The calculation is independent of candidate rewards and is recorded in state/training-variant-benchmarks.txt and state/continuation-config.txt. Public scaling and curriculum ablations favor more mixed SFT over a component switch.
  4. Select the healthy terminal checkpoint a priori (intermediate saves are only rollback points), run the canonical full suites, and package the checkpoint/harness.

At 00:25 UTC on 2026-08-15, before step-150 weights or evaluation outcomes existed, the fixed 1,650/1,800 deadline branch was replaced by the mechanical throughput/time calculation above. This avoids leaving training compute idle if an independently validated GPU-memory variant is materially faster, while the two-epoch cap prevents an open-ended fit. bash -n passed and only the sleeping agentptb-post-step150 watcher was restarted; the live trainer was untouched.

At 00:31 UTC, a resumed-controller handoff audit verified the dynamic terminal path end to end without touching the trainer. Prime-RL's SFT loop always writes both resumable and HF exports at the final max_steps, even when it is not a checkpoint-interval multiple, and the documented CLI syntax accepts the staged --max-steps override. All workspace shell scripts passed bash -n, all Python scripts parsed successfully, and the Prime-RL diff passed git diff --check. The old ac-selective-bench and noactoffload-bench directories contain only dry-validation configs, not stale step-152 artifacts, so the execution gate cannot accidentally reuse a prior benchmark. The manual checklist's obsolete fixed step-1,800 wording was updated to match the already-precommitted dynamic target. Training was healthy at step 125: loss 0.2641, gradient norm 0.2247, zero NaNs, and about 27.6k tokens/s, with roughly one hour remaining to step 150.

At 00:36 UTC, the resumed controller completed another read-only audit of the development and final handoff. Verifiers' eval runner binds each concurrent environment server to tcp://127.0.0.1:0, so the ten-process development gate cannot collide on the serialized config's default port 5000. Its output writer persists one complete episode atomically per scheduled rollout, and the fixed configs have unique output directories. The watcher process-group cleanup, step-152 save/metric predicates, dynamic target propagation, final stock/custom output labels, and scheduled-task denominators remain internally consistent. The live trainer was untouched and reached healthy step 127: loss 0.2558, gradient norm 0.2322, LR 2.30e-6, and 28.1k tokens/s.

At 00:40 UTC, after the supervisor resumed again, all five critical tmux sessions were reconciled against their actual process trees. The clean trainer was healthy at step 128 (loss 0.2551, gradient norm 0.2266, zero NaNs, 28.1k tokens/s, 116.1 GiB/GPU peak), with about 55 minutes projected to step 150. The step-150 evaluation, post-evaluation benchmark/continuation, dynamic checkpoint preservation, and finalization watchers were all alive and waiting on the correct sentinels; port 8200 and every downstream state marker remained clean. A fresh line-by-line audit of the handoff scripts confirmed unique dev output directories, the 120-sandbox aggregate concurrency, process-group-owned inference cleanup, step-152 save-plus-metric gates, and propagation of the mechanically selected terminal step into preservation and packaging.

At 00:47 UTC, the newly resumed controller re-read the persisted state and reconciled it with the live host before taking any action. The corrected trainer was healthy at step 132/150: loss 0.2564, recent-mean loss 0.2600, gradient norm 0.2239, zero NaNs, 28.0k tokens/s recent throughput, and 116.1 GiB/GPU peak memory. All five trainer/evaluation/continuation/preservation/finalization tmux sessions remained alive; port 8200 was free, and no development/final output collision or premature state sentinel existed. A read-only audit of the active handoff reconfirmed process-group-owned inference and benchmark cleanup, the real resumable/HF/metric completion predicates, fail-closed selection files, and dynamic terminal-step propagation. The trainer was not disturbed.

At 00:58 UTC, the active trainer reached step 136/150 with loss 0.2579, recent-mean loss 0.2552, gradient norm 0.2151, zero NaNs, 27.9k tokens/s recent throughput, and 116.1 GiB/GPU peak memory. The resumed controller audited the development launcher, the ten then-staged fixed-sample configs, the precommitted temperature/review selector, the four save-through execution benchmarks, the dynamic continuation target calculation, terminal-checkpoint preservation, finite-tensor packaging gate, and four-way final evaluator. The aggregate development concurrency remains 120 and final concurrency remains 128; stock configs leave every custom Pi option unset. No active process or artifact was changed other than this state record.

At 01:03 UTC, still before step-150 weights or outcomes existed, the development gate gained a conservative scaffold fallback. The SFT-aligned prompt remains the default; true stock Pi can replace it only if stock is non-inferior on each suite, has a positive combined paired advantage, and reaches the same exact sign-test p<=0.10 threshold. Two fixed-sample stock t=0.6 arms were added so the comparison uses identical sampling. They run as a separate 64-sandbox wave after the existing 120-sandbox wave. All six new development/final fallback configs passed the evaluator's dry resolver, shell/Python/TOML checks passed, and the dry output directories were removed. Only the sleeping step-150 watcher was restarted to load the change; the live trainer and other watchers were not touched.

At 01:11 UTC, the newly resumed controller reconciled the full persisted campaign with the live host and left all active processes untouched. The trainer was healthy at step 141/150: loss 0.2536, recent-mean loss 0.2578, gradient norm 0.2115, zero NaNs, 27.8k tokens/s, and 116.1 GiB/GPU peak memory. All five handoff sessions remained live and were waiting on the intended sentinels. A read-only inspection reconfirmed the development selection logic, the four isolated save-through execution benchmarks, deadline-derived terminal step, terminal-checkpoint preservation, full finite-tensor packaging gate, and stock/custom full-suite evaluation. The optional Pi skill path was also inspected; no new skill was added because the concise custom prompt already matches every SFT row and introducing an untrained skill-loading pattern before the paired gate lacked supporting evidence.

At 02:03 UTC, the resumed controller found that step 150 had completed and the trainer had exited normally. The four-way DP candidate server was healthy and the precommitted ten-arm development wave was running at the planned aggregate concurrency of 120; all downstream benchmark, preservation, and finalization watchers remained live. Early traces were explicitly treated as incomplete, not as denominators. They nevertheless confirm the broad motivating failure mode: many step-150 generations still consume the full 4,096-token call budget, and SWE episodes sometimes emit dozens of tool calls in one assistant turn, expanding the observation history until context compaction/termination. At least one early SWE episode had already passed. No selection rule, evaluation config, active process, or checkpoint was changed after observing these partial results.

At 02:38 UTC, the controller again reconciled persisted state with the live host. All ten fixed development evaluators and the four-way step-150 server were healthy, and all four downstream watcher sessions were present. Each evaluation had completed roughly 27--33 rollout attempts, including the first typed retries; the synchronized SandboxError entries occurred at the configured 20-minute episode boundary for the still-running cohort and are not being interpreted as model outcomes. The server continued returning successful requests and all four worker health probes passed. No partial score was used, and no process, config, selection gate, or checkpoint was changed.

Before selection ran, a fail-closed audit found that select_harness.py validated each saved config as 32x1 but did not explicitly require all 32 distinct trace records or identical task keys in each pair. The selector now raises unless both invariants hold. This leaves the precommitted temperature, review, scaffold, and significance rules unchanged while preventing a client crash or mismatched sample from silently influencing selection. Python syntax and the workspace diff check pass; no active evaluator was touched.

The broker /resources endpoint then showed the cause of the synchronized readiness failures: only 33 of 160 shared sandbox pods were running while 127 were pending, despite nominally free aggregate CPU and memory. The candidate server was correspondingly idle and healthy. Before the separate stock-t=0.6 wave launched, its width was reduced from 32 to 16 per arm (64 to 32 aggregate) to avoid repeating this live shared-pool contention. Its exact fixed 32-task samples, sampling parameters, retry policy, and selection rule are unchanged; both TOMLs parse and the watcher passes bash -n.

At 03:03 UTC, the infrastructure-repair path was reconciled with the live selector before either had run. select_harness.py already waits up to eight hours for state/step150-infra-repair-complete, keeping the step-150 server alive and preventing unrepaired sandbox failures from entering selection. The repair backlog was already about 90 episodes, so the repair scheduler was changed from twelve sequential arms to three batches of four arms. Each arm still resumes only its same fixed task indices, preserves model/harness errors, uses an isolated manifest and process group, and retains the six-pass cap. The largest batch requests at most 56 sandboxes, below the documented 128 ceiling. bash -n passed and only the waiting repair tmux session was restarted; no active evaluation, model server, trace, score, or selection rule was changed.

The same observed infrastructure failure was removed from the unattended final path before any final run existed. All sixteen possible final configs now use 8-way TB2 or 16-way SWE concurrency, for 48 aggregate episodes in whichever precommitted four-run combination is selected. run_final_evals.sh then invokes repair_eval_infra.sh, which concurrently resumes only missing rows and typed sandbox/network errors from the same saved runs and fails closed after six passes. Other failures are protected and restored exactly at the parsed-record level; a 32-row semantic prepare/restore round trip passed. All TOMLs parse, the selected aggregate is 48, both shell scripts pass bash -n, and the Python helpers compile. No final task, checkpoint, or score existed when this was fixed.

At 03:36 UTC, the resumed controller found one idle duplicate repair process left from the earlier standalone repair watcher. The active run-2 evaluation watcher already invokes the same repair inline after both fixed waves; allowing both copies to wake on the 12 completed directories could have made them rewrite and resume the same traces.jsonl files concurrently. The duplicate was confirmed to be sleeping in the all-32-rows wait loop with no repair child, then terminated without touching the ten active evaluators or inference server. repair_step150_infra.sh now takes an exclusive workspace flock before editing traces, so any future accidental second invocation serializes safely. The script passes bash -n; all ten evaluators remained alive and the candidate server health endpoint remained 200. A contemporaneous broker snapshot showed 52 running and 105 pending shared sandbox pods, so the already-running 120-wide initial wave is expected to leave typed infrastructure retries for the lower- width repair phase; no score, sample, or selection rule was changed.

At 03:50 UTC, the generic turn-boundary investigation established that the step-150 checkpoint had learned to emit <|im_end|>, while its inherited generation metadata still named only <|endoftext|> as EOS. On the same task-independent tool-call prompt, default serving consumed the full 512-token ceiling and parsed two calls; explicitly stopping on token 248046 consumed 152 tokens and returned one valid call. The pre-selection development attempt was therefore stopped and quarantined as a serving-metadata error without consulting task rewards. scripts/ensure_chat_stop_metadata.py now records both token 248044 and token 248046 as EOS without changing model tensors or tokenizer entries. A fresh server honored that metadata by default (152 tokens, one call), and the normal structured smoke completed in 67 tokens. Terminal preservation and packaging apply and validate the same correction.

At 03:51 UTC, all ten partial pre-fix run-2 directories and their launch logs were moved under evals/quarantined-stop-metadata-run2 and logs/quarantined-stop-metadata-run2; none can enter the selector. A clean step-150 watcher was launched against the identical fixed samples. The twelve arms now run in four sequential three-arm waves at concurrency 8 per arm, so aggregate live sandbox demand is 24. Evaluator signal cleanup was also made idempotent after the deliberate interruption exposed double-wait warnings. The downstream continuation, preservation, and finalization watchers remain fail-closed on the clean gate's completion marker.

At 04:00 UTC, the resumed controller reconstructed the campaign from this file and the live workspace (the supervisor's generic /workspace/state path does not exist in this cell; this workspace's STATE.md and state/ directory are the persisted ground truth). The corrected four-way step-150 server was healthy, its structured smoke used one valid bash call and stopped after 67 completion tokens, and the first clean matched wave was running the three TB2 arms at 8-way concurrency each. The first saved traces were appearing in all three run-2 directories. The continuation, terminal-preservation, and final pipeline watchers were alive and still blocked on the clean evaluation gate; no selection marker or stale infrastructure-repair marker existed. No active process, configuration, task sample, or decision rule was changed during this recovery audit.

At 04:06 UTC, a score-independent audit fixed one missing-row deadlock in the not-yet-run step-150 infrastructure repair. The old precondition waited for all twelve original directories to contain exactly 32 traces before invoking the helper whose purpose includes repairing missing traces. It now waits for the original evaluator processes to exit, requires each saved resume config, creates an empty trace file only if an evaluator failed before doing so, and then lets the existing fixed-index missing/transient repair run. Model, harness, context, and task failures remain protected verbatim. bash -n passes; the active first clean wave was not touched.

At 04:11 UTC, the same not-yet-invoked repair path received the complementary missing-row fix. Its per-arm loop already reported both missing and transient counts, but only entered --resume when the latter was nonzero. A client crash that left no trace row and no recorded exception could therefore reach the strict selector unrepaired. The loop and its terminal assertion now require both counts to reach zero, matching the already-tested canonical-final repair controller. bash -n and the Prime-RL workspace diff check pass; no active evaluator, trace, task sample, or model outcome was changed.

At 04:22 UTC, the resumed controller read the complete persisted campaign and reconciled it with the live processes before intervening. The corrected step-150 server and all four workers were healthy, the structured smoke still showed a clean 67-token tool turn, and every downstream watcher remained blocked on its intended sentinel. The first clean fixed-sample wave had saved 31/32 traces in each of its three TB2 arms; one long episode or typed retry per arm was still active, while the broker had recovered to 37 running pods and only one pending pod. No configuration, trace, task sample, selection rule, model artifact, or active process was changed.

At 04:32 UTC, another recovery audit verified the step-150 checkpoint directly: all four indexed BF16 shards contain the expected 760 tensors (9,409,813,744 elements), the terminal loss/gradient/LR metrics are finite, and the corrected server remains healthy. The three first-wave TB2 arms are still at 31/32; the unmatched rollouts began between 03:54 and 04:06 and remain within the broker runtime's explicit 3,600-second command budget. They were therefore left untouched. The continuation, preservation, packaging, finite-tensor scan, and four-arm full-suite final pipeline were re-read end to end; their sentinels, process-group cleanup, selected-step propagation, fixed denominators, and infrastructure-only retry behavior remain consistent. The deadline is 2026-08-18 20:27 UTC (about 87.9 hours remained at this audit).

At 04:45 UTC, the resumed controller re-read STATE.md, the live state/ directory, the evaluation/runbook references, and the active handoff scripts. The first corrected TB2 wave remained at 31/32 in each matched arm, with all three original evaluator processes still alive and within the declared one-hour command budget. The four-way inference health endpoint reported all workers healthy, the continuation/preservation/finalization sessions remained blocked on the clean selection marker, and no downstream state file had been created prematurely. The active processes and artifacts were left unchanged.

At 05:09 UTC, a fresh controller reconciled the complete in-run record with the live host. The corrected low-temperature TB2 wave had finished all 32 rows in each matched arm with no missing or typed infrastructure failures, and the three matched SWE arms had started normally at eight-way concurrency each. The candidate server and all four workers remained healthy. A reward-blind transport audit found 20 stock Pi HarnessErrors versus 4 aligned-no-review and 6 aligned-review errors; the custom residuals were overwhelmingly deliberately rejected immediately empty turns, while nonempty clean tool-end turns were accepted as designed. Median completion length was 258--261 tokens and only 95 of 1,478 TB2 model calls hit the 4,096-token ceiling, confirming that the portable <|im_end|> stop correction removed the earlier runaway-generation failure. No evaluation outcome, active process, configuration, selection rule, checkpoint, or downstream sentinel was changed.

At 05:20 UTC, the resumed controller re-read the persisted workspace state, evaluation kit, sandbox runbook, active scripts/configs, process tree, and all current artifacts. /workspace/state does not exist in this cell; STATE.md and this workspace's state/ directory remain the ground truth. The low- temperature TB2 arms and stock/no-review SWE arms were complete at 32/32, while the review SWE arm was still running at 28/32; the four-way candidate server and every downstream watcher were healthy and untouched. Completed scheduled- task scores were 3/32 stock TB2, 2/32 aligned-no-review TB2, 2/32 aligned-review TB2, 3/32 stock SWE, and 3/32 aligned-no-review SWE. These are development diagnostics only; no partial result changed the precommitted selection rule or continuation. The stale high-concurrency command in EVAL_CHECKLIST.md was updated to document the already-active four sequential 24-sandbox waves; no executable config or process was changed.

At 05:24 UTC, the controller completed the requested ground-truth recovery from STATE.md, state/, the current run report/checklists, live process tree, GPU ownership, and the evaluation/continuation/finalization scripts. The persisted campaign and host agree: step 150 is healthy and preserved, its corrected chat-stop metadata is active, five of the six low-temperature arms have all 32 fixed traces, and aligned-review SWE has 28/32 with its evaluator still live inside the configured runtime budget. The four-way candidate router reports all workers healthy; the evaluation, continuation, preservation, and finalization watchers are alive, and no selection or continuation marker exists prematurely. No active process, task sample, configuration, selection rule, or artifact was changed during this recovery.

At 05:33 UTC, the newly resumed controller re-read the complete persisted record, the evaluation-kit and sandbox-runbook contracts, the active handoff scripts, current state markers, process tree, GPU ownership, and evaluation artifacts. The host still agrees with the record: the four candidate workers on physical GPUs 4--7 and the router health endpoint are healthy, all four downstream watcher sessions are alive, five low-temperature arms contain 32/32 traces, and the aligned-review SWE arm remains at 28/32 with its original evaluator active inside the one-hour command budget. Neither a selection nor continuation sentinel exists. No active process, evaluation record, model artifact, configuration, task sample, or precommitted decision rule was changed during recovery.

At 05:41 UTC, the final low-temperature arm had advanced to 31/32 traces. Its last retry was waiting on shared sandbox capacity: the broker reported 17 pending versus 3 running pods despite ample aggregate CPU and memory, while the candidate router still reported all four workers healthy. Existing typed retry and fixed-index repair logic covers this infrastructure condition, so no live process or evaluation protocol was changed. The manual evaluation checklist's stale readiness URL was corrected from the DP router's unreliable /v1/models forwarding endpoint to the already-proven /health endpoint plus the subsequent structured-completion smoke; executable automation was already correct and was untouched.

At 06:15 UTC, the resumed controller reconstructed the campaign from the full persisted state, current reports/configs/scripts, live process tree, GPU ownership, and evaluation artifacts. All six corrected low-temperature arms had completed 32/32 fixed traces. The high-temperature TB2 wave was active: stock had completed 32/32, aligned-no-review had saved 25/32, and aligned-review had saved 16/32. The latter two evaluator processes were live and continuing to save traces; the broker had 64 running and one pending pod, and the four-way candidate router reported all workers healthy. The continuation, terminal-preservation, and finalization watchers remained alive and blocked on their intended sentinels. A read-only re-audit confirmed that the continuation launcher does write continuation-launched after atomically recording its chosen config and target. No model, trace, task sample, configuration, precommitted selection rule, or active process was changed.

At 06:21 UTC, a new controller recovered the complete in-run record and audited the evaluation, continuation, preservation, packaging, and final-suite paths. The clean step-150 export, portable dual-EOS metadata, four-way inference server, and all downstream sentinels were consistent and healthy. Aggregate low-temperature results remained development-only: stock/aligned/review solved 3/2/2 of 32 TB2 tasks and 3/3/7 of 32 SWE tasks before infrastructure-only repair. The aligned scaffold sharply reduced unscored harness failures, while the precommitted paired significance gate remains the sole selector. The high-temperature TB2 wave advanced during the audit from 16 to 26 review traces; the evaluator and server were actively using the assigned GPUs. Filesystem headroom was 3.5 TiB, sufficient for the guarded continuation checkpoints. No task-level outcome was used to alter data, training, harness behavior, sampling, or any selection rule, and no active process was changed.

At 06:38 UTC, the controller again left the live high-temperature TB2 wave untouched (stock and aligned-no-review were 32/32; aligned-review was 29/32, with its evaluator alive and the broker reporting no pending pods). A task-identity-blind error audit found that every non-infrastructure custom TB2 HarnessError in the completed low-temperature arms was the same immediately empty first turn (end_turn, no tool statuses); the high-temperature custom arms showed the same residual at lower frequency. It also confirmed that the observed custom context failures occur at the backend's exact 65,537-versus- 65,536 token boundary. Two generic, not-yet-applied hardening candidates are therefore recorded for implementation only after the paired development wave has fully exited: one fresh-session retry for that exact empty-first-turn signature, and a modest advertised context-window safety margin so Pi compacts before the backend boundary. Neither change uses task content, accepts an unchanged workspace as success, or alters stock Pi. No source/config was edited while later development arms could still import it.

At 07:24 UTC, the resumed controller reconstructed the full persisted campaign, read the evaluation and sandbox contracts, and audited the active evaluation, selection, continuation, preservation, packaging, and final-suite scripts. The last high-temperature TB2 retry completed, giving every TB2 arm 32/32 traces, and the three matched high-temperature SWE arms then started at the planned aggregate width of 24. Their evaluators and the four-way candidate server were healthy, while all downstream watchers remained blocked on their intended sentinels. The generic empty-first-turn retry and 512-token advertised-context safety margin remain deliberately unapplied until the complete development and infrastructure-repair gate exits, so no saved arm can mix harness versions. No active process, trace, task sample, selection rule, checkpoint, or executable configuration was changed during this recovery.

At 07:52 UTC, the new controller recovered the complete in-run ledger and live host state. The final high-temperature SWE wave was healthy and advancing, with all nine earlier arms complete and every downstream watcher still blocked on its intended sentinel. A handoff audit found that the generic final-only empty-first-turn retry and 512-token context safety margin had been staged in the submitted patch/configs but the patch was not yet applied to the shared evaluation checkout. A fail-closed agentptb-harness-hardening watcher now waits for the complete development selection and infrastructure-repair marker, waits for the evaluator session to exit, applies and validates only that task-independent opt-in patch, and writes state/harness-hardening-applied. The finalization path now requires that marker, and its sleeping tmux watcher was restarted to load the new gate. Current development and stock configs are unchanged; no live evaluator imported the new behavior.

At 08:14 UTC, the active controller re-read both authorized operational references and recovered the full same-run campaign from STATE.md, state/, the current scripts/configs, and the live process tree. The step-150 server and all four workers remained healthy. All twelve fixed development arms had 32 scheduled records; the precommitted infrastructure-only repair had already cleared the first two batches, including the single custom-review t=0.6 TB2 retry, and was moving to the last batch with seven typed transient records. The continuation, hardening, preservation, and finalization watchers remained blocked on their intended sentinels. No task content, evaluation outcome, active process, model artifact, config, harness source, or precommitted decision rule was changed during recovery.

At 08:19 UTC, infrastructure-only repair finished with all twelve development arms containing the same 32 fixed task keys and no missing or transient episodes. The precommitted selector chose temperature 0.6, aligned no-review. At that setting, scheduled-task scores were 1/32 TB2 and 11/32 SWE for aligned no-review, 3/32 TB2 and 11/32 SWE for aligned review, and 2/32 TB2 and 7/32 SWE for stock. Temperature 0.2 failed its gate (combined official-t0.6-only 9 versus low-t0.2-only 2, exact sign p=0.0654, with a TB2 regression); review failed its selected-temperature significance gate (no-review-only 5 versus review-only 7, p=0.7744); and stock failed the scaffold gate (selected-custom- only 6 versus stock-only 3, p=0.5078, with a TB2 regression). The strong 11/32 SWE signal validates continued broad mixed SFT, while the 32-task TB2 interval remains too wide to support a data-branch change. Full results are in logs/select-harness-step150.json and the twelve saved summaries.

Only after the clean development gate and its evaluator session exited, the task-independent final-only harness hardening watcher applied and validated the opt-in empty-first-turn retry plus 512-token advertised-context safety margin; state/harness-hardening-applied now exists. The candidate inference process released GPUs 4--7, and the guarded post-step-150 handoff began its first isolated save-through execution benchmark at 08:20 UTC. The proven full-AC/CPU-Adam baseline resumed step 150 with the correct dataloader and optimizer state and reached the training loop; no benchmark metric or variant choice existed yet. Continuation, preservation, and finalization remain fail-closed on the benchmark-derived config/target and terminal checkpoint.

At 08:34 UTC, the proven full-AC/CPU-Adam save-through baseline completed both finite updates and wrote valid distributed and HF step-152 checkpoints. Its step-152 loss was 0.2608, gradient norm 0.5164, LR 2.00e-5, peak training memory 116.2 GiB/GPU, and checkpoint-time-adjusted throughput 28.0k tokens/s. This is the valid paired reference for the precommitted 3% execution-variant gate. The micro-batch-10/global-batch-120 benchmark then resumed the same step-150 state and entered its first compiled update on GPUs 4--7; no variant choice or dynamic terminal target exists yet. The continuation, preservation, and finalization controllers remain blocked on those mechanically derived records.

At 08:48 UTC, the resumed controller re-read the complete persisted ledger, both authorized operational references, the live process tree, and the active benchmark/continuation/finalization scripts. The micro-batch-10/global-batch- 120 benchmark had completed finite steps and valid resumable plus HF step-152 saves. Its checkpoint-adjusted throughput was 28,847.85 tokens/s versus 28,002.43 for the paired baseline, a 3.0207% increase that narrowly clears the precommitted eligibility threshold; peak memory was 137.7 GiB/GPU, step-152 loss 0.2639, gradient norm 0.5215, and LR 2.00e-5. The independently resumed micro-batch-12/global-batch-96 benchmark was then loading the same step-150 state on GPUs 4--7. No execution recipe or terminal target is selected until all staged variants finish, and no active process, data, score rule, or model artifact was changed during recovery.

At 09:01 UTC, the micro-batch-12/global-batch-96 benchmark completed two finite updates and valid distributed plus HF step-152 saves. Its checkpoint-adjusted throughput was 26,801.79 tokens/s, below the 28,002.43 baseline, with 159.2 GiB/GPU peak memory, step-152 loss 0.2675, gradient norm 0.5256, and LR 2.00e-5. It is therefore valid but ineligible for the fixed 3% speed gate. The controller released all of its workers and started the independent selective-activation benchmark from the same step-150 state. No execution recipe or terminal target is selected until the remaining staged variants finish.

During the selective benchmark startup, a read-only inherited TORCHINDUCTOR_CACHE_DIR produced nonfatal graph-cache permission warnings. Before any long continuation config was launched, all six possible continuation TOMLs were updated to point TorchInductor at the writable, node-local /tmp/agentptb-torchinductor-continuation directory. Every TOML was parsed afterward and the handoff scripts still pass bash -n. Active benchmark configs and all model/data/optimizer/selection settings were left unchanged.

The selective variant then required a new Inductor graph and the inherited cache error became fatal before its first optimizer update. Before any variant-selection or continuation marker existed, the controller and all of that attempt's workers were stopped; the failed output/log were preserved as outputs/quarantined-cache-permission-ac-selective-bench and logs/quarantined-cache-permission-sft-ac-selective-bench.log. All six execution-only benchmark TOMLs were pointed at the same writable node-local cache and parsed successfully. The identical controller was restarted at 09:08 UTC: it reused the three already-valid save-through arms and immediately relaunched selective AC from the same step-150 state. Its resolved config contains the local override. This is an infrastructure retry only; no task reward, training data, model update, throughput result, or selection threshold was changed.