--- name: design-an-interface description: Generate multiple radically different interface designs for a module using parallel sub-agents. Use when user wants to design an API, explore interface options, compare module shapes, or mentions "design it twice". --- # Design an Interface Based on "Design It Twice" from "A Philosophy of Software Design": your first idea is unlikely to be the best. Generate multiple radically different designs, then compare. ## Workflow ### 1. Gather Requirements Before designing, understand: - [ ] What problem does this module solve? - [ ] Who are the callers? (other modules, external users, tests) - [ ] What are the key operations? - [ ] Any constraints? (performance, compatibility, existing patterns) - [ ] What should be hidden inside vs exposed? Infer these from the request and existing callers; ask only about missing requirements that materially affect the designs. ### 2. Generate Designs (Parallel Sub-Agents) Compare meaningfully different approaches, honoring the requested count. Two is a useful default for "design it twice"; add options only when they explore a relevant trade-off. Use independent subagents through the available delegation tool when useful and within available slots; otherwise develop the alternatives directly. ``` Prompt template for each sub-agent: Design an interface for: [module description] Requirements: [gathered requirements] Constraints for this design: [assign a different constraint to each agent] - Option A: "Optimize for the primary caller's workflow" - Option B: "Expose explicit state transitions for the same requirements" Choose constraints relevant to the actual problem; do not invent future use cases or a target method count. Output format: 1. Interface signature (types/methods) 2. Usage example (how caller uses it) 3. What this design hides internally 4. Trade-offs of this approach ``` ### 3. Present Designs Show each design with: 1. **Interface signature** - types, methods, params 2. **Usage examples** - how callers actually use it in practice 3. **What it hides** - complexity kept internal Present designs sequentially so user can absorb each approach before comparison. ### 4. Compare Designs After showing all designs, compare them on: - **Interface simplicity**: fewer methods, simpler params - **General-purpose vs specialized**: flexibility vs focus - **Implementation efficiency**: does shape allow efficient internals? - **Depth**: small interface hiding significant complexity (good) vs large interface with thin implementation (bad) - **Ease of correct use** vs **ease of misuse** Use the requested format or the clearest concise comparison. Highlight where designs diverge most. ### 5. Synthesize Recommend the best fit with reasons. If the user wants to choose interactively, ask: - "Which design best fits your primary use case?" - "Any elements from other designs worth incorporating?" ## Evaluation Criteria From "A Philosophy of Software Design": **Interface simplicity**: Fewer methods, simpler params = easier to learn and use correctly. **Scope fit**: Covers known callers and requirements without speculative flexibility. **Implementation efficiency**: Does interface shape allow efficient implementation? Or force awkward internals? **Depth**: Small interface hiding significant complexity = deep module (good). Large interface with thin implementation = shallow module (avoid). ## Anti-Patterns - Don't let sub-agents produce similar designs - enforce radical difference - Don't skip comparison - the value is in contrast - Don't implement - this is purely about interface shape - Include implementation effort and migration risk in the trade-offs without letting them obscure correctness or usability.