feat(nouser): notify watcher — el sistema reacciona en tiempo real

El daemon monta notify::recommended_watcher recursivo sobre el dir
escaneado. Cada Create/Modify de archivo regular dispara:
embedding → filtro por centroid_model → ranking contra centroides →
log con 🧲 / · según supere DEFAULT_ATTRACTION_THRESHOLD.

  $ nouser daemon /tmp/x &
  $ vim /tmp/x/src/nuevo.rs
  [watcher] 🧲 /tmp/x/src/nuevo.rs  →  x/src  (0.7470)

  $ echo edit >> /tmp/x/docs/n1.md
  [watcher] 🧲 /tmp/x/docs/n1.md  →  x/docs  (0.8169)

Mecánica:
- DB pasa a Arc<Mutex<MonadDb>> para sharing con thread watcher.
- Watcher en thread dedicado nouser-watcher; reacciona sólo a
  Create/Modify, ignora Access/Metadata-only.
- react_to_change(path, metadata, db) computa embedding, filtra por
  centroid_model, busca best attraction.
- No re-publica al broker ni muta DB — sólo observa y narra. La
  invalidación selectiva (re-cluster + replace + diff publish) queda
  para futuro.

Limitación conocida: notify emite múltiples eventos por edición
(Create + Modify, etc.). Sin debounce el watcher reporta varias
veces. Aceptable para demo; producción conviene debounce ~100ms
por path.

Esto cierra la Fase C del plan post-reporte: el sistema "se siente"
vivo. Tocar un archivo en vim y ver inmediatamente la atracción
calculada cumple el meta-mensaje "Mónada Viva".

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sergio
2026-05-09 01:06:31 +00:00
parent 65af98da13
commit 487c457e5b
4 changed files with 173 additions and 1 deletions
+34
View File
@@ -6,6 +6,40 @@ ratio/diff ver `git show <sha>`.
## 2026-05-09
### feat(nouser): notify watcher — el sistema reacciona en tiempo real
El daemon ahora monta un `notify::recommended_watcher` recursivo
sobre el directorio. Cada `Create`/`Modify` de archivo regular
dispara: embedding del archivo, filtro por `centroid_model`, ranking
contra centroides existentes, log con marker 🧲 / · según supere
el umbral de atracción.
$ nouser daemon /tmp/x &
# en otra terminal:
$ vim /tmp/x/src/nuevo.rs
# daemon log:
[watcher] 🧲 /tmp/x/src/nuevo.rs → x/src (0.7470)
$ echo "edit" >> /tmp/x/docs/n1.md
[watcher] 🧲 /tmp/x/docs/n1.md → x/docs (0.8169)
Mecánica:
- DB pasa a `Arc<Mutex<MonadDb>>` para sharing con el thread del
watcher.
- Watcher en thread dedicado (`nouser-watcher`); reacciona sólo a
Create/Modify, ignora Access/Metadata-only.
- `react_to_change(path, metadata, db)` computa embedding,
filtra por `centroid_model`, busca best attraction.
- No re-publica al broker ni muta DB — sólo observa y narra. La
invalidación selectiva (re-cluster + replace_monads + diff
publish) queda como work futuro.
Limitación conocida: `notify` emite múltiples eventos por una sola
edición (Create + Modify, etc.). Sin debounce, el watcher reporta
varias veces. Aceptable para demo; production conviene debounce
~100ms por path.
Tests: 7 (card) + 24 (core) verdes, 0 errores, 0 warnings.
### 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