⚠️ Qodo Command CLI is discontinued. The pre-merge review now uses Entire CLI (entire review) — intent-aware code review that reads git checkpoints. No API key needed.
A developmental framework for AI agents where students grow through practice, feedback, challenge, and rest — not prompt-chaining.
- Roles over prompts — persistent personas (Student / Teacher / Principal / Janitor)
- Compiler before critic — execute the code first, LLM-as-judge last
- Adversarial review mandatory — two-judge (CTO + COO) on every output
- Growth over performance — difficulty-adjusted EMA scoring
- Memory that compounds — Library/Engram consolidation
FirstMate spawns ephemeral Hermes crewmates into Orca worktrees (see
campus.md → Operational Reality for the full note). It lives in a
persistent location so it survives reboots:
# One-time install (NOT /tmp — that gets wiped on reboot)
git clone --depth 1 https://github.com/kunchenguid/firstmate.git ~/.local/share/firstmate
# Spawn a crewmate (FM_HOME carries the orca backend config)
FM_HOME=~/.hermes/school-core-fm-config \
~/.local/share/firstmate/bin/fm-spawn.sh <task-id> <project-dir> \
--backend orca --mode no-mistakes --yolo on \
--harness '/Users/brandonbennett/.local/bin/hermes-fm-wrapper "$($__OPINPUT__ encode launch-brief < $__BRIEF__)"'Working skill: ~/.hermes/skills/firstmate-orca-spawn-hermes/SKILL.md.
# One-command setup (Nix)
nix develop github:branben/school-core
# Dispatch a task
orca dispatch --profile student-coder "implement feature X"
# Review + rubber-stamp via AgentMail
python3 scripts/run_teacher_review_once.py teacher-cto
# → AgentMail card lands in inbox: [/approve] [/reject] [/fix] Student ──► CTO Review ──► Bookbag ──► AgentMail Card ──► /approve
Student ──► COO Review ──► │ ──► /reject
│ ──► /fix <note>
┌──────────────────────────────────────────────────────────────────────┐
│ Principal routes work by measured competency │ No sycophancy │
└──────────────────────────────────────────────────────────────────────┘
| Role | Gate | Description |
|---|---|---|
| Student | 0-24 pts | Takes easy tasks, builds foundations |
| Senior Student | 25-49 pts | Passes medium tasks |
| Teacher | 50-74 pts | Can mentor, review, and stress-test |
| Faculty | 75+ pts | Handles blockers, designs curriculum |
| Principal | — | Routes work by competency |
| Janitor | — | Prunes stale trajectories, consolidates Library |
school-core/
├── campus.md # 🏛️ Identity & behavioral core
├── docs/
│ ├── HANDOFF.md # 📋 Bookbag state machine + signal protocol
│ ├── school-core-architecture.md
│ └── agent-school/
├── config/
│ ├── anchors.yaml # Semantic anchors (TDD, YAGNI, Fagan…)
│ └── profiles/*/SOUL.md # Persona definitions
├── conductor.py # 🎓 Principal — routes work + review
├── director.py # EFC-gated task pipeline + two-judge review
├── leaf.py # 🍃 Student leaves — disposable worktrees
├── teacher.py # 🧑🏫 Teacher lifecycle — sleep/wake/review
├── bookbag.py # 🎒 Bookbag state + file-lock protocol
├── executor.py # Model routing (ACRouter) + OmniRoute transport
├── src/
│ ├── entire_review.py # ✨ Entire review shim (pre-merge)
│ └── agentmail_poller.py # 📬 Inbound /approve → commit+push+close
├── scripts/
│ └── run_teacher_review_once.py # One-shot teacher review pass
├── tests/ # 942-test suite (TDD)
└── flake.nix # Reproducible dev env (Nix)
| Component | Status |
|---|---|
| Test suite | ✅ 942 tests passing, 15 skipped |
| Entire pre-merge | ✅ Wired (entire review, intent-aware; replaces discontinued Qodo) |
| AgentMail loop | ✅ Cron every 2 min |
| Beads kanban | ✅ 0 blocked, 0 open |
| Purpose | File |
|---|---|
| Identity | campus.md |
| Handoff contract | docs/HANDOFF.md |
| Anchors/methods | config/anchors.yaml |
| Notification tone spec | docs/notification-style-guide.md |
Notifications (verdict cards, issue alerts, CI alerts) route through
school_mail.py + the shared agentmail_client.py. Set the control-plane
inbox so cards land where the poller watches:
AGENTMAIL_SCHOOL_INBOX=vault-synthesis@agentmail.to # control-plane (default)
# AGENTMAIL_INBOX=… # override destinationResolution: AGENTMAIL_SCHOOL_INBOX → AGENTMAIL_INBOX → first inbox on the
key. The key itself comes from AGENTMAIL_API_KEY or ~/.hermes/config.yaml.
See docs/notification-style-guide.md for
the full contract.
See docs/HANDOFF.md. Build against wired capabilities only — campus.md marks what's operational vs aspirational.
"Help every agent become better than they were yesterday." — Load
campus.mdfor the full identity.