pattern-matching

Installation
SKILL.md

Pattern Matching

Overview

Every codebase has a fingerprint. Your job is to replicate that fingerprint so precisely that no reviewer can tell where the original ends and your contribution begins.

Core principle: Observe before you act. Every function, file, and folder you produce must have a living precedent somewhere in the repository. If you cannot point to the model you followed, you have already introduced drift.

No exceptions. No workarounds. No shortcuts.

The Prime Directive

EVERY ADDITION MUST MIRROR AN EXISTING PRECEDENT

When the repository favors snake_case, you write snake_case. When services live under src/domain/, your service lands there too. When errors propagate through a custom Result<T> type, you adopt it without question. There is no room for personal preference.

When to Use

Mandatory in these situations:

  • Touching any file in a pre-existing repository
  • Introducing new modules, routes, or components into an established architecture
  • Contributing features to a project you did not originate
  • Performing refactors that reshape existing logic

Unnecessary when:

  • Bootstrapping a greenfield project (see godmode:project-bootstrap)
  • Writing disposable scripts that will never enter version control

The Entry Protocol

BEFORE producing any code in an existing repository:

1. SURVEY: Locate 2-3 files or functions that solve a comparable problem
2. CATALOG: Record every convention they share
   - Identifier formatting (camelCase, snake_case, PascalCase)
   - Directory taxonomy (where do peers of this file reside?)
   - Import conventions (relative paths, aliases, barrel files)
   - Error propagation strategy (exceptions, Result types, error codes)
   - State access patterns (global store, context injection, parameter passing)
   - Test co-location and framework choices
3. REPLICATE: Produce your code using the identical conventions
4. AUDIT: Hold your output beside the originals — does it pass as native?

Omit any step = drift introduced

Dimensions of Conformity

File-Level Conventions

BEFORE placing a new file:

1. Where do its siblings reside? (directory hierarchy)
2. How are filenames formed? (kebab-case.ts, PascalCase.tsx, snake_case.py)
3. What internal structure does each file follow? (imports, types, constants, logic, exports)
4. How are exports surfaced? (default export, named exports, re-export indexes)

Function-Level Conventions

BEFORE writing a new function, class, or component:

1. Identify an existing function that addresses a similar concern
2. Mirror its shape:
   - Argument style (destructured object vs positional args)
   - Return envelope (Promise<T>, Result<T, E>, nullable)
   - Error strategy (try/catch, .catch(), explicit error returns)
   - Observability (logger.info(), structured JSON, console methods)
   - Validation technique (Zod, Joi, manual guards, type narrowing)
3. Rely on the SAME libraries and utilities the project already depends on
   - Do not introduce ramda if the project uses native array methods
   - Do not pull in got if the project wraps fetch
   - Do not add a competing ORM when one is already wired in

Architecture-Level Conventions

BEFORE inserting a new module or layer:

1. How is the codebase stratified?
   - Routes -> Controllers -> Services -> Repositories?
   - Pages -> Components -> Hooks -> Helpers?
   - Handlers -> Domain -> Infrastructure?
2. Which way do imports flow?
3. Where does business logic concentrate?
4. How do cross-cutting concerns surface? (auth middleware, logging wrappers, error boundaries)

The Shadowing Method

The fastest route to conformity: locate the nearest relative and shadow it stroke for stroke.

1. LOCATE: "Find the file most similar to what I need to create"
2. STUDY: Absorb its structure, imports, error handling, naming, export style
3. DUPLICATE: Use it as a skeleton
4. SPECIALIZE: Swap in only the logic unique to your feature
5. COMPARE: Place them side by side — can you spot the newcomer?

Effective prompting pattern:

"Here is our existing payment service (src/services/payment.ts).
Produce the new subscription service using identical structure, patterns, and naming."

Showing a concrete example always outperforms describing rules in prose.

Typical Divergence Patterns

AI Tendency Project Convention Correction
console.log() Structured logger via winston Adopt the project's logging pipeline
Generic try/catch Domain-specific ServiceError class Throw and catch using the project's error hierarchy
Inline Tailwind classes CSS Modules / styled-components Follow the project's styling methodology
axios for HTTP Custom fetch wrapper in lib/http Use the wrapper the team built
New helper functions Existing utility belt in utils/ Audit utils/ before creating anything new
Flat file layout Feature-folder nesting Respect the existing directory blueprint
Default exports Named exports throughout Align with the repository's export convention
Loose any types Strict TypeScript with generics Match the project's type discipline
let declarations const by default Mirror the existing variable declaration habit
Raw SQL strings ORM query builder Use the project's data access layer

Pre-Commit Verification

Before finalizing, confirm:

  • File resides in the appropriate directory (same neighborhood as its peers)
  • Filename obeys the prevailing naming scheme
  • Import order and alias usage match the established style
  • All identifiers (variables, functions, types) follow existing naming rules
  • Error handling echoes the repository's standard pattern
  • No new dependency duplicates an existing one
  • Tests adhere to the same framework, structure, and naming as existing tests
  • Logging channels through the project's logger
  • The code reads as though the original author wrote it

Cognitive Traps

Rationalization Truth
"My approach is objectively superior" Uniformity outweighs individual taste. Conform to the codebase.
"This is a more contemporary technique" Modern does not mean appropriate for THIS repository. Match the existing reality.
"It is only a single file" One divergent file sets a precedent for ten more. Entropy compounds.
"I will harmonize everything later" You will not. Partial migration is more damaging than consistent legacy.
"The current pattern is flawed" Raise it with the human first. Unilateral convention changes are forbidden.
"This dependency is demonstrably better" Better in isolation does not justify duplication. The project already solved this.

Guardrails

Prohibited actions:

  • Importing a library that overlaps with one already in use
  • Applying a naming convention alien to the codebase
  • Placing a file where it violates the existing directory structure
  • Altering an established convention without explicit human approval
  • Writing code that is visually distinguishable from its neighbors

Required actions:

  • Examine 2-3 analogous files before writing anything
  • Exhaust the project's existing utilities before inventing new ones
  • Reproduce error handling, logging, and validation patterns verbatim
  • Seek permission before deviating ("The codebase uses X. Shall I continue with X or migrate to Y?")

Integration

Complementary skills:

  • godmode:ux-patterns -- Conformity applied to UI component conventions
  • godmode:design-integration -- Conformity applied to design system usage
  • godmode:quality-enforcement -- Automated checks that catch drift

Adjacent skills:

  • godmode:codebase-research -- Discover external patterns; this skill enforces internal ones
  • godmode:system-design -- Guides greenfield structure; this skill governs established codebases
Related skills
Installs
14
GitHub Stars
29
First Seen
Apr 5, 2026