specialize — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited specialize (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.
The end-user command @spec/commands/bluespec.specialize.md writes into a scaffolded target project: .bluespec/skills/<name>.md and .bluespec/skills.json. Neither path exists here. This repo is the Blue Spec source, where built-in sub-skills live in spec/skills/<name>.md and the catalog is a hardcoded TypeScript array, not a runtime JSON file. There is also no "user" registry: a built-in is registered in code, compiled, scaffolded, and tested.
So you reuse the command's authoring discipline (terrain, defense-only gate, template, tags, reconcile-never-append) but override every output path to the native layout, and you update the registration points the end-user command never has to.
Read and follow @spec/commands/bluespec.specialize.md in full. Its authoring steps hold unchanged. The one thing that does not is where files are read and written, since the command targets a scaffolded project and you are in the source. Remap every path it names:
| Command path (end-user target) | Native path (use this instead) |
|---|---|
.bluespec/skills/{regex,javascript,browser}.md (worked examples) | every *.md already in spec/skills/ (list the directory, mirror the closest one) |
templates/specialize-template.md | spec/templates/specialize-template.md |
node ./.bluespec/hooks/skills.mjs (list what exists) | read spec/skills/ and SKILLS_CATALOG in src/hooks/skills/catalog.ts |
.bluespec/skills/<name>.md (the sub-skill file) | spec/skills/<name>.md |
.bluespec/skills.json (catalog entry) | a BuiltinSkillEntry in src/hooks/skills/catalog.ts |
One path it names stays put: a hook reference inside the .md body keeps the ./.bluespec/hooks/<x>.mjs form, because that body ships verbatim to the end user and must point at their scaffolded path, not the source.
Every built-in belongs to a category (group), which is how npx blue-spec add --skills <category> bundles it into a target project. Categories live in SKILL_GROUPS in src/hooks/skills/groups.ts.
python under python, and so on).owasp.SkillGroup to SKILL_GROUPS (key, label, description). Ask the user before inventing one, do not force an unrelated module into owasp to avoid the question.The end-user skills.json has no groups field by default, but the built-in catalog entry does. Set it.
A new built-in is not done when the .md exists. Touch each of these:
src/core/assets.ts reads spec/skills/ by directory listing, so the file loads automatically once it is on disk, with no code change.BuiltinSkillEntry { name, tags, groups } to `src/hooks/skills/catalog.ts`. Without this row the file scaffolds, but the skills hook never lists it and add --skills cannot bundle it.SkillGroup to `src/hooks/skills/groups.ts`, but only when you introduced a new category.SKILLS_CATALOG (e.g. "never repeats the name inside its own tags"), so a new entry is exercised automatically. Check that no count-based or hardcoded-list assertion now fails..bluespec/skills/regex.md. Update them only when your change alters what a given category scaffolds.npm test. Its pretest hook runs scripts/build.sh first, so the compiled lib/hooks/*.mjs the e2e tests exercise are rebuilt automatically, no separate build step needed. All green before you call it done.# => regex: ...) is illustrative. Update it only when it should showcase the new one.src/core/skills-catalog.ts (the _empty user_ catalog factory), src/hooks/skills/discover.ts (reads the _user's_ .bluespec/skills.json), and .bluespec/skills.json itself: these are the end-user registry. A built-in never writes there.[ ] spec/skills/<name>.md authored from spec/templates/specialize-template.md (reconciled on a refine)
[ ] src/hooks/skills/catalog.ts BuiltinSkillEntry added { name, tags, groups }
[ ] src/hooks/skills/groups.ts only if a new category was introduced
[ ] tests updated + npm test green
[ ] website/docs/commands/skills.mdx table row addedAs Step 8 of the command: state the name, tags, category, what it covers, and that the detect and verify phases now load it on demand once shipped (end users import it with @.bluespec/skills/<name>.md). Note it shadows any same-named entry on a refine. Suggest a commit such as `feat: add specialization in <name> defense`, matching the wording the existing built-ins use, as a suggestion, not a mandate.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.