feat: Phase D-3 + D-4 — service_socket en Card, providers coexisten
Cierra el ciclo del swap automático Nous mock↔real:
- brahman-card: Card.service_socket: Option<PathBuf> y espejo en
WireCard. Path del data plane (distinto al Init). Cualquier
consumer que matchee con esta Card conecta directo, sin discovery
extra.
- brahman-broker: BrokeredCard propaga service_socket. Sin
participación en matching — sólo metadata.
- brahman-handshake::MatchEvent: nuevo campo
producer_service_socket. Server lo busca en BrokeredCard al emitir
Available.
- nouser-nous::transport: provider_socket_path(provider: &str)
devuelve nouser-nous-{provider}.sock por default. Mock y real
coexisten en sockets distintos (Phase D-4). default_socket_path()
conserva el comportamiento single-provider.
- Mock declara nouser-nous-mock.sock; real declara
nouser-nous-real.sock. La Card se construye DESPUÉS del bind.
- brahman-status imprime "socket:" por sesión cuando está presente.
Validación end-to-end:
$ ente-zero & nouser-nous-mock & nouser-nous-real &
$ ls /run/user/1001/nouser-nous-*.sock
nouser-nous-mock.sock
nouser-nous-real.sock
$ brahman-status
Sessions (2):
[ente] nouser.nous_real
socket: /run/user/1001/nouser-nous-real.sock
[ente] nouser.nous_mock
socket: /run/user/1001/nouser-nous-mock.sock
Pendiente (no crítico): nouser-core attract --remote usa todavía
NOUSER_NOUS_SOCKET hardcoded. Siguiente paso: subscribirse al
MatchEvent del broker y usar producer_service_socket directo, así
BRAHMAN_BROKER_CONTEXT=test/prod swapea provider sin tocar al
consumer.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,57 @@ ratio/diff ver `git show <sha>`.
|
||||
|
||||
## 2026-05-08
|
||||
|
||||
### feat: Phase D-3 + D-4 — service_socket en Card, providers coexisten
|
||||
Cierra el ciclo del swap automático de Nous (mock↔real):
|
||||
|
||||
- **Schema** (`brahman-card`): `Card.service_socket: Option<PathBuf>` y
|
||||
espejo en `WireCard`. Conversiones `From` propagan. Es el path del
|
||||
**data plane** (distinto del socket del Init); cualquier consumer
|
||||
que matchee con esta Card puede conectar directo sin discovery
|
||||
adicional.
|
||||
- **Broker** (`brahman-broker`): `BrokeredCard` propaga
|
||||
`service_socket` desde la Card. Sin participación en el matching —
|
||||
sólo metadata para los observadores.
|
||||
- **MatchEvent** (`brahman-handshake`): nuevo campo
|
||||
`producer_service_socket: Option<PathBuf>`. Cuando el server emite
|
||||
`Available`, busca la `BrokeredCard` del productor en el broker y
|
||||
copia su `service_socket`. El consumer recibe la ruta completa para
|
||||
conectar.
|
||||
- **Transport** (`nouser-nous`): `provider_socket_path(provider: &str)`
|
||||
devuelve `nouser-nous-{provider}.sock` por default — mock y real
|
||||
coexisten en sockets distintos (Phase D-4). `default_socket_path()`
|
||||
conserva el comportamiento single-provider.
|
||||
- **Providers**: mock declara `service_socket =
|
||||
/run/user/X/nouser-nous-mock.sock`; real declara
|
||||
`nouser-nous-real.sock`. La Card se construye DESPUÉS del bind para
|
||||
que el path declarado sea el real.
|
||||
- **Status**: `brahman-status` imprime `socket:` por sesión cuando
|
||||
está presente.
|
||||
|
||||
Validación end-to-end:
|
||||
|
||||
$ ente-zero & nouser-nous-mock & nouser-nous-real &
|
||||
$ ls /run/user/1001/nouser-nous-*.sock
|
||||
nouser-nous-mock.sock
|
||||
nouser-nous-real.sock
|
||||
|
||||
$ brahman-status
|
||||
Sessions (2):
|
||||
[ente] ... nouser.nous_real
|
||||
socket: /run/user/1001/nouser-nous-real.sock
|
||||
in embed-request: Primitive { name: "json" }
|
||||
out embed-result: Primitive { name: "json" }
|
||||
[ente] ... nouser.nous_mock
|
||||
socket: /run/user/1001/nouser-nous-mock.sock
|
||||
in embed-request, out embed-result
|
||||
|
||||
Pendientes para futuro (no críticos):
|
||||
- nouser-core attract --remote todavía usa NOUSER_NOUS_SOCKET hardcoded
|
||||
o `default_socket_path()`. El siguiente paso es subscribirse al
|
||||
MatchEvent del broker y usar `producer_service_socket` directo —
|
||||
con eso `BRAHMAN_BROKER_CONTEXT=test/prod` swapea provider sin
|
||||
tocar al consumer.
|
||||
|
||||
### refactor(nouser): labels de Mónada con 2 componentes del path
|
||||
Resuelve la fricción visual de monorepos donde múltiples Mónadas se
|
||||
llamaban "src". Nueva función `label_from_path` toma los últimos hasta
|
||||
|
||||
Reference in New Issue
Block a user