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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user