feat: dominium standalone — simulador de campo medio sobre Llimphi

Front-door publicable de dominium: los 9 crates propios como path
members; Llimphi, app-bus, rimay-localize, wawa-config y pluma-notebook
por git-dep al monorepo tawasuyu.git (branch=main). cargo check
--workspace --all-targets pasa exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-16 23:22:40 +00:00
commit 1860b51f70
70 changed files with 19902 additions and 0 deletions
@@ -0,0 +1,30 @@
//! Constantes de mundo y de bucle compartidas por todos los módulos de la app.
/// Lado de la grilla cuadrada del mundo. 240×240 = 57 600 celdas: continente
/// con varios biomas (mares, ríos, llanuras, sierras, picos). El motor sigue
/// siendo O(grid) en difusión y O(N²) en `nearest`, así que la población
/// arranca en miles pero limitada por los frenos termodinámicos de
/// `init`-time (ver `SimParams` override).
pub(crate) const GRID: usize = 240;
/// Población inicial de Lemmings. Miles. La densidad efectiva queda más
/// baja que en la versión 80² histórica (≈0.043 lem/celda) porque sólo
/// spawnean en tierra navegable y el motor ya no permite el crecimiento
/// exponencial sin freno.
pub(crate) const LEMMINGS: usize = 2500;
/// Periodo del bucle de simulación (~11 Hz).
pub(crate) const TICK_MS: u64 = 90;
/// Cada cuántos ticks recalculamos k-means para colorear los clusters
/// (modo PsiCluster). 30 ticks ≈ 2.7s — suficiente para ver tribus
/// emergentes sin que el costo del kmeans (O(K·N·iter)) note.
pub(crate) const KMEANS_REFRESH_TICKS: u64 = 30;
/// Ancho del panel de stats.
pub(crate) const SIDE_WIDTH: f32 = 240.0;
/// Tamaño del ring de snapshots: ~18 segundos a 11 Hz. Permite ver hacia
/// atrás un par de minutos de simulación sin pasarse en RAM (cada snapshot
/// es un `World` clonado; con grid 40×40 y ~50 lemmings, ~30 KB).
pub(crate) const SNAPSHOT_RING_CAP: usize = 200;
/// Largo del trail por lemming. Tradeoff: muy alto y la pantalla se llena
/// de motas; muy bajo y el rastro no cuenta nada. 24 a 11 Hz ≈ 2 s de
/// historia visible — coincide con el horizonte que el ojo integra.
pub(crate) const TRAIL_CAP: usize = 24;