# 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.