fortify-8e1fdb — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited fortify-8e1fdb (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.
Drop into any project, detect its stack, install the professional testing ecosystem, write thorough tests, run them until green, and verify they catch real bugs. The output isn't test files — it's proof your code works.
npm test / pytest / whatever directly/architect| Mode | What happens |
|---|---|
/fortify or /fortify full | Detect → Install → Audit → Write → Run → Verify → Report |
/fortify setup | Detect → Install → Done |
/fortify check | Detect → Audit → Report gaps → Done (no installs, no test writing) |
The difference from just asking Claude to "add tests": Phases 6 and 7. Tests that aren't run are fiction. Tests that don't catch bugs are theater.
Read the project root. Identify everything about the stack.
Read all of these that exist:
package.json, pnpm-lock.yaml, yarn.lock, bun.lockbpyproject.toml, setup.py, setup.cfg, Pipfile, requirements.txtCargo.toml, go.mod, Gemfile, composer.jsonbuild.gradle, pom.xml, Package.swift, mix.exs, pubspec.yamlFrom the manifest and source files, identify:
Scan the codebase to identify what types of code exist:
| Signal | Domain |
|---|---|
| Route handlers, controllers, API files | API endpoints |
| ORM models, migrations, schema files | Database layer |
| Fetch calls, SDK clients, webhook handlers | External API integrations |
| React/Vue/Svelte components | UI components |
| CLI entry points, arg parsing | CLI tools |
| WebSocket handlers, SSE, real-time | Real-time |
| Queue workers, cron jobs, async tasks | Background jobs |
| Auth middleware, session handling, token logic | Auth/security |
| State machines, workflow engines | State machines |
| File upload/download, media processing | File I/O |
| Cache layers, memoization | Caching |
| Config loaders, env parsing, feature flags | Configuration |
Before moving on, research what commonly goes wrong for this specific stack. This isn't generic — it's targeted:
If _docs/pitfalls.md exists (from /recon), read it — it contains pre-researched intelligence about this project's domain.
Use these findings to inform what to test for in Phase 5 — test for bugs that commonly appear in projects like this, even if the code doesn't obviously have them yet.
State clearly:
Stack: [language] + [framework] on [runtime]
Package manager: [manager]
Domains found: [list]
Existing test setup: [what exists, or "none"]
Common pitfalls for this stack: [top 3-5 from research]If existing test setup is found, read the config and understand what's already configured before changing anything.
For the detected stack, identify the complete professional testing toolchain:
If a references/ file exists for this stack in the skill directory, use it. Otherwise, use context7 to check current best practices for the framework's recommended testing approach.
Show the user what you plan to install:
## Testing Ecosystem for [stack]
### Test Runner: [tool] — [why]
### Libraries: [list with purposes]
### Mocking: [list with what each mocks]
### Coverage: [tool and config approach]Ask: "This is what I want to install. Anything to add or skip?"
Wait for confirmation.
Add all testing dependencies as dev dependencies:
Test runner config:
Test scripts in package manifest:
test — run all teststest:watch — watch modetest:coverage — with coverage reportTest directory structure — follow existing conventions. If project has __tests__/, use it. If co-located tests, match that. Don't impose a structure.
Run the test command to verify:
Fix anything that fails before moving on.
Stop here if mode is `setup`.
Scan the entire codebase and identify what needs tests.
For every source file, classify:
Every item gets an explicit priority label:
## Test Coverage Audit
### P0 — Critical (test immediately)
- src/routes/auth.ts — handles login/register, high blast radius
- src/middleware/auth.ts — JWT verification, every request depends on this
- src/lib/validations.ts — data integrity boundary
### P1 — Important (test soon)
- src/components/PaymentForm.tsx — complex state, user-facing
- src/services/pricing.ts — business logic with edge cases
### P2 — Standard (test when possible)
- src/routes/users.ts — standard CRUD
- src/components/UserCard.tsx — simple display component
### P3 — Low priority
- src/utils/format.ts — formatting helpers
### Summary
[X] files, [Y] have tests, [Z]% coverage estimate
[N] P0 items need immediate testing
[M] known stack pitfalls to test for: [list]Stop here if mode is `check`.
Work through the priority list: all P0, then P1, then P2. Stop at P2 unless user asks for P3.
For every function tested, error/edge-case tests must outnumber happy-path tests. This is the single most important testing principle. Happy paths work because you test them by hand while developing. Bugs live in:
If you write 2 happy-path tests for a function, write at least 3 error-path tests. This ratio is enforced, not aspirational.
Unit tests:
Integration tests:
Error path tests:
For each test file:
API endpoints: Test every status code the endpoint can return. Not just 200 — test 400, 401, 403, 404, 409, 422, 429, 500. Each is a different failure mode.
Database: Test CRUD, constraints, edge queries, concurrent access. Use transaction rollback or test containers for isolation.
UI components: Test rendering, interaction, accessibility. Query by role, not test ID.
External APIs: Test response handling, retry logic, timeouts, rate limits. Mock the HTTP layer.
Auth: Test EVERY auth path — valid credentials, invalid credentials, expired tokens, missing tokens, malformed tokens, insufficient permissions, role boundaries.
Work in batches of 2-3 related files:
Do NOT write all tests then run them at the end. That's how you end up with 50 broken test files.
This phase is mandatory. Tests that aren't run are fiction.
After each batch from Phase 4:
npm test, pytest, etc.)If dependencies aren't installed and you can't run tests, tell the user:
Tests written but I can't verify them — dependencies need to be installed first.
Run: [install command]
Then: [test command]This is the fallback, not the default. Always try to run tests.
This phase is what separates real tests from test theater.
After all tests are green, verify they actually catch bugs:
Pick 3-5 P0 functions — the most critical code. For each:
Make one small, realistic mutation:
=== to !== or > to <These aren't random — they simulate real bugs. Pick mutations that would cause real user impact.
Run the test suite. The tests MUST fail. If they don't, the tests are theater — they pass regardless of whether the code is correct.
For each mutation that tests didn't catch:
## Mutation Testing Results
### Mutations tested: [N]
### Caught by tests: [M] / [N]
| Code | Mutation | Caught? | Test that caught it |
|------|----------|---------|---------------------|
| auth.ts:24 | Removed token expiry check | Yes | "returns 401 when token is expired" |
| products.ts:55 | Changed price > 0 to price >= 0 | No → FIXED | Added "rejects product with price of 0" |
| ...## Fortify Complete
### Installed
- [list of testing tools]
### Tests Written
- [X] test files, [Y] total test cases
- P0: [N] files tested ([list])
- P1: [N] files tested ([list])
- P2: [N] files tested ([list])
- Error path tests: [N] / Happy path tests: [M] (ratio: [N/M])
### Verification
- All tests passing: Yes/No
- Coverage: [X]% overall, [Y]% on P0 code
- Mutations tested: [N], caught: [M]/[N]
### Remaining Gaps
- [anything not tested and why]
- [any mutations that revealed weak test coverage — now fixed]
### How to Run
- `[test command]` — run all tests
- `[coverage command]` — run with coverage
- `[watch command]` — run in watch mode__tests__/ exists, use it. The goal is testing, not reformatting._docs/pitfalls.md or _docs/security-notes.md exist, read them. They contain pre-researched intelligence about common problems for this type of project. Use them to inform what to test for.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.