feat(nouser): Phase C — pseudo-embeddings + atracción por centroide
El "imán semántico" matemático del diseño Kairos, sin LLM. Cada
archivo se proyecta a un vector 32-d determinista derivado de sus
metadatos; cada Mónada calcula su centroide; archivos nuevos se
asignan por cosine similarity contra los centroides existentes.
Cambios:
- nouser-core dep nueva: blake3 (hash determinista de strings).
- crates/modules/nouser/core/src/embed.rs nuevo:
- EMBED_DIM = 32. Vector:
* dims 0..8: blake3(extension)
* dims 8..16: blake3(parent_dir)
* dims 16..24: blake3(file_stem)
* dims 24..28: tamaño (log + flags)
* dims 28..32: mtime (escala día + features cíclicas)
- Tip clave: hash bytes se centran a [-1, 1] (no [0, 1]). Sin
centrar, dos hashes random tendrían cosine ~0.75 espurio.
Centrados, expectativa ≈ 0 entre no-relacionados.
- APIs: embed, cosine_similarity, centroid, cohesion,
attraction_score, best_attraction. DEFAULT_ATTRACTION_THRESHOLD = 0.7.
- cluster::by_directory ahora computa el centroide de cada Mónada
y lo guarda en MonadManifest.centroid. El centroide viaja al
brahman-status vía DataFacet.centroid.
- bin nouser nuevo subcomando: attract <dir> <file>.
- Scan del dir, embedding del archivo objetivo, ranking de afinidad
contra Mónadas con centroide.
- 🧲 si la mejor supera umbral, · si es mejor pero debajo.
Validación end-to-end:
$ nouser attract crates/core crates/modules/nouser/core/src/embed.rs
🧲 0.9058 [01K..] src (ente-brain/src)
0.8984 [01K..] src (brahman-handshake/src)
...
$ nouser attract crates/core crates/modules/nouser/core/Cargo.toml
0.3427 [01K..] graph (ente-zero/src/graph)
(mejor score 0.3427 < umbral 0.7000 — no se 'pega')
7 tests nuevos en embed (determinismo, normalización, similitud
mismo-dir/mismo-ext, baja entre no-relacionados, centroide
unidad+coherente, attraction picks correctly, vacío skipeado).
Tests acumulados: 73. cargo check --workspace: 0 errores, 0 warnings.
Próximo: Phase D — nouser-nous, módulo aparte para LLM real.
Mock-nous determinista (basado en estos pseudo-embeddings) en
BRAHMAN_BROKER_CONTEXT=test; real-nous en prod. El switch lo hace
el broker via priority_contexts.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,62 @@ ratio/diff ver `git show <sha>`.
|
||||
|
||||
## 2026-05-08
|
||||
|
||||
### feat(nouser): Phase C — pseudo-embeddings + atracción por centroide
|
||||
El "imán semántico" matemático del diseño Kairos, sin LLM. Cada
|
||||
archivo se proyecta a un vector 32-d derivado de sus metadatos; cada
|
||||
Mónada calcula su centroide; archivos nuevos se asignan por cosine
|
||||
similarity contra los centroides existentes.
|
||||
|
||||
Cambios:
|
||||
|
||||
- nouser-core dep nueva: `blake3` (hash determinista de strings).
|
||||
- `crates/modules/nouser/core/src/embed.rs`:
|
||||
- `EMBED_DIM = 32`. Estructura del vector:
|
||||
- dims 0..8: blake3(extension) → identidad de tipo
|
||||
- dims 8..16: blake3(parent_dir) → identidad de contenedor
|
||||
- dims 16..24: blake3(file_stem) → identidad léxica
|
||||
- dims 24..28: tamaño (log + flags)
|
||||
- dims 28..32: mtime (escala día + cíclicas)
|
||||
- **Tip clave**: bytes del hash se centran a `[-1, 1]` (no `[0, 1]`).
|
||||
Sin centrar, dos vectores hash random tendrían cosine ~0.75
|
||||
espuria; centrados, expectativa ≈ 0 entre no-relacionados.
|
||||
- APIs: `embed`, `cosine_similarity`, `centroid`, `cohesion`,
|
||||
`attraction_score`, `best_attraction`. `DEFAULT_ATTRACTION_THRESHOLD = 0.7`.
|
||||
- `cluster::by_directory` ahora computa el centroide de cada Mónada
|
||||
(promedio de embeddings de los miembros, L2-normalizado) y lo guarda
|
||||
en `MonadManifest.centroid`. El centroide viaja al brahman-status vía
|
||||
`DataFacet.centroid` → ahora se ven los Vec<f32> reales por cada Mónada.
|
||||
- bin nouser nuevo subcomando: `attract <dir> <file>`.
|
||||
- Escanea el dir, embeda el archivo objetivo, ranking de afinidad
|
||||
contra todas las Mónadas con centroide.
|
||||
- Marca 🧲 si la mejor supera el umbral, `·` si es la mejor pero
|
||||
debajo, espacio en blanco para el resto.
|
||||
|
||||
Validación end-to-end:
|
||||
|
||||
$ nouser attract crates/core crates/modules/nouser/core/src/embed.rs
|
||||
ranking de atracción (cosine similarity):
|
||||
🧲 0.9058 [01K..] src (11 archivos en crates/core/ente-brain/src)
|
||||
0.8984 [01K..] src (6 archivos en crates/core/brahman-handshake/src)
|
||||
0.8918 [01K..] src (5 archivos en crates/core/ente-zero/src)
|
||||
...
|
||||
|
||||
$ nouser attract crates/core crates/modules/nouser/core/Cargo.toml
|
||||
ranking:
|
||||
0.3427 [01K..] graph (7 archivos en crates/core/ente-zero/src/graph)
|
||||
...
|
||||
(mejor score 0.3427 < umbral 0.7000 — el archivo no se 'pega')
|
||||
|
||||
Tests: 20 en nouser-core (era 13, +7 de embed). Total acumulado: 73
|
||||
(card 11, broker 15, handshake codec+tr 2 + integ 7, card-wit 4,
|
||||
admin 0, nouser-card 7, nouser-core 20, ente-card 0).
|
||||
cargo check --workspace: 0 errores, 0 warnings.
|
||||
|
||||
Próximo: **Phase D** — `nouser-nous`, módulo aparte para LLM real.
|
||||
Mock-nous determinista (basado en estos pseudo-embeddings) en
|
||||
`BRAHMAN_BROKER_CONTEXT=test`; real-nous en `prod`. El switch lo hace
|
||||
el broker via priority_contexts sin tocar nada más.
|
||||
|
||||
### feat(nouser): Phase B-2 — daemon que publica Mónadas al Init
|
||||
Cierra la unificación: el `nouser daemon` se sidecarea como Ente y
|
||||
publica cada Mónada como su propia sesión Data. Un solo
|
||||
|
||||
Reference in New Issue
Block a user