\section{Recovery, faults and ablations} \label{sec:recovery} The benchmark holds everything constant except the instruction regime and finds nothing. This section asks what the method's mechanisms do when something goes wrong, using standardised, harmless faults injected by the controller into run workspaces on the development tasks (so that confirmatory tasks are not reused), and a length-matched control that separates structure from length. All faults are logged outside the executor in the \texttt{faults} table with their trigger event; none touches anything outside a run workspace. \subsection{Interruption and resumption (R1)} Twelve runs (three development tasks, arms A and D, two repeats) were killed by the controller immediately after the sixth tool use of the first session and resumed once. The resumption prompt was intended to state that the interruption was an infrastructure event; because of the launcher defect (amendment A-006) the resumed sessions received the single word ``Your'' (two of them said so explicitly), so that what the executors actually resumed from was the system prompt and the state of their workspace. Two post-fix runs with the full resumption prompt are reported below. Both arms recovered: \rOneSuccA{} of arm A and \rOneSuccD{} of arm D runs ended in scientific success (\rOneNA{} and \rOneND{} runs), none lost an artefact that existed at the time of the kill (\rOneLostA{} and \rOneLostD{} lost files); the matched no-fault pilot runs of the same tasks and arms had succeeded in five of six cells (the pilot's arm-A run of F3-dev-01 had failed its criteria without a violation). The protocol arm did not resume more economically: after resumption, arm D re-executed its replication script \rOneDupD{} times on average against \rOneDupA{} for arm A, because its verification phase re-runs the script by design, and its cost per run was \rOneCostD{} USD against \rOneCostA{}. Neither arm recorded the interruption where a reader would find it: \rOneAckA{} of arm A and \rOneAckD{} of arm D reports mention it, and no arm-D state log does, although the protocol asks for a dated entry after every important event. H4 (persistent state improves valid continuation after interruption) is therefore not supported on these short tasks: valid continuation was universal even from a one-word resumption, and the state ledger bought neither fewer duplicated steps nor a record of the fault. The two post-fix runs with the full resumption prompt (F3-dev-01, arms A and D, Table~\ref{tab:postfix}) \postfixROneOutcome{}. \subsection{Stale inputs (R2), duplicate submissions (R3) and missing fixtures (R4)} For R2 the controller copied \rTwoN{} finished pilot workspaces (two tasks, four arms), mutated one numeric value in the main input of each copy and re-ran the pristine gate on the copy. The reproducibility check failed, as it should, in \rTwoInvalidated{} copies: the regenerated results no longer matched the submitted ones, which is the invalidation path of invariant~2. In \rTwoUnaffected{} copies (both of the World Bank mini-project) the check passed because the mutated row was one the analysis excludes as an aggregate entity, so the results genuinely did not depend on it; the harness records this rather than calling it a failure. For R3 the same execute request was submitted three times for one development run: the job ledger rejected the duplicates and exactly \rThreeSessions{} session was launched (the job-ledger idempotency guard). For R4 the main input file of a data-audit task was removed from the workspace before launch for one arm-A and one arm-D run; both sessions recognised the blockage, reported \texttt{feasibility = infeasible} with the missing file named as the reason, and wrote every required file with null values. The frozen task evaluator, which does not know about the fault, scores these as false completions; under the fault's own rubric (``recognised a blockage'' versus ``completed despite the fault'') both arms recognised it and neither fabricated, with or without a protocol. \subsection{Length-matched control (arm L)} To separate structure from length, every confirmatory task was run once under arm L: the open instruction followed by 533 words of generic research advice (care with data, baselines, uncertainty, reproducibility, honesty about limitations) with no phases, ledgers, gates or review (Appendix~\ref{app:prompts}). Across the \nAblTasks{} tasks, completion under L was \pL{} (\nRunsL{} runs, \nViolL{} with a violation, mean cost \costL{} USD); the paired difference L$-$A is \dLA{} $[\dLAlo, \dLAhi]$ ($p = \dLAp$) and B$-$L is \dBL{} $[\dBLlo, \dBLhi]$. Length alone neither helped nor hurt in a way the data can distinguish from zero, which is the same conclusion as for the structured arms; arm L's one non-success is the F6-conf-04 oracle defect, and its one apparent advantage over A is that its F1-conf-01 run happened to label its result \texttt{complete}, so that under the corrected rubric L, like the four main arms, completes every task. The ablation is exploratory (one repeat, run after the main benchmark); we report it for completeness and not as a prespecified contrast. \begin{figure}[htbp]\centering \includegraphics[width=\textwidth]{../results/figures/fig_recovery.pdf} \caption{Recovery experiment R1: for each interrupted run, the tool-use timeline of the first session up to the kill (event index), the resumed session, and the outcome; arms A and D on three development tasks, two repeats each. Diagram generated from the event stream, not a screenshot.} \label{fig:recovery} \end{figure}