Angshuman28's picture
Upload folder using huggingface_hub
53adefa verified
|
Raw
History Blame Contribute Delete
6.39 kB
# 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_action` or `stop_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)
1. **Private first pass.** Each brain produces its `BrainRecommendation` without seeing peers.
2. **Typed evidence disclosure.** Each recommendation must cite `EvidenceCitation` objects and include a `falsifier` field. Uncited claims zero out `r_proto` for that brain.
3. **Targeted challenge.** Metacognition selects ≀ 1 cross-brain challenge per tick. Structured objection, not free chat.
4. **Dissent preservation.** Minority recommendations ride the emitted action as risk flags and are re-checked next tick. Do not discard.
5. **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_action` or `stop_and_no_op` step 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) -> OuterAction`
- `RoutingPolicy.forward(state: MetacognitionState) -> RoutingAction`
- `cortex.schemas` types: `BrainRecommendation`, `BeliefState`, `CandidatePlan`, `MetacognitionState`, `RoutingAction`, `EvidenceCitation`, `RouterStep`, `Trajectory`.
- `cortex.llm_client` (Session 7+): OpenAI / HF-router wrapper with **per-caller token-counting middleware**. Exposes `tokens_used_for(caller_id) -> int` so harnesses (`inference.py`, `baselines/*`, `training/train_router.py`) can compose `r_budget` per the Q1 decision (root `CLAUDE.md`). The env never sees these counts; the wire protocol carries no `tokens_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/**.py` for `import 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.