Docker instances
sim speed
db
clean :3010
plugins :3020
New idea → ticket
Send to Redmine target:
localhost:3020 · project redmine (safe default — local docker)
Because the human never reviews code, everything a code review would catch is caught mechanically — six gates against two Redmine 6.1 instances, stock vs. plugins. The diagram lights up live while a ticket runs on the Control surface.
← swipe to see the whole diagram →
The six gates (gates/*.sh)
| # | Gate | Catches | Try it |
|---|---|---|---|
| 01 | boot integrity — zeitwerk:check + eager load | Zeitwerk NameError that 500s only in prod | #4847 |
| 02 | migration up→down→up on a scratch DB | irreversible / lossy migrations | #4840 |
| 03 | SQL-count ceilings per endpoint | N+1 invisible at 12 rows | #4823 |
| 04 | permission matrix diff vs fixture | leaks that look like a working feature | #4834 |
| 05 | brakeman, new findings only | introduced security warnings | #4845 |
| 06 | differential JSON vs stock (allowlist) | a plugin altering a core API contract | #4842 |
Tickets marked in “Try it” arrive with Ingest tickets (or are already on the board). Their first coder attempt trips that gate; the gate output is routed back and the retry passes.
Principles (docs/ARCHITECTURE.md §2)
| P1 | The spec is the source of truth — tests derive from the spec, never the code. |
| P2 | Czech stays Czech — tickets are passed verbatim; ambiguity is signal. |
| P3 | Independence — coder and tester never see each other's output. |
| P4 | Boundaries enforced by the filesystem (hooks, cwd), not prompts. |
| P5 | Behaviour review is blind to four failure classes → gated mechanically. |
| P6 | Nothing leaves the machine without a human — push is human-only. |
| P7 | Bounded retries — three, then escalate: exhaustion means the spec was wrong. |