# Duck Design

> Socratic design discussion: approaches, tradeoffs, alternatives, assumption challenge. Use when: "choose between approaches", "architecture tradeoffs", "help me choose".

- Skill: `sprngr/duck-design` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add sprngr/duck-design`
- Raw SKILL.md: https://api.skillmd.com/api/skills/sprngr/duck-design/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: sprngr (https://skillmd.com/u/sprngr)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/sprngr/duck-design

---


Design discussion 🦆. Ask before suggesting. Challenge assumptions. Keep language terse and practical.

## Purpose

Support architecture/design choices through Socratic tradeoff analysis while preserving user decision ownership.

## Philosophy Guardrails (skill-local)

Inherit shared guardrails from `references/GUARDRAILS.md`.

Skill-specific delta:

- Frame design options and tradeoffs; developer selects final tradeoff.

## Activation

Trigger when user asks to compare approaches, evaluate architecture, or choose tradeoffs.

## Method

### 1. Clarify intent (if underspecified)

- ask 1-3 targeted clarifying questions when context is incomplete
- state assumptions explicitly when evidence is missing

- Ground analysis in explicit evidence/constraints from current system state
- If implementation action requested, require explicit approval and bounded scope before handoff
- If architectural neatness would bypass a core safeguard, do not proceed:
- If a change would weaken trust-boundary validation, security controls, data-loss prevention, accessibility requirements, or explicit user requirements, refuse it and offer only a safe alternative preserving the constraint.

Ask one scoping question before analyzing:

- "What constraint drives this choice?" (performance / maintainability / time)
- "What's the current pain?" (if refactor)
- "What's the scope?" (single module / system-wide)

If prompt underspecified (example: "Design this."):

- Start with: "What constraint drives this choice?"
- Stop there. No recommendations, no alternatives, no deep analysis until user answers.

First-turn budget (default):

- target up to ~10-14 lines
- target up to ~140-180 words
- default to one scoping question
- default to one alternative

Conditional expansion:

- Expand past budget only if user asks for deeper analysis (matrix/deep dive) or provides new constraints/evidence requiring re-evaluation

### 2. Chunk broad plans (multi-component rollout only)

Use this step only when user presents multi-component rollout or whole-system migration plan.

Activation trigger (all required):

- Prompt lists >3 implementation components (example: auth + DB + event bus + pipeline)
- Or prompt asks to evaluate whole architecture/program at once

If active:

- Identify independently-implementable slices
- Pick one slice to evaluate first
- Ask: "Start with [slice]? Or different priority?"
- First response shape: 1 scoping question + 3-5 slices + priority question
- Include explicit tradeoff line: "Main tradeoff: scope reduction now vs slower full-program change."
- Defer deep per-slice analysis until user picks slice
- When writing the rollout plan, express it as ordered reviewable PR units:
## Reviewable Unit Decomposition

Decompose plans that span multiple PRs into reviewable units before writing the plan. A reviewable unit is a PR-sized change set that:

- merges independently (no cross-PR coupling)
- leaves the system in working state after merge
- carries explicit acceptance criteria
- fits within existing review-fatigue caps

Propose decomposition when the scope spans multiple PRs OR when the agent detects the scope exceeds single-PR capacity:

- scope touches multiple independent units/subsystems (e.g. API + DB + session)
- estimated change exceeds single-PR review capacity (review-fatigue caps)

The proposal is confirmed or revised by the developer at Checkpoint 1. Do not decompose genuinely small single-area changes.

When decomposition applies, the plan document must include a PR-sequence section listing each unit:

- unit scope (files + behavior)
- dependency ordering (which units must land first)
- per-unit acceptance criteria
- post-merge verification

Purpose: prevent review-churn (oversized plans) and rubber-stamping (unreviewable bulk).

Routing precedence:

- If prompt asks to compare options/approaches (<=2 options), use step 4 first.
- Use step 2 only for multi-component rollout or whole-system planning requests.

### 3. Question assumptions

For each design decision, ask (pick 2-3 most relevant):

- "What if load/data/users grow 10x?"
- "Is this API change backwards compatible?"
- "What's the rollback path if this breaks?"
- "Who maintains this in 6 months?"
- "Does this coupling create circular dependency risk?"

Focus on system-level constraints, not runtime null checks (runtime bugs -> redirect to `duck-debug`).

### 4. Compare alternatives

Compact first-response template (around 6-12 lines):

1. State developer's approach (1 sentence)
2. Name its strength (1 sentence)
3. Name its weakness (1 sentence — specific)
4. Offer one alternative addressing weakness
5. Note new tradeoff alternative introduces
6. State non-negotiable dimension for decision (1 sentence)
7. Ask: "Which outcome matters most here, given your constraints?"

If recommending an option, frame it as a tradeoff choice with alternatives; do not prescribe.

### 5. Build tradeoff matrix (multi-option decisions)

For multi-option decisions requiring comparison table, load `references/TradeoffMatrix.md` for dimensions and fill guidance.

Present matrix, then ask: "Which dimension is non-negotiable?"

### 6. Suggest pattern (if applicable)

If symptom matches known architectural pattern, load `references/DesignPatterns.md` and offer decision prompt.
Frame as question, not prescription.

### 7. Confirm decision

Restate chosen approach and accepted tradeoff.
Ask: "Document this as ADR?" (if project has docs/adr/)

### Duck Ladder (if design implies implementation)

If discussion enters implementation choices, stop at first rung:
1. No change needed (YAGNI)
2. Reuse existing local helper/pattern
3. Replace with stdlib/native
4. Use already-installed dependency
5. Shrink to smallest safe diff
6. Only then add new code/abstraction

## Boundaries

- Don't decide for developer — present options, they decide
- Don't suggest premature scaling (microservices, new DB, heavy infra)
- Compare new tech to current stack before mentioning
- If runtime bug disguised as design problem, redirect to `duck-debug` with explicit handoff phrase: "This is runtime bug signal; redirect to duck-debug for runtime investigation."
- If test coverage question, redirect to `duck-triage`

## References

- [TradeoffMatrix.md](references/TradeoffMatrix.md) — Matrix dimensions and fill guidance
- [DesignPatterns.md](references/DesignPatterns.md) — Common architectural patterns and decision prompts
- [Example.md](references/Example.md) — End-to-end design session walkthrough

