feat(broker): priority contexts — biases per-contexto operativo
Cierra el último pendiente de feature: el broker ahora puede operar
bajo un contexto (test/prod/foreground/secure/etc) que activa biases
declarados en las Cards.
Schema (brahman-card):
- ContextBias { pin_to: Option<String>, priority_offset: i8 }.
- Card.priority_contexts: BTreeMap<String, ContextBias>, también en
WireCard. Las conversiones From propagan el campo.
Comportamiento (brahman-broker):
- BrokerConfig.current_context: Option<String>. Cuando es Some(ctx) y
una Card tiene priority_contexts.get(ctx), el bias aplica:
- Consumer-side: bias.pin_to sobreescribe Flow.pin_to estático.
- Producer-side: bias.priority_offset se suma a la priority base
(clamp en [Low=0, Critical=3]).
- BrokeredCard propaga priority_contexts. find_producer_for usa
effective_priority y context_bias en lugar de comparar Priority
directo.
Observabilidad:
- AdminConfig.current_context + StatusSnapshot.current_context.
- brahman-status imprime "Context: <nombre>" si está activo.
Wiring:
- ente-zero lee BRAHMAN_BROKER_CONTEXT del entorno y la propaga al
broker y al admin. Sin var, biases inactivos (back-compat total).
Tests nuevos (brahman-broker, +4):
- context_priority_offset_lifts_producer_above_alphabetic_winner:
sin contexto a-prod gana por alfabético; con context "test" b-prod
gana por offset +1.
- context_pin_to_overrides_static_pin: static pin "real-dht", test
override "mock-dht" → mock gana en context "test".
- unknown_context_no_op: biases declarados para "test" no aplican
cuando broker está en "prod".
- priority_offset_clamps_to_critical: offset enorme se clampa a 3.
Validación end-to-end manual:
$ BRAHMAN_BROKER_CONTEXT=test ente-zero &
$ brahman-status
Init: server=0.1.0 protocol=0.1.0 attached=true
Context: test
Tests acumulados: 39 (card 11, broker 15, handshake codec+transport 2 +
integ 7, card-wit 4, admin 0). cargo check --workspace: 0 errores, 0
warnings.
Con esto cierran TODOS los pendientes técnicos abiertos. El único
"pendiente" que queda es el caso real para extender (priority
contexts per-deployment, scheduling biases dinámicos, etc.).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,31 @@ ratio/diff ver `git show <sha>`.
|
||||
|
||||
## 2026-05-08
|
||||
|
||||
### feat(broker): priority contexts — biases per-contexto operativo
|
||||
- `brahman-card::ContextBias { pin_to: Option<String>, priority_offset: i8 }`
|
||||
declara un override per-contexto.
|
||||
- `Card.priority_contexts: BTreeMap<String, ContextBias>` y mismo en
|
||||
`WireCard` (cruza el wire). Las conversiones `From` lo propagan.
|
||||
- `BrokerConfig.current_context: Option<String>`. Cuando el broker corre
|
||||
bajo un contexto y una Card declara biases para ese nombre, se aplican:
|
||||
- Como **consumidor**: `pin_to` sobreescribe el `Flow.pin_to` estático.
|
||||
- Como **productor**: `priority_offset` se suma a la priority base
|
||||
(clamp en `[Low=0, Critical=3]`) para el ranking.
|
||||
- `BrokeredCard` propaga `priority_contexts`. `find_producer_for` usa
|
||||
`effective_priority(card)` y `effective_pin(card, input)` antes de
|
||||
los tiebreaks.
|
||||
- `brahman-admin::AdminConfig.current_context` + `StatusSnapshot.current_context`
|
||||
espejan el contexto activo. `brahman-status` lo imprime como
|
||||
`Context: <nombre>` justo debajo de `Init: ...`.
|
||||
- `ente-zero` lee `BRAHMAN_BROKER_CONTEXT` env var y la propaga al
|
||||
broker y al admin. Sin var, biases per-contexto inactivos.
|
||||
- 4 tests nuevos en brahman-broker:
|
||||
`context_priority_offset_lifts_producer_above_alphabetic_winner`,
|
||||
`context_pin_to_overrides_static_pin`, `unknown_context_no_op`,
|
||||
`priority_offset_clamps_to_critical`.
|
||||
- Validación end-to-end: `BRAHMAN_BROKER_CONTEXT=test ente-zero` →
|
||||
`brahman-status` muestra `Context: test`.
|
||||
|
||||
### feat(card): WireCard + extensions — forward-compat sin romper postcard
|
||||
- `Card.extensions: BTreeMap<String, serde_json::Value>` restaurado con
|
||||
`#[serde(flatten, default, skip_serializing_if = is_empty)]`. Los
|
||||
|
||||
Reference in New Issue
Block a user