4.1 KiB
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/<service>.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/<svc>.env + serve script + unit) → ./tests/run.sh → PR →
deploy.sh <host> --service <svc> → /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/<svc>.env is the authority |
| Endpoint lore, eras, laws, rollback | vault serverAppConfigs-docs/LLM/<endpoint>.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 401408and a dragoon 524,288-position pool). Memory files do not get deploys — the repo does. That is why it is pointers now.