pragmatic

Apply Pragmatic Programmer principles when building new features. Enforces ETC (Easy to Change), real DRY, tracer bullets, orthogonality, broken windows, and good-enough discipline. Use when the user asks to build, implement, add, or scaffold a new feature, endpoint, module, or system. Do not use for one-line fixes, typo corrections, or purely cosmetic changes.

7 stars

Best use case

pragmatic is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Apply Pragmatic Programmer principles when building new features. Enforces ETC (Easy to Change), real DRY, tracer bullets, orthogonality, broken windows, and good-enough discipline. Use when the user asks to build, implement, add, or scaffold a new feature, endpoint, module, or system. Do not use for one-line fixes, typo corrections, or purely cosmetic changes.

Teams using pragmatic should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/pragmatic/SKILL.md --create-dirs "https://raw.githubusercontent.com/brijr/vibe/main/.agents/skills/pragmatic/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/pragmatic/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How pragmatic Compares

Feature / AgentpragmaticStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Apply Pragmatic Programmer principles when building new features. Enforces ETC (Easy to Change), real DRY, tracer bullets, orthogonality, broken windows, and good-enough discipline. Use when the user asks to build, implement, add, or scaffold a new feature, endpoint, module, or system. Do not use for one-line fixes, typo corrections, or purely cosmetic changes.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# pragmatic — Feature Development Constraint System

This skill enforces a specific engineering philosophy when building new features. It is not generic advice — it is an opinionated constraint system derived from *The Pragmatic Programmer* by Andy Hunt and Dave Thomas.

Read every rule before writing code. Every rule is testable — you should be able to look at a diff and answer yes/no.

## Core Principle

**ETC — Easy to Change.** This is the north star. Every decision filters through one question: *does this make the system easier or harder to change later?* When uncertain between two approaches, pick the one that leaves more options open.

## Constraints

### 1. Tracer Bullets First

Build the thinnest possible end-to-end slice before filling in details. A tracer bullet:

- Touches every layer the feature will touch (UI → API → data, or whatever the stack is)
- Actually runs — it's not a stub or a mock
- Proves the path works before you invest in breadth

Do not build layer by layer (all models, then all routes, then all UI). Build one thin vertical slice, confirm it works, then widen.

### 2. Real DRY

DRY is about **knowledge**, not text. Two pieces of code that look identical but represent different domain concepts are not duplication — leave them alone. But a single business rule expressed in three places is a violation even if the code looks different in each.

- Before extracting, ask: *do these change for the same reason?*
- If yes → unify. If no → leave them separate.
- Never DRY things up just because they look similar right now.

### 3. Orthogonality

A change in one area should not force changes in unrelated areas. Test this mentally: *if I change how X works, how many other files do I touch?* If the answer is "many," the design is coupled.

- Keep modules, components, and functions self-contained
- Pass data explicitly rather than relying on shared mutable state
- If a function needs to know about the internals of another module, something is wrong

### 4. Broken Windows

Do not leave bad code behind — not even temporarily. If you touch a file and see something wrong, fix it or flag it. Do not add clean code next to code you know is broken, hacky, or unclear.

- No "we'll fix this later" without a concrete plan
- No working around a bad interface — fix the interface
- If the right fix is too large for the current scope, say so explicitly rather than shipping a hack

### 5. Good Enough Software

Know when to stop. A feature that works correctly, handles its edge cases, and is easy to change is done. Do not:

- Add configurability nobody asked for
- Handle hypothetical future requirements
- Polish beyond what the current need demands
- Build abstractions for a single use case

Ship when it's good enough — not when it's perfect, and not before it's solid.

## Anti-Patterns (Hard Stops)

Do not produce any of the following:

- **Big-bang builds** — building all the parts separately and integrating at the end. Always have something running.
- **Premature abstraction** — extracting a helper, utility, or base class before you have at least two real, proven use cases that change for the same reason.
- **Copy-paste as velocity** — duplicating a block of code to "move fast" instead of understanding what it does and placing the knowledge correctly.
- **Hacky fixes** — duct-tape solutions that work around a problem instead of addressing it. If the right fix exists, do the right fix. If it's too big to do now, surface that tradeoff explicitly rather than hiding a hack in the codebase.
- **Speculative generality** — parameters, flags, options, or extension points for requirements that don't exist yet.
- **Layer-by-layer construction** — writing all the models, then all the controllers, then all the views. Work in vertical slices.
- **Ignoring broken windows** — adding new code next to code you know is wrong without addressing it.

## Workflow

When building a new feature:

1. **Understand** — What is the feature? What layers does it touch? What changes are likely in the future?
2. **Tracer bullet** — Build the thinnest end-to-end slice that proves the path works.
3. **Widen** — Add cases, validations, UI states, edge handling — one slice at a time.
4. **Clean as you go** — Fix broken windows in files you touch. Keep things orthogonal.
5. **Stop** — When the feature works and the code is easy to change, stop. Don't over-polish.

## Self-Review (Run Before Finalizing)

Score 1–5 on each. Revise until all are 4+.

| Criterion | Question |
|---|---|
| ETC | If requirements shift tomorrow, how much of this code do I rewrite? |
| DRY | Is every piece of domain knowledge expressed in exactly one place? |
| Orthogonal | Can I change one part without rippling into others? |
| Tracer | Did I build end-to-end first, or did I build in layers? |
| Windows | Did I leave any code I know is wrong? |
| Enough | Did I build only what was needed — no more, no less? |

Related Skills

calm-ui

7
from brijr/vibe

Apply a restrained, Swiss/Japanese/Scandinavian/German-influenced product design system when building or refining UI in React, Next.js, TypeScript, and shadcn/ui. Use when the user asks to build, refine, critique, redesign, or review a page, screen, component, form, table, dashboard, layout, or other frontend interface, especially in projects using shadcn/ui. Do not use for marketing sites, landing pages, non-UI work, or requests for bold, playful, maximalist, or otherwise expressive aesthetics.

Frontend Development

ai-sdk

7
from brijr/vibe

Answer questions about the AI SDK and help build AI-powered features. Use when developers: (1) Ask about AI SDK functions like generateText, streamText, ToolLoopAgent, embed, or tools, (2) Want to build AI agents, chatbots, RAG systems, or text generation features, (3) Have questions about AI providers (OpenAI, Anthropic, Google, etc.), streaming, tool calling, structured output, or embeddings, (4) Use React hooks like useChat or useCompletion. Triggers on: "AI SDK", "Vercel AI SDK", "generateText", "streamText", "add AI to my app", "build an agent", "tool calling", "structured output", "useChat".

fp-ts-pragmatic

31392
from sickn33/antigravity-awesome-skills

A practical, jargon-free guide to fp-ts functional programming - the 80/20 approach that gets results without the academic overhead. Use when writing TypeScript with fp-ts library.

fp-pragmatic

31392
from sickn33/antigravity-awesome-skills

A practical, jargon-free guide to functional programming - the 80/20 approach that gets results without the academic overhead

Programming AidClaude

fp-ts-pragmatic

242
from aiskillstore/marketplace

A practical, jargon-free guide to fp-ts functional programming - the 80/20 approach that gets results without the academic overhead. Use when writing TypeScript with fp-ts library.

pragmatic-writing

56
from robertguss/claude-code-toolkit

This skill should be used when writing technical content in the style of Hunt/Thomas (The Pragmatic Programmer) and Joel Spolsky (Joel on Software). It applies when creating technical essays, documentation, tutorials, or explanatory content that needs to be clear, engaging, and actionable.

fp-ts-pragmatic

40
from benjaminasterA/antigravity-awesome-skills

A practical, jargon-free guide to fp-ts functional programming - the 80/20 approach that gets results without the academic overhead. Use when writing TypeScript with fp-ts library.

fp-ts-pragmatic

38
from lingxling/awesome-skills-cn

A practical, jargon-free guide to fp-ts functional programming - the 80/20 approach that gets results without the academic overhead. Use when writing TypeScript with fp-ts library.

fp-pragmatic

38
from lingxling/awesome-skills-cn

A practical, jargon-free guide to functional programming - the 80/20 approach that gets results without the academic overhead

fp-ts-pragmatic

30
from Zidong-IA/BIBLIOTECA

A practical, jargon-free guide to fp-ts functional programming - the 80/20 approach that gets results without the academic overhead. Use when writing TypeScript with fp-ts library.

fp-ts-pragmatic

25
from ComeOnOliver/skillshub

A practical, jargon-free guide to fp-ts functional programming - the 80/20 approach that gets results without the academic overhead. Use when writing TypeScript with fp-ts library.

pragmatic-programmer

23
from christophacham/agent-skills-library

Apply meta-principles of software craftsmanship: DRY, orthogonality, tracer bullets, and design by contract. Use when the user mentions "best practices", "pragmatic approach", "broken windows", "tracer bullet", or "software craftsmanship". Covers estimation, domain languages, and reversibility. For code-level quality, see clean-code. For refactoring techniques, see refactoring-patterns.