skills/coding-principles/SKILL.md
Software design principles and opinionated stances on clean code. Reference skill — index is always loaded, detail files read on demand. Use when reviewing code, refactoring, or making architecture decisions.
npx skillsauth add RonanCodes/ronan-skills coding-principlesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Quick reference index. Each section links to a detail file with examples — read those when a specific principle is relevant.
| Principle | Stance | |-----------|--------| | KISS | The simplest solution that works wins. "Clever" = hard to maintain. | | YAGNI | Don't build for hypothetical futures. Predicted requirements are usually wrong. | | No premature optimization | Make it work, make it right, make it fast — in that order. Profile before optimizing. |
See: principles/simplicity.md
| Principle | Stance | |-----------|--------| | Rule of Three | Don't abstract until you've seen the pattern 3 times. Two is coincidence. | | DRY | About knowledge, not code. Two identical functions can represent different knowledge — that's OK. | | Single Source of Truth | One authoritative place for each piece of data. Derive, don't duplicate. |
See: principles/abstraction.md
| Principle | One-liner | |-----------|-----------| | Single Responsibility | One reason to change | | Open/Closed | Extend by adding code, not modifying existing code | | Liskov Substitution | Subtypes must be drop-in replacements for base types | | Interface Segregation | Many specific interfaces > one fat interface | | Dependency Inversion | Depend on abstractions, not concretions |
See: principles/solid.md
| Principle | Stance |
|-----------|--------|
| Separation of Concerns | UI, business logic, and data access are separate. Always. |
| Law of Demeter | a.getB().getC().doThing() is a red flag. Only talk to immediate friends. |
| Least Privilege | Functions receive only the data they need. Private by default. |
| Deep Modules | Small interface, large behaviour behind it (Ousterhout). Especially important when delegating implementation to agents: a deep module lets a human review the interface contract and delegate the inside. Background: llm-wiki-ai-research:deep-modules-for-ai. |
| Push reviewer, pull implementer | In multi-agent setups, push coding standards into the reviewer agent's prompt; let the implementer pull standards on demand. Background: llm-wiki-ai-research:push-vs-pull-coding-standards. |
See: principles/boundaries.md
| Principle | Stance | |-----------|--------| | Tracer Bullets | Build a thin end-to-end slice first. Validate architecture before building features. | | Don't Outrun Your Headlights | Small steps with feedback. Feedback rate is your speed limit. | | Fail Fast | Surface errors immediately. Don't hide them, don't continue in a broken state. |
See: principles/pragmatic.md
| Principle | Stance | |-----------|--------| | Boy Scout Rule | Leave code better than you found it. Small improvements, not rewrites. | | Least Surprise | If a function name says "get", it shouldn't modify state. No hidden side effects. | | Composition over Inheritance | Prefer combining objects over class hierarchies. Inheritance is rarely the right call. |
See: principles/craftsmanship.md
| Context | TDD? | Notes | |---------|------|-------| | Backend | Mandatory | Write the test first. Business logic bugs are expensive. | | Frontend | Optional | When it adds value — complex logic, utils, critical paths. |
Backend TDD workflow: failing test → minimum code to pass → refactor → repeat.
development
Close the loop on a Linear ticket when its work ships - move the status and post a deploy comment with the PR link, what shipped, and a try-it link, mentioning the collaborator. Used as the tail of /ro:linear-nightshift for every merged mirror, or manually after an ad-hoc build. Triggers on "linear update", "update the linear ticket", "mark NUT-x done", "tell eoin it shipped", "/ro:linear-update".
devops
Run a night-shift against a collaborator's Linear board. Pulls the team's Grilled tickets (/ro:linear-grill moves a ticket to Grilled once its questions are answered), VERIFIES the questions were actually answered (unanswered → bounce the ticket to the "Question for <name>" state), mirrors verified tickets to ephemeral GitHub issues with ready-for-agent, then runs the standard /ro:night-shift machinery on GitHub. Tail-calls /ro:linear-update for everything that merged + deployed. Triggers on "linear nightshift", "nightshift linear", "drain the linear board", "run the shift off linear", "/ro:linear-nightshift".
development
Grill a collaborator's Linear tickets and move every processed ticket to where it belongs. Resolves the board from the repo's .ro-linear.json, reads the collaborator's Backlog / Ready-for-agent issues, then per ticket either posts 3-5 decision-extracting questions (state moves to "Question for <name>") or confirms it build-ready (state moves to "Grilled", the gate /ro:linear-nightshift consumes); shipped-and-confirmed tickets close as Done. The async-collaborator counterpart of /ro:day-shift for people who never touch GitHub. Triggers on "grill linear", "grill eoin's tickets", "linear grill", "add questions to the linear tickets", "/ro:linear-grill".
development
--- name: about-page description: Add a standard About page to any web app, what it is, the tech stack, and an FAQ, wired into a footer link with a sticky footer. Built with Spartan + Tailwind (the canonical component layer) and falls back to semantic HTML so it ships reliably. Use whenever building, polishing, or shipping an app, every app should have one. Triggers on "add an about page", "about page", "footer about link", or as a standard step in app build/polish. category: frontend argument-h