# SDD 09 — Modelo de confianza

La premisa de compartir en `hammer` es **"verificar, no confiar"**: nunca ejecutas un binario
ajeno; reproduces una receta sobre código fuente público y compruebas que obtienes el mismo
resultado. Esto sólo funciona si el build es determinista y si el intercambio está firmado y,
opcionalmente, anclado a un log de transparencia.

## 1. La cadena de confianza

```
   código fuente público (repo@commit fijado)
        │  +  patch declarado en el .swm
        ▼
   build determinista en TU laboratorio local
        │  →  artifact_hash reproducible
        ▼
   ¿coincide con el expected_hash del autor?
        ├─ sí  → obtuviste exactamente su binario, sin descargarlo. Confianza derivada del código, no del autor.
        └─ no  → algo difiere (pin, patch, toolchain). hammer te dice qué. No promueves.
```

El binario del autor **nunca viaja**. Viaja la *receta*. La confianza no está en "el binario de
sergio es bueno", sino en "el código fuente público + esta transformación produce esto, y lo
verifiqué yo mismo".

## 2. Determinismo como cimiento

Todo esto descansa en que dos máquinas con la misma entrada produzcan el mismo
`artifact_hash` ([SDD 02](02-build-lab.md)). Requisitos prácticos de reproducibilidad:

- **Toolchain fijado.** El `zig`/compilador y su versión forman parte del hash de entrada.
- **Commits fijados.** Nada de `HEAD` ([ADR 0006](adr/0006-pinned-commits.md)).
- **Sandbox hermético.** Sin red durante el build, sin fugas del host
  ([SDD 02](02-build-lab.md) §3).
- **Eliminación de no-determinismo.** Timestamps embebidos, rutas absolutas, orden de archivos,
  paralelismo no determinista → se normalizan (p. ej. `SOURCE_DATE_EPOCH`, orden estable).

Cuando un build no reproduce, es un **bug a corregir**, no una excepción a tolerar. La
reproducibilidad bit-a-bit es objetivo, no aspiración.

## 3. Firma del `.swm`

Un `.swm` puede ir firmado (Ed25519). La firma cubre el contenido del manifiesto (base +
mutations). Sirve para:

- **Autoría:** saber quién publicó la receta.
- **Integridad:** que no se alteró en tránsito.

La firma **no** sustituye la verificación reproducible — un autor firmado podría declarar un
`expected_hash` que no corresponde a su patch; por eso `hammer apply` **siempre** reproduce y
compara, firme o no.

## 4. Log de transparencia (visión, opt-in)

Para compartir en comunidad sin un repositorio central de binarios de confianza, los `.swm`
publicados pueden anclarse a un **log de transparencia append-only** (estilo Sigstore/Rekor):

- cada `.swm` publicado deja una entrada inmutable (hash del manifiesto + firma + timestamp),
- cualquiera puede auditar la historia: qué se publicó, por quién, cuándo,
- detecta sustituciones silenciosas y "split-view".

Esto es opt-in y de fase posterior; el modelo base (reproducir + firmar) ya da la garantía
fuerte: **no ejecutas binarios ajenos**.

## 5. TrustStore local

Claves públicas en las que el usuario confía para *autoría* (no para ejecución):

```
/var/lib/hammer/trust/
    sergio.ed25519.pub
    comunidad-foo.ed25519.pub
```

`hammer apply` reporta el estado de firma (`trusted` / `unknown-key` / `bad-sig` / `unsigned`)
pero la decisión de promover sigue dependiendo de la **verificación reproducible** + el
`commit` humano.

## 6. Resumen de garantías

| Amenaza | Mitigación |
|---|---|
| Ejecutar binario ajeno malicioso | No se ejecutan binarios ajenos; se reproduce desde fuente |
| Receta alterada en tránsito | Firma Ed25519 del `.swm` |
| Build no reproducible / backdoor en toolchain | Toolchain fijado en el hash + determinismo verificado |
| Sustitución silenciosa en la comunidad | Log de transparencia (opt-in) |
| Promoción accidental de algo malo | Overlay + `commit` humano explícito |

## 7. Interfaz

```rust
// hammer-core
pub fn sign_swm(swm: &Swm, key: &Ed25519PrivateKey) -> Signature;
pub fn verify_swm(swm: &Swm, trust: &TrustStore) -> SigStatus;
pub fn reproduce_and_compare(swm: &Swm, store: &Store) -> Result<Vec<HashMatch>>;
```
