CrisisWorldCortex / cortex /brains /_executive.py
Angshuman28's picture
Upload folder using huggingface_hub
5c4e77e verified
Raw
History Blame Contribute Delete
5.24 kB
"""Brain Executive - deterministic Python aggregation.
Per Phase A docs/CORTEX_ARCHITECTURE.md Decisions 15-21 + M-FR-3 partial
evidence union (perception + beliefs only; CandidatePlan and CriticReport
schemas have no evidence fields).
Brain Executive runs ONCE per brain at round end. NOT router-callable
per cortex/CLAUDE.md.
"""
from __future__ import annotations
from typing import List
from cortex.schemas import (
BeliefState,
BrainRecommendation,
CandidatePlan,
CriticReport,
EvidenceCitation,
PerceptionReport,
)
from CrisisWorldCortex.models import NoOp
_REASONING_SUMMARY_MAX_CHARS = 400 # matches BrainRecommendation.reasoning_summary cap
_FALSIFIERS_TO_JOIN = 3
_FALSIFIER_FALLBACK = "(no falsifier provided)"
_EMPTY_REASONING = "(empty: no subagent produced a parseable plan)"
def aggregate_brain_outputs(
brain_id: str,
perception: PerceptionReport,
beliefs: List[BeliefState],
plans: List[CandidatePlan],
critics: List[CriticReport],
tokens_used: int = 0,
) -> BrainRecommendation:
"""Aggregate one brain's per-round subagent outputs into a recommendation.
Decisions:
D15: argmax over expected_value * confidence.
D16: top_confidence = chosen.confidence * (1 - chosen_belief.uncertainty).
D17: minority_actions = all expected_outer_actions except chosen.
D19: reasoning_summary = chosen.action_sketch[:400].
D20 (M-FR-3): evidence = perception.evidence + flat-union of beliefs[*].evidence.
CandidatePlan/CriticReport carry no evidence fields.
D21: brain_id is lowercase per Pydantic Literal in BrainRecommendation.
Empty fallback (M-FR-7): no plans, or chosen plan has confidence==0
-> top_action=NoOp, top_confidence=0, uncertainty=1.0,
reasoning_summary=_EMPTY_REASONING.
Args:
brain_id: lowercase brain id ("epidemiology" / "logistics" / "governance").
perception: This brain's PerceptionReport for the tick.
beliefs: Per-round BeliefStates. Index aligned with ``plans``.
plans: Per-round CandidatePlans.
critics: Per-round CriticReports (currently unused in aggregation but
kept on the signature so the trajectory log captures the full
chain).
tokens_used: Total tokens billed across this brain's subagents.
"""
if not plans:
return _empty_recommendation(brain_id, perception, beliefs, tokens_used)
# D15: argmax over expected_value * confidence
chosen_idx = max(
range(len(plans)),
key=lambda i: plans[i].expected_value * plans[i].confidence,
)
chosen_plan = plans[chosen_idx]
if chosen_plan.confidence == 0.0:
# All plans are empty fallbacks (or the only plan is empty).
# Brain Executive treats this as no-signal.
return _empty_recommendation(brain_id, perception, beliefs, tokens_used)
# D16: top_confidence = chosen.confidence * (1 - belief.uncertainty)
if chosen_idx < len(beliefs):
chosen_belief = beliefs[chosen_idx]
uncertainty = chosen_belief.uncertainty
else:
# Defensive: parallel arrays should match. If not, treat as max uncertainty.
uncertainty = 1.0
top_confidence = chosen_plan.confidence * (1.0 - uncertainty)
# D17: minority_actions = all plans except chosen
minority_actions = [
plans[i].expected_outer_action for i in range(len(plans)) if i != chosen_idx
]
# D19: reasoning_summary
reasoning_summary = chosen_plan.action_sketch[:_REASONING_SUMMARY_MAX_CHARS]
# D20 (M-FR-3): evidence union from perception + beliefs only.
# CandidatePlan and CriticReport schemas (Session 9) have no evidence fields;
# the perception+beliefs union captures the actionable evidence chain since
# plans/critics derive from beliefs.
evidence: List[EvidenceCitation] = list(perception.evidence)
for b in beliefs:
evidence.extend(b.evidence)
# falsifier (M-FR-6): join up to 3 falsifiers; fallback if empty.
if chosen_plan.falsifiers:
falsifier = "; ".join(chosen_plan.falsifiers[:_FALSIFIERS_TO_JOIN])
else:
falsifier = _FALSIFIER_FALLBACK
return BrainRecommendation(
brain=brain_id,
top_action=chosen_plan.expected_outer_action,
top_confidence=top_confidence,
minority_actions=minority_actions,
reasoning_summary=reasoning_summary,
evidence=evidence,
falsifier=falsifier,
uncertainty=uncertainty,
tokens_used=tokens_used,
)
def _empty_recommendation(
brain_id: str,
perception: PerceptionReport,
beliefs: List[BeliefState],
tokens_used: int,
) -> BrainRecommendation:
"""M-FR-7 empty fallback: NoOp + confidence=0 + uncertainty=1."""
evidence: List[EvidenceCitation] = list(perception.evidence)
for b in beliefs:
evidence.extend(b.evidence)
return BrainRecommendation(
brain=brain_id,
top_action=NoOp(),
top_confidence=0.0,
minority_actions=[],
reasoning_summary=_EMPTY_REASONING,
evidence=evidence,
falsifier=_FALSIFIER_FALLBACK,
uncertainty=1.0,
tokens_used=tokens_used,
)