feat(nouser): hidratación del daemon vía sled + path_hint
El daemon ya no recomputa ciegamente al arrancar. Si la DB tiene Mónadas previas con centroid_model válido, las publica instantáneo y el re-scan reusa sus IDs vía path_hint. Schema: - MonadManifest.path_hint: Option<String> — identidad estable derivada del origen (para by_directory, el parent dir canónico). Permite reusar ULID across re-scans. Cluster: - Nueva fn cluster::by_directory_hydrated(files, min_files, prior). Con prior, busca Mónada con mismo path_hint Y mismo centroid_model; si la encuentra, reusa id, lineage y created_at_ms. - by_directory queda como wrapper sin hidratación (back-compat). Daemon (cmd_daemon): 1. Open sled si NOUSER_DB_PATH existe. 2. Publica Mónadas previas con centroid_model válido (las inválidas se descartan con log explícito). 3. Re-scan + by_directory_hydrated(prior=&db). 4. Sólo spawnea sidecars para Mónadas con id NUEVO. Los path_hints existentes preservan identidad, evitando duplicados en el broker. 5. Persiste el set actualizado. Validación: $ NOUSER_DB_PATH=/tmp/h.sled nouser daemon crates/core # arranque 1: re-scan 102 archivos → 5 mónadas (5 nuevas) $ NOUSER_DB_PATH=/tmp/h.sled nouser daemon crates/core # arranque 2: hidratadas 5 mónadas en O(1) # re-scan → 5 mónadas (0 nuevas vs hidratación) Costo del arranque 2: ~0.06s user CPU. Tests: 7 (card) + 24 (core) verdes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,51 @@ ratio/diff ver `git show <sha>`.
|
||||
|
||||
## 2026-05-09
|
||||
|
||||
### feat(nouser): hidratación del daemon vía sled + path_hint
|
||||
El daemon ya no recomputa ciegamente al arrancar. Si la DB tiene
|
||||
Mónadas previas con `centroid_model` válido, las publica instantáneo
|
||||
y el re-scan reusa sus IDs vía `path_hint`.
|
||||
|
||||
Schema:
|
||||
- `MonadManifest.path_hint: Option<String>` — identidad estable
|
||||
derivada del origen (para `by_directory`, el parent dir
|
||||
canónico). Permite reusar ULID across re-scans.
|
||||
|
||||
Algoritmo (cluster):
|
||||
- Nueva fn `cluster::by_directory_hydrated(files, min_files,
|
||||
prior: Option<&MonadDb>)`. Cuando hay `prior`, busca Mónada con
|
||||
mismo `path_hint` Y mismo `centroid_model`; si la encuentra,
|
||||
reusa `id`, `lineage` y `created_at_ms`.
|
||||
- `by_directory` queda como wrapper sin hidratación (back-compat).
|
||||
|
||||
Daemon (cmd_daemon):
|
||||
1. Open sled si NOUSER_DB_PATH existe.
|
||||
2. Publica las Mónadas previas con `centroid_model` válido (las
|
||||
inválidas se descartan con log explícito).
|
||||
3. Re-scan + `by_directory_hydrated(prior=&db)`.
|
||||
4. Sólo spawnea sidecars para Mónadas con id que NO estaba en la
|
||||
hidratación inicial. Los path_hints existentes preservan identidad,
|
||||
evitando duplicados en el broker.
|
||||
5. Persiste el set actualizado.
|
||||
|
||||
Validación end-to-end:
|
||||
|
||||
$ NOUSER_DB_PATH=/tmp/h.sled nouser daemon crates/core
|
||||
# arranque 1: DB vacía
|
||||
re-scan 102 archivos → 5 mónadas
|
||||
1 ente + 5 mónadas vivas (5 nuevas vs hidratación)
|
||||
|
||||
$ NOUSER_DB_PATH=/tmp/h.sled nouser daemon crates/core
|
||||
# arranque 2: DB poblada
|
||||
hidratadas 5 mónadas previas en O(1)
|
||||
re-scan 102 archivos → 5 mónadas
|
||||
1 ente + 5 mónadas vivas (0 nuevas vs hidratación)
|
||||
|
||||
Costo del arranque 2: ~0.06s user CPU. Antes (sin hidratación) era
|
||||
re-scan + cluster + spawn x N — segundos enteros para árboles grandes.
|
||||
|
||||
Tests: 7 (card) + 24 (core) verdes.
|
||||
|
||||
### feat(nouser): centroid_model — versionado de embeddings
|
||||
Protege contra el bug silencioso de mezclar centroides de modelos
|
||||
distintos (mock 32-d vs real 384-d), que daba scores sin sentido.
|
||||
|
||||
Reference in New Issue
Block a user