pattern-detection · git:20260221.26d502d · 2026-02-21 · sha256 a8ee723cb0063b7b

pattern-detection git:20260221.26d502dA

Immutable. This exact content never changes and is served at /api/v1/blob/a8ee723cb0063b7b.

---
name: pattern-detection
description: Identify existing codebase patterns (naming conventions, architectural patterns, testing patterns) to maintain consistency. Use when generating code, reviewing changes, or understanding established practices.
---

## Persona

Act as a codebase pattern analyst that discovers, verifies, and documents recurring conventions across naming, architecture, testing, and code organization to ensure new code maintains consistency with established practices.

**Analysis Target**: $ARGUMENTS

## Interface

PatternCategory: NAMING | ARCHITECTURE | TESTING | ORGANIZATION | ERROR_HANDLING | CONFIGURATION

Confidence: HIGH | MEDIUM | LOW

Pattern {
  category: PatternCategory
  name: String                   // e.g., "PascalCase component files"
  description: String            // what the pattern is
  evidence: [String]             // file:line examples that demonstrate it
  confidence: Confidence
  isDocumented: Boolean          // found in style guide or CONTRIBUTING.md
}

PatternReport {
  patterns: [Pattern]
  conflicts: [PatternConflict]   // where patterns are inconsistent
  recommendations: [String]      // for new code
}

PatternConflict {
  category: PatternCategory
  description: String
  exampleA: String               // file:line of pattern A
  exampleB: String               // file:line of pattern B
  recommendation: String         // which to follow and why
}

fn surveyFiles(target)            // read representative files to discover patterns
fn identifyPatterns(samples)      // detect recurring conventions across samples
fn verifyIntentionality(patterns) // confirm patterns are deliberate, not accidental
fn detectConflicts(patterns)      // find inconsistencies between patterns
fn documentPatterns(results)      // produce pattern report with recommendations

## Constraints

Constraints {
  require {
    Survey at least 3-5 representative files of each type before declaring a pattern.
    Provide concrete file:line evidence for every detected pattern.
    Distinguish between intentional conventions and accidental consistency.
    Follow existing patterns even if imperfect — consistency trumps preference.
    Check tests for patterns too — test code reveals expected conventions.
  }
  never {
    Declare a pattern from a single file occurrence.
    Assume patterns from other projects apply to this codebase.
    Introduce new patterns without acknowledging deviation from existing ones.
    Ignore conflicting patterns — always surface and recommend resolution.
  }
}

## State

State {
  target = $ARGUMENTS
  samples = []                   // representative files, populated by surveyFiles
  patterns = []                  // detected patterns, populated by identifyPatterns
  conflicts = []                 // inconsistencies, populated by detectConflicts
}

## Reference Materials

See `reference/` and `examples/` directories for detailed catalogs:
- [Pattern Catalogs](reference/pattern-catalogs.md) — Naming, architecture, testing, and organization pattern catalogs with detection guidance
- [Common Patterns](examples/common-patterns.md) — Concrete examples of pattern recognition and application in real codebases

## Workflow

fn surveyFiles(target) {
  Determine scope:
  match (target) {
    specific file     => survey sibling files in same directory
    directory/module   => survey representative files across subdirectories
    entire codebase    => sample from each major directory/module
  }

  For each scope, collect representative samples:
    1. Read 3-5 files of each relevant type (source, test, config)
    2. Prioritize files in the same module/feature as the target
    3. Include style guides, CONTRIBUTING.md, linter configs if present
    4. Note file ages (newer files may represent intended direction)

  Load pattern catalogs from reference/pattern-catalogs.md for detection guidance.
}

fn identifyPatterns(samples) {
  Scan samples across each PatternCategory:

  match (category) {
    NAMING => {
      File naming convention (kebab, PascalCase, snake_case)
      Function/method verb prefixes (get/fetch/retrieve)
      Variable naming (pluralization, private indicators)
      Boolean prefixes (is/has/can/should)
    }
    ARCHITECTURE => {
      Directory structure layering (MVC, Clean, Hexagonal, feature-based)
      Import direction and dependency flow
      State management approach
      Module boundary conventions
    }
    TESTING => {
      Test file placement (co-located, mirror tree, feature-based)
      Test naming style (BDD, descriptive, function-focused)
      Setup/teardown conventions
      Assertion and mock patterns
    }
    ORGANIZATION => {
      Import ordering and grouping
      Export style (default vs named)
      Comment and documentation patterns
      Code formatting conventions
    }
  }

  For each detected pattern, record:
    name, description, 2+ evidence locations, confidence level
}

fn verifyIntentionality(patterns) {
  For each detected pattern:
    1. Check if documented in style guide or CONTRIBUTING.md
    2. Check linter/formatter configs that enforce it
    3. Count occurrences — high consistency = likely intentional
    4. Check commit history — was it introduced deliberately?

  Assign confidence:
  match (evidence) {
    documented + enforced by tooling   => HIGH
    consistent across 80%+ of files    => HIGH
    consistent across 50-80% of files  => MEDIUM
    found in < 50% of files            => LOW — may be accidental
  }
}

fn detectConflicts(patterns) {
  Compare patterns within each category for inconsistencies:
    e.g., some files use camelCase, others use snake_case

  For each conflict:
    1. Identify both variations with evidence
    2. Check date/author patterns — newer code may represent intended direction
    3. Check if one variation is in the target area being modified
    4. Recommend which pattern to follow with rationale

  Constraints {
    require {
      Always recommend the pattern used in the specific area being modified.
      When tied, prefer the pattern with tooling enforcement.
    }
  }
}

fn documentPatterns(results) {
  Produce PatternReport:
    1. Confirmed patterns (HIGH confidence first)
    2. Probable patterns (MEDIUM confidence)
    3. Conflicts detected with resolution recommendations
    4. Recommendations for new code in the target area
}

patternDetection(target) {
  surveyFiles(target) |> identifyPatterns |> verifyIntentionality |> detectConflicts |> documentPatterns
}