# modules/yachay/ — Notebooks computacionales reproducibles

**Propósito.** Notebooks donde la reproducibilidad es verificable, no
prometida. Un notebook es a la vez una secuencia de celdas (orden de
lectura) y un DAG de dependencias (orden de ejecución). Un digest Merkle
certifica que dos corridas del mismo notebook producen lo mismo.

## Crates

| crate         | tipo | rol                                                          |
| ------------- | ---- | ------------------------------------------------------------ |
| `yachay-core` | lib  | `Cell` (markdown/código/embed), `Notebook` (DAG, staleness, digest) |

App: `apps/yachay` — demo CLI (`cargo run -p yachay`).

## Modelo

```text
  Cell { kind, source, depends_on } ──► Notebook
        │                                  │
   content_hash (BLAKE3)            execution_order (topológico)
        │                                  │
        └──► digest = BLAKE3(content_hash ‖ digests upstream) ──► notebook_digest
```

- **Doble estructura**: orden de presentación (lista) + DAG de
  dependencias. La ejecución sigue el DAG.
- **Staleness**: editar una celda la marca `Stale` y propaga la
  obsolescencia a sus descendientes (no a sus ancestros).
- **Digest Merkle**: el digest de una celda cubre su contenido y todo su
  linaje; dos notebooks con el mismo `notebook_digest` son
  reproduciblemente equivalentes. El orden de declaración de
  dependencias no lo afecta.
- **Embeds**: una celda puede incrustar la visualización de otro módulo
  brahman (`dominium`, `pineal`, `takiy`) — yachay integra el ecosistema.

## Dependencias

- `yachay-core` ← `blake3` + `serde`. `#![forbid(unsafe_code)]`.
- Sin kernel, sin ejecución real, sin UI — tipos puros y deterministas.

## Estado

`yachay-core` implementado y verde (14 tests) + demo CLI. **Pendiente**:
los kernels de ejecución de código, el render de los embeds (consume los
`*-render-plan` de cada módulo), persistencia y el frontend GPUI.
