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.
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
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/pragmatic/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How pragmatic Compares
| Feature / Agent | pragmatic | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/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
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.
ai-sdk
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
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
A practical, jargon-free guide to functional programming - the 80/20 approach that gets results without the academic overhead
fp-ts-pragmatic
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
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
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
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
A practical, jargon-free guide to functional programming - the 80/20 approach that gets results without the academic overhead
fp-ts-pragmatic
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
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
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.