v0.7.3 — Trial fixes + send() decomposition
Fixes surfaced by a live end-to-end trial (a real 7B and 30B model fixing a buggy project through the CLI), plus a readability refactor of the core loop.
Trial-driven fixes
- edit_file now hands back a ready-to-use line-anchored template when the
oldsnippet doesn't match, so models don't have to reproduce it byte-exactly (they routinely can't). - detect_test_cmd recognizes a bare root-level
test_*.py/*_test.py, so the synchronous done-gate auto-verifies for the common small-project layout. - Accurate stuck message on a single-model ladder ("no stronger local model to escalate to" instead of a false "even after escalating").
- write_file ensures a single final newline (quieter diffs).
Refactor
- The 500-line
send()loop is decomposed into named single-responsibility methods (_begin_turn,_prepare_and_generate,_handle_malformed,_execute_and_record,_handle_failure,_escalate,_do_fleet_send,_log_step). Control-altering phases use explicit signals so the loop's early-exit semantics are preserved exactly — verified by the full test suite AND real 7B/30B inference.
Stdlib-only, zero runtime deps. 419 tests green.