Your agent made dozens of decisions you never saw. Some were choices. Many were just its habits. Whiteboard Defense tells you which is which, before someone asks.
“Why did you do X instead of Y?” is a fair question to get on a Tuesday.
curl -fsSL https://raw.githubusercontent.com/avestura/whiteboard-defense/main/install.sh | sh
irm https://raw.githubusercontent.com/avestura/whiteboard-defense/main/install.ps1 | iex
claude plugin marketplace add avestura/whiteboard-defense claude plugin install whiteboard-defense@whiteboard-defense
curl -fsSL https://raw.githubusercontent.com/avestura/whiteboard-defense/main/install.sh | sh -s -- codex
curl -fsSL https://raw.githubusercontent.com/avestura/whiteboard-defense/main/install.sh | sh -s -- opencode
A short brief, and a full one saved to .whiteboard/. Every decision carries a tag saying who made it. The tag you care about is the red one.
| Decision | Choice | Who | Not taken |
|---|---|---|---|
| Link credential | Bearer token in URL | USER | Login-gated view |
| Token storage | SHA-256 hash | INFERRED | Plaintext |
| Expiry | 7 days, fixed | GUESS | Per-link setting |
| Revocation | None | DEFAULT | Delete endpoint |
Defend it: Where does this fail? A leaked link can’t be cut off before it expires, and every hit costs a full PDF render.
Paste next time: Every shareable link must be revocable by its creator.
In Claude Code the plugin also draws in the interface: a band above the prompt, a brief pane, an entry in the status line, and briefs that start on their own once enough code has changed. These are working replicas built in HTML. Press the buttons.
Replayed from a recorded eval run. Switch to prompt to see the plain skill with no interface changes (/whiteboard-ui prompt).
Quiz mode works in every agent. Here the answers are scripted; in a real session the agent grades your own words against the code.
Telling a model to “avoid a generic look” mostly swaps one default for another. Naming the specific pattern works much better. The catalogue ships with entries like these and grows through pull requests.
Avoid: a single-letter monogram, letters in circles, dot accents.N for notes, a progress bar, an agenda slide. Fine, unless you never chose it.try/catch that returns a default and hides the failure from the caller.localStorage, default hashing parameters, no stated threat model.It is not only design. Architecture, naming, errors and security all have defaults.
"auto": "off"./whiteboard-ui rich brings them back.Avoid: line to paste into your next prompt.Claude Code: /whiteboard-defense:whiteboard · Codex: $whiteboard · OpenCode: /whiteboard
PoCs, demos and experiments are exempt. Mark a project "tier": "poc" and it stays quiet.
xIt can’t read its own weights. DEFAULT means “you didn’t specify it and it matches a habitual pattern”, not “proven bias”.
xThe “why” is reconstructed from the conversation and the diff. Usually right, sometimes wrong. Shaky ones are tagged GUESS.
xIt doesn’t replace reading the code that matters. It tells you where to look.
xIn Codex, OpenCode and Claude Code’s prompt mode, automatic briefs depend on the agent honouring the skill. If one is skipped, run it by hand. Claude Code’s rich UI triggers them from the plugin instead.