solid-principles — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited solid-principles (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
SOLID is a set of five design principles that reduce coupling, increase cohesion, and make software easier to maintain and extend. Apply them when writing new code and check for violations when reviewing code.
A module, class, or function should have one reason to change.
A "reason to change" means one actor or stakeholder whose requirements could change the code. Code with multiple responsibilities becomes a tangled web where changing one concern breaks another.
UserServicethat validates input, persists to the database, AND sends emails)
and in a function name: validateAndSave(), parseAndFormatDate()notification each belong in separate classes or functions
Software entities should be open for extension but closed for modification.
Adding new behavior should not require changing existing, tested code. Achieve this through abstraction: program to interfaces, not implementations.
if/else or switch on a type field that must be modified everytime a new type is added
if type === 'admin' ... else if type === 'user'Subtypes must be substitutable for their base types without altering program correctness.
If code works correctly with a Shape, it must work correctly with a Rectangle that extends Shape, without the caller knowing which it got.
NotImplementedError or do nothinginstanceof before calling methods: if (x instanceof Square)what the base type promises
hold behaviorally
ReadOnlyList cannot mutate) butmust fulfill all contracts the base type advertises
Clients should not be forced to depend on interfaces they do not use.
Fat interfaces force clients to implement or depend on methods they do not need, creating unnecessary coupling.
uses only 3 of them
UnsupportedOperationExceptionfor several methods
several contracts
High-level modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend on details.
Business logic should not import database drivers, HTTP clients, or file system APIs directly. It should depend on interfaces that those details implement.
newimport DatabaseClient from './database' inside a domain serviceDatabase.query(...),Clock.now(), Config.get(...)) — static calls have no seam, so tests cannot substitute them
Registry.getInstance()) —the dependency is real but invisible in the signature, so the class lies about what it needs
access
layer
the function
the long-lived collaborators that define what the object IS (its clients, its loggers, its clock, its database handle). Methods take the per-call work parameters. A ReportGenerator(reportingDb, clock) can serve many date ranges via generate(startDate, endDate). A ReportGenerator(reportingDb, clock, startDate, endDate) creates a new instance per query and conflates identity with work.
When writing new code:
answer contains "and", split it.
tested code?" Use abstractions where extension is expected.
contracts. Prefer composition when uncertain.
multiple distinct clients use the same interface differently.
inside domain logic.
When reviewing code for SOLID violations:
both input validation and database write.`
switch or if/else chain.
do not use.
Every SOLID finding should cite the specific file and line, name the principle, and explain the consequence: why does this violation matter for this codebase right now?
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.