feat(nouser): Phase A — mecanismo determinista de Mónadas
Primer trozo de Nouser/Kairos: explorador de Mónadas como agrupaciones
semánticas sobre el filesystem, sin tocar IA todavía. Cubre el 90% de
los casos con heurísticas puras.
Crates nuevos:
crates/modules/nouser/card:
- MonadManifest: la Tarjeta de Presentación de una Mónada. Espejo
conceptual de brahman::Card pero para datos: id (Ulid), label,
summary, centroid (vacío en Phase A), keywords, cardinality, entropy
[0,1], dominant_lens (Grid|Code|Gallery|Database|Markdown|Tree),
pins, members, timestamps, extensions (forward-compat).
- Diferencia explícita en docs: brahman::Card describe entidades
runtime con payload/soma/supervision; MonadManifest describe una
agrupación de datos sin proceso atrás.
- Validación: schema_version, label no vacío, entropy en rango,
cardinality consistente con members.len().
- 6 tests (validación + JSON roundtrip).
crates/modules/nouser/core:
- scanner::scan_directory: walkdir → Vec<FileEntry> con metadatos.
Skipea hidden por default; configurable max_depth y follow_links.
- cluster::by_directory: agrupa archivos por parent dir, mínimo 3
para promover a Mónada (configurable). Computa keywords (top-N
extensiones por freq + alfabético), elige Lens dominante por
extensión más frecuente, entropía de Shannon normalizada.
- db::MonadDb: store en memoria con índices BTreeMap.
resolve_members filtra IDs huérfanos.
- bin nouser con subcomandos scan, show, json. Env var
NOUSER_MIN_FILES para el threshold.
- 13 tests (4 scanner + 6 cluster + 3 db).
Demo end-to-end:
$ nouser scan crates
scan: 255 archivos en crates, 19 mónadas (min_files=3)
[01KR4C13] src card=12 ent=0.00 lens=Code keywords: rs
[01KR4C13] tests card=14 ent=0.00 lens=Code keywords: rs
[01KR4C13] fixtures card=5 ent=0.00 lens=Grid keywords: rhai
Pendientes (anotados en CHANGELOG, no urgentes):
- Phase B: bin nouser daemon que sidecarea a brahman-init.
- Phase C: pseudo-embeddings de metadatos + atracción por centroide.
- Phase D: módulo nouser-nous para el LLM real, swappable por
priority_contexts (mock-nous en test, real-nous en prod).
- Polish: labels con 2-3 componentes del path.
cargo check --workspace: 0 errores, 0 warnings.
Tests acumulados: 58.
CHANGELOG.md actualizado.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,74 @@ ratio/diff ver `git show <sha>`.
|
||||
|
||||
## 2026-05-08
|
||||
|
||||
### feat(nouser): Phase A — mecanismo determinista de Mónadas
|
||||
Primer trozo del módulo Nouser (Kairos): explorador de Mónadas como
|
||||
"imanes semánticos" sobre el filesystem. Phase A cubre el 90% de los
|
||||
casos sin tocar IA — sólo metadatos y heurísticas.
|
||||
|
||||
Crates nuevos:
|
||||
|
||||
- `crates/modules/nouser/card`: `MonadManifest` (la Tarjeta de
|
||||
Presentación de una Mónada — espejo conceptual de `brahman::Card`
|
||||
pero para datos, no para procesos runtime). Campos: id (Ulid),
|
||||
label, summary, centroid (vacío en Phase A), keywords, cardinality,
|
||||
entropy [0,1], dominant_lens, pins, members, timestamps,
|
||||
extensions (forward-compat). 6 tests de validación + JSON roundtrip.
|
||||
- `crates/modules/nouser/core`: pipeline determinista.
|
||||
- `scanner`: walkdir → `Vec<FileEntry>` con metadatos (path, size,
|
||||
mtime, extension). Skipea hidden por default. Configurable max
|
||||
depth y follow_links.
|
||||
- `cluster::by_directory`: agrupa por parent dir, mínimo 3 archivos
|
||||
para promover a Mónada (configurable). Calcula keywords (top-N
|
||||
extensiones por frecuencia + alfabético), elige `Lens` dominante
|
||||
(Code/Gallery/Markdown/Database/Grid) según extensión más
|
||||
frecuente, computa entropía de Shannon normalizada [0,1].
|
||||
- `db`: `MonadDb` en memoria con índices BTreeMap files/monads y
|
||||
`resolve_members(monad_id)` que filtra IDs huérfanos. Phase B
|
||||
traerá persistencia.
|
||||
- bin `nouser`: subcomandos `scan <dir>`, `show <dir> <prefix>`,
|
||||
`json <dir>`. Env var `NOUSER_MIN_FILES` para tunear el threshold.
|
||||
- 13 tests (4 scanner + 6 cluster + 3 db).
|
||||
|
||||
Demo end-to-end:
|
||||
|
||||
$ nouser scan crates
|
||||
scan: 255 archivos en crates, 19 mónadas (min_files=3)
|
||||
[01KR4C13] src card=12 ent=0.00 lens=Code
|
||||
keywords: rs
|
||||
[01KR4C13] tests card=14 ent=0.00 lens=Code
|
||||
keywords: rs
|
||||
[01KR4C13] fixtures card=5 ent=0.00 lens=Grid
|
||||
keywords: rhai
|
||||
...
|
||||
|
||||
$ nouser show crates 01KR4C
|
||||
Monad 01KR4C1370DVF6NMTW6SECNXAF
|
||||
label: src
|
||||
summary: 4 archivos en crates/modules/nouser/core/src (ext: rs)
|
||||
cardinality: 4
|
||||
entropy: 0.0000
|
||||
lens: Code
|
||||
members (4):
|
||||
4132 bytes crates/modules/nouser/core/src/db.rs
|
||||
...
|
||||
|
||||
Pendientes para próximas fases (anotados, no urgentes):
|
||||
- **Phase B**: bin `nouser daemon` que sidecarea a brahman-init
|
||||
declarando flows (`scan-request:json` → `monad-update:json`).
|
||||
- **Phase C**: pseudo-embeddings deterministas (hash de path/ext/size
|
||||
a 32-d) + atracción por centroide via cosine similarity. Implementa
|
||||
el "imán" sin LLM.
|
||||
- **Phase D**: módulo `nouser-nous` aparte para el LLM real
|
||||
(Llama/ONNX). En `priority_contexts.test` el Init pinea a
|
||||
`mock-nous` (embeddings determinísticos); en `prod` a `real-nous`.
|
||||
- **Polish**: labels de Mónada incluir 2-3 componentes del path para
|
||||
desambiguar `src/` repetidos en monorepo.
|
||||
|
||||
Workspace: 0 errores, 0 warnings. Tests acumulados: 58
|
||||
(card 11, broker 15, handshake codec+transport 2 + integ 7,
|
||||
card-wit 4, admin 0, nouser-card 6, nouser-core 13).
|
||||
|
||||
### feat(broker): priority contexts — biases per-contexto operativo
|
||||
- `brahman-card::ContextBias { pin_to: Option<String>, priority_offset: i8 }`
|
||||
declara un override per-contexto.
|
||||
|
||||
Reference in New Issue
Block a user