Design mistakes to avoid before enabling unattended loops. For runtime incidents, see failure-modes.md.
Anti-pattern: One session marks its own work "done" after running tests once.
Why it fails: Confirmation bias; weak tests get rubber-stamped.
Do instead: Separate verifier sub-agent, model, or /goal checker. Verifier default stance: REJECT.
Anti-pattern: "Keep trying until CI is green."
Why it fails: Infinite fix loops, token burn, merge of wrong fixes.
Do instead: Hard cap (e.g. 3 attempts) → escalate with full context in state file.
Anti-pattern: Triage skill returns paragraphs of narrative.
Why it fails: Loop cannot parse priorities; humans ignore STATE.md.
Do instead: Structured markdown sections with one-line items and explicit Suggested loop action.
Anti-pattern: Auto-fix and auto-PR on day one.
Why it fails: Loop acts on bad signal; comprehension debt explodes.
Do instead: L1 report-only week one. Measure triage accuracy before enabling L2.
Anti-pattern: Three loops append to one unstructured STATE.md.
Why it fails: State rot, conflicting actions, ghost items.
Do instead: One state file per pattern, or clearly separated sections with prune rules.
Anti-pattern: Loop can merge PRs, post to Slack, and edit production tickets on day one.
Why it fails: Blast radius of a bad triage decision is huge.
Do instead: L1 read-only connectors. Expand scope only after trust is earned.
Anti-pattern: Loop runs 24/7 with no pause criteria.
Why it fails: Alert fatigue, budget overrun, weekend incidents.
Do instead: Document pause/kill in LOOP.md + templates/loop-budget.md.template.
Anti-pattern: CI Sweeper changes application code when classification is flake.
Why it fails: Masks infra problems; introduces random diffs.
Do instead: Classify → quarantine or retry policy → escalate env/infra failures.
Anti-pattern: "Verifier passed, merge it."
Why it fails: Security and business-logic bugs pass weak verifiers.
Do instead: Explicit path allowlist; human merge for denylist paths per safety.md.
Anti-pattern: Only STATE.md, no history of what the loop did.
Why it fails: Cannot debug "why did it do that Tuesday?"
Do instead: Append to loop-run-log.md per operating-loops.md.