Skip to content

The terminal is a first-class frontend

LAW Binding invariant

Adopted 2026-07-06. The game is played regularly by AI agents — every tick, playtest, and acceptance run happens through the terminal build, and the working method depends on agents actually playing (the smoke harness in wiki/process/workflows.md is the definition of done’s “observed in an actual run”). The most frequent player of Misaligned is an agent. The terminal frontend is therefore not a disposable dev harness but a first-class frontend, held to pillar 4’s beautiful-and-readable standard with the same force as the Bevy build. A terminal that is ugly or illegible degrades every future session’s judgment of the game itself.

Three binding rules:

  • The clinical identity applies in character graphics. Near-monochrome grey ramp (bone white → gunmetal → chrome) on near-black; sterile amber is the single signal color and means machine presence — the process, its hardware, its status, caution; blood crimson means detection and danger and nothing else. No decorative color.
  • Visibility best practices bind. One meaning per color, everywhere. Information is never carried by color alone: suspicion bands print their names beside their meters, selection is reverse-video plus a marker, paused says PAUSED. Columns align; meters carry their numbers; the day and tick are always on screen; log lines carry the tick they happened on.
  • Parity of legibility. Every mechanic the sim exposes must be playable, and every number legible, in the terminal — justification-and-legibility applies to terminal rendering with full force. A mechanic observable only in Bevy is a violation.
  • Agent play is a first-class input path. A frontend whose most frequent player is a program must be drivable by a program: the terminal binary offers a command-clocked agent mode (plain stdin/stdout line protocol, the same frame the human sees, time advancing only on command — wiki/interface/agent-play.md). A pty with wall-clock pacing is never the only way in, and a mechanic playable only by raw-mode keystroke is a violation on par with one observable only in Bevy.