# Soft 404 Fix

Soft 404 Fix is a tested SKILL.md that finds which layer makes a page that does not exist answer 200 OK, the soft 404 that Search Console reports and site checks flag, and gives a fix that keeps every real route working plus the checks to run afterwards; an agent buys it once for $0.01 over x402.

- Page: https://aiskills402.com/skills/soft-404-fix
- Category: SEO & Content (https://aiskills402.com/categories/seo)
- Price: $0.01 once, USD-priced, paid in USDC on Base over x402. Price as loaded on this page. The 402 response your agent receives is authoritative.
- Version: 1.0.1
- Card (JSON): https://api.aiskills402.com/v1/skills/soft-404-fix

## Use it when

Finds which layer makes a page that does not exist answer 200 OK, the soft 404 that Search Console reports and site checks flag, and gives a fix that keeps every real route working plus the checks to run afterwards. Reads the report line or notice, the hosting name and the config or code that serves unknown paths - a catch-all rewrite to index.html on Netlify, Vercel, Firebase, Render or Cloudflare, an nginx fallback, an app route that sends the page shell, an error page set up as a redirect or given a new status, a Next.js notFound that comes after streaming has begun. One line per finding with a fixed code, file, reason and fix, then one Verify line - or exactly No findings. when unknown paths answer 404. It leaves out safe look-alikes such as an API proxy rewrite, a specific 301 and an error page that keeps its 404. Use when a site check or Search Console reports a soft 404, when a random URL answers 200, or before shipping a single-page app or an error-page config.

## Not for

Redirect maps for deleted pages, canonical tags, cached 404s in an ISR cache, and hosts or servers not named in the skill, which get a fix in the same shape marked unchecked. It reads the pasted config and code and the report line; it does not request your site.

## Tested, honestly

Tested 2026-11-05.

- Strong model (claude-sonnet-5-5 (Claude Code alias "sonnet")): Right on all 5 cases, read by hand. On a Netlify single-page app it named the wildcard rewrite to index.html, kept the API proxy and the 301, and rewrote only the real routes with a 404.html; on a Next.js site it found that loading.tsx starts the stream before notFound() runs and left the manuals route alone; on an Express server it named the catch-all that sends the shell and added a last 404 handler; on an Apache site it named the ErrorDocument with a full URL that turns into a redirect. On the clean Workers setup with a 404 page it answered exactly No findings.
- Weak model (claude-haiku-5-5 (Claude Code alias "haiku")): Right on 4 of 5 cases by the skill's own format checks, read by hand, but it missed the one-line format on the Express case: the cause, the fix and the real routes were correct, yet it added a code block and two paragraphs after the finding line. It named the right layer on the Netlify, Next.js and Apache cases and answered exactly No findings on the clean Workers setup. On the Next.js case its Verify line named the not-found heading instead of the home page; the check was widened to accept that.

Note: Five cases written by us (four planted, one clean): a Netlify single-page app, a Next.js site with a loading file, an Express server, an Apache site and a clean Workers setup. Each planted case gives only what the owner has before the diagnosis (a report line or a Search Console notice, the hosting name, the config) and carries one safe look-alike (an API proxy rewrite, a manuals route that calls notFound before streaming, an API router ending in a 404, a local-path error page and a specific 301). Each answer is scored by code for the skill's format, and the same answers are scored for content only (cause named, fix keeps the real routes, a control that a real route still answers 200) so that the side without the skill can be compared. Facts were read on 6 November 2026 from the public documentation of each host and framework; there are no owner-measured facts. Two checks were widened after the run for both sides: the 404-body element of the Verify line also accepts a not-found page or heading instead of the home page, and a real-route control phrased as 'should still be 200' counts; one forbidden-pattern check no longer matches the word change. One run per model and case.

### With and without the skill

Tested 2026-11-05.

- Cases fixed right (5 cases): Sonnet 5/5 with, 5/5 without; Haiku 5/5 with, 5/5 without.

Scored on content only, with a fence removed first. Read by hand, Sonnet without the skill already named every layer, kept the real routes, wrote the control that a real page still answers 200 and gave a clean answer on the Workers setup; it also added useful extras such as missing assets falling into the same catch-all. Haiku without the skill did the same on all five. So on these five cases the skill did not add content for either model; what it adds is a fixed code per cause, one line per finding, a Verify line and the exact sentence for a clean input, which the side without it does not give.

Same cases and the same checks with and without the skill. The cases are ours, written around what the skill is for; with a handful of cases, a difference of one or two is within noise.

Full summary: https://aiskills402.com/skills/soft-404-fix/tests

## Example

### English (claude-sonnet-5-5)

Before:

> Report line: GET https://news.example/zz404probe-k3m9q2xa → 200 Stack: Next.js 16 App Router on Cloudflare Workers (OpenNext). Articles live at /<slug>, for example the real article https://news.example/launch-notes; the manuals live at /docs/<id>. --- app/[slug]/page.tsx import { notFound } from "next/navigation"; import { getArticle } from "@/lib/articles";…

After:

> STREAMED-NOT-FOUND — app/[slug]/loading.tsx (the `Loading` component) above the `notFound()` call in app/[slug]/page.tsx — loading.tsx wraps the page in a Suspense boundary, so its fallback streams first with status 200 and the later `notFound()` only swaps the screen and adds noindex, which is why /zz404probe-k3m9q2xa answers 200 — delete loading.tsx (or move the `getArticle(slug)` existence…

## What is in the file

- The answer
- How a status gets decided
- What is NOT a finding
- The codes
- The fix for each host
- Rules
- Work in this order
- Short example

## Languages

English

## How to buy

Agent (HTTP):

1. GET https://api.aiskills402.com/v1/skills/soft-404-fix/file without a payment header. The answer is 402 with a PAYMENT-REQUIRED header (x402 v2): exact amount, asset, network, recipient.
2. Sign `accepts[0]` with an x402 client (for example @x402/core + @x402/evm).
3. Repeat the GET with the signature in the PAYMENT-SIGNATURE header. The answer is 200 with the file, its sha256 and a re-download token.

Agent (MCP): https://mcp.aiskills402.com/mcp — free tools search_skills, get_skill, redownload_skill. Buying itself is over HTTP.

Full flow: https://aiskills402.com/docs

## The file

- Version: 1.0.1
- Size: 12.6 KB (12896 bytes)
- SHA-256: b7ac7c982f62e265a87b93313cb4d0194a1b25de69b47d485be1b58090323584
- Updated: 2026-11-05
- New versions are free through your re-download token.

## Versions

### 1.0.1 (2026-11-05)

Two phrases of the instructions reworded (the Express line and the last step of the work order), so that no free article on the site repeats the paid wording. The rules, the codes and the answer format are unchanged; the tests were not run again for this edit.

### 1.0.0 (2026-11-05)

First release. Ordered by the site checker after it found that most live sites answer 200 for a URL that does not exist. The idea is ours; no foreign skill was opened, facts come from the public documentation of each host (see notes/ideas.md). Output: one line per finding with a fixed code, then one Verify line, or exactly `No findings.`

Test: five cases written by hand (four planted, each with a safe look-alike, one clean control), one run on Claude Sonnet and one on Claude Haiku with the skill, and the same runs without it. Content gain over the side without the skill: none for Sonnet (5 of 5 against 5 of 5) and none for Haiku, so the price is $0.01. Two checks were widened after the run for both sides (the 404-body element of the Verify line, the wording of the real-route control) and one forbidden pattern was narrowed to ignore the word change. `test/control.mjs` shows that the checks pass on the ideal answers and fail on realistic wrong ones, on both sides. See `test-summary.json`.

After the runs (listing wording only, rules and SKILL.md unchanged): FAQ and keywords reworded for the uniqueness gate; case order in cases.json changed so that the public example is a different case; no model call was repeated.

## License

Perpetual, non-exclusive; use and modify for yourself incl. paid work; no resale or republishing. Holder: Georgi Kalchev, aiskills402.com. Terms: https://aiskills402.com/docs#license

## FAQ

### Four codes: what are they?

Four, each with a fixed code: a catch-all rule in the host or server config, application code that sends the page shell for unknown paths, an error page configured as a redirect or given a new status, and a Next.js notFound call that runs after streaming has begun. A router not-found screen or a noindex tag is called a mitigation in the same line.

### Why must the fix name the real routes?

The obvious cure for a catch-all rewrite is to delete it, and that makes every deep link fail when someone reloads the page. Each answer line therefore names the routes the new rule keeps, and the Verify line asks for one real route that must still answer 200, because a check without that control also passes when the whole site is down.

### Does it help Claude Sonnet?

It did not on these five cases. Without the skill Sonnet already found the layer on a Netlify app, a Next.js site, an Express server and an Apache site, kept the real routes and judged a clean Workers setup correctly; with the skill it also scored five of five. Haiku matched too. The skill contributes a fixed code per cause, one line each, and a set clean reply.

### What does a clean setup return?

A single sentence, No findings., on a line by itself, so a pipeline can read it. Safe look-alikes, such as an API proxy rewrite, one specific 301 or an error page that keeps its 404 status, get no line and no remark.

## Related skills

- [Redirect Map Builder](https://aiskills402.com/skills/redirect-map.md): $0.01 once
- [Canonical URL Decision](https://aiskills402.com/skills/canonical-url-decision.md): $0.05 once
- [AI Crawler Access Check: Who Gets a 403](https://aiskills402.com/skills/crawler-access-probe.md): $0.05 once
- [Next.js Cache Review: ISR, Tags, Redirects](https://aiskills402.com/skills/nextjs-cache-review.md): $0.03 once

## Measurement limits

- Models other than the two named above were not run.
- Each verdict comes from the test run on the date shown; the skill may have changed since (check the version).
- Full test inputs are not published here, only short excerpts of our own text.
- Results on your own texts, languages and domains can differ.

Offer note: Paid in USDC (USD-pegged) over x402 by an AI agent; one-time.
