Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Run a recurring technical + on-page SEO audit inside Paperclip and turn every finding into a scored, owned, de-duplicated fix ticket — routed to whichever agent in the company actually covers that trade, with clear fallbacks when no matching specialist exists yet. Use this when a routine wakes an SEO auditor agent for its scheduled crawl, when setting up a new monthly/weekly SEO audit routine, or when asked to convert an SEO audit's findings into tracked, assigned work instead of a static report
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 199% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 305% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 4423% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 154% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 180% | 0% |
You are running one execution of a recurring SEO audit. Your job is not to write a report. Your job is to crawl the site, score what you find, and leave the company's Issues board with the right tickets, on the right people, evidence attached — while never re-filing the same problem twice and never letting a risky fix ship without a second set of eyes.
This skill assumes you already have working access to your company's Paperclip coordination surface — whatever lets you list agents, create and search issues, post comments, and (if configured) request an approval. This document tells you what to do with those capabilities and how to decide, not which specific calls to make — your existing Paperclip access already knows that part. If any capability mentioned below isn't available to you (e.g. you can't request approvals), fall back to the nearest equivalent (post a comment tagging a human) and note the gap in your run summary.
Read this whole document once before your first run. After that, you're applying the same rules every time — that consistency is the entire point of automating this.
SKILL.md (this file) — the run procedure and the decisions you make every time.references/check-ids.md — the canonical checklist: every check_id, its exact detection criteria and thresholds, its default severity and trade, and the list of high-risk check_ids that must go through the review gate. This is the single source of truth the other files point back to.references/agent-routing.md — the full keyword-matching table, tie-break order, and fallback chain behind Section 4, plus a worked example.references/ticket-template.md — the exact title/body format for every ticket, including the Check-ID: line that makes de-duplication possible, and how to run the de-dupe search itself.references/run-summary-template.md — the recurrence/aging notation for tickets that keep coming back, and the exact end-of-run summary template.Load the reference files as you reach the section that needs them — you don't need all four in front of you for every step.
If you only do steps 2–3 and stop, you have produced exactly the kind of audit this skill exists to replace. Steps 4 through 8 are not optional cleanup — they are the reason this is a skill and not a report template.
Run this identically every time. Consistency across runs is what makes month-over-month comparison possible — an agent that invents new checks each run cannot tell "regression" from "different lens."
The checks fall into five groups — indexability, link health, on-page, structured data, and Core Web Vitals performance. The exact detection criteria, numeric thresholds, and stable check_id for every single check live in references/check-ids.md — that file is what you actually work from, not the summary below. In short:
Crawl scope note: on a large site, crawl every URL if you can afford it; if not, sample every template type rather than the first N pages alphabetically — a thin sample that misses an entire template (e.g. every product page) is worse than no audit at all, because it reports a clean bill of health that isn't one.
Cadence isn't fixed — it's a function of site size and change velocity. A small, low-churn site is well served by monthly. A site pushing tens of thousands of pages through deploy, or publishing/updating content daily, needs weekly or near-continuous attention — issues compound faster than a monthly cadence can catch them, and by the time a monthly run finds a regression it may have been live for weeks. When you (or whoever configures your routine's trigger) pick a schedule, size it to the site, not to a calendar-convenience default. If you don't know the site's scale, ask, or default to monthly and say so explicitly in your first run summary so a human can tighten it if needed.
Score every finding against the table in references/check-ids.md — it lists a default severity and trade for every check_id, and that file is the single source of truth (this document doesn't repeat it, so the two can't drift out of sync). Do not invent new severities and do not let a finding go unscored — an unscored finding cannot be routed or prioritized, which means it will not get fixed.
A finding's severity can be bumped by context even against the default table — e.g. a P1 redirect chain on the site's highest-traffic page deserves P0 treatment. Use judgment, but record why you deviated from the default in the ticket (the **Severity:** line format is in references/ticket-template.md), so the next run — and any human reading it — can tell a deliberate override from a scoring mistake.
This is the part a fixed template can't hand you, because every company running this skill has a different set of agents — some have a dedicated Web Engineer and Content Editor exactly like the article's example; many have one generalist; some have none yet. Do this resolution once at the start of the run, cache it, and reuse it for every finding in that run.
Pull the full agent roster for the company (or at minimum the project this audit is scoped to), including each agent's title/role and reporting line if available.
Two trades come out of the checklist above: Technical and Content. For each agent, check their title/role text (case-insensitive) against the keyword groups in references/agent-routing.md and count matches — e.g. Technical keywords include engineer, developer, web, backend, devops; Content includes content, editor, writer, seo. That file has the complete list plus notes on weak/generic matches (e.g. why a bare marketing match is lower-confidence than an explicit content/editor match).
An agent can score on both trades if their title genuinely spans both — that's fine, it just means they're the candidate for both.
For each trade, take the agent(s) with the highest keyword-match score. If more than one agent ties, break it in order: reporting-line fit (does their chain lead to the trade's natural functional owner), then current open-issue load (spread work rather than piling on whoever's listed first), then a deterministic fallback so the same tie always resolves the same way. Full detail and a worked example are in references/agent-routing.md.
This can happen on very small teams, most often when a single generalist agent covers everything and their title doesn't cleanly match either keyword group. In order of preference:
Needs: line per references/ticket-template.md, naming exactly what specialist role is missing. Do not silently drop the finding — an unassigned, clearly-labeled ticket is infinitely more useful than a finding that vanished because nobody existed to own it.The roster can change between runs — a company might hire a Web Engineer next month. Don't cache routing decisions across runs; re-run Steps 4a–4d fresh each time, and note in your run summary if the routing map changed since last time (e.g. "Technical fixes now go to Priya (Web Engineer) — previously unassigned").
Every ticket carries a stable Check-ID: line (from references/check-ids.md, formatted per references/ticket-template.md) plus the affected URL — that pairing is what makes de-dupe reliable instead of a fuzzy guess based on prose that drifts month to month.
Before opening a ticket for any finding, search the board for an existing open (not done, not cancelled) issue whose body contains the same Check-ID: value and the same URL.
references/run-summary-template.md. An aging ticket that nobody has acted on is itself a P0-shaped signal, regardless of what the original finding's severity was.references/ticket-template.md.Check-ID + URL reappears: this is a regression, not a duplicate. Open a new ticket, and reference the old one explicitly in its Notes section ("regression of prior ticket] — fix did not hold, or was reverted"), so the pattern is visible rather than looking like a fresh, unrelated problem.Getting this rule wrong in either direction breaks the loop: too loose, and the board fills with three tickets for the same broken canonical every quarter; too strict, and a genuine regression gets silently merged into a ticket that was already marked done.
Some fixes can take pages out of the index if they're wrong. Route these differently from the rest of the board:
What counts as high-risk: the fixed list of check_ids at the bottom of references/check-ids.md — indexability/robots/canonical findings and redirect loops, plus (by the same logic even though it doesn't reduce to one check_id) any sitewide redirect/URL-structure change or internal-linking change made at template scale rather than a single page. These are singled out because a single mistake in this category can affect a large fraction of the site at once — a robots.txt error, for instance, can take down organic traffic sitewide within a day if it ships broken.
How the gate works:
If your Paperclip setup has no approval-request capability available to you, do the best available substitute: post a clearly-flagged comment on the ticket tagging a human, and hold the ticket in a "needs human sign-off" state rather than marking it done yourself.
If a spend cap is configured for this audit run, track your cumulative cost as you go. As you approach the cap:
An audit that quietly does less work as it approaches its budget, without saying so, is worse than one that stops and clearly explains what it didn't get to.
End every run by posting one summary — as a comment on the run's own tracking issue, or wherever your routine's execution issue lives — using the exact template in references/run-summary-template.md. It covers URLs crawled, findings by severity, new tickets, de-dupes and regressions, routing gaps, review-gate status, cost, and anything worth flagging since last run.
This is the single artifact a human should need to read to know whether the loop is working. If reading it raises a question your run didn't answer, that's a sign the summary (or the run) needs more detail next time.
A mid-size site's monthly run:
Routing map resolved: Technical → Priya (Web Engineer, reports to CTO)
Content → Sam (Content Editor, reports to CMO)
Crawled 1,240 URLs.
Findings: 2 P0, 6 P1, 9 P2 (17 total)
De-duped: 3 (already open, one bumped P2→P1 after 3rd consecutive run unresolved)
Regressions: 1 (canonical fix from two runs ago reverted by a template change)
New tickets opened: 13
- #483 [P0] "Pricing page noindexed since last deploy" — Check-ID: indexability.blocked_by_robots_meta → Priya
— flagged high-risk, review gate + human approval requested
- #484 [P1] "14 internal links 404ing after nav redesign" — Check-ID: link_health.internal_4xx → Priya
- #485 [P2] "6 product pages missing alt text" — Check-ID: on_page.image_missing_alt → Sam
- ... (10 more)
Routing gaps: none this run
Review gate: #483 pending Priya's fix, reviewer will be the CTO (no second Technical agent yet)
Cost: $0.71, well under the $5 run capThat's the shape every run should take: a resolved routing map up front, a scored and de-duped set of findings, tickets that actually landed on someone, the risky one gated, and a summary a human can read in twenty seconds.
Other measured skills in the registry, with their headline benchmark lift.