AgentPTB run state
Scope and compliance
- Objective: improve
Qwen/Qwen3.5-9B-Basefor agentic software engineering and shell work using weights trained in this run and/or a compliantpiharness. - Evaluation-only data:
/root/work/shared/tasksets/terminal-bench-2and/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-Basein 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, exportedPRIME_API_KEY
Experiment log
- Base inference server:
configs/inference-base.toml, one B200 on physical GPU 4, port 8200. Correctly emits a structuredbashcall 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 inevals/base-tb2-smoke-retryscored 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, revision750b2c11239fd5e32f97e6cfb9bf80fb9a9a2983, 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 Pibashfunction 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, revisiona1667c4ffdadea02a89bffe4f1bb7ca2ff19f8d9, 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 indata/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) anddata/pi-nemotron-terminal-skill-140k-clean14(127,729 rows). The active balanced mixture isdata/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 isdata/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.shlaunches isolated concurrent runs, andscripts/compare_evals.pyreports 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-v1contains 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_sandboxesAPI mismatch. - Evaluation summaries now derive their conservative denominator from the saved
num_tasks * num_rolloutsconfiguration 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.
- Finish the first full-parameter mixed SFT gate at step 150.
- Evaluate step 150 with stock and custom Pi on fixed unbiased samples from both suites.
- 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.txtandstate/continuation-config.txt. Public scaling and curriculum ablations favor more mixed SFT over a component switch. - 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.