npx skills add ...
npx skills add riekelt/principal-engineer --skill principal-engineering
Use when doing any non-trivial engineering work - implementing, debugging, refactoring, configuring, operating, or investigating why a system misbehaves - or any change where being wrong has a cost. Encodes the evidence-over-theory discipline, the hard safety rules, and the pre-change checkpoint. Use whenever code, data, or infrastructure is about to change or must be understood before it can, even if the task looks routine or is only "find out why". Foundation for the sibling skills.
npx skills add riekelt/principal-engineer --skill principal-engineering
Check what the system actually does rather than recalling a pattern for it. Ground every decision in the real code and data, fail loud, keep one home per fact, and never claim done without the verification that proves it.
Sibling skills carry the depth: grounding-before-coding, handling-failures, keeping-one-source-of-truth, verifying-before-done, operating-safely, scoping-changes, testing-changes, writing-unit-tests, guarding-architecture, adding-dependencies. Load the matching one on top of this.
| The task is | Also load |
|---|---|
| Starting a change, a debug, or work in unfamiliar code | grounding-before-coding |
| Writing or touching any error path, fallback, or default | handling-failures |
| Adding data, config, state, or a second copy of anything | keeping-one-source-of-truth |
| Claiming "done", "fixed", or "passing" | verifying-before-done |
| Deleting, overwriting, restarting, or touching secrets or live systems | operating-safely |
| Deciding how big a fix should be, or noticing scope move mid-task | scoping-changes |
| Deciding what tests a change owes, or facing an empty test diff | testing-changes |
| Writing or fixing a unit test, or taming a flaky or unreadable one | writing-unit-tests |
| Crossing module boundaries or touching stated principles | guarding-architecture |
| Adding, updating, vetting, or removing a package, library, or base image | adding-dependencies |
The documents around the work (specs, decisions, changelogs, runbooks, postmortems, issues) are the technical-writer plugin's job where installed; these skills govern the engineering itself and defer to it for the prose.
Before writing the first line, state in working notes:
Grounded: <what you read or ran to know the current behavior> | Blast radius: <what this change touches> | Invariants: <what must not break> | Verify: <the command that will prove it worked>
Fill it from the code and data, not from memory or plausibility. A field you cannot fill is the work you do first.
Non-negotiable, in every repository:
handling-failures.verifying-before-done.The rules hold at every tier; the tier sets how much proof they demand. What sits in the top tier is the project's to declare: money paths in one system, the sales pipeline in another, stored user data, a medical record, a safety gate, an irreversible migration. The project's rules or CLAUDE.md name its top-tier paths; when they do not, ask what the system must never get wrong and treat the answer as the declaration.
Top-tier work gets maximum rigor: invariant tests, independent verification, and the full checkpoint taken literally. Ordinary paths get standard rigor. Tooling and throwaway work still obey the hard rules (a silent swallow in a script still hides failures) but earn no gold-plating. State the tier when it is not obvious; running top-tier work at tooling rigor is the expensive mistake, the reverse is the wasteful one.
Something that bites twice becomes a written rule with its provenance (what happened, when, how to avoid it); once is learning. A rule that keeps triggering gets sharpened; a rule whose underlying cause is fixed gets retired. The recorded incident behind each rule is what stops it from being cargo-culted or wrongly deleted later.
keeping-one-source-of-truth.scoping-changes.