H1c (proof-carrying recipes): cablea la evidencia al Orchestrator VERIFY

La evidencia corre del lado del BUILD (hammer-agent no depende de hammer-build:
separación PROPONE/CONSTRUYE). Piezas:

- proto: RecipeInline lleva `evidence`; Event::BuildReady lleva
  `verdict: Option<EvidenceVerdict>` (+ EvidenceCheckVerdict). Ambos con
  skip_serializing_if ⇒ wire compatible con clientes pre-H1c.
- hammerd/bus: run_compile ejecuta la evidencia declarada tras sellar el
  artefacto (run_evidence vía swm_bridge::recipe_from_source_patch) y adjunta
  el veredicto en BuildReady. Si ni se pudo ejecutar ⇒ veredicto fallido
  sintético (no pasa en silencio). El lab reporta; el gate vive en el agente.
- client: compile() devuelve CompileOutcome { artifact, verdict }.
- orchestrator: VERIFY lee el veredicto; si all_passed=false empuja
  VerifyCheck::fail y ABORTA antes de hidratar (artefacto sellado, no toca el
  sistema). Nuevo constructor VerifyCheck::fail.

Tests: roundtrip del veredicto en proto; stub-bus refleja evidencia→verdict;
nueva prueba de integración orchestrator_evidence_gate (veredicto fallido ⇒
run() aborta con "no se propone" y no hidrata). Suite completa verde (33 suites).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-02 13:33:25 -04:00
co-authored by Claude Opus 4.8
parent 497d0d00e7
commit 6ac6438c00
9 changed files with 401 additions and 20 deletions
+9 -3
View File
@@ -49,17 +49,23 @@ del lado del init: **el permiso deriva de una propiedad verificada del artefacto
firmó.** H1 es esa idea, subida del boot al build.
**Tickets:**
- **H1a** — Extender el `.swm` (SDD 06) con un bloque `evidence`: lista de `{kind, cmd, expected}`
- **H1a** — Extender el `.swm` (SDD 06) con un bloque `evidence`: lista de `{kind, cmd, expected}`
donde `kind ∈ {proptest, contract, kani, cmd-exit}`. Serialización YAML estable + `verify_schema`.
- **H1b** — El checker: `hammer swm-verify --evidence` corre cada ítem **dentro del sandbox
- **H1b** — El checker: `hammer swm-verify --evidence` corre cada ítem **dentro del sandbox
reproducible** y exige `expected`. Pequeño y auditable a propósito (no un framework: un runner
de comandos con hash del output). Falla ⇒ no se propone. Reusa `Sandbox::run` + el `log_tail`
ya existente (Fase 5).
- **H1c** — Cablear al `Orchestrator`: VERIFY consume `evidence`; el `Proposal` lleva el
- **H1c** — Cablear al `Orchestrator`: VERIFY consume `evidence`; el `Proposal` lleva el
**veredicto de evidencia** además del diff. El humano ve "reproduce + estas N pruebas pasan",
no sólo "reproduce". **Frontera:** el checker confía en que las pruebas *cubren* lo que
importa — eso lo juzga el humano; H1 garantiza que *lo declarado pasa*, no que *lo declarado
basta*. Se dice así.
**Implementación:** la evidencia corre del lado del BUILD (no del agente — `hammer-agent` no
depende de `hammer-build`, separación PROPONE/CONSTRUYE). `proto::RecipeInline` lleva `evidence`
y `Event::BuildReady` lleva `verdict: Option<EvidenceVerdict>`; `hammerd::bus` la ejecuta tras
sellar el artefacto (`run_evidence` vía `swm_bridge::recipe_from_source_patch`) y adjunta el
veredicto; el `Orchestrator` lee el veredicto y, si `all_passed=false`, empuja `VerifyCheck::fail`
y **aborta antes de hidratar** (el artefacto queda sellado pero no toca el sistema).
**Frontera honesta.** Property tests no son prueba; Kani/Creusot sí pero sólo cubren crates que
se dejan. H1 **estratifica** la confianza (`cmd-exit` < `proptest` < `contract` < `kani`) y la