feat(brahman-net+handshake): stop_providing automatico en cleanup

Cierra el pendiente conocido del DHT: hasta ahora cuando una sesion
con outputs cerraba (Farewell, EOF, error), el record que la
anunciaba en el DHT seguia vivo hasta su TTL natural (~24h en kad
default). Consumers remotos podian descubrir un peer "vivo" que ya
no servia nada.

Cambios:
- BrahmanNet::stop_providing(key) (nuevo): contraparte simetrica de
  start_providing. Manda Command::StopProviding al swarm que llama
  kad.stop_providing(&key). Borra el record local al instante;
  replicas remotas siguen expirando por TTL (kad no expone retraccion
  cross-peer, simetrico al hecho de que start_providing tambien
  propaga eventualmente).
- brahman_handshake::network::withdraw_outputs(net, card) (nuevo):
  contraparte de announce_outputs. Itera card.flow.output y llama
  net.stop_providing(flow_dht_key(...)) por cada uno.
- server::cleanup: extrae la ResolvedCard removida del registro de
  sesiones (en lugar de descartarla) y, si config.net esta set,
  llama withdraw_outputs(net, &card) antes de broadcast_match_diffs.

Tests: nuevo E2E dht_discovery_withdraws_on_session_cleanup:
1. A registra Card con flow.output = monad-list:json.
2. B descubre a A via find_remote_providers (assert before contains
   a_peer).
3. Cliente local de A hace farewell -> cleanup -> withdraw_outputs.
4. Espera a que la sesion salga del registro + 100ms para que el
   swarm procese el Command.
5. Nueva query desde B: after NO debe contener a_peer.

3 tests verdes en network_discovery.rs (positivo, negativo, withdraw).
18 tests totales en handshake + net.
This commit is contained in:
Sergio
2026-05-09 15:10:30 +00:00
parent fa0ed98880
commit 2e6afd0973
5 changed files with 195 additions and 5 deletions
+38
View File
@@ -6,6 +6,44 @@ ratio/diff ver `git show <sha>`.
## 2026-05-09
### feat(brahman-net+handshake): stop_providing automático en cleanup de sesión
Cierra el pendiente conocido del DHT: hasta ahora cuando una sesión
con outputs cerraba (Farewell, EOF, error), el record que la
anunciaba en el DHT seguía vivo hasta su TTL natural (~24h en kad
default). Consumers remotos podían descubrir un peer "vivo" que ya
no servía nada.
Cambios:
- **`BrahmanNet::stop_providing(key)`** (nuevo): contraparte simétrica
de `start_providing`. Manda `Command::StopProviding` al swarm que
llama `kad.stop_providing(&key)`. Borra el record del provider
store local al instante; replicas en peers remotos siguen
expirando por TTL (kad no expone retracción cross-peer, simétrico
al hecho de que `start_providing` también propaga eventualmente).
- **`brahman_handshake::network::withdraw_outputs(net, card)`**
(nuevo): contraparte de `announce_outputs`. Itera `card.flow.output`
y llama `net.stop_providing(flow_dht_key(...))` por cada uno.
- **`server::cleanup`**: extrae la `ResolvedCard` removida del registro
de sesiones (en lugar de descartarla con `remove`) y, si
`config.net` está set, llama `withdraw_outputs(net, &card)` antes
de `broadcast_match_diffs`.
Tests: nuevo E2E `dht_discovery_withdraws_on_session_cleanup`:
1. A registra Card con `flow.output = monad-list:json`.
2. B descubre a A vía `find_remote_providers` — confirma
`before.contains(&a_peer)`.
3. Cliente local de A hace `farewell` → cleanup → withdraw_outputs.
4. Espera a que la sesión salga del registro (señal de cleanup
completado) + 100ms para que el swarm procese el Command.
5. Nueva query desde B: `after` NO debe contener `a_peer`.
3 tests verdes en `network_discovery.rs` (positivo, negativo,
withdraw). 18 tests totales en handshake + net.
Pendiente futuro: retracción cross-peer en kad (requeriría extensión
del protocolo libp2p, no soportada hoy). Aceptable: simétrico al
modelo de propagación eventual del DHT.
### feat(ente-zero): wire de Arje con brahman-net (red P2P opcional + identidad persistente)
Cierra el último pendiente del plan de red: Arje ahora puede arrancar
opcionalmente con `BrahmanNet` configurado, persistir su identidad