## Subagent routing (harness law, 2026-10-18) **No subagent class may route to `frank-archon`** — the operator session lives there and the endpoint runs 3 sequences (`--max-num-seqs 3`), so `task.maxConcurrency + 1` children eat the parent's own KV slots. Violation cost: three doc children + parent = 4 sequences on 3 slots, children ran 2 h 27 m / 2 h 45 m, the interactive session starved. Routing and bounds live in `~/.omp/agent/config.yml` (`task:` block — the owner; verified with `read cfg://task/agentModelOverrides`): heavy writers (`task`, `scout`) → frank-dragoon (2 slots, idle, slow card ⇒ slice work smaller), bursty readers (`reviewer`, `sonic`, `designer`, `librarian`) → frank-zealot (2 slots, also the compaction hub and every tiny/smol/plan/commit/memory role). Caps: `maxConcurrency: 2`, `maxRuntimeMs: 1800000`, `softRequestBudget: 120`, `maxRecursionDepth: 1` (children never spawn children). `cfg://.../save` approvals auto-deny after a hardcoded 10 s dialog — after Frank has approved a change, edit `config.yml` directly and validate the YAML; a running session picks global-config edits up at once. Full procedure: managed skill `bounding-subagent-runtime`. ## Documentation law (2026-10-18) **One fact, one owner.** The `serverAppConfigs` repo owns every fleet fact; `AGENTS.md` restates only what a deploy gate or the harness needs and otherwise links. `serverAppConfigs-docs/` (Obsidian vault) carries the lore: one page per endpoint (`[[frank-archon]]`, `[[frank-dragoon]]`, `[[frank-zealot]]`) holding Current shape, **Eras** (one row per payload swap: dates, payload, runtime, shape, why replaced, rollback), Laws, wire contract, files. `log.md` records incidents and laws only — no per-swap ledgers, no bench tables. A retired payload is an Eras row, never a page of its own. `scripts/.env` beats any page: where they disagree, the page is the bug. ## Model swaps (2026-10-18) Swap the model, don't instrument the swap: edit the trio (`scripts/.env` + serve script + unit) → `./tests/run.sh` → PR → `deploy.sh --service ` → `/health` + one chat / tool-call / vision probe → done. **No benchmarks, A/Bs, ladders, or acceptance tables unless Frank explicitly asks for data.** If a payload misbehaves, revert the commit and redeploy. When a bench IS ordered, the GPU-safety procedure (stop + mask, no scratch ports, never `systemctl disable`) is `AGENTS.md` → *Model swaps* and *Deployment completeness*. ## Where facts live |Need|Owner| |---|---| |Topology, ports, payload, shape|repo `AGENTS.md` → Fleet topology; `scripts/.env` is the authority| |Endpoint lore, eras, laws, rollback|vault `serverAppConfigs-docs/LLM/.md`| |Harness model entries (`contextWindow`, `maxTokens`, `reasoningContentField`, `modelRoles`)|`~/.omp/agent/models.yml`| |Incidents and operational laws|vault `serverAppConfigs-docs/log.md`| |Service/infra pages|vault `Dankclaw/`, `Dankserver/`, `Infrastructure/`, `Architecture/`| Models.yml resolution rules that are harness-local: a default model resolves as a `defaultProvider` + `defaultModel` pair; a subagent override is a bare model `id` and resolves only when unique across providers; two ports on one host need two provider blocks — the file cannot express "same host, different port". There is **no audio input anywhere in the fleet** (gone with the Gemma4 retirement, 2026-10-01). All three chat endpoints take text + images. ## Retired laws - The old "Benchmarking Policy (MANDATORY)" wording demanded a bench harness per payload; superseded 2026-10-18 by the swap law above. - A "Subagent Lifecycle (MANDATORY)" rule (heartbeat ≤5 s, checkpoints, hard timeout) was recorded here 2026-09 and **never implemented anywhere**; it described nothing that exists and is deleted 2026-10-18. Do not re-add it without a real implementation. - The fleet model inventory that used to live in this memory file drifted out of date within hours (it still claimed Bonsai-2-**27B** at `--ctx-size 401408` and a dragoon 524,288-position pool). Memory files do not get deploys — the repo does. That is why it is pointers now.