Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when applies to any site with user-generated slugs, CMS-generated URLs, or content in non-English languages. Use when auditing URLs for crawl errors or canonicalization issues.
.claude/skills/thedaviddias-special-chars/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-02 | ✓→✓ | = Same ✓ | -8% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 53% | 0% |
| case-04 | ✓→✓ | = Same ✓ | -1% | 0% |
| case-05 | ✓→✓ | = Same ✓ | -23% | 0% |
Special characters in URL paths cause inconsistent crawling, broken links when shared, and canonicalization failures when different systems encode them differently.
-, _, ., ~%20 (not +, which is query-string syntax)#, ?, &, = have reserved meaning in URLs and must be percent-encoded in path segmentsScan all crawled URL paths for characters outside [A-Za-z0-9\-_./~]. Flag URLs containing spaces (%20 or literal), special symbols (#, ?, &, =, + in paths), or unencoded non-ASCII characters. Check if different encodings of the same URL return separate 200 responses.
Update the URL generation logic in your CMS or framework to strip or replace special characters. Replace spaces with hyphens. Percent-encode any reserved characters that must appear in paths. Set up redirects from problematic old URLs to clean new slugs.
Explain the difference between reserved and unreserved characters in RFC 3986, how browsers and crawlers handle inconsistent percent-encoding, and why special characters in paths create duplicate content risks.
Review metadata generation, rendered HTML, structured data, and response headers related to URL Special Characters. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.
For full implementation details, code examples, and framework-specific guidance, see references/rule.md.
Rule page: https://frontendchecklist.io/en/rules/seo/special-chars
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 19,227 | 14,313 | -26% | 1 | 1 | 0% | 3,297 | 3,042 | -8% | 0 | 0 | — |
case-02 | pass→pass | 12,181 | 8,249 | -32% | 1 | 1 | 0% | 2,173 | 2,005 | -8% | 0 | 0 | — |
case-03 | pass→pass | 5,561 | 6,319 | +14% | 1 | 1 | 0% | 1,034 | 1,579 | +53% | 0 | 0 | — |
case-04 | pass→pass | 9,894 | 7,314 | -26% | 1 | 1 | 0% | 1,802 | 1,780 | -1% | 0 | 0 | — |
case-05 | pass→pass | 16,059 | 9,510 | -41% | 1 | 1 | 0% | 2,832 | 2,184 | -23% | 0 | 0 | — |
case-11 | pass→pass | 8,587 | 6,207 | -28% | 1 | 1 | 0% | 1,642 | 1,531 | -7% | 0 | 0 | — |
case-06 | pass→pass | 12,181 | 9,793 | -20% | 1 | 1 | 0% | 2,303 | 2,221 | -4% | 0 | 0 | — |
case-07 | pass→pass | 7,844 | 6,146 | -22% | 1 | 1 | 0% | 1,487 | 1,549 | +4% | 0 | 0 | — |
case-08 | pass→pass | 13,742 | 11,580 | -16% | 1 | 1 | 0% | 2,412 | 2,503 | +4% | 0 | 0 | — |
case-09 | pass→pass | 22,209 | 19,142 | -14% | 1 | 1 | 0% | 3,600 | 3,472 | -4% | 0 | 0 | — |
case-10 | fail→pass | 16,653 | 15,513 | -7% | 1 | 1 | 0% | 2,892 | 3,132 | +8% | 0 | 0 | — |
case-12 | pass→pass | 14,322 | 12,261 | -14% | 1 | 1 | 0% | 2,565 | 2,561 | -0% | 0 | 0 | — |
case-13 | pass→pass | 11,630 | 9,407 | -19% | 1 | 1 | 0% | 2,032 | 2,048 | +1% | 0 | 0 | — |
case-14 | pass→pass | 9,790 | 4,477 | -54% | 1 | 1 | 0% | 1,943 | 1,188 | -39% | 0 | 0 | — |
case-15 | pass→pass | 11,424 | 8,741 | -23% | 1 | 1 | 0% | 2,046 | 2,118 | +4% | 0 | 0 | — |
case-16 | pass→pass | 13,922 | 9,958 | -28% | 1 | 1 | 0% | 2,383 | 2,245 | -6% | 0 | 0 | — |
case-17 | pass→pass | 8,400 | 6,473 | -23% | 1 | 1 | 0% | 1,484 | 1,563 | +5% | 0 | 0 | — |
case-18 | pass→pass | 16,433 | 12,078 | -27% | 1 | 1 | 0% | 2,751 | 2,215 | -19% | 0 | 0 | — |
case-19 | pass→pass | 18,360 | 13,954 | -24% | 1 | 1 | 0% | 3,116 | 2,886 | -7% | 0 | 0 | — |
case-20 | pass→pass | 10,531 | 7,486 | -29% | 1 | 1 | 0% | 2,077 | 1,835 | -12% | 0 | 0 | — |
case-21 | pass→pass | 5,470 | 6,218 | +14% | 1 | 1 | 0% | 992 | 1,497 | +51% | 0 | 0 | — |
case-22 | pass→pass | 9,406 | 10,241 | +9% | 1 | 1 | 0% | 1,719 | 2,369 | +38% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +5 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.