docs(redirects): add 51 verified redirects for pre-migration URLs still 404ing - #2299
Conversation
palango
left a comment
There was a problem hiding this comment.
Reviewed against the PR head (f83df74), checking every destination against origin/main rather than the branch working tree, since the branch is based on 2ed9dba9 and main is at 6136d331. The file itself is sound: docs.json parses, mint broken-links passes, there are no duplicate sources in the array, none of the 36 new sources collides with anything on main, and the three catch-alls are the last three entries with every specific source above the wildcard that would otherwise swallow it. Ten of the twelve sources I sampled do 404 today.
Twelve findings. Nine are inline on the diff; the three below anchor outside it.
Ranked, most severe first: 1. four disclaimer redirects chain (inline, 3536) 2. /general/ecosystem/daos chains (inline, 3432) 3. the branch predates both merges that caused 1 and 2 (below) 4. the second commit does what the body says this PR does not (below) 5. /v2/:slug* discards mappings the first commit writes by hand (inline, 3556) 6. /developer-resources/:slug* swallows 501 files (inline, 3560) 7. /about-celo/:slug* misses two of its own children (inline, 3420) 8. four testnet landing URLs still 404 (inline, 3540) 9. /oracle and /network/cannoli indexes get no entry (inline, 3484) 10. eight /protocol/identity/* siblings left 404ing (inline, 3480) 11. .../usage resolves two ways (inline, 3468) 12. two sampled sources already return 200 (below).
Branch base (findings 1 and 2 exist only because of it). The branch is based on 2ed9dba9; main is at 6136d331. #2293 (bb57fda6) and #2301 (6136d331) both rewrote docs.json in between, and both chained destinations were live at the branch base and are gone on main. GitHub still calls this MERGEABLE, because the new entries append to the end of the array while main's changes sit mid-array, so nothing flags it at merge time. Rebase, then re-check each destination against main.
The second commit does what the body says this PR does not. The body has a section headed "What it does NOT do (tracked in #2298)" naming "The 3 bulk buckets (old /blog/** 415, /v2/** 107, generated /developer-resources/** API dumps 449) — those need a target decision". Commit f83df74 adds all three as catch-alls. The counts disagree too: the body says 33 redirects and 714 → 747, the branch has 36 and 714 → 750, and the difference is those three entries. Either split the commit into its own PR against #2298, or rewrite the body to own the decision.
Two sampled sources already resolve. Of the twelve I checked against the live site, /community/release-process and /developer-resources/contractkit return 200 today, on /contribute-to-celo/release-process and /tooling/libraries-sdks/contractkit. Nothing in main's docs.json matches either, so something outside the file is handling them and I cannot tell you what. Explicit entries beat whatever that is, but the same method produced the other 31 sources, so check how the audit sampled.
| "destination": "/build-on-celo/build-with-ai/mcp/celina" | ||
| }, | ||
| { | ||
| "source": "/network/cannoli/disclaimer", |
There was a problem hiding this comment.
All four of these disclaimer redirects land on a redirect rather than a page, so all four 404. /tooling/testnets/celo-sepolia/disclaimer was deleted by #2293 (merged as bb57fda6) and is now itself a source, pointing at /tooling/testnets/celo-sepolia/index. Mintlify takes one hop. AGENTS.md section 2: point at the final page, not at another redirect. Give all four /tooling/testnets/celo-sepolia/index, the destination #2293 already chose for the /network/*/disclaimer sources.
| "destination": "/tooling/testnets/celo-sepolia/disclaimer" | ||
| }, | ||
| { | ||
| "source": "/tooling/testnets/alfajores/disclaimer", |
There was a problem hiding this comment.
The disclaimers get redirects and the landing pages do not. tooling/testnets/alfajores/index.mdx, baklava/index.mdx, mainnet/index.mdx and eclair/index.mdx all existed, added in d09e2b60, and main carries no /tooling/testnets source apart from the celo-sepolia disclaimer. A testnet landing page collects more inbound links than its disclaimer does. Add the four bare paths pointing at /tooling/testnets/celo-sepolia, matching the /network/eclair/:slug* convention already in the file.
| "destination": "/tooling/libraries-sdks/contractkit/odis" | ||
| }, | ||
| { | ||
| "source": "/oracle/band-protocol", |
There was a problem hiding this comment.
/oracle gets no entry while all three of its children do. docs/oracle/index.md existed alongside band-protocol.md, redstone.md and run.md, and docs/network/cannoli/index.md is in the same position relative to the cannoli disclaimer below. A category index is usually the most linked URL in its group, so these are the 404s the audit set out to close. /oracle to /tooling/oracles, /network/cannoli to /tooling/testnets/celo-sepolia.
| "destination": "/tooling/libraries-sdks/contractkit" | ||
| }, | ||
| { | ||
| "source": "/developer-resources/dappkit/usage", |
There was a problem hiding this comment.
These two send .../usage somewhere different from the entries already on main. Main maps /developer-guide/contractkit/usage and /developer-resources/contractkit/usage to /tooling/libraries-sdks/contractkit/setup; these map /developer-resources/dappkit/usage and /developer/dappkit/usage to /tooling/libraries-sdks/contractkit/usage. Both pages exist, so nothing 404s, but two readers following the same old ContractKit usage link from different eras land on different pages. Pick one and make the four agree.
…ll 404ing GA4 shows 'Page Not Found' is the #4 most-viewed page (~4.4% of pageviews). An audit of the full git history found ~1,266 old public URLs that 404 with no redirect. This adds the 33 high-confidence ones — every destination verified to be a live page on main — led by /about-celo/:slug* -> /home/:slug* (covers 26 pages). Bulk buckets (old blog, v2 GitBook, generated API dumps) and paths needing editorial targets are tracked in the issue, not here. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ing siblings - Point the four testnet disclaimer sources at /tooling/testnets/celo-sepolia/index instead of /tooling/testnets/celo-sepolia/disclaimer, which #2293 turned into a redirect source (Mintlify takes one hop, so all four 404'd) - Point /general/ecosystem/daos at /contribute-to-celo instead of the page #2301 deleted, matching its three siblings - Add /about-celo, /about-celo/manage/exchange and /about-celo/protocol/consensus above the /about-celo/:slug* wildcard, which would otherwise send them to 404s - Add the four testnet landing pages, /oracle and /network/cannoli - Add the nine /protocol/identity/* siblings, mirroring the /legacy/protocol/identity destinations already on main - Align the two new dappkit .../usage entries with main's contractkit convention Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
f83df74 to
14c2efe
Compare
|
Rebased onto 3 — branch base. Rebased. The catch-all commit is dropped (see 4), so the branch is 4 — the second commit does what the body says this PR does not. Took the split option: commit 1 — four disclaimer redirects chain. Fixed. All four now point at 2 — 7 — 8 — four testnet landing URLs. Added, all four to 9 — 10 — eight 11 — 5, 6 — the 12 — sources that already resolve. You sampled 12 and found 2. I checked all 51 against production:
The third is Worth flagging: my first sweep reported all 51 as 404. That was a bug in my own test script, not the site — BSD Also checked over the whole array, not just the diff: 0 duplicate sources, 0 chains, 0 destinations without a page on disk. The diff is redirect entries only. |
palango
left a comment
There was a problem hiding this comment.
All twelve findings from the previous round are addressed. Re-checked against head 14c2efee with destinations resolved on origin/main (25aca481).
The four disclaimer redirects and /general/ecosystem/daos now point at final pages, the branch is rebased past the two merges that caused those chains, and the three catch-all wildcards are gone along with the commit that added them, so the body and the diff agree again. The /about-celo/:slug* wildcard has its two exceptions and the bare path above it and now sits at the end of the block. Testnet landings, /oracle, /network/cannoli, the nine /protocol/identity/* siblings and the two dappkit usage entries all landed as discussed, with the identity destinations matching main's /legacy/ twins exactly.
Verified independently: docs.json parses, 737 to 788 with 51 new sources, no duplicates, no chains against any specific source or :slug* prefix in the array, every non-wildcard destination backed by a real file, no new source shadowed by an earlier wildcard, and all 29 historical about-celo/ paths reaching a live page. Live sample of ten sources matched the body. CI green.
Two non-blocking notes. The branch is behind main by e1f87763 and 25aca481; neither touches docs.json, so Update branch is enough before merge. And the PR mixes bare group destinations with /index-suffixed ones, which main already does in both directions, so it is pre-existing noise rather than anything this PR introduces.
Why
GA4 shows the "Page Not Found" page is the #4 most-viewed page on docs.celo.org (~4.4% of pageviews). An audit of the full git history (
git log --all, both the Docusaurus and Mintlify eras) found ~1,266 old public URLs that 404 with no redirect. See #2298 for the full breakdown.What this PR does
Adds 51 redirect sources,
docs.jsononly,737 → 788entries. Every destination is a live page onmain./about-celo/:slug* → /home/:slug*— one wildcard covering theabout-celo/→home/rename, with/about-celo,/about-celo/manage/exchangeand/about-celo/protocol/consensusplaced above it because the wildcard alone sends those three to 404s./developer/dev-environments/{hardhat,foundry,remix,thirdweb}→/tooling/dev-environments/*(not caught by existing/developer/*wildcards)./protocol/identity/*siblings, mirroring the/legacy/protocol/identity/*destinations already onmain./oracle,/network/cannoli, and oldholder/manage/,community/,general/paths.What it does NOT do (tracked in #2298)
/blog/**(415),/v2/**(107), generated/developer-resources/**API dumps (449). An earlier revision of this branch added these as catch-all wildcards; that commit has been dropped, so the PR now matches this section. The review found two concrete reasons the wildcards were wrong as written, both recorded on task: Audit historical architecture changes and add missing redirects (Page Not Found is the #4 most-viewed page in GA4) #2298 so the analysis is not lost.Verification
Checked programmatically over the whole array on this head:
.mdxon disk.docs.json.Live status of all 51 sources against production:
The three that already resolve are
/community/release-process,/developer-resources/contractkitand/developer-resources/forno. Something outsidedocs.jsonhandles them; explicit entries are still preferable, but this confirms the audit's source list was not live-checked. Full sweep replaces the earlier spot-check.Refs #2298