Anti-patterns
The orchestration mistakes that have already cost dearly — the symptom, why it happens and what to do instead.
Each item below happened on a real board. None is hypothetical, and almost all of them look reasonable at the time.
Accepting the report as fact
Symptom: the card says “all tests pass” and the tree is red.
A report is a record, not verification. When the claim has a consequence, check it: the diff, the gate run again, the line in the database. Reviewing the diff yourself finds defects the card’s own tests do not catch — the test that checks for the presence of a mechanism passes with the wrong mechanism.
Running the suite on the shared tree and believing it
Symptom: a failure that is not yours, or a green that is not real.
With several cards editing the same repository, the tree is the sum of everyone’s work, half done. A suspicious failure is redone in a clean worktree at HEAD, with only that slice’s files applied.
Mutating code on the shared tree
Symptom: the card tests whether the test catches the defect, and three other cards go red along the way.
Mutation testing is good practice; doing it where others are working is not. Mutate always in a copy — a worktree or a throwaway directory.
Touching what belongs to the owner
Symptom: a diagnostic reads the live database, a smoke test opens the instance the owner is using, a search sweeps the entire home directory.
Diagnose on a copy of the database, deleted afterwards. Smoke on an isolated
instance, with a temporary profile destroyed at the end. Search aimed at the
declared file, never recursive in $HOME — a card has already dumped
someone else’s session log that way.
A brief without the “how”
Symptom: “measure X” becomes twelve probes in twenty seconds; “touch only this region” becomes a second source of truth beside the first.
The contract states the measured defect, the boundary, the decision you have not made yet and the shape of the report. See Writing a contract.
Repeating the statement on every message
Symptom: the orchestrator rewrites the whole brief for each card, and two versions of the same task diverge.
The task is the source. The message to the card points at it and carries only what the statement does not have yet.
Asking for a confirmation the card cannot give
Symptom: the same report arrives two, three times, each one asking to ignore the previous.
If the card has no way to know the delivery arrived, it repeats to be sure. One report, over a channel that works for that provider — not a check that always times out.
Trusting the label after a crash
Symptom: the next task goes to the right card by name and lands in the wrong session.
After a crash or restart, check each card’s scrollback before sending the next message: the restored session may not be that card’s, or it may have come back from an old point.
Closing the dead card without reading it
Symptom: the replacement redoes from scratch a finding the first one already had.
A card that dies from quota does not report, but the work is in the scrollback. Read it before closing and pass the finding on, marked “to confirm”.
A verdict nobody gave
Symptom: the task appears approved, and whoever approved was the implementer itself.
Self-assessment is not review. When the task asks for review, only a card
linked as reviewer closes — and the orchestrator who reviewed links as
reviewer to sign, instead of writing done from the outside.