# modules/badu/ — Toma de notas con gravedad semántica **Propósito.** Notas como texto enlazado: cada nota tiene título, etiquetas y wiki-links `[[...]]`; el conjunto forma un grafo navegable. Sobre ese grafo, una capa de *gravedad semántica* agrupa y posiciona las notas por afinidad de significado. ## Crates | crate | tipo | rol | | -------------- | ---- | ------------------------------------------------------------ | | `badu-core` | lib | `Note` + `NoteStore` (etiquetas, búsqueda) + grafo de wiki-links (forward/backlinks, huérfanas, colgantes) | | `badu-gravity` | lib | `SemanticField`: afinidad coseno, vecinos, clústeres por umbral y layout 2D dirigido por fuerzas | ## Modelo ```text Note ([[links]] en el cuerpo) ──► NoteStore ──► grafo de enlaces │ │ vector semántico (verbo) ──► SemanticField ──► clústeres + layout 2D ``` - **Enlaces**: el grafo se *deriva* del cuerpo, no se guarda aparte. `[[cocina]]` y `[[Cocina]]` resuelven a la misma nota. - **Gravedad**: las notas afines se atraen, todas se repelen — un layout force-directed determinista (posiciones iniciales fijas, sin RNG). - **Clústeres**: union-find sobre las afinidades que superan un umbral. ## Dependencias - `core` ← sólo `serde`. `gravity` ← `badu-core` + `serde`. - `gravity` recibe los vectores ya calculados — no se acopla a `verbo`; el frontend embebe las notas con un `verbo::Provider` y los inyecta. - Ambos `#![forbid(unsafe_code)]` y deterministas. ## Estado `core` + `gravity` implementados y verdes (29 tests). Demo CLI en `apps/badu` (`cargo run -p badu`): cuaderno sembrado con grafo de enlaces + clústeres por gravedad. **Pendiente**: las 4 lentes visuales (lista, grafo, gravedad espacial, línea de tiempo), los «Susurros» (sugerencias vía `verbo`) y el frontend GPUI — separabilidad UI estricta, el núcleo ya es agnóstico.