skill-quality-suite
Skill2 starsChanged 9 days agoApache-2.0View on GitHub
Lint, validate and security-scan Agent Skills. Use when asked to check or audit a SKILL.md; when a skill does not fire, fires on a neighbour's work, or half-works and silently skips steps; when writing or reworking one; after a rename left a reference pointing at nothing; before committing or publishing; when a skill came from elsewhere and has to be read before it is trusted; when deciding which skill to write or fix next from the work actually done; and when the question is whether the last edit made its routing better or worse.
2 other projects use a version of this.
Adopted by
Most recently taken up by
- letsloose501/skill-quality-suiteword for word, first seen Oct 16, 2026
- letsloose501/sqs-skillsword for word, first seen Oct 16, 2026
Other versions2 projects use a version of this.
Word for word · 2
- letsloose501/skill-quality-suite★ 4100% same
- letsloose501/sqs-skills★ 4100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository20 other files it gives its agents.
- browserSkill
- clean-memorySkill
- codebase-designSkill
- commitSkill
- desktopSkill
- graphicsSkill
- grillingSkill
- implementSkill
- latexSkill
- memory-reviewSkill
- mistakeSkill
- notesSkill
- pdfSkill
- routerSkill
- setupSkill
- tddSkill
- to-specSkill
- to-ticketsSkill
- vault-indexSkill
- videoSkill
The file
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 0 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 103
Every finding carries a rule code.
- Very specific: line 182
A line: - write sqs-allow: SE002 on it or just above it.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Skill quality suite
Validates a SKILL.md against the Agent Skills specification, lints the instructions an
agent will actually follow, scans a skill for secrets and prompt injection before you
install it, checks whether it will work on another agent, and measures whether it
improves the agent's work at all.
A quality gate in two halves. The static half reads the skill: eight checks, one command each, separate because they fail at different moments - structure breaks today and in silence, the specification breaks on publication, compatibility breaks on somebody else's machine, routing breaks when a neighbour's description moves. Running them as one undifferentiated pass reports all four with the same urgency, which is how a report stops being read.
The evaluation half runs an agent: does the skill fire, does it make the work come out better, did the last edit make it worse. It costs money and minutes and needs an agent installed, so nothing in it runs unless you ask for it by name.
Everything lives in scripts/sqs.py. The static half is standard library only and works
offline; it finds the skills folder on its own, or takes --skills-dir.
Paid layers: offer, warn, never start
sqs.py eval in every form, and any check a model has to read or judge, spends the
user's money or the usage window of their subscription. The rule for all of it:
- Never run a paid layer on your own initiative, however well it fits the task. Run it only after the user said yes to that run in this conversation.
- When a paid layer would help, offer it - and say, every time, that it is paid and what one run costs: a capped trigger run measured at about $0.21 (23.09.2026); a trigger set of twenty queries at three runs each is sixty of those.
- Say that it pays off only over time. One run of a model that answers differently each time is an anecdote. The value is a measurement repeated across edits - the regression gate comparing this version with the last one - not a single number today.
- Offer the free step first:
check,route --prompt,evals,cases --from-history. Most "does it fire" questions are answered there.
Plain wording that works: "This would need eval --trigger, which is paid - about $0.21
per run, sixty runs for a proper set - and only pays off if you keep measuring across
edits. The free checks say X. Run it?"
Start here
| The situation | Run |
| Just edited a skill, want it intact | sqs.py check <skill> |
| A skill does not fire, or half-works | sqs.py check <skill> and sqs.py route --prompt "..."; eval --trigger is paid - ask first |
| Does the skill actually help | sqs.py eval <skill> --runtime - paid, ask first: the task with it and without it |
| Did my last edit break it | sqs.py eval <skill> --all --save v2, then --compare v1 v2 - paid, ask first |
| What do people actually type to reach it | sqs.py cases <skill> --from-history - free, reads local transcripts |
| What should I change in this skill | sqs.py improve <skill> - findings with fixes, your requests, your mistakes journal |
| Was it followed to the end | sqs.py improve <skill> --transcripts <dir>, then judging-sessions.md - judging is paid, ask first |
| Which skill to write next, or which one keeps missing | sqs.py discover - free, reads local transcripts; then propose from from-history.md |
| Switching the gate on over an old tree | sqs.py baseline create, then check --baseline |
| One line per layer, for a decision | sqs.py check <skill> --format board |
| Writing a new skill | sqs.py new <name> [--seed WORD], then creating-a-skill.md |
| Reworking a skill that grew unwieldy | sqs.py check <skill>, then the reading pass in writing-rubric.md |
| A skill arrived from elsewhere | sqs.py security <skill> before running it, then check |
| About to commit or publish | sqs.py all <skill> --strict, then publishing.md |
| Renamed something | sqs.py structure - it catches the pointers the rename orphaned |
| Sweeping the whole tree | sqs.py check --quiet |
| Will it work anywhere but this machine | sqs.py compat <skill> --harness all |
| Port it to another harness | sqs.py compat <skill> --harness <target>, then porting.md - read the target's page first |
check is the everyday one: structure, spec, quality, compat and security together.
all adds the publish module. Neither runs an agent - that is eval, and it is always
opt-in.
From your history to a proposal
discover, improve and --transcripts print evidence and decide nothing. Each edit
passes the bar in from-history.md first; most fail it, and
saying why is a result.
Reading the report
⛔ SP004 `name: video-tools` does not match the folder `video` (SKILL.md)
⚠️ ST006 SKILL.md is 21370 B > the 15000 B budget (SKILL.md)
· QL006 при необходимости - lines 191, 295 (SKILL.md:191)- ⛔ error - fix it. Nothing here is cosmetic: a broken pointer into
references/does not crash anything, the agent just skips the step in silence, and from outside it looks like the work came out weaker than usual. That is why this class of breakage survives for months. - ⚠️ warning - a decision, not a defect. An orphan file is either unwired or no longer needed, and only you know which.
- · info - a nudge. Real, small, and safe to leave.
--format board prints one line per layer instead of a finding list - the view for
deciding rather than fixing, where a layer nobody ran says NOT RUN instead of looking
like a pass. --score adds an aggregate number and the arithmetic that produced it:
additional, never the headline, because a number hides which question failed. sarif
feeds GitHub code scanning, github annotates a diff, json everything else.
Every finding carries a rule code. sqs.py explain ST008 gives the code's reasoning and
its fix; sqs.py rules lists all of them. Reach for explain rather than guessing at
what a message means - the reasoning is the part that decides whether the finding
applies to your case.
The modules
sqs.py structure links, orphans, budgets, section pointers, outbound paths
sqs.py spec layout, fences, description shape, asset weight, nesting
sqs.py quality the description as a pointer, placeholders, vague bounds
sqs.py compat will the skill work on somebody else's harness
sqs.py security secrets, destructive commands, injection, hidden characters
sqs.py evals the eval files and the routing invariants - free
sqs.py publish what has to be true before the skill leaves the machine
sqs.py fix the repairs with exactly one correct answer
sqs.py eval runs the agent: triggering, task success, regressions - costs money
sqs.py baseline the findings a tree has agreed to live with, for nowevals reads the eval files and costs nothing. eval runs the agent and costs money.
The two are one letter apart because they are about the same thing at two prices.
Four of them need a word of their own.
security is the one to run on a skill somebody else wrote, before the agent reads
it for work. A skill is executable text; an installed skill is a supply chain. It reports
credentials, destructive commands, text addressed at the agent rather than the task, and
hidden or bidirectional characters that make the rendered file differ from the file the
model reads.
compat is the check your own machine can never make for you. It reads the skill
as a list of features - a frontmatter field, a directory, a tool name, a hard-coded
path into someone's skill folder - and asks ten harness adapters what each one means
to them: Claude Code, Codex, Cursor, Gemini CLI, Antigravity, OpenCode, Cline, Roo
Code, Windsurf, GitHub Copilot. Every row rests on that project's own documentation,
and what the documentation does not state comes back UNKNOWN rather than as an
invented incompatibility. sqs.py harnesses lists them with the page each rests on.
evals is the free half of testing. Per skill: does this one carry a usable eval
set (evals/trigger/*.yaml or evals/eval_queries.json, and evals/evals.json;
--init scaffolds them). Tree-wide: do the routing invariants still hold, delegated to
evals/run_evals.py when one sits beside the skills.
eval is the half that runs an agent, and the only part of the suite that observes
behaviour instead of reasoning about text:
--triggersends each query to a headless session and counts what loaded. The output is the confusion matrix - true and false positives and negatives, precision, recall, F1 - printed beside the cases it came from. F1 is printed, not scored: it weighs a miss and a false fire equally, and in a tree of skills they are not equal.--runtimeruns the task set twice, once with the skill loaded and once with no skills at all, and reports task success, tool calls, turns, time, tokens, cost and whether following the skill made the agent do something destructive. A task with no assertions comes backungraded, never as a pass.--save <label>stores a run;--compare v1 v2diffs two. Quality falling fails the gate, cost rising is reported and does not, because cheaper-and-worse and dearer-and-better are both trades somebody has to look at.
sqs.py eval <skill> with no layer named runs nothing: it prints what each layer would
cost and stops. See evaluating.md.
fix is a dry run unless you pass --apply. It only repairs what the broken state
forces: the name the folder already dictates, characters that should never have been in
the file. It deliberately will not shorten an over-long description - there is no single
right shortening, and picking one for you deletes a trigger you needed.
Fixing what it found
sqs.py explain <CODE>- the reasoning, then the fix.sqs.py fix --applyfor the mechanical ones.- The rest by hand. When the finding is about what the skill says rather than how it is wired, the report has taken you as far as counting can: open writing-rubric.md and do the reading pass.
- Re-run until clean. A run that ends
0 errorand a run you assumed would are different things.
Three scopes of escape hatch, for findings that are correct-and-intended:
- A line - write
sqs-allow: SE002on it or just above it. This is how one quotation of a dangerous pattern avoids being reported as a use of one. - A file -
sqs-allow-file: SE001, SE002in its first 25 lines, for a file whose whole job is to hold the patterns. Annotating each occurrence there would be noise pretending to be care. - The tree -
sqs.config.jsonbeside the skills:rulesmaps a code tooff/info/warning/error,ignoreskips skills,allow_dirsaccepts a directory the spec does not name,harnessessets the target environments andlangthe publication language. - A subtree -
.sqsignoreat the skill root, one path glob per line: not read at all, so nothing is claimed about it. It hides a path from this suite only, not from the installer (PB015).
Two more ways to make a report survive contact with an old tree, neither of which hides anything:
--baselinereports only what the baseline file does not already carry, so switching the gate on over three hundred existing findings does not turn the build red on day one. The recorded findings stay in the file, dated, andsqs.py baseline showlists them: it is a queue, not a bin.--min-confidence highdrops the findings the suite is less sure of - the prose heuristics - and keeps the filesystem and parse facts. Every rule carries a detection confidence and a false-positive risk, andsqs.py explain <CODE>prints both.
Record why in the config next to the entry. A silenced rule with no reason gets un-silenced by the next person who reads the file, including you.
The references
- creating-a-skill.md - the order for building a new skill, and for reworking an old one. Open it before writing any skill from scratch.
- writing-rubric.md - the reading pass: the pointer, the two loads, the information hierarchy, completion criteria, leading words, pruning. Open it when the problem is what the skill says rather than how it is wired.
- agent-compatibility.md - the ten harnesses, what each row rests on, the five portability verdicts, and how to add a harness without inventing one. Open it before answering "will this work on X".
- evaluating.md - the three eval questions, the trigger loop
with its train/validation split, the baseline/treatment comparison, the regression
gate, and the part that stays a human's job. Open it before touching a description
that already fires, and before the first
sqs.py eval. - publishing.md - the gate before a skill leaves the machine, and what the publish module cannot see.
- from-history.md - from the user's own sessions to a
proposal, and the bar every edit to a skill passes. Open it before
discoveror any edit. - judging-sessions.md - a skill's loads judged: two verdicts each, then drafts.
- mistakes-journal.md - recording a mistake, reviewing
the journal into rules and gates, and what
improvereads from it. - porting.md - moving a skill to another harness: read the target's own page now, plan against it, write a copy, never the original. Open it before changing a skill for a harness it was not written for.
- editing-this-suite.md - the audit, the golden corpus and the generated pages, which all have to agree before a change is done. Open it before changing a rule, a harness or the evaluation layer of this suite itself.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

