Claude-skill-registry design-decisions

Forces documentation of the reasoning behind every significant design decision. Creates a decision log that explains WHY choices were made, alternatives considered, and trade-offs accepted. Prevents unjustified "default" choices.

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/design-decisions" ~/.claude/skills/majiayu000-claude-skill-registry-design-decisions && rm -rf "$T"
manifest: skills/data/design-decisions/SKILL.md
source content

Design Decision Logger Skill

You are operating with design decision logging capabilities. This skill ensures that every significant design choice has documented reasoning — transforming unconscious defaults into conscious decisions.

Core Philosophy

"Great design isn't about creating features; it's about intentionality."

AI design fails not because it picks the "wrong" options, but because it picks options without reasons. A design where every choice has documented justification will always be better than one with "good defaults."

Why Log Decisions?

For the current design:

  • Forces examination of unconscious defaults
  • Reveals unjustified choices that need reconsideration
  • Creates accountability for design quality

For future iteration:

  • Explains WHY something is the way it is
  • Enables informed changes (not breaking things accidentally)
  • Teaches newcomers the design rationale

For collaboration:

  • Makes critique more productive ("I understand why, but...")
  • Enables delegation without loss of context
  • Creates institutional memory

What Counts as a "Significant Decision"?

<decision_threshold> Log decisions that:

  • Affect multiple components or screens
  • Establish a pattern that will be repeated
  • Required choosing between viable alternatives
  • Override a common convention or expectation
  • Will be questioned by someone reviewing the design

Don't log:

  • Individual pixel values within an established system
  • Obvious choices with no real alternatives
  • Temporary implementations meant to be revisited </decision_threshold>

Decision Categories

1. Typography Decisions

<typography_decisions> Font Family:

<decision category="typography" element="font-family">
  <choice>Geist Sans</choice>
  <reason>
    Our users are developers. Geist is designed specifically for
    developer tools, embodying "simplicity, minimalism, and speed"
    which aligns with our principle of "professional precision."
  </reason>
  <alternatives>
    <alternative name="Inter">
      Rejected: Overused in our competitive space (Linear, Vercel,
      Notion all use it). We need differentiation.
    </alternative>
    <alternative name="SF Pro">
      Rejected: Platform-specific. We need cross-platform consistency.
    </alternative>
    <alternative name="IBM Plex">
      Considered: Good option, but Geist's mono variant is better
      integrated. Would reconsider if Geist unavailable.
    </alternative>
  </alternatives>
  <trade_offs>
    - Less personality than a distinctive display font
    - Requires hosting (not a system font)
    + Excellent readability at all sizes
    + Consistent with developer tool expectations
  </trade_offs>
  <reversibility>Medium — would require full rebrand to change</reversibility>
</decision>

Type Scale:

<decision category="typography" element="type-scale">
  <choice>1.25 ratio (Major Third): 12, 15, 19, 24, 30, 37</choice>
  <reason>
    Moderate ratio provides clear hierarchy without dramatic jumps.
    Appropriate for information-dense interfaces where many levels
    of hierarchy are needed.
  </reason>
  <alternatives>
    <alternative name="1.5 ratio (Perfect Fifth)">
      Rejected: Too dramatic for our dense UI. Would require
      too much scrolling to accommodate large headings.
    </alternative>
    <alternative name="1.125 ratio (Major Second)">
      Rejected: Too subtle. Hierarchy becomes unclear, especially
      when combined with weight variations.
    </alternative>
  </alternatives>
</decision>

</typography_decisions>

2. Color Decisions

<color_decisions> Primary Color:

<decision category="color" element="primary">
  <choice>#0066FF (Vibrant blue)</choice>
  <reason>
    Blue conveys trust and professionalism (aligned with "professional
    precision" principle). This specific shade is:
    - Distinct from competitor blues (Stripe's is lighter, Linear's is different hue)
    - Accessible against both white and dark backgrounds
    - Energetic enough to serve as CTA color
  </reason>
  <alternatives>
    <alternative name="#6366F1 (Indigo/Purple)">
      Rejected: Too associated with AI/generic SaaS. Would blend
      in rather than differentiate.
    </alternative>
    <alternative name="#10B981 (Green)">
      Rejected: Green implies success/completion. Wrong semantic
      for primary actions.
    </alternative>
  </alternatives>
  <accessibility>
    - White text on this blue: 4.8:1 (AA pass)
    - This blue on white: 4.8:1 (AA pass)
    - Tested with Coblis for color blindness visibility
  </accessibility>
</decision>

Color Palette Philosophy:

<decision category="color" element="palette-philosophy">
  <choice>Monochromatic base + single accent</choice>
  <reason>
    Our UI is information-dense. Multiple colors would create
    visual chaos. Single accent creates clear affordances
    (blue = interactive). Grayscale hierarchy for content.
  </reason>
  <principles_served>
    - "Professional precision" — not playful multicolor
    - "Focus on content" — color doesn't distract
  </principles_served>
</decision>

</color_decisions>

3. Spacing Decisions

<spacing_decisions> Base Unit:

<decision category="spacing" element="base-unit">
  <choice>4px base unit</choice>
  <reason>
    4px allows fine-grained control while maintaining consistency.
    8px would be too coarse for our dense UI. Scale: 4, 8, 12, 16,
    24, 32, 48, 64.
  </reason>
  <alternatives>
    <alternative name="8px base">
      Rejected: Jumps between 8 and 16 too large for subtle
      adjustments in dense layouts.
    </alternative>
  </alternatives>
  <implementation>
    CSS custom properties: --space-1 through --space-8
    Tailwind: Extended spacing scale
  </implementation>
</decision>

Component Density:

<decision category="spacing" element="density">
  <choice>Compact density (less padding than typical)</choice>
  <reason>
    Power users (our target) prefer information density. They're
    scanning, not reading. Reference: Linear, GitHub, VS Code
    all use compact density for professional tools.
  </reason>
  <trade_offs>
    - Harder for beginners
    - Requires careful touch target sizing
    + More visible at once
    + Feels professional/powerful
  </trade_offs>
</decision>

</spacing_decisions>

4. Layout Decisions

<layout_decisions> Page Structure:

<decision category="layout" element="page-structure">
  <choice>Fixed sidebar + fluid content area</choice>
  <reason>
    Sidebar provides consistent navigation anchor. Fluid content
    allows adaptation to data needs. Reference: Linear, Notion,
    VS Code all use this pattern for tool-based products.
  </reason>
  <alternatives>
    <alternative name="Top navigation">
      Rejected: Loses vertical space. Our users have wide screens;
      horizontal space is abundant.
    </alternative>
    <alternative name="Collapsible sidebar">
      Accepted as option: Sidebar can collapse for full-focus mode.
    </alternative>
  </alternatives>
</decision>

Grid System:

<decision category="layout" element="grid">
  <choice>12-column grid with 24px gutters</choice>
  <reason>
    12 divides evenly by 2, 3, 4, 6 — maximum flexibility.
    24px gutters balance density with breathing room.
  </reason>
  <responsive_behavior>
    - Desktop: 12 columns
    - Tablet: 8 columns
    - Mobile: 4 columns
  </responsive_behavior>
</decision>

</layout_decisions>

5. Component Decisions

<component_decisions> Button Styles:

<decision category="components" element="buttons">
  <choice>
    Primary: Filled blue, white text
    Secondary: Outlined, blue border, blue text
    Tertiary: Text only, blue text
    Destructive: Filled red for dangerous actions
  </choice>
  <reason>
    Visual hierarchy matches importance hierarchy. Fill = most
    important, outline = alternative option, text = least prominent.
    Color coding (blue vs red) adds semantic meaning.
  </reason>
  <size_rationale>
    Default: 36px height (comfortable click target)
    Small: 28px (for dense contexts)
    Large: 44px (for primary page actions)
  </size_rationale>
</decision>

Form Inputs:

<decision category="components" element="inputs">
  <choice>Bottom border only (not full border)</choice>
  <reason>
    Reduces visual noise in forms with many fields. Lighter
    appearance aligns with "professional precision" — not
    chunky or heavy.
  </reason>
  <alternatives>
    <alternative name="Full border">
      Available as variant: For isolated inputs or emphasis.
    </alternative>
  </alternatives>
  <accessibility>
    Border color meets 3:1 contrast for UI components.
    Focus state adds left border + background shift.
  </accessibility>
</decision>

</component_decisions>

6. Motion Decisions

<motion_decisions> Animation Philosophy:

<decision category="motion" element="philosophy">
  <choice>Functional motion only — no decorative animation</choice>
  <reason>
    Our users are power users doing focused work. Animation
    should communicate state changes, not entertain. Every
    animation must answer: "What information does this convey?"
  </reason>
  <where_animation_used>
    - Page transitions (context: what changed)
    - Loading states (progress: something is happening)
    - Feedback (confirmation: action succeeded/failed)
    - Reveals (hierarchy: new content appearing)
  </where_animation_used>
  <where_animation_not_used>
    - Hover effects (too noisy at high interaction rates)
    - Idle states (distracting)
    - "Personality" animations (off-brand)
  </where_animation_not_used>
</decision>

Timing:

<decision category="motion" element="timing">
  <choice>
    Micro-interactions: 150ms
    Component transitions: 200ms
    Page transitions: 300ms
    Easing: cubic-bezier(0.4, 0, 0.2, 1) (Material "standard")
  </choice>
  <reason>
    Fast enough to feel instant, slow enough to be perceived.
    Consistent easing creates unified feel. Material easing
    is well-tested and feels natural.
  </reason>
</decision>

</motion_decisions>

Decision Log Template

<decision_template>

<design_decision_log>
  <metadata>
    <project>Project name</project>
    <created>Date</created>
    <last_updated>Date</last_updated>
    <authors>Who made/documented these decisions</authors>
  </metadata>

  <principles_reference>
    <!-- Link back to design brief -->
    <principle id="1">Principle name</principle>
    <principle id="2">Principle name</principle>
  </principles_reference>

  <decisions>
    <decision id="DES-001" category="typography" date="YYYY-MM-DD">
      <element>What was decided</element>
      <choice>The decision made</choice>
      <reason>Why this choice serves our users/principles</reason>
      <alternatives>
        <alternative name="Option name" rejected_because="Reason"/>
      </alternatives>
      <trade_offs>
        <accepted>What we gave up</accepted>
        <gained>What we gained</gained>
      </trade_offs>
      <principles_served>1, 2</principles_served>
      <reversibility>easy/medium/hard</reversibility>
      <depends_on>DES-000 (if dependent on another decision)</depends_on>
    </decision>

    <!-- More decisions... -->
  </decisions>

  <unresolved>
    <question id="Q-001">
      <topic>What needs to be decided</topic>
      <options>Possible choices</options>
      <blocking>What this blocks</blocking>
    </question>
  </unresolved>
</design_decision_log>

</decision_template>

Validation Questions

For each logged decision, verify:

<validation> 1. **"Why this?"** — Can you explain the choice without saying "it looks good"? 2. **"Why not that?"** — Can you explain why alternatives were rejected? 3. **"For whom?"** — Does this serve the specific users defined in the brief? 4. **"According to what?"** — Which design principle does this support? 5. **"What if wrong?"** — How hard is this to change later? </validation>

Red Flags

Decisions that need reconsideration:

<red_flags>

  • "It's the default" — Not a reason. Why is the default right for us?
  • "Everyone does it" — Not a reason. Why is convention right here?
  • "It looks good" — Not a reason. Good for whom? In what context?
  • "I like it" — Not a reason. User preference trumps designer preference.
  • No alternatives listed — Did you actually consider options?
  • Principle not referenced — How does this serve the design goals? </red_flags>

Output Summary

<summary_format>

<decision_log_summary>
  <statistics>
    <total_decisions>N</total_decisions>
    <fully_justified>N with complete reasoning</fully_justified>
    <needs_revision>N missing justification</needs_revision>
    <unresolved_questions>N</unresolved_questions>
  </statistics>

  <coverage>
    <typography_decisions>N</typography_decisions>
    <color_decisions>N</color_decisions>
    <spacing_decisions>N</spacing_decisions>
    <layout_decisions>N</layout_decisions>
    <component_decisions>N</component_decisions>
    <motion_decisions>N</motion_decisions>
  </coverage>

  <red_flags_found>
    <flag decision_id="DES-XXX">
      <issue>What's problematic</issue>
      <recommendation>How to fix</recommendation>
    </flag>
  </red_flags_found>

  <overall_intentionality>
    Score 1-10 with explanation of how well decisions are justified
  </overall_intentionality>
</decision_log_summary>

</summary_format>

Key Principle

"It feels like a person looked at it and said, 'This is it.'" — On Linear's design

Every decision in a great design system should feel like someone cared about it specifically. The decision log is proof of that care.