Production-grade engineering skills for AI coding agents.
This report summarizes scanner evidence for addyosmani/agent-skills, a JavaScript project with 104,501 GitHub stars. SynthScan examined 22,443 lines of code across 158 source files, recording 134 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 14.1 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 68 finding(s).
Are imports declared and package/API names verified? 1 finding(s).
Are wrappers, guards, and repeated structures necessary? 65 finding(s).
Which changes need focused human review? 134 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 134 distinct pattern matches across 6 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | hooks/sdd-cache-test.sh | 26 | # ── curl stub ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | hooks/sdd-cache-test.sh | 102 | # ── Test 1: pre — no url in input lets WebFetch proceed ─────────────────── | COMMENT |
| MEDIUM⚡ | hooks/sdd-cache-test.sh | 108 | # ── Test 2: pre — malformed JSON input is not fatal ─────────────────────── | COMMENT |
| MEDIUM⚡ | hooks/sdd-cache-test.sh | 114 | # ── Test 3: pre — no cache entry lets WebFetch proceed ──────────────────── | COMMENT |
| MEDIUM⚡ | hooks/sdd-cache-test.sh | 120 | # ── Test 4: pre — entry without validators is never served ──────────────── | COMMENT |
| MEDIUM⚡ | hooks/sdd-cache-test.sh | 127 | # ── Test 5: pre — non-304 status lets WebFetch proceed ──────────────────── | COMMENT |
| MEDIUM⚡ | hooks/sdd-cache-test.sh | 134 | # ── Test 6: pre — network failure lets WebFetch proceed ─────────────────── | COMMENT |
| MEDIUM⚡ | hooks/sdd-cache-test.sh | 141 | # ── Test 7: pre — 304 serves cached content byte-exactly ────────────────── | COMMENT |
| MEDIUM⚡ | hooks/sdd-cache-test.sh | 158 | # ── Test 8: pre — empty content field bypasses even on 304 ──────────────── | COMMENT |
| MEDIUM⚡ | hooks/sdd-cache-test.sh | 165 | # ── Test 9: post — no url in input writes nothing ───────────────────────── | COMMENT |
| MEDIUM⚡ | hooks/sdd-cache-test.sh | 172 | # ── Test 10: post — unknown tool_response shape writes nothing ──────────── | COMMENT |
| MEDIUM⚡ | hooks/sdd-cache-test.sh | 180 | # ── Test 11: post — caches when the origin provides an ETag ─────────────── | COMMENT |
| MEDIUM | hooks/sdd-cache-test.sh | 196 | # ── Test 12: post — string-shaped tool_response is accepted ─────────────── | COMMENT |
| MEDIUM | hooks/sdd-cache-test.sh | 206 | # ── Test 13: post — origin without validators removes stale entry ───────── | COMMENT |
| MEDIUM | hooks/sdd-cache-test.sh | 217 | # ── Test 14: post — validators taken from final response block ──────────── | COMMENT |
| MEDIUM | hooks/sdd-cache-test.sh | 230 | # ── Test 15: round-trip — post writes, pre serves the same bytes ────────── | COMMENT |
| MEDIUM | hooks/sdd-cache-test.sh | 243 | # ── Summary ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore.sh | 256 | # ── Stop: expand each cached file in place, backup only as fallback ────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore.sh | 311 | # ── PreToolUse Read: filter in-place ────────────────────────────────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore.sh | 353 | # ── PostToolUse Edit|Write: expand, then re-filter ──────────────────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 49 | # ── Test 1: Single-line block produces exactly one placeholder ──────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 77 | # ── Test 2: Multi-line block ───────────────────────────────────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 101 | # ── Test 3: Multiple blocks in one file ────────────────────────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 128 | # ── Test 4: Reason string preserved ────────────────────────────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 149 | # ── Test 5: Trailing newline preservation ──────────────────────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 165 | # ── Test 6: No blocks → return 1 ──────────────────────────────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 181 | # ── Test 7: Unclosed block emits warning and flushes ───────────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 198 | # ── Test 8: Single-line block with reason ──────────────────────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 217 | # ── Test 9: HTML comment syntax ────────────────────────────────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 238 | # ── Test 10: JSON parsing error warning ────────────────────────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 250 | # ── Test 11: Stop keeps a change made outside Edit|Write ───────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 294 | # ── Test 12: Stop fallback keeps the rewrite in the cache ─────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 334 | # ── Test 13: Read → direct write with no event → Stop ─────────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 370 | # ── Tests 14-16: full-lifecycle round-trip fidelity ────────────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 390 | # ── Test 14: Read → Stop restores the file byte-identically ────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 418 | # ── Test 15: Round-trip preserves missing trailing newline ──────────────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 434 | # ── Test 16: Read → model edit → Edit event → Stop keeps the edit ──────── | COMMENT |
| MEDIUM | hooks/simplify-ignore-test.sh | 523 | # ── Summary ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/validate-skills.js | 25 | // ─── Main ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/validate-skills.js | 58 | // ── Personas ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/validate-commands.js | 35 | // ─── Config ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/validate-commands.js | 54 | // ─── Parsers ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/validate-commands.js | 78 | // ─── Loader ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/validate-commands.js | 99 | // ─── Main ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/validate-commands.js | 122 | // ── Parity check ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/validate-commands.js | 148 | // ── Claude frontmatter validity ───────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/validate-commands.js | 174 | // ── Description sync check ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/validate-artifact-paths-test.js | 118 | // ─── Every command surface is guarded, not only the Claude Code copy ──────── | COMMENT |
| MEDIUM | scripts/lib/skill-lint.js | 29 | // ─── Config ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/lib/skill-lint.js | 108 | // ─── Helpers ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/lib/skill-lint.js | 343 | // ─── Linter ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/lib/skill-lint.js | 355 | // ── Frontmatter ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/lib/skill-lint.js | 408 | // ── Exemption guard ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/lib/skill-lint.js | 422 | // ── Required sections ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/lib/skill-lint.js | 466 | // ── Context budget ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/lib/skill-lint.js | 477 | // ── Cross-skill references ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/lib/skill-lint-test.js | 57 | // ─── Section exemptions ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/lib/skill-lint-test.js | 106 | // ─── Guardrails on the rules this change sits beside ───────────────────────── | COMMENT |
| MEDIUM | scripts/lib/skill-lint-test.js | 178 | // ─── Fenced-block stripping (#437) ─────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/lib/skill-lint-test.js | 178 | // ─── Fenced-block stripping (#437) ─────────────────────────────────────────── | COMMENT |
| 5 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/lib/skill-lint-test.js | 158 | '### Step 1: Measure', | CODE |
| LOW | skills/debugging-and-error-recovery/SKILL.md | 40 | ### Step 1: Reproduce | COMMENT |
| LOW | skills/debugging-and-error-recovery/SKILL.md | 87 | ### Step 2: Localize | COMMENT |
| LOW | skills/debugging-and-error-recovery/SKILL.md | 111 | ### Step 3: Reduce | COMMENT |
| LOW | skills/debugging-and-error-recovery/SKILL.md | 121 | ### Step 4: Fix the Root Cause | COMMENT |
| LOW | skills/debugging-and-error-recovery/SKILL.md | 138 | ### Step 5: Guard Against Recurrence | COMMENT |
| LOW | skills/debugging-and-error-recovery/SKILL.md | 154 | ### Step 6: Verify End-to-End | COMMENT |
| LOW | skills/test-driven-development/SKILL.md | 49 | ### Step 1: RED — Write a Failing Test | COMMENT |
| LOW | skills/test-driven-development/SKILL.md | 67 | ### Step 2: GREEN — Make It Pass | COMMENT |
| LOW | skills/test-driven-development/SKILL.md | 85 | ### Step 3: REFACTOR — Clean Up | COMMENT |
| LOW⚡ | skills/test-driven-development/SKILL.md | 124 | // Step 1: Write the reproduction test (it should FAIL) | COMMENT |
| LOW⚡ | skills/test-driven-development/SKILL.md | 133 | // Step 2: Fix the bug | COMMENT |
| LOW⚡ | skills/test-driven-development/SKILL.md | 141 | // Step 3: Test passes → bug fixed, regression guarded | COMMENT |
| LOW | skills/planning-and-task-breakdown/SKILL.md | 24 | ### Step 1: Enter Plan Mode | COMMENT |
| LOW | skills/planning-and-task-breakdown/SKILL.md | 35 | ### Step 2: Identify the Dependency Graph | COMMENT |
| LOW | skills/planning-and-task-breakdown/SKILL.md | 57 | ### Step 3: Slice Vertically | COMMENT |
| LOW | skills/planning-and-task-breakdown/SKILL.md | 79 | ### Step 4: Write Tasks | COMMENT |
| LOW | skills/planning-and-task-breakdown/SKILL.md | 106 | ### Step 5: Order and Checkpoint | COMMENT |
| LOW | skills/constraint-driven-development/SKILL.md | 42 | ### Step 1: Detect before you ask | COMMENT |
| LOW | skills/constraint-driven-development/SKILL.md | 57 | ### Step 2: Four questions, each with a default | COMMENT |
| LOW | skills/constraint-driven-development/SKILL.md | 93 | ### Step 3: Write CONSTRAINTS.md | COMMENT |
| LOW | skills/constraint-driven-development/SKILL.md | 142 | ### Step 4: Install what each dimension needs | COMMENT |
| LOW | skills/constraint-driven-development/SKILL.md | 186 | ### Step 5: Wire it to the lifecycle | COMMENT |
| LOW | skills/constraint-driven-development/SKILL.md | 202 | ### Step 6: Guard the bar itself | COMMENT |
| LOW | skills/constraint-driven-development/SKILL.md | 226 | ### Step 7: Ratchets, when you don't have a number | COMMENT |
| LOW | skills/code-review-and-quality/SKILL.md | 142 | ### Step 1: Understand the Context | COMMENT |
| LOW | skills/code-review-and-quality/SKILL.md | 152 | ### Step 2: Review the Tests First | COMMENT |
| LOW | skills/code-review-and-quality/SKILL.md | 166 | ### Step 3: Review the Implementation | COMMENT |
| LOW | skills/code-review-and-quality/SKILL.md | 179 | ### Step 4: Categorize Findings | COMMENT |
| LOW | skills/code-review-and-quality/SKILL.md | 195 | ### Step 5: Verify the Verification | COMMENT |
| LOW | skills/deprecation-and-migration/SKILL.md | 69 | ### Step 1: Build the Replacement | COMMENT |
| LOW | skills/deprecation-and-migration/SKILL.md | 77 | ### Step 2: Announce and Document | COMMENT |
| LOW | skills/deprecation-and-migration/SKILL.md | 94 | ### Step 3: Migrate Incrementally | COMMENT |
| LOW | skills/deprecation-and-migration/SKILL.md | 108 | ### Step 4: Remove the Old System | COMMENT |
| LOW | skills/interview-me/SKILL.md | 40 | ### Step 1: Hypothesize, with a confidence number | COMMENT |
| LOW | skills/interview-me/SKILL.md | 53 | ### Step 2: Ask one question at a time, each with a guess attached | COMMENT |
| LOW | skills/interview-me/SKILL.md | 79 | ### Step 3: Listen for "want vs. should want" | COMMENT |
| LOW | skills/interview-me/SKILL.md | 94 | ### Step 4: Restate intent in the user's own words | COMMENT |
| LOW | skills/interview-me/SKILL.md | 113 | ### Step 5: Confirm — explicit yes, not "whatever you think" | COMMENT |
| LOW | skills/interview-me/SKILL.md | 124 | ### Step 6: Terminal Turn & Stop Rule (CRITICAL) | COMMENT |
| LOW | skills/code-simplification/SKILL.md | 107 | ### Step 1: Understand Before Touching (Chesterton's Fence) | COMMENT |
| LOW | skills/code-simplification/SKILL.md | 123 | ### Step 2: Identify Simplification Opportunities | COMMENT |
| LOW | skills/code-simplification/SKILL.md | 157 | ### Step 3: Apply Changes Incrementally | COMMENT |
| LOW | skills/code-simplification/SKILL.md | 173 | ### Step 4: Verify the Result | COMMENT |
| LOW | skills/doubt-driven-development/SKILL.md | 62 | ### Step 1: CLAIM — Surface what stands | COMMENT |
| LOW | skills/doubt-driven-development/SKILL.md | 75 | ### Step 2: EXTRACT — Smallest reviewable unit | COMMENT |
| LOW | skills/doubt-driven-development/SKILL.md | 85 | ### Step 3: DOUBT — Invoke the fresh-context reviewer | COMMENT |
| LOW | skills/doubt-driven-development/SKILL.md | 168 | ### Step 4: RECONCILE — Fold findings back | COMMENT |
| LOW | skills/doubt-driven-development/SKILL.md | 181 | ### Step 5: STOP — Bounded loop, not recursion | COMMENT |
| LOW | skills/source-driven-development/SKILL.md | 38 | ### Step 1: Detect Stack and Versions | COMMENT |
| LOW | skills/source-driven-development/SKILL.md | 63 | ### Step 2: Fetch Official Documentation | COMMENT |
| LOW | skills/source-driven-development/SKILL.md | 116 | ### Step 3: Implement Following Documented Patterns | COMMENT |
| LOW | skills/source-driven-development/SKILL.md | 141 | ### Step 4: Cite Your Sources | COMMENT |
| LOW | skills/performance-optimization/SKILL.md | 40 | ### Step 1: Measure | COMMENT |
| LOW | skills/performance-optimization/SKILL.md | 99 | ### Step 2: Identify the Bottleneck | COMMENT |
| LOW | skills/performance-optimization/SKILL.md | 121 | ### Step 3: Fix the Bottleneck | COMMENT |
| LOW | skills/performance-optimization/SKILL.md | 139 | ### Step 4: Verify (Keep or Revert) | COMMENT |
| LOW | skills/performance-optimization/SKILL.md | 174 | ### Step 5: Guard Against Regression | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | references/orchestration-patterns.md | 11 | ### 1. Direct invocation (no orchestration) | COMMENT |
| MEDIUM | docs/agents.md | 58 | ## Worked example: valid orchestration | COMMENT |
| MEDIUM | docs/agents.md | 79 | ## Worked example: invalid orchestration (do not build this) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | hooks/sdd-cache-test.sh | 1 | #!/bin/bash | COMMENT |
| LOW | hooks/simplify-ignore.sh | 1 | #!/bin/bash | COMMENT |
| LOW | hooks/sdd-cache-post.sh | 1 | #!/bin/bash | COMMENT |
| LOW | hooks/sdd-cache-pre.sh | 1 | #!/bin/bash | COMMENT |
| LOW | hooks/session-start.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/lib/skill-lint.js | 261 | ); | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/lib/skill-lint-test.js | 158 | '### Step 1: Measure', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/frontend-ui-engineering/SKILL.md | 139 | | Lorem ipsum-style copy | Placeholder text hides layout problems that real content reveals (length, wrapping, overflow) | CODE |