From groundwork
Generates 2-3 divergent interface designs before committing to non-trivial modules, service boundaries, or public APIs and recommends the best based on depth, locality, and seam placement.
How this skill is triggered — by the user, by Claude, or both
Slash command
/groundwork:design-it-twiceThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Your first interface is rarely your best (**Design it twice**, Ousterhout). Before you commit a module boundary, generate genuinely different designs and compare them — the cost of exploring on paper is trivial next to the cost of a shallow interface that **Hyrum's Law** then freezes into a contract.
Your first interface is rarely your best (Design it twice, Ousterhout). Before you commit a module boundary, generate genuinely different designs and compare them — the cost of exploring on paper is trivial next to the cost of a shallow interface that Hyrum's Law then freezes into a contract.
Core principle: Aim for deep modules — a simple interface hiding substantial functionality. A design that merely forwards calls is shallow and usually a liability.
This is a build-time and architecture-time discipline. [[design-architecture]] and [[swarm-design-architecture]] invoke it for module boundaries; invoke it directly any time you're about to design a single non-trivial interface.
Skip for trivial or single-call-site code, or interfaces fully dictated by an existing contract.
Before generating alternatives, write down the constraints, dependencies, the dominant use case, and a rough code sketch of the interface. Use the project's domain language (see [[domain-modeling]]). Vague framing yields vague designs.
Each design optimizes one distinct goal — they must genuinely differ, not be three shades of the same idea:
| Lens | Optimizes for |
|---|---|
| Minimize entry points | Fewest interfaces, maximum leverage per surface — a deep module |
| Maximize flexibility | Reuse across the widest set of use cases |
| Optimize the common case | Simplest path for the dominant workflow |
| Isolate seams | Cross-boundary dependencies behind ports & adapters |
Orchestration: if the Agent/Task tool is available, fan out one agent per design in parallel, each with the same framing and a different lens. No agent teams or debate are needed — the designs are independent. If agents are unavailable, produce the designs sequentially yourself. Each brief returns the interface sketch plus its trade-offs.
Give an opinionated recommendation — which design solves the problem best and why — possibly a hybrid that grafts the best of two. A neutral menu pushes the judgment onto the reader and defeats the exercise.
Named principles referenced here are defined in ${CLAUDE_PLUGIN_ROOT}/references/engineering-principles.md.
| Excuse | Reality |
|---|---|
| "My first design is obviously right" | That feeling is exactly when a second design most often beats it. Cost of checking is one sketch. |
| "Three designs is slower" | Slower than reworking a shallow interface every caller already depends on? No. |
| "They'd all come out the same" | Then your lenses aren't divergent. Force distinct optimization goals. |
| "I'll just present the options and let them pick" | A menu without a recommendation is unfinished work. Take a position. |
npx claudepluginhub etr/groundworkGenerates multiple radically different API/module interface designs using parallel sub-agents, then compares trade-offs. Use when exploring interface options or designing a module.
Generates multiple radically different interface designs for modules or APIs using parallel sub-agents. Use when designing APIs, exploring options, comparing module shapes, or 'design it twice'.
Design a module's interface using parallel sub-agents for radically different designs. Compare on depth, simplicity, and efficiency, then grill the synthesis. Use for new APIs, refactors, or interface decisions.