Repository navigation
Finish runs instead of crashing on recoverable checks, and write down how to fail well - #298
Merged
Merged
Conversation
… how to fail well An already-covered judgment crashed a paid content.generate run because an extra comparison page couldn't be read; it now needs the site's own coverage read and otherwise ends as insufficient evidence. Revision notes no longer fail a revision over their section shape. A task that pauses without a question asks a plain one. AGENTS.md gains "Failing well": refuse only for security, money and outside effects; everything else ends with a named reason. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This was referenced Oct 5, 2026
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.
What and why
Over the last 14 days, 129 of 661 production runs failed (about 20%). Many causes are already fixed (#273, #275, #278, #279, #282, #285, #287, #297). Several of the rest were checks that crashed a run, often one that had already paid for its model calls, over something the run could have finished from. This PR fixes four of them and writes the rule down so new code fails well.
1. "Already covered" no longer crashes on an unreadable extra page. On Sheepdogs, content.generate fe7a1329 refreshing
/how-the-sheep-get-home:Now:
insufficient_evidence("Coverage could not be established"). The run finishes with that outcome instead of crashing.2. Revision notes never fail a paid revision.
article_review.validate_changesrequired exactly one "What changed" and one "Feedback not followed" section of 4–2,000 characters. A revision that followed all feedback and omitted the second section crashed (content.generate on 10-02: "Explain 'Feedback not followed' once…").change_summaryalready returns nothing when "What changed" is missing.3. A task that pauses without a question asks a plain one. Two
project.taskturns failed on 10-02 with "Codex requested input without a question". The task bridge now asks "How should I continue?", and the founder can answer or stop.sandbox/task_app_server.py, which is baked into the sandbox templates. It takes effect with the next rebuild oftin-lite-codex-isolated.4. A page refresh never fails over how its review tables are written. content.refresh 0de1f797, the first run after #297, failed after its paid run with "Show the current and proposed title in the review table."
5. AGENTS.md: "Failing well".
No migration and no Temporal change.
Failures in the last 14 days, by real cause
From run errors and the bridge's own messages in the journal:
no_changeoutcomeVerification
test_an_unreadable_extra_page_does_not_sink_an_already_covered_judgment, the Sheepdogs case;test_covered_without_reading_the_destination_finishes_as_insufficient_evidence;test_copy_and_notes_are_different_contracts, rewritten: missing, prose-only or long sections are accepted, and unbounded or non-notes content is still refused;test_a_task_that_pauses_without_a_question_asks_a_plain_one;test_the_review_tables_never_fail_a_paid_refresh, replacing the test that expected those failures.localtimetests fail as on main. ruff, format,lint-importsanddump_catalog.py --checkare clean.🤖 Generated with Claude Code