Angshuman28's picture
Upload folder using huggingface_hub
5c4e77e verified
Raw
History Blame Contribute Delete
6.54 kB
"""Perception subagent - deterministic Python; not router-callable.
Per cortex/CLAUDE.md binding: Perception is pure Python; no LLM calls.
Phase A Decisions 9 (V2 KeyError) + 63 (salient_signals cap at 5) +
M-FR-1 (pinned confidence per brain).
Perception runs ONCE per brain at tick start (not router-callable).
The Council Executive (Session 12) calls ``perception_for`` once per
brain at the start of each tick; the resulting ``PerceptionReport`` is
plumbed into all subsequent SubagentInputs for that brain in that tick.
"""
from __future__ import annotations
from typing import Callable, Dict, List
from cortex.schemas import EvidenceCitation, PerceptionReport
from CrisisWorldCortex.models import CrisisworldcortexObservation
_V2_BRAINS = frozenset({"communications", "equity"})
_SALIENT_SIGNALS_CAP = 5 # Phase A Decision 63 / OQ-2
_LOGISTICS_THRESHOLDS = {
"test_kits": 300,
"hospital_beds_free": 100,
"mobile_units": 5,
"vaccine_doses": 500,
}
_HOSPITAL_LOAD_ANOMALY_THRESHOLD = 0.6
def perception_for(brain: str, obs: CrisisworldcortexObservation) -> PerceptionReport:
"""Compute the per-brain Perception report.
Args:
brain: One of {"epidemiology", "logistics", "governance"}.
obs: The current tick's observation.
Raises:
KeyError: If ``brain`` is V2-deferred or unknown.
"""
helper = _PERCEPTION_REGISTRY.get(brain)
if helper is not None:
return helper(obs)
if brain in _V2_BRAINS:
raise KeyError(
f"V2 brain {brain!r} deferred per Phase A Decision 9; no MVP stub perception."
)
raise KeyError(f"unknown brain: {brain!r}")
def _epi_perception(obs: CrisisworldcortexObservation) -> PerceptionReport:
"""Epidemiology perception: top-cases regions + high-hospital-load anomalies."""
sorted_regions = sorted(obs.regions, key=lambda r: r.reported_cases_d_ago, reverse=True)
salient_signals: List[str] = []
evidence: List[EvidenceCitation] = []
for r in sorted_regions[:3]:
if r.reported_cases_d_ago > 0:
salient_signals.append(f"{r.region}: cases={r.reported_cases_d_ago}")
evidence.append(
EvidenceCitation(
source="telemetry",
ref=f"{r.region}.reported_cases_d_ago",
excerpt=str(r.reported_cases_d_ago),
)
)
if not salient_signals and obs.regions:
# Fallback: cite the first region so we have at least one signal
r = obs.regions[0]
salient_signals.append(f"{r.region}: cases={r.reported_cases_d_ago}")
evidence.append(
EvidenceCitation(
source="telemetry",
ref=f"{r.region}.reported_cases_d_ago",
excerpt=str(r.reported_cases_d_ago),
)
)
salient_signals = salient_signals[:_SALIENT_SIGNALS_CAP]
anomalies = [
f"{r.region}: hospital_load={r.hospital_load:.2f}"
for r in obs.regions
if r.hospital_load > _HOSPITAL_LOAD_ANOMALY_THRESHOLD
]
return PerceptionReport(
brain="epidemiology",
salient_signals=salient_signals,
anomalies=anomalies,
# M-FR-1: telemetry is delayed and noisy per mm.md; pinned proxy
confidence=0.7,
evidence=evidence,
)
def _logistics_perception(obs: CrisisworldcortexObservation) -> PerceptionReport:
"""Logistics perception: low-resource flags + depleted-resource anomalies."""
res = obs.resources
salient_signals: List[str] = []
evidence: List[EvidenceCitation] = []
for resource_name, threshold in _LOGISTICS_THRESHOLDS.items():
value = getattr(res, resource_name)
if value < threshold:
salient_signals.append(f"{resource_name} low: {value}")
evidence.append(
EvidenceCitation(
source="resource",
ref=f"resources.{resource_name}",
excerpt=str(value),
)
)
salient_signals = salient_signals[:_SALIENT_SIGNALS_CAP]
anomalies = []
for resource_name in _LOGISTICS_THRESHOLDS:
if getattr(res, resource_name) == 0:
anomalies.append(f"{resource_name}: depleted")
return PerceptionReport(
brain="logistics",
salient_signals=salient_signals,
anomalies=anomalies,
# M-FR-1: resource counts are deterministic, no telemetry noise
confidence=1.0,
evidence=evidence,
)
def _governance_perception(obs: CrisisworldcortexObservation) -> PerceptionReport:
"""Governance perception: active restrictions + legal constraints + about-to-expire anomalies."""
salient_signals: List[str] = []
evidence: List[EvidenceCitation] = []
for restr in obs.active_restrictions:
salient_signals.append(f"{restr.region}: {restr.severity} ({restr.ticks_remaining}t)")
evidence.append(
EvidenceCitation(
source="policy",
ref=f"active_restrictions.{restr.region}",
excerpt=f"{restr.severity}@{restr.ticks_remaining}",
)
)
for lc in obs.legal_constraints:
salient_signals.append(f"legal: {lc.rule_id} blocks {lc.blocked_action}")
evidence.append(
EvidenceCitation(
source="policy",
ref=f"legal_constraints.{lc.rule_id}",
excerpt=lc.blocked_action,
)
)
salient_signals = salient_signals[:_SALIENT_SIGNALS_CAP]
has_recent_escalate_national = any(
ea.accepted
and ea.action.kind == "escalate"
and getattr(ea.action, "to_authority", None) == "national"
for ea in obs.recent_action_log
)
anomalies = []
for restr in obs.active_restrictions:
if (
restr.severity == "strict"
and restr.ticks_remaining <= 1
and not has_recent_escalate_national
):
anomalies.append(f"{restr.region}: strict expiring without escalation")
return PerceptionReport(
brain="governance",
salient_signals=salient_signals,
anomalies=anomalies,
# M-FR-1: policy state is deterministic
confidence=1.0,
evidence=evidence,
)
_PERCEPTION_REGISTRY: Dict[str, Callable[[CrisisworldcortexObservation], PerceptionReport]] = {
"epidemiology": _epi_perception,
"logistics": _logistics_perception,
"governance": _governance_perception,
}