Spaces:
Sleeping
Sleeping
cortex/CLAUDE.md
Cortex = the multi-brain agent. Client-side only. Never imports server/*.
Belongs here
- 3 brains β Epidemiology, Logistics, Governance (
cortex/brains/). - Per-brain subagents β Perception, World Modeler, Planner, Critic, Brain Executive (
cortex/subagents/). - Council Executive + 4-phase state machine (
cortex/council.py). - Routing policy: MLP head over
MetacognitionState(MVP primary); LoRA stretch (cortex/routing_policy.py). - Metacognition signals (
cortex/metacognition.py). - Anti-hivemind protocol + collapse detectors (
cortex/anti_hivemind.py). - Brain-specific observation lenses (
cortex/lenses.py). - LLM client wrapper (
cortex/llm_client.py). - Cortex-internal schemas (
cortex/schemas.py).
Does not belong here
SEIR dynamics, telemetry noise, reward math (β server/). GRPO loop, rollout buffer (β training/). Baseline agents (β baselines/).
Allowed imports
models (wire types), cortex/*, torch, OpenAI SDK, stdlib.
Forbidden imports
server/* (binding β no reaching into SEIR constants, latent state, or graders; training hits the env over HTTP like production). training/*, baselines/*, demo/*.
Enforcement rules (all binding)
Role split
- Perception is pure Python. Do not introduce an LLM call.
- Brain Executive is pure Python. Do not introduce an LLM call.
- World Modeler, Planner, Critic are LLM calls. Do not rewrite in Python.
- Router-callable subagent set is exactly
{WorldModeler, Planner, Critic}. The routing policy must not invoke Perception or Brain Executive.
Per-tick hard caps (enforce in Council Executive)
- At most 2 deliberation rounds per tick. Force convergence after round 2.
- At most 1 cross-brain challenge per tick total β not per brain, total across brains.
- At most 1 Critic call per brain per tick. A brain's Critic must not run twice in one tick.
- Read hard token budget per tick from the task config at tick start. When depleted, the router may only emit
emit_outer_actionorstop_and_no_op. - Worst-case LLM calls per tick = 19 (9 round-1 + 9 round-2 + 1 cross-brain challenge). Any design exceeding 19 is a bug.
Execution order
- Perception runs once per brain at tick start. Not router-callable.
- Brain Executive runs once per brain at round end. Not router-callable.
- Only World Modeler / Planner / Critic are invoked by the router, via
call_subagent.
Anti-hivemind protocol β exactly 5 steps per deliberation round (MVP; no anonymization)
- Private first pass. Each brain produces its
BrainRecommendationwithout seeing peers. - Typed evidence disclosure. Each recommendation must cite
EvidenceCitationobjects and include afalsifierfield. Uncited claims zero outr_protofor that brain. - Targeted challenge. Metacognition selects β€ 1 cross-brain challenge per tick. Structured objection, not free chat.
- Dissent preservation. Minority recommendations ride the emitted action as risk flags and are re-checked next tick. Do not discard.
- Constitutional decision. Council Executive selects: act / request more data / another round (within 2-round cap) / escalate /
no_op.
Step 4β² (anonymized comparison) is [V2]. Do not implement in MVP.
Router action space β exactly these 6 kinds
call_subagent(brain, subagent β {WorldModeler, Planner, Critic})request_challenge(challenger_brain, target_brain)switch_phase(new_phase)β Divergence β Challenge β Narrowing β Convergence. Cannot skip forward.preserve_dissent(tag)emit_outer_action(OuterAction)β closes the tick.stop_and_no_opβ closes the tick.
recurse_in(...) is [V2]. Do not add a 7th router action.
Phase machine invariants
- Phases may not skip forward (Divergence cannot jump to Convergence).
- Phases may re-enter backward on explicit dissent-triggered flag.
- The first
emit_outer_actionorstop_and_no_opstep closes the tick, even mid-round.
Logging contract
- Training-data row = one router step, not a tick or round:
(episode_id, tick, round, step_idx, RoutingAction, MetacognitionState, tokens_spent, subagent_report?). - Do not log ticks or rounds as training rows.
Temperature
- Eval: temperature 0 on all LLM subagents for reproducibility.
- Training rollouts: temperature > 0 on LLM subagents so the router sees exploration.
Public APIs (owned here)
Council.step(observation: CrisisworldcortexObservation) -> OuterActionRoutingPolicy.forward(state: MetacognitionState) -> RoutingActioncortex.schemastypes:BrainRecommendation,BeliefState,CandidatePlan,MetacognitionState,RoutingAction,EvidenceCitation,RouterStep,Trajectory.cortex.llm_client(Session 7+): OpenAI / HF-router wrapper with per-caller token-counting middleware. Exposestokens_used_for(caller_id) -> intso harnesses (inference.py,baselines/*,training/train_router.py) can composer_budgetper the Q1 decision (rootCLAUDE.md). The env never sees these counts; the wire protocol carries notokens_spent_*fields.
Testing requirements
- Protocol-invariant test: after any
Council.step, the 5 protocol steps ran in order or a short-circuit reason is logged. - Cap tests: synthetic signals inviting > 2 rounds / > 1 cross-brain challenge / > 1 Critic-per-brain must fail closed, not silently exceed.
- No-LLM-call tests: Perception and Brain Executive must not call the LLM client β mock the client, assert zero invocations.
- Import-graph test: grep
cortex/**.pyforimport server/from serverβ must return empty. - Determinism (eval-mode): same observation + same policy checkpoint β identical
OuterAction.
Common failure modes
- Not clamping rounds at 2 β silently inflates tick cost, breaks matched-compute baseline comparisons.
- Router calling Perception or Brain Executive β violates role split, pollutes training data.
- Discarding minority recommendations β deletes the dissent-preservation signal the pitch depends on.
- Skipping typed evidence disclosure β grader zeros
r_proto. - Sharing a single observation lens across brains β collapses evidence-diversity.
- Adding an LLM call inside Perception or Brain Executive β breaks the "3 LLM calls per brain per round" cost guarantee.