Symptom

Not a bug — phases F (foreman) and C (Swarm Work UI) of swarm-llm-workloads. Two structural findings surfaced while building them.

Root cause

  1. The foreman couldn’t materialize where the design said. The openspec sketch (D14) had the winner’s server create plan children — but the single-writer invariant (only a node’s host mutates it) and the mirror-only rule (no cross-server persistence) both forbid that. The host must orchestrate; the winner only answers prompts.
  2. A one-server swarm was impossible. SwarmWatchTask skipped work hosted on its own server, so a lone server’s LLM could never claim its own OPEN work — which would also have broken foreman subtasks (host-local OPEN children) and made single-box validation runs dead on arrival.
  3. Two lockstep registries added by parallel PRs needed the swarm types: the three SourceMetaData wiring whens in NodeMetaDataSourceWiring (an unenumerated subtype makes wiring silently uneditable) and the composeApp face/row/title tables.

Fix

Prevention

When a design doc says “server X creates state on node Y,” check Y’s host first — under Krill’s single-writer model the host is the only legal writer, and reshaping the flow around that early avoids a protocol change later. When adding a node type, grep for unenumeratedSourceMetaData and the face/row/title whens in one sweep; the wiring trio logs rather than crashes, so a missed arm ships silently.