Repository navigation
A Run the host ran out of disk space under hands its issue back, not agent-failed (#2092) - #2111
Merged
Merged
Conversation
…agent-failed (#2092) A failure whose cause chain says No space left on device (the OS's ENOSPC or git's wording) ends the Claim with a new OutOfDisk ending: the Claim is released even with work on origin, ready-for-agent goes back, no agent-failed and no Recovery comment, so the Failure limit does not count it. A Security fix still waits for the Day shift. The Command's cause is followed by advice to free disk space. Co-Authored-By: Claude <noreply@anthropic.com>
…very line, ADR 0030 A failed Harness session's diagnostic and a Spec run's Tickets not done never count as running out of disk. The out-of-disk release shares the ordinary release's labelling, the Recovery lines say to free disk space, the tests use write_executable and pin the preservation line, and ADR 0030 records the amendment to ADR 0029. Co-Authored-By: Claude <noreply@anthropic.com>
security review) The parent Run read a failed Base fix's cause back as plain text, so a Base fix agent's session diagnostic naming "No space left on device" made the parent's failure look like the host's: its Claim was released with work on origin, without agent-failed, and the Failure limit did not count it. A Base fix's ending is now a typed ChildEnded error that out_of_disk never counts, and the out-of-disk advice follows the typed check instead of matching the cause's text. Co-Authored-By: Claude <noreply@anthropic.com>
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
A Run whose failure was caused by the host running out of disk space now hands its issue back instead of charging the failure to it. Out of disk means
No space left on devicefrom the OS or git, during worktree creation, a Session trace write, a push and so on.failed_run::out_of_diskwalks the cause chain. It returns true for anio::Errorof kindStorageFull, or for a layer whose text containsNo space left on device.SessionFailureare never out of disk, because the agent can write its diagnostic.TicketsNotDoneare never out of disk, because a Spec run's Ticket causes can mix a full disk with genuine failures.ChildEndedare never out of disk, because the parent reads the Base fix's cause back as text that can carry its agent's diagnostic.agent-failedlabel means the Failure limit doesn't count the failure.ready-for-agentis a hand-back, so Pickup retakes the issue only after its settling window. Host limits: wait for free disk space instead of starting sessions that fail on a full disk #2091's disk limit then holds the session until space is free, so a full disk doesn't cause a rapid retry loop.…, without agent-failed: the host ran out of disk space; free disk space on it, then retry the Command.Before retrying: the host ran out of disk space; ….site/index.html, how-it-works, architecture).Evidence
Execution evidence
The reproduction is a fake-adapter scenario: a
gitwrapper onPATHfailsgit worktree add(orgit push) with git'sNo space left on devicemessage, on an issue whose Issue branch is already on origin.main, the new tests applied):cargo test --test out_of_diskthirdshift: labelling #7 agent-failed, in place of in-progress, so it waits for the Day shiftcargo test --test out_of_diskConfirmed cause:
run::claim_endingmapped every failure toclaim::Ending::Failed. For a run with work on origin, such as a Continuation's Issue branch,Ending::Failedswapsin-progressforagent-failed. Nothing distinguished a host cause from an issue cause.Inline tests:
claim::tests(47 passed): covers the release with work on origin and a Security fix that still getsagent-failed.failed_run::tests(3 passed): covers ENOSPC as anio::Errorand as git text, and agent-written diagnostics andTicketsNotDoneexcluded. The exclusion test failed against the first classifier.run_ending::tests(26 passed): covers the advice line and the parent's read-back of the cause.scripts/affected-tests main:npm test --prefix sitepassed, andnpm run docs:check --prefix sitepassed.cargo testhad two timing failures, each passing on rerun. Neither test goes near the Claim:process::findings::merged_fix_is_rechecked_after_a_later_fix_failsalso flakes onorigin/main(1 of 6 runs).triage_pass::recommendation_only_pass_reserves_without_claiming_or_publishing_and_notifiespanicked with "the agent never started" after 120s, and passed on rerun.cargo testskipped after that failure was rerun and passed.Visual evidence
None needed. The site changes are prose inside existing paragraphs, with no layout, CSS or markup structure changed.
Merge Danger
Door: two-way
Reverting restores the old labelling. Issues already released keep
ready-for-agent, which is the state the Day shift restored by hand on 2026-11-12.Blast Radius: labelling
A real issue failure would escape
agent-failedand the Failure limit only if its factory-owned cause text saysNo space left on device. Agent diagnostics, Spec-run Ticket causes and Base fix endings are excluded.Unaddressed findings
Standards
command_logduplicatestests/process.rs:767. Declined. Each integration test binary only sharestests/support, and moving this helper there is unrelated churn.base_fix::Advice. Declined.Adviceis the Base fix's labelled advice (Base check:/Retry with:). The out-of-disk advice is one constant,failed_run::OUT_OF_DISK, decided by one predicate,failed_run::out_of_disk/says_out_of_disk.FailureCategory. Declined. By the timerun_endingsees the cause it is already text (Cause::full). A new recorded category belongs with the Console display; see the Spec entry below.Security
None. The Security review found one introduced finding and fixed it: a Base fix agent's diagnostic naming a full disk released the parent Run's Claim without
agent-failed. Its regression test istests/out_of_disk.rs::a_base_fix_agent_saying_the_disk_is_full_does_not_release_the_run_that_waited_on_it.Spec
io::ErrorwithStorageFullfrom any layer is covered byfailed_run::tests::running_out_of_disk_is_recognised_anywhere_in_the_cause_chain. The push case is covered end to end and pins the exactPreserved:line.needs-triage). It is not in the acceptance criteria. How the Inbox (ADR 0023) groups a machine-level failure across runs is a UI decision for the Day shift.Review coverage: both reviewers read every changed file except
site/docs/index.html, which is generated fromdocs/guide.mdand verified withnpm run docs:check --prefix site. The second commit's new file,docs/adr/0030-a-full-disk-is-the-hosts-failure-not-the-issues.md, and the later edits tosrc/recovery.rswere written in response to the review and were not re-reviewed.Closes #2092
Built with claude 2.1.314 · opus · default effort
Security review outcome
No unaddressed introduced findings.