Marketing skills for Claude Code and AI agents. CRO, copywriting, SEO, analytics, and growth engineering.
This report summarizes scanner evidence for coreyhaines31/marketingskills, a JavaScript project with 57,607 GitHub stars. SynthScan examined 116,718 lines of code across 665 source files, recording 168 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 2.3 (Low 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.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 85 finding(s).
Are imports declared and package/API names verified? 83 finding(s).
Are wrappers, guards, and repeated structures necessary? 24 finding(s).
Which changes need focused human review? 168 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 168 distinct pattern matches across 9 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 |
|---|---|---|---|---|
| LOW | tools/integrations/resend.md | 72 | "to": ["user@example.com"], | CODE |
| LOW | tools/integrations/resend.md | 85 | "to": ["user@example.com"], | CODE |
| LOW | tools/integrations/resend.md | 154 | to: 'user@example.com', | CODE |
| LOW | tools/integrations/resend.md | 167 | to: 'user@example.com', | CODE |
| LOW | tools/integrations/sequenzy.md | 115 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/sequenzy.md | 134 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/sequenzy.md | 148 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/sequenzy.md | 236 | "to": "user@example.com", | CODE |
| LOW | tools/integrations/clay.md | 54 | "company": "Acme Inc", | CODE |
| LOW | tools/integrations/sendgrid.md | 31 | "to": [{"email": "user@example.com"}] | CODE |
| LOW | tools/integrations/sendgrid.md | 49 | "to": [{"email": "user@example.com"}], | CODE |
| LOW | tools/integrations/sendgrid.md | 68 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/sendgrid.md | 126 | "email": "user@example.com" | CODE |
| LOW | tools/integrations/sendgrid.md | 150 | to: 'user@example.com', | CODE |
| LOW | tools/integrations/beehiiv.md | 50 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/attentive.md | 31 | "email": "user@example.com" | CODE |
| LOW | tools/integrations/onesignal.md | 62 | node tools/clis/onesignal.js notifications send --emails "user@example.com" --email-subject "Welcome" --email-body "<p>T | CODE |
| LOW | tools/integrations/onesignal.md | 163 | { "type": "Email", "token": "user@example.com" } | CODE |
| LOW | tools/integrations/activecampaign.md | 81 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/activecampaign.md | 109 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/partnerstack.md | 58 | "name": "John Doe" | CODE |
| LOW | tools/integrations/partnerstack.md | 137 | "company": "Acme Corp" | CODE |
| LOW | tools/integrations/brevo.md | 47 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/brevo.md | 137 | { "email": "user@example.com", "name": "Jane Doe" } | CODE |
| LOW | tools/integrations/brevo.md | 137 | { "email": "user@example.com", "name": "Jane Doe" } | CODE |
| LOW | tools/integrations/intercom.md | 42 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/intercom.md | 43 | "name": "Jane Doe", | CODE |
| LOW | tools/integrations/intercom.md | 72 | "value": "user@example.com" | CODE |
| LOW | tools/integrations/intercom.md | 154 | "name": "Acme Corp", | CODE |
| LOW | tools/integrations/trustpilot.md | 93 | "consumerName": "Jane Doe", | CODE |
| LOW | tools/integrations/trustpilot.md | 116 | "name": "Jane Doe", | CODE |
| LOW | tools/integrations/segment.md | 49 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/segment.md | 50 | "name": "John Doe", | CODE |
| LOW | tools/integrations/segment.md | 112 | email: 'user@example.com', | CODE |
| LOW | tools/integrations/audiencetap.md | 32 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/postscript.md | 36 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/klaviyo.md | 30 | GET https://a.klaviyo.com/api/profiles/?filter=equals(email,"user@example.com") | CODE |
| LOW | tools/integrations/klaviyo.md | 42 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/klaviyo.md | 121 | "attributes": { "email": "user@example.com" } | CODE |
| LOW | tools/integrations/klaviyo.md | 204 | - `filter` - Filter expressions (e.g., `equals(email,"user@example.com")`) | CODE |
| LOW | tools/integrations/close.md | 44 | "name": "Acme Corp", | CODE |
| LOW | tools/integrations/attio.md | 36 | "name": [{ "first_name": "Jane", "last_name": "Doe", "full_name": "Jane Doe" }], | CODE |
| LOW | tools/integrations/postmark.md | 166 | { "EmailAddress": "user@example.com" } | CODE |
| LOW | tools/integrations/zapier.md | 167 | "email": "user@example.com" | CODE |
| LOW | tools/integrations/zapier.md | 179 | "name": "John Doe", | CODE |
| LOW | tools/integrations/zapier.md | 217 | "customer_name": "John Doe", | CODE |
| LOW | tools/integrations/mailchimp.md | 46 | "email_address": "user@example.com", | CODE |
| LOW | tools/integrations/demio.md | 85 | "name": "Jane Doe", | CODE |
| LOW | tools/integrations/demio.md | 103 | "name": "Jane Doe", | CODE |
| LOW | tools/integrations/kit.md | 42 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/kit.md | 57 | "email": "user@example.com" | CODE |
| LOW | tools/integrations/kit.md | 68 | "email": "user@example.com" | CODE |
| LOW | tools/integrations/kit.md | 99 | "email": "user@example.com" | CODE |
| LOW | tools/integrations/zoominfo.md | 45 | "companyName": ["Acme Corp"], | CODE |
| LOW | tools/integrations/posthog.md | 110 | email: 'user@example.com', | CODE |
| LOW | tools/integrations/hubspot.md | 40 | "value": "user@example.com" | CODE |
| LOW | tools/integrations/hubspot.md | 53 | "email": "user@example.com", | CODE |
| LOW | tools/integrations/savvycal.md | 136 | "display_name": "John Doe", | CODE |
| LOW | tools/integrations/savvycal.md | 154 | --time-zone America/New_York --name "John Doe" --email john@example.com | CODE |
| LOW | tools/integrations/customer-io.md | 30 | "email": "user@example.com", | CODE |
| 12 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/competitor-profiling/SKILL.md | 108 | #### Step 1: Map the site | COMMENT |
| LOW | skills/competitor-profiling/SKILL.md | 126 | #### Step 2: Scrape key pages | COMMENT |
| LOW | skills/competitor-profiling/SKILL.md | 148 | #### Step 3: Scrape competitor reviews (optional but high-value) | COMMENT |
| LOW | skills/product-marketing/SKILL.md | 16 | ### Step 1: Check for Existing Context | COMMENT |
| LOW | skills/product-marketing/SKILL.md | 34 | ### Step 2: Gather Information | COMMENT |
| LOW | skills/product-marketing/SKILL.md | 143 | ## Step 3: Create the Document | COMMENT |
| LOW | skills/product-marketing/SKILL.md | 274 | ## Step 4: Confirm, Version, and Save | COMMENT |
| LOW⚡ | skills/referrals/SKILL.md | 93 | ### Step 1: Identify Trigger Moments | COMMENT |
| LOW⚡ | skills/referrals/SKILL.md | 101 | ### Step 2: Design Share Mechanism | COMMENT |
| LOW⚡ | skills/referrals/SKILL.md | 110 | ### Step 3: Choose Incentive Structure | COMMENT |
| LOW | skills/directory-submissions/SKILL.md | 70 | ### Step 1: Readiness assessment (Phase 0) | COMMENT |
| LOW | skills/directory-submissions/SKILL.md | 86 | ### Step 2: Choose the tiers | COMMENT |
| LOW | skills/directory-submissions/SKILL.md | 112 | ### Step 3: Prepare asset variations | COMMENT |
| LOW | skills/directory-submissions/SKILL.md | 125 | ### Step 4: Batch submit | COMMENT |
| LOW | skills/link-building/SKILL.md | 33 | ## Step 1: Confirm Links Are the Bottleneck | COMMENT |
| LOW | skills/link-building/SKILL.md | 50 | ## Step 2: Have Something Worth Linking To | COMMENT |
| LOW | skills/link-building/SKILL.md | 62 | ## Step 3: Pick Tactics by Effort and Quality | COMMENT |
| LOW | skills/link-building/SKILL.md | 87 | ## Step 4: Prospect, Qualify, Reach Out | COMMENT |
| LOW | skills/link-building/SKILL.md | 100 | ## Step 5: Stay Inside the Rules | COMMENT |
| LOW | skills/link-building/SKILL.md | 114 | ## Step 6: Anchors and Pace | COMMENT |
| LOW | skills/link-building/SKILL.md | 120 | ## Step 7: Measure Both Outcomes | COMMENT |
| LOW | skills/ad-creative/SKILL.md | 187 | ### Step 1: Define Your Angles | COMMENT |
| LOW⚡ | skills/ad-creative/SKILL.md | 204 | ### Step 2: Generate Variations per Angle | COMMENT |
| LOW⚡ | skills/ad-creative/SKILL.md | 212 | ### Step 3: Validate Against Specs | COMMENT |
| LOW⚡ | skills/ad-creative/SKILL.md | 216 | ### Step 4: Organize for Upload | COMMENT |
| LOW⚡ | skills/ad-creative/SKILL.md | 226 | ### Step 1: Analyze Winners | COMMENT |
| LOW⚡ | skills/ad-creative/SKILL.md | 235 | ### Step 2: Analyze Losers | COMMENT |
| LOW⚡ | skills/ad-creative/SKILL.md | 242 | ### Step 3: Generate New Variations | COMMENT |
| LOW⚡ | skills/ad-creative/SKILL.md | 250 | ### Step 4: Document the Iteration | COMMENT |
| LOW | skills/ad-creative/references/creative-roadmap.md | 11 | ## Step 1: Read the Three Signals | COMMENT |
| LOW | skills/ad-creative/references/creative-roadmap.md | 27 | ## Step 2: Turn Signals into Evidence-Ranked Concepts | COMMENT |
| LOW | skills/ad-creative/references/creative-roadmap.md | 46 | ## Step 3: Branch on Account State | COMMENT |
| LOW | skills/ad-creative/references/creative-roadmap.md | 63 | ## Step 4: The Roadmap Artifact | COMMENT |
| LOW | skills/ad-creative/references/creative-roadmap.md | 87 | ## Step 5: The Monthly Creative Retro | COMMENT |
| LOW | skills/ai-seo/SKILL.md | 136 | ### Step 1: Check AI Answers for Your Key Queries | COMMENT |
| LOW | skills/ai-seo/SKILL.md | 153 | ### Step 2: Analyze Citation Patterns | COMMENT |
| LOW | skills/ai-seo/SKILL.md | 164 | ### Step 3: Content Extractability Check | COMMENT |
| LOW | skills/ai-seo/SKILL.md | 181 | ### Step 4: AI Bot Access Check | COMMENT |
| LOW | skills/conversion-tracking/references/audit-playbook.md | 25 | ## Step 1: static recon (no logins needed) | COMMENT |
| LOW | skills/conversion-tracking/references/audit-playbook.md | 42 | ## Step 2: classify the conversion moment | COMMENT |
| LOW | skills/conversion-tracking/references/audit-playbook.md | 47 | ## Step 3: walk the click ID chain | COMMENT |
| LOW | skills/conversion-tracking/references/audit-playbook.md | 58 | ## Step 4: guided account checks | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tools/integrations/dub-co.md | 115 | const dub = new Dub({ token: "YOUR_API_KEY" }); | CODE |
| HIGH | tools/integrations/heygen.md | 51 | -H "X-Api-Key: YOUR_API_KEY" \ | CODE |
| HIGH | tools/integrations/heygen.md | 77 | -H "X-Api-Key: YOUR_API_KEY" | CODE |
| HIGH | tools/integrations/heygen.md | 84 | -H "X-Api-Key: YOUR_API_KEY" | CODE |
| HIGH | tools/integrations/rewardful.md | 97 | <script async src='https://r.wdfl.co/rw.js' data-rewardful='YOUR_API_KEY'></script> | CODE |
| HIGH | tools/integrations/firecrawl.md | 19 | - **Header**: `Authorization: Bearer fc-YOUR_API_KEY` | CODE |
| HIGH | tools/integrations/firecrawl.md | 30 | Authorization: Bearer fc-YOUR_API_KEY | CODE |
| HIGH | tools/integrations/browserbase.md | 17 | - **Header**: `x-bb-api-key: YOUR_API_KEY` | CODE |
| HIGH | tools/integrations/browserbase.md | 28 | x-bb-api-key: YOUR_API_KEY | CODE |
| HIGH | tools/integrations/trustpilot.md | 17 | - **Public Header**: `apikey: {YOUR_API_KEY}` | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_skill_packaging.py | 99 | def test_repeat_builds_are_byte_identical(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 105 | def test_frozen_revision_ignores_dirty_worktree_and_untracked_files(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 113 | def test_explicit_old_revision_uses_its_own_descriptions(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 122 | def test_missing_override_fails_before_writing_any_selection(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 129 | def test_invalid_overrides_are_rejected(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 138 | def test_release_subset_lists_new_and_stale_skills_but_source_is_complete(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 156 | def test_release_subset_keeps_current_reviewed_mappings(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 163 | def test_changed_source_triggers_require_new_review(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 169 | def test_unknown_or_traversal_selection_is_rejected(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 174 | def test_selected_subset_does_not_package_other_skill(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 180 | def test_tracked_symlink_is_not_followed(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 187 | def test_configured_size_bound_fails_without_partial_outputs(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 192 | def test_oversized_resource_is_rejected_before_blob_loading(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 203 | def test_oversized_license_is_rejected_before_blob_loading(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 213 | def test_oversized_source_skill_is_rejected_before_blob_loading(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 223 | def test_web_metadata_shrink_uses_packaged_size_bound(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 229 | def test_crlf_body_and_quoted_description_are_preserved(self): | CODE |
| LOW⚡ | tests/test_skill_packaging.py | 235 | def test_perplexity_archive_puts_skill_at_root_with_original_metadata(self): | CODE |
| LOW | tests/test_skill_packaging.py | 69 | def test_source_archive_keeps_actual_routes_bytes_and_license(self): | CODE |
| LOW | tests/test_skill_packaging.py | 84 | def test_web_archive_changes_only_description_and_records_exact_hashes(self): | CODE |
| LOW | tests/test_skill_packaging.py | 260 | def test_perplexity_caps_size_at_its_upload_limit(self): | CODE |
| LOW | …s/conversion-tracking/assets/snippets/gravity-forms.js | 70 | function hasVisibleValidationErrors(rootEl) { | CODE |
| LOW | …s/conversion-tracking/assets/snippets/gravity-forms.js | 101 | function hasServerRejectionMarkers(formId) { | CODE |
| LOW | …ng/assets/gtm-recipes/detect/detect-gravity-forms.json | 32 | "value": "<script>\n/* Gravity Forms Submission Listener.\n * Event-only adaptation of verified production d | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/integrations/hyperframes.md | 31 | npx hyperframes init my-video # scaffold a project from a template | CODE |
| MEDIUM | skills/ads/references/abm-playbook.md | 66 | ## Cross-channel orchestration | COMMENT |
| MEDIUM | skills/ads/references/abm-playbook.md | 80 | ## Sales orchestration | COMMENT |
| MEDIUM | skills/marketing-loops/references/loop-guardrails.md | 17 | ## Spend guardrails (ad-fatigue, paid-search, retargeting, expansion) | COMMENT |
| MEDIUM | skills/marketing-loops/references/loop-guardrails.md | 24 | ## Publish & send guardrails (email, social, PR, community, reviews) | COMMENT |
| MEDIUM | …customer-research/references/interviews-and-surveys.md | 134 | ### Survey design guardrails | COMMENT |
| MEDIUM | …lls/marketing-plan/references/team-and-agency-model.md | 272 | ## Operational guardrails | COMMENT |
| MEDIUM | skills/marketing-plan/references/growth-patterns.md | 107 | ### The orchestration | COMMENT |
| MEDIUM | skills/ai-seo/references/agent-readiness.md | 9 | | **Is Agentic** (Vercel + Ora) | `npx is-agentic yourdomain.com` or [is-agentic.com](https://is-agentic.com) | 100+ che | CODE |
| MEDIUM | skills/attribution/references/first-party-tracking.md | 156 | ## Step 3 — The guardrails (do not skip) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/run-regression.sh | 1 | #!/bin/bash | COMMENT |
| LOW | …nversion-tracking/assets/snippets/squarespace-forms.js | 1 | /*! Squarespace Forms conversion detection (MIT) | COMMENT |
| LOW | …nversion-tracking/assets/snippets/squarespace-forms.js | 21 | // server decides: 204 on success, 400 for a field error, 401 for a failed | COMMENT |
| LOW | …s/conversion-tracking/assets/snippets/hubspot-forms.js | 101 | } catch (e) { | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | validate-skills.sh | 36 | # Check if SKILL.md exists | COMMENT |
| LOW | validate-skills-official.sh | 40 | # Check if skills-ref is already installed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/package_skills.py | 34 | CODE | |
| LOW | scripts/package_skills.py | 82 | CODE | |
| LOW | skills/conversion-tracking/scripts/build_recipe.py | 101 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/package_skills.py | 10 | CODE |