Claude-skill-registry decision-logging

Capture architectural and implementation decisions with rationale to prevent re-debating. Creates and maintains DECISIONS.md.

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/decision-logging" ~/.claude/skills/majiayu000-claude-skill-registry-decision-logging && rm -rf "$T"
manifest: skills/data/decision-logging/SKILL.md
source content

Decision Logging Skill

// Project Autopilot - Decision Documentation // Copyright (c) 2026 Jeremy McSpadden jeremy@fluxlabs.net

Purpose: Record decisions with full context so future sessions don't re-debate settled issues, rationale is preserved, and decision impact is trackable.


Why Decision Logging?

Without decision logging:

  • Same questions asked repeatedly across sessions
  • Rationale lost, leading to reversals without understanding
  • Time wasted re-debating settled issues
  • Context lost when decisions need to be revisited

With decision logging:

  • Decisions preserved with full context
  • Alternatives considered are documented
  • Future sessions can read and understand past decisions
  • Easy to revisit decisions when requirements change

DECISIONS.md Location

.autopilot/DECISIONS.md

This file is automatically created and updated by the decision logging system.


DECISIONS.md Template

# Project Decisions

// Project Autopilot - Decision Log
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>

**Project:** {project_name}
**Last Updated:** {timestamp}

---

## Decision Index

| ID | Title | Date | Status | Phase |
|----|-------|------|--------|-------|
| D001 | Auth Provider Selection | 2026-01-29 | Final | 1 |
| D002 | State Management Approach | 2026-01-29 | Final | 1 |
| D003 | Database Schema Design | 2026-01-29 | Final | 2 |

---

## D001: Auth Provider Selection

**Date:** 2026-01-29
**Status:** Final
**Owner:** {user}
**Phase:** 1

### Context
We need to implement user authentication for the application. Multiple providers
are available, each with different trade-offs in terms of features, cost, and
development complexity.

### Options Considered
| Option | Pros | Cons |
|--------|------|------|
| Supabase Auth | Built-in with DB, free tier, easy setup | Less customizable |
| Clerk | Best DX, beautiful pre-built UI | Paid after 10k MAU |
| Auth.js | Full control, free | More implementation work |
| Custom JWT | Complete flexibility | Security responsibility |

### Decision
**Selected:** Supabase Auth

### Rationale
1. Already using Supabase for database - natural fit
2. Free tier sufficient for MVP and initial growth
3. Built-in security best practices
4. Minimal implementation time

### Consequences
**Positive:**
- Fast implementation (hours vs days)
- Security handled by Supabase team
- Integration with row-level security

**Trade-offs:**
- Vendor lock-in to Supabase ecosystem
- Less customizable than Auth.js
- May need migration if exceeding free tier

### Related Decisions
- D003: Database schema (influenced by this)
- D007: API authentication (builds on this)

---

## D002: State Management Approach

**Date:** 2026-01-29
**Status:** Final
**Owner:** {user}
**Phase:** 1

### Context
The application needs client-side state management for UI state, caching,
and server state synchronization.

### Options Considered
| Option | Pros | Cons |
|--------|------|------|
| Redux | Battle-tested, dev tools | Boilerplate, complexity |
| Zustand | Simple, minimal boilerplate | Less ecosystem |
| Jotai | Atomic, React-native feel | Learning curve |
| React Query only | Server state handled | No client state |

### Decision
**Selected:** Zustand + React Query

### Rationale
1. Zustand for simple client state (UI, preferences)
2. React Query for server state (API caching, sync)
3. Minimal boilerplate, familiar patterns
4. Excellent TypeScript support

### Consequences
**Positive:**
- Clean separation of client vs server state
- Minimal bundle size
- Easy to understand and maintain

**Trade-offs:**
- Two libraries to learn
- Less unified than Redux

### Related Decisions
- D005: Component architecture (influenced by this)

---

Decision Capture Protocol

When to Capture Decisions

Capture a decision when:

  • Multiple valid approaches exist
  • The choice has lasting implications
  • Future sessions might question the choice
  • The decision affects architecture or patterns

Decision Capture Function

FUNCTION captureDecision(context, options, selected, rationale):
    """
    Capture a decision with full context.
    """
    # Generate decision ID
    decisions = loadDecisions()
    id = "D" + String(decisions.length + 1).padStart(3, "0")

    # Build decision object
    decision = {
        id: id,
        title: context.title,
        date: now().format("YYYY-MM-DD"),
        status: "Final",
        owner: getCurrentUser() OR "Claude",
        phase: context.phase OR null,
        context: context.description,
        options: options,
        selected: selected,
        rationale: rationale,
        consequences: {
            positive: inferPositiveConsequences(selected, options),
            tradeoffs: inferTradeoffs(selected, options)
        },
        related: context.related_decisions OR []
    }

    # Append to DECISIONS.md
    appendToDecisionsFile(decision)
    updateDecisionIndex(decision)

    LOG "✅ Decision captured: {id} - {decision.title}"

    RETURN id

Auto-Capture During Discussion

FUNCTION captureFromDiscussion(gray_area, user_selection):
    """
    Automatically capture decisions during /autopilot:discuss.
    """
    IF user_selection.is_significant:
        context = {
            title: gray_area.label,
            description: gray_area.question,
            phase: current_phase
        }

        options = gray_area.options.map(opt => ({
            name: opt.label,
            pros: opt.pros OR ["N/A"],
            cons: opt.cons OR ["N/A"]
        }))

        selected = user_selection.option.label
        rationale = user_selection.explanation OR "User preference"

        captureDecision(context, options, selected, rationale)

Re-Debate Prevention

Checking for Prior Decisions

FUNCTION checkForPriorDecision(topic):
    """
    Check if a decision has already been made on this topic.
    Prevents re-debating settled issues.
    """
    decisions = loadDecisions()

    FOR each decision IN decisions:
        # Semantic similarity check
        similarity = semanticSimilarity(topic, decision.title)

        IF similarity > 0.8:
            RETURN {
                found: true,
                decision: decision,
                message: formatPriorDecisionMessage(decision)
            }

        # Check for keyword matches
        IF containsKeywords(topic, decision.title) OR
           containsKeywords(topic, decision.context):
            RETURN {
                found: true,
                decision: decision,
                message: formatPriorDecisionMessage(decision)
            }

    RETURN {found: false}

FUNCTION formatPriorDecisionMessage(decision):
    """
    Format a message about a prior decision.
    """
    message = """
This was decided in {decision.id}: {decision.title}

**Decision:** {decision.selected}
**Rationale:** {decision.rationale}

To revisit this decision, use:
/autopilot:decision revisit {decision.id}
"""
    RETURN message

Re-Debate Response

When a topic matches a prior decision:

User: "Should we use Redux for state management?"

Claude: "This was decided in D002: State Management Approach.

**Decision:** Zustand + React Query
**Rationale:** Clean separation of client vs server state, minimal boilerplate

To revisit this decision, use:
/autopilot:decision revisit D002"

Decision Revisit Protocol

When to Revisit

Decisions can be revisited when:

  • Requirements have fundamentally changed
  • New information invalidates assumptions
  • Significant time has passed and landscape changed
  • Implementation revealed unforeseen issues

Revisit Function

FUNCTION revisitDecision(decision_id, reason):
    """
    Mark a decision for revisit and document why.
    """
    decisions = loadDecisions()
    decision = decisions.find(d => d.id == decision_id)

    IF NOT decision:
        ERROR "Decision not found: {decision_id}"

    # Add revisit note
    decision.status = "Under Review"
    decision.revisit = {
        date: now(),
        reason: reason,
        original_decision: decision.selected,
        original_rationale: decision.rationale
    }

    updateDecision(decision)

    LOG "Decision {decision_id} marked for revisit"
    LOG "Original: {decision.selected}"
    LOG "Reason for revisit: {reason}"

    # Start new discussion
    RETURN startDecisionDiscussion(decision)

Integration Points

With /autopilot:discuss

discuss.md integrates:
    - Check for prior decisions before asking questions
    - Auto-capture significant decisions
    - Link decisions to phases

With /autopilot:takeoff

build.md integrates:
    - Check decisions before making architectural choices
    - Reference decisions in code comments where relevant
    - Update decisions if implementation reveals issues

With /autopilot:cockpit

resume.md loads:
    - All decisions for context
    - Pending decisions needing resolution
    - Recent decisions for reference

With /autopilot:plan

plan.md reads:
    - Architectural decisions for planning
    - Technology decisions for task estimation
    - Prior decisions to avoid re-deciding

Commands

View Decisions

/autopilot:decisions list
/autopilot:decisions list --phase=3
/autopilot:decisions show D001

Search Decisions

/autopilot:decisions search "authentication"
/autopilot:decisions search --keyword=database

Revisit Decision

/autopilot:decisions revisit D001 --reason="New requirements"

Add Decision

/autopilot:decisions add
# Interactive prompt for decision details

Decision Categories

Architectural Decisions

  • Framework selection
  • Database choice
  • API design patterns
  • Deployment architecture

Implementation Decisions

  • Library selection
  • Code organization
  • Error handling approach
  • Testing strategy

Process Decisions

  • Workflow choices
  • Review process
  • Deployment frequency
  • Documentation approach

Trade-off Decisions

  • Build vs buy
  • Performance vs simplicity
  • Flexibility vs speed
  • Cost vs features

Output Formats

Compact (for conversation)

📋 Decision D001: Auth Provider
├─ Selected: Supabase Auth
├─ Rationale: Built-in with DB, minimal setup
└─ Status: Final (2026-01-29)

Detailed (for review)

## D001: Auth Provider Selection

**Status:** Final
**Date:** 2026-01-29
**Phase:** 1

### Decision
Supabase Auth

### Why
1. Already using Supabase for database
2. Free tier sufficient for MVP
3. Built-in security best practices

### Trade-offs Accepted
- Vendor lock-in to Supabase
- Less customizable than custom solution

### Affects
- D003: Database schema
- D007: API authentication

Best Practices

Writing Good Decisions

DO:

  • Capture context: Why was this decision needed?
  • List all options considered, not just the chosen one
  • Document rationale with specific reasons
  • Note consequences (both positive and negative)
  • Link related decisions

DON'T:

  • Skip the "why" - future you will wonder
  • Omit rejected options - understanding why they were rejected is valuable
  • Make decisions without documenting
  • Leave decisions as "pending" indefinitely

Decision Quality Checklist

  • Title clearly describes the decision
  • Context explains why decision was needed
  • At least 2 options were considered
  • Each option has pros and cons
  • Rationale explains why selected option was chosen
  • Consequences (positive and trade-offs) documented
  • Related decisions linked