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:
@@ -145,8 +145,18 @@ async fn primordial_loop(
|
||||
// tipados. Si el bind falla (socket en uso, FS no escribible),
|
||||
// degradamos a "modo bus-only" — la doctrina de PID 1 no rompe
|
||||
// por subsistemas opcionales.
|
||||
// Contexto operativo del broker: configurable por env var. Útil para
|
||||
// distinguir test/prod/foreground sin recompilar. Sin la var, los
|
||||
// biases per-contexto declarados en las Cards quedan inactivos.
|
||||
let broker_context = std::env::var("BRAHMAN_BROKER_CONTEXT").ok();
|
||||
if let Some(ctx) = &broker_context {
|
||||
info!(context = %ctx, "brahman broker bajo contexto operativo");
|
||||
}
|
||||
let brahman_broker = std::sync::Arc::new(tokio::sync::Mutex::new(
|
||||
brahman_broker::Broker::new(brahman_broker::BrokerConfig::default()),
|
||||
brahman_broker::Broker::new(brahman_broker::BrokerConfig {
|
||||
strategy: brahman_broker::MatchStrategy::default(),
|
||||
current_context: broker_context.clone(),
|
||||
}),
|
||||
));
|
||||
let brahman_sock = brahman_handshake::transport::default_socket_path();
|
||||
match brahman_handshake::server::Server::bind(
|
||||
@@ -177,6 +187,7 @@ async fn primordial_loop(
|
||||
brahman_broker.clone(),
|
||||
brahman_admin::server::AdminConfig {
|
||||
init_attached: true,
|
||||
current_context: broker_context.clone(),
|
||||
},
|
||||
) {
|
||||
Ok(admin) => {
|
||||
|
||||
Reference in New Issue
Block a user