Fase 4 — formato .swm: verify, apply (config_edit/file_drop/source_patch) y export
- hammer-core::swm: verify_schema (invariantes por mutación) + verify_base con BaseRef/BaseCompat/PinDiff (distro_version + pins). FileDrop.content_b64 para .swm autocontenidos. - hammer-core::apply: primitivas puras apply_config_edit (hunks -/+ con búsqueda exacta de bloque, ambiguo => error), apply_file_drop (base64 + verify BLAKE3), rebase_path para tests con prefix. - hammer-build::swm_bridge: Mutation::SourcePatch -> Recipe sintética + patch inline materializado + build, con comparación opcional contra expected_hash. - hammer-cli: nuevos subcomandos apply [--prefix --base-ref --skip-source-patch --state-root], swm-verify, export --journal --base-ref --since. - Tests: 18 unit nuevos en hammer-core (apply + verify), 5 en swm_bridge, 4 e2e en hammer-cli (roundtrip yaml -> apply bajo prefix reproduce los archivos). - Roadmap y SDD 06 actualizados con lo cerrado y lo pendiente (URLs remotos, provenance en export vía mapa artefacto->receta, firma ed25519).
This commit is contained in:
+18
-1
@@ -60,6 +60,13 @@ signature: # opcional pero recomendado (ver SDD 09)
|
||||
| `init_rule` | regla del bus de init | inyecta la regla vía `/run/init.control` / receta de servicio |
|
||||
| `file_drop` | depositar un archivo de datos no compilable | escribe el archivo (con su hash declarado) en la ruta |
|
||||
|
||||
`file_drop` admite dos modos para el contenido, mutuamente excluyentes:
|
||||
|
||||
- `content_b64` (RFC 4648, sin saltos): inline en el `.swm`. Útil para `.swm`s
|
||||
autocontenidos (tests, snapshots offline, datos pequeños).
|
||||
- `content_url`: el receptor lo descarga. En ambos casos se verifica `content_hash`
|
||||
(BLAKE3) antes de escribir nada.
|
||||
|
||||
Cada `source_patch` es, en esencia, una `Recipe` ([SDD 02](02-build-lab.md)) serializada para
|
||||
viajar. El `build` lleva el **compilador por mutación** (no global).
|
||||
|
||||
@@ -110,4 +117,14 @@ impl Swm {
|
||||
}
|
||||
```
|
||||
|
||||
CLI: `hammer apply <file.swm>` · `hammer export … > out.swm` · `hammer swm verify <file.swm>`.
|
||||
CLI:
|
||||
|
||||
- `hammer apply <file.swm>` — abre un overlay por defecto y aplica las mutaciones. Con
|
||||
`--prefix DIR` opera directamente bajo `DIR` sin overlay (tests, staging). Con
|
||||
`--base-ref base.json` aborta si la base local no es compatible.
|
||||
- `hammer swm-verify <file.swm>` — chequea schema, hashes de los `file_drop` inline y,
|
||||
con `--base-ref`, la compatibilidad de base.
|
||||
- `hammer export --journal DIR > out.swm` — lee el diario y emite un `.swm` con un
|
||||
`file_drop` por archivo modificado (estado final actual; los `Delete` se omiten). El
|
||||
receptor reproduce byte-a-byte; la provenance vía `source_patch` queda para más adelante
|
||||
(necesita un mapa artefacto→receta).
|
||||
|
||||
+17
-2
@@ -57,9 +57,24 @@ pre-requisito de validación.
|
||||
- [ ] Refinar op del watcher (Create vs Replace vs Edit con FAN_REPORT_DFID_NAME).
|
||||
- [ ] Hash del contenido tras la mutación (`content_hash`) y de-dup idempotente.
|
||||
|
||||
### Fase 4 — Formato y flujo `.swm`
|
||||
- [ ] `Swm` (de/serialización YAML), `hammer export`, `hammer apply` (con overlay), `verify`.
|
||||
### Fase 4 — Formato y flujo `.swm` ▶ *en progreso*
|
||||
- [x] `Swm` de/serialización YAML estable (roundtrip).
|
||||
- [x] `verify_schema` (estructura + invariantes por mutación) y `verify_base` (distro_version
|
||||
+ pins) con `BaseRef` / `BaseCompat`.
|
||||
- [x] `apply_config_edit` (hunks `-/+` con búsqueda exacta, no-fuzz) y `apply_file_drop`
|
||||
(base64 inline + verificación BLAKE3 vs `content_hash`).
|
||||
- [x] Bridge `Mutation::SourcePatch` → `Recipe` + `build` + hidratación.
|
||||
- [x] CLI: `hammer apply [--prefix DIR] [--base-ref base.json]`,
|
||||
`hammer swm-verify`, `hammer export --journal DIR > out.swm`.
|
||||
- [ ] `patch_url` / `content_url` remotos (hoy sólo inline).
|
||||
- [ ] Provenance en `export`: mapa artefacto→receta para emitir `source_patch` en vez de
|
||||
`file_drop`. Hoy se emiten file_drops con `content_b64`, lo que reproduce byte-a-byte
|
||||
pero pierde la receta original.
|
||||
- [ ] Firma `signature` (ed25519) y `TrustStore` local.
|
||||
- **Hecho cuando:** exportas un cambio, lo aplicas en otra máquina y reproduce idéntico.
|
||||
✅ Demostrado en `crates/hammer-cli/tests/swm_roundtrip.rs` para
|
||||
`config_edit` + `file_drop`. `source_patch` reusa el camino de Fase 0/1 (gated en
|
||||
`HAMMER_NETWORK_TESTS`).
|
||||
|
||||
### Fase 5 — Bus de agente
|
||||
- [ ] `/run/init.control` (FIFO humano) + `/run/agent.sock` (JSON-líneas, `SO_PEERCRED`).
|
||||
|
||||
Reference in New Issue
Block a user