source-first — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited source-first (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.
Check the source before you trust your memory of it. APIs change, training-data recollection is fuzzy, and a library's real behavior lives in its code and types — not in what you assume it does. Unverified assumptions are the main cause of plausible-but-wrong AI output.
Source-first means: identify what you're claiming, find the authoritative evidence, read it, then write or change code. If the source contradicts your plan, the source wins.
Pair with [[context-curation]] to load verified source into the working set (not paraphrase), [[fault-recovery]] when debugging against a wrong mental model, [[interface-design]] when confirming public contracts, [[test-first]] to lock verified behavior, and [[llm-feature-engineering]] when grounding model answers in retrieval — model memory is not a source.
Skip for pure greenfield logic with no external contracts — still apply when you touch existing code or libraries. Not a substitute for running the app ([[browser-checks]]) or tests ([[test-first]]) — source tells you what should happen; execution proves it.
Work in order. Know what you're verifying before you open files.
Before searching, write the specific assertion you're relying on:
Bad: "I'll use the auth helper"
Good: "authMiddleware() runs before route handlers and sets req.user from the JWT"If you can't state the claim, you're not ready to implement — explore first, don't guess.
Claims that always need a source:
Use the highest-authority source available for the claim:
| Priority | Source | Use for |
|---|---|---|
| 1 | Your codebase — definition, callers, tests | Internal modules, app behavior, conventions |
| 2 | Types/schemas — TypeScript, OpenAPI, Protobuf, DB migration | Contracts, required fields, enums |
| 3 | Tests — unit/integration asserting behavior | Expected edge cases, regression truth |
| 4 | Installed package — node_modules, lockfile version, vendor code | Third-party API for your version |
| 5 | Version-pinned docs — docs for the exact release in lockfile | When code isn't readable |
| 6 | Runtime sample — one real query, log line, API response | Data shape, null patterns, env quirks |
| 7 | Web search / training memory | Last resort — confirm against 1–6 before trusting |
Wrong: blog post from 2021 → implement
Right: lockfile says v4.2 → read types in node_modules → cross-check v4.2 docs if neededDocs lag code on active repos; code lags docs on stable public APIs — when they disagree on your repo, your code wins. For third-party libs, installed source + pinned docs beat generic web results.
Don't read the whole repo — locate the definition:
grep for symbol name, export, route pathFor AI agents: verify paths and symbols exist before editing — invented file paths and imports are a common failure mode.
Read enough to answer: what goes in, what comes out, what can fail, what else it touches.
Checklist for the slice:
@deprecated, migration notes ([[migration-path]])Assumed: getUser(id) → User
Read: getUser(id) → User | null; throws NetworkError on timeout; caches 60sStop when the claim is verified — don't read adjacent modules "while you're here" ([[context-curation]]).
Behavior without version context is incomplete.
package-lock.json, pnpm-lock.yaml, Cargo.lock, go.sumIf the user's environment is unknown, ask or detect before assuming latest docs apply.
For "how does X work today?" follow one concrete path:
Assumed: DELETE /users/:id removes row immediately
Traced: handler → softDeleteUser() → sets deleted_at; row stays 90 daysTracing beats reading one function in isolation when the bug is order, wiring, or middleware.
Tools: debugger, structured logs, temporary trace log, or manual step-through in tests.
Some truths aren't in code alone:
Use sanitized samples — never paste secrets or PII into chat ([[hardening]]). Prefer schema + one anonymized row, or LIMIT 1 read in dev/staging.
Before implementing or advising:
When pairing with [[context-curation]], load actual source excerpts into the working set — a hand-wavy paraphrase of a module reintroduces hallucination.
If evidence disproves the assumption:
Planned: add field to existing POST body
Found: OpenAPI marks field read-only; server rejects unknown fields
Action: new endpoint or version bump ([[interface-design]], [[migration-path]])| Situation | Source-first rule |
|---|---|
| AI-generated code | Every import, path, method name verified in repo or package |
| Stack Overflow / gist | Treat as untrusted — rewrite against your version's source |
| LLM "facts" about your product | Ground in retrieval or code — never model memory alone ([[llm-feature-engineering]]) |
| Deprecated API | Read migration guide + grep repo for remaining callers |
| Config from env | Read .env.example, deploy config, or schema — not "usual" var names |
| Monorepo shared package | Trace into the package source — don't assume npm doc matches internal fork |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.