Fase 5: BuildFailed.log_tail con la cola real del log del sandbox

Cuando una fase de build falla, el lab ahora conserva las últimas 50
líneas del log y las entrega a la IA por el bus.

- sandbox.rs: BuildFailure { reason, log_tail } (impl Error), wrap en
  Error::Other. Sandbox::run hace tee de stdout/stderr al padre (streaming
  en vivo intacto) y a un ring buffer acotado; al fallar, devuelve la cola
  en log_tail. spawn_pump + push_tail con tests.
- BuildFailure::from_error(&Error) recupera la struct por downcast.
- bus.rs run_compile: separa reason del log_tail real del compilador en
  vez de mandar e.to_string() y log_tail=None.

Tests: push_tail (ring), roundtrip por downcast, none para errores planos.
Firmas de build/build_source_patch sin cambios. 22 binarios verdes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sergio
2026-06-10 19:41:51 +00:00
co-authored by Claude Opus 4.8
parent 42288230f9
commit 6db3e3e302
4 changed files with 161 additions and 13 deletions
+5 -2
View File
@@ -101,8 +101,11 @@ pre-requisito de validación.
`examples/agent-caps.toml`. El `default_policy` hardcoded queda como fallback.
- [ ] `CRASHED` real (requiere supervisión de servicios, que llega con el init propio del
track posterior).
- [ ] `BuildFailed.log_tail` con cola real del lab (hoy es `None`; el `reason` viene del
`Error` de Rust pero no se conserva el log textual del sandbox).
- [x] `BuildFailed.log_tail` con cola real del lab. `Sandbox::run` hace *tee* de
stdout/stderr (sigue viéndose en vivo) y retiene las últimas 50 líneas; al fallar una
fase devuelve `BuildFailure { reason, log_tail }` envuelto en `Error::Other`. El bus lo
recupera por `BuildFailure::from_error` (downcast) y separa `reason` del log textual del
compilador, para que la IA reaccione al error real, no sólo al mensaje de Rust.
- **Hecho cuando:** un cliente externo dispara un build y recibe el evento de fin por el
socket. ✅ Camino implementado (`Compile``BuildReady`/`BuildFailed`) y la maquinaria
alrededor cubierta por `crates/hammerd/tests/bus_e2e.rs`: handshake con peer creds,