Skip to content

docs: resolve the 20 orphaned pages — 10 re-nav'd, 10 deleted with redirects (#2253) - #2293

Merged
palango merged 6 commits into
mainfrom
GigaHierz/2253-orphan-audit
Sep 1, 2026
Merged

docs: resolve the 20 orphaned pages — 10 re-nav'd, 10 deleted with redirects (#2253)#2293
palango merged 6 commits into
mainfrom
GigaHierz/2253-orphan-audit

Conversation

@GigaHierz

Copy link
Copy Markdown
Contributor

Closes #2253. Stacked on #2291 — base is GigaHierz/2255-thirdweb-one-page, since the orphan check can only flip to gating once the three thirdweb orphans are also gone. Review that one first; this retargets to main automatically when it merges.

What changed

All 20 non-thirdweb orphans resolved per the decisions in the audit sheet (the Remove column plus its Notes). Every .mdx on disk is now reachable from docs.json navigation.

Re-nav'd — current tab, no path moves (10)

Page Nav home
tooling/overview/migrate/from-ethereum Tooling › Overview
build-on-celo/build-with-usat Build on Celo › Use Cases
build-on-celo/build-on-socialconnect Build on Celo › Use Cases
tooling/oracles/wit-oracle Tooling › Oracles
tooling/wallets/ledger/eip712-workaround Tooling › Wallets › Ledger Wallet
contractkit/{data-encryption-key, migrating-to-viem, migrating-to-contractkit-v1, migrating-to-contractkit-v2, notes-web3-with-contractkit} Tooling › Libraries & SDKs › ContractKit

Deleted with a redirect (10)

The six tooling/overview/setup/* pages, build-on-celo/support, tooling/contract-verification/foundry, tooling/testnets/celo-sepolia/disclaimer, tooling/wallets/coinbase-wallet. Each redirect points at the nearest page that answers the same question, and none of them point at another redirect source.

Two places the sheet and the repo disagreed

Worth a look, because in both cases the sheet's inbound-link count was 0 and the repo says otherwise.

1. build-on-celo/build-on-socialconnect — kept, not deleted. Marked Remove=TRUE with inbound = 0, but it is linked from six in-nav pages: home/wallets.mdx:10, tooling/wallets/index.mdx:11, build-on-celo/build-with-self.mdx:50, build-on-celo/build-on-minipay/overview.mdx:102, contractkit/odis.mdx:25, contractkit/migrating-to-contractkit-v1.mdx:45. Re-nav'd into Use Cases next to build-with-self; all six links keep working. Please correct the row.

2. tooling/contract-verification/foundry — deleted, but its content was kept. Also marked inbound = 0; in fact tooling/dev-environments/foundry.mdx:112 linked to it, and deleting it outright would have left Foundry as the only deploy path in the docs with no verification instructions while Hardhat, Remix, Blockscout and Celoscan all keep theirs. The forge verify-contract commands are now a "Using Foundry" section on the contract-verification overview — a page that did not mention Foundry at all before — and the redirect lands there.

Same treatment for the other two deletes that held unique content: the Celo Sepolia terms and conditions became an <Accordion> on the testnet page, and the support channels became a "Get support" section on build-on-celo/index. Nothing that only existed on a deleted page was dropped.

Inbound links repointed, not papered over

tooling/dev-environments/hardhat.mdx listed three deleted setup pages as its prerequisites; that block is now a single sentence naming the actual prerequisites. tooling/dev-environments/foundry.mdx:112 points at the new anchor.

The CI check now gates

continue-on-error: true removed from .github/workflows/docs-validation.yml, and the stale "report-only" comment updated in scripts/check-orphans.sh. A new page that is not added to navigation now fails CI.

Incidental fixes on pages this already touches

Verification

$ bash scripts/check-orphans.sh
No orphan pages found.

$ npx mintlify broken-links
success no broken links found

Unblocks #2256 (decides coinbase-wallet and ledger/eip712-workaround), #2257 (decides from-ethereum and development-chain), #2258 and #2259.

@GigaHierz
GigaHierz requested review from a team as code owners August 28, 2026 13:02
@GigaHierz
GigaHierz requested review from piersy and seolaoh and removed request for a team August 28, 2026 13:02
Base automatically changed from GigaHierz/2255-thirdweb-one-page to main August 28, 2026 14:41

@palango palango left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the full change set against the PR head (6579bf5). The mechanics mostly check out: all ten new nav entries exist on disk with no duplicates, all ten redirect destinations exist and are in nav, docs.json parses, check-orphans.sh passes at head, and the /build#celo-l2-mainnet anchor resolves. Fifteen findings survived verification; twelve are inline comments on the diff, and the three below anchor on lines outside it.

Ranked, most severe first: 1. legacy-URL redirect chains (inline, docs.json:573) 2. from-ethereum content errors (inline) 3. migrating-to-viem Alfajores content and broken examples (inline) 4. hardhat prerequisites dead-end (inline) 5. mis-aimed deletion redirects (inline, docs.json:609) 6. socialconnect redirects not tightened (below) 7. orphan-gate blind spots (inline, check-orphans.sh) 8. circular foundry.toml promise (inline) 9. Foundry invisible in list and sidebar (inline) 10. segment-dropping wildcards (below) 11. nonexistent "Edit this page" control (inline) 12. stale duplicate lede (inline) 13. emoji headings on the socialconnect page (inline) 14. wit-oracle fence tags (inline) 15. orphaned image assets (below).

Socialconnect redirects not tightened (docs.json 3085, 2229, 753/761/789/3321). This PR adds build-on-celo/build-on-socialconnect to navigation, which was the recorded precondition for re-pointing these. /build/build-on-socialconnect (line 3085) is the page's own legacy path and still lands on /build-on-celo/index. /protocol/socialconnect (2229) still leaves the site for self.xyz, a different product per the Self/SocialConnect split in AGENTS.md section 7. The identity-concept sources at 753, 761 and 3321 still point at the ContractKit ODIS API page, as does 789, whose #using-the-mapping-for-payment fragment matches no heading there while the socialconnect page opens with exactly that payments use case. The ODIS-specific sources (769, 821, 3337) are fine as they are.

Segment-dropping wildcards (docs.json 2609, 2613). /developer/setup/:slug* and /developer/migrate/:slug* both rewrite to /tooling/overview/:slug*, dropping a path segment, so all six legacy /developer/setup/* URLs and /developer/migrate/from-ethereum 404. This predates the PR, but the PR retires the setup pages and publishes from-ethereum, and it forecloses the one-line wildcard fix because the corrected targets are now redirect sources themselves. While the redirect set is open: explicit /developer/setup/* entries mirroring the new block at 573-596, plus /developer/migrate/from-ethereum and the three celo-for-eth-devs sources (1433, 1513, 1557) pointed at /tooling/overview/migrate/from-ethereum, which now answers exactly that question.

Orphaned image assets. Deleting replit.mdx and wallet.mdx leaves img/doc-images/deploy-replit/ (12 PNGs, 6.9 MB) and img/doc-images/testnet-wallet/ (6 PNGs, 1.0 MB) with zero references anywhere in the tree. Nothing in CI catches unreferenced images, so git rm -r both directories in this PR while the deletions are in context.

Comment thread docs.json
Comment thread tooling/overview/migrate/from-ethereum.mdx
Comment thread tooling/libraries-sdks/contractkit/migrating-to-viem.mdx
Comment thread tooling/dev-environments/hardhat.mdx Outdated
Comment thread docs.json
Comment thread tooling/contract-verification/index.mdx
Comment thread build-on-celo/index.mdx Outdated
Comment thread tooling/contract-verification/index.mdx Outdated
Comment thread build-on-celo/build-on-socialconnect.mdx
* https://docs.witnet.io/smart-contracts/witnet-data-feeds/addresses
*/
constructor(IWitnetPriceRouter _router))
constructor(IWitnetPriceRouter _router) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch on the constructor. The fence this block sits in is still tagged javascript though, as are the other two on the page: lines 36 and 106 are Solidity, and the snippet at line 76 mixes Python calls with // comments and parses in neither language. Since this PR already edits inside the first block, worth retagging the fences and fixing the line-76 snippet in the same pass.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fences and the constructor are fixed. The web3 snippet parses as Python now, but it still won't run: the ABI string types _id as bytes32 while the call passes four bytes.

web3 7.16.0
  bytes32 + bytes.fromhex("9ed884be") -> MismatchedABI
  bytes4  + bytes.fromhex("9ed884be") -> OK  0xd2476bd49ed884be00...

The bytes32 is the wrong half, not the argument. The Solidity block above already calls router.valueFor(bytes4(0x24beead4)), and Witnet types these IDs as bytes4 upstream: IWitPriceFeedsLegacy.sol declares latestPrice(bytes4 feedId) and documents hash() as returning "the ERC-2362 identifier of the given data feed caption string, truncated to bytes4". So "type": "bytes4" and "internalType": "bytes4", argument unchanged. That moves the selector from 0xf78eea83 to 0xd2476bd4, so it is not cosmetic; as written the snippet calls a function the proxy does not have.

Same block, smaller: the heading above it still reads #### Javascript example over a python fence.

One thing beyond this PR. IWitnetPriceRouter no longer exists in witnet-solidity-bridge: the interfaces directory now carries IWitPriceFeeds.sol with computeID4/getPrice(ID4), and the router shape has moved under legacy/. Both Solidity blocks on the page import a path upstream dropped. Worth its own issue rather than growing this one.

GigaHierz and others added 2 commits August 31, 2026 13:39
…directs (#2253)

Applies the decisions recorded in the orphan-audit sheet. Every .mdx file on
disk is now reachable from docs.json navigation, and the CI orphan check added
in #2252 goes from report-only to gating.

Re-nav'd in their current tab, no path moves:

- tooling/overview/migrate/from-ethereum  -> Tooling > Overview
- build-on-celo/build-with-usat           -> Build on Celo > Use Cases
- build-on-celo/build-on-socialconnect    -> Build on Celo > Use Cases
- tooling/oracles/wit-oracle              -> Tooling > Oracles
- tooling/wallets/ledger/eip712-workaround-> Tooling > Wallets > Ledger Wallet
- five ContractKit pages                  -> Tooling > Libraries & SDKs > ContractKit

Deleted, each with a redirect to the nearest page that answers the same
question: the six tooling/overview/setup pages, build-on-celo/support,
tooling/contract-verification/foundry, tooling/testnets/celo-sepolia/disclaimer
and tooling/wallets/coinbase-wallet.

Three of those carried content that existed nowhere else, so it was folded into
a live page before the delete rather than dropped:

- the Celo Sepolia terms and conditions -> an Accordion on the testnet page
- the support channels                  -> a "Get support" section on build-on-celo/index
- the forge verify-contract commands    -> a "Using Foundry" section on the
  contract-verification overview, which previously did not mention Foundry at all

Inbound links repointed rather than left to redirects: the Hardhat page linked
to three deleted setup pages, and the Foundry page linked to the deleted
verification page.

Also on the pages this touches:

- og:description -> description on the nine re-nav'd pages that had it, so they
  carry a description into llms.txt now that they are reachable (#2239).
- wit-oracle: emoji heading removed, and a Solidity example fixed that could not
  compile (`constructor(IWitnetPriceRouter _router))` -> `... _router) {`).
- contract-verification overview: stale /developer/verify/* links updated to
  current paths.

Verified: `scripts/check-orphans.sh` reports no orphan pages;
`mintlify broken-links` reports no broken links.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…fixes, gate coverage

Review fixes on #2253.

Redirects. Mintlify takes one hop, and array order decides which entry matches,
so a specific source below a wildcard is dead code. Six legacy URLs reached a
page this PR deletes and would have 404d; three more were a regression from
#2291, where /build/:slug* shadowed the thirdweb entries. Explicit entries for
all of them now sit above the wildcards, along with the /developer/setup/* and
/developer/migrate/from-ethereum paths that the segment-dropping wildcards never
resolved. A resolver over the full array now reports zero chains, zero dead
destinations and zero shadowed sources.

Three redirect targets did not answer the deleted page's question: coinbase-wallet
now goes to the MetaMask setup page that carries the same wallet_addEthereumChain
content, setup/wallet to add-celo-testnet-to-metamask, and setup/replit to Remix,
the surviving browser-only path. With socialconnect in navigation, the six
identity-concept sources that pointed at the ContractKit ODIS API page now reach
it, and the celo-for-eth-devs sources reach from-ethereum.

Content on the pages this PR publishes:

- from-ethereum said Celo "uses EigenLayer as the data settlement layer" (it is
  EigenDA, for data availability), claimed 1-second finality, had a reversed
  markdown link to a path that does not resolve, recommended the archived
  celo-org/rosetta, and linked precompiles at celo-blockchain v1.3.2. The
  precompile list now points at core/vm/celo_contracts.go in op-geth.
- migrating-to-viem shipped code that cannot run: an unterminated string literal
  in two blocks, publicClient.getAddresses(), walletClient.sendSignedTransaction,
  and sendTransaction after simulateContract. The CeloTokens helper returned
  pairs, so indexing it by name never worked; it now returns a lookup. The
  Alfajores USDm address was passed as feeCurrency on a mainnet client —
  eth_call symbol() at that address on forno.celo.org returns no code. Replaced
  with the mainnet USDm address, verified to return "USDm".
- hardhat's prerequisites dead-ended: the config needs a mnemonic on Celo's
  derivation path and no page explained how to get one. Now links celocli
  account:new and notes MetaMask cannot produce one.
- contract-verification lost a duplicated lede, gained Foundry in its method
  list, and no longer promises a foundry.toml block that does not exist.
- socialconnect lost its emoji headings, its question heading and "Further
  Reading", and gained a Related section — it had no internal links at all.
- wit-oracle's Solidity blocks were tagged javascript, and the web3.py snippet
  parsed in neither language.
- build-on-celo/index no longer points at an "Edit this page" control; docs.json
  has no feedback key, so it does not render.

The orphan gate had two blind spots that became load-bearing once it fails CI:
pages referenced by href or root were invisible to it, and .md was not matched
at all. Both fixed, with tests confirming an orphaned .md is caught and an
href-only reference is not a false positive.

Deletes img/doc-images/deploy-replit and img/doc-images/testnet-wallet — 18
files, 7.9 MB, unreferenced once replit.mdx and wallet.mdx are gone.

Verified: scripts/check-orphans.sh reports no orphan pages; mintlify
broken-links reports no broken links.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@GigaHierz
GigaHierz force-pushed the GigaHierz/2253-orphan-audit branch from 6579bf5 to a3ce702 Compare August 31, 2026 12:47
@GigaHierz

Copy link
Copy Markdown
Contributor Author

All 15 addressed in a3ce702c. Rebased on main, so #2291 is out of the diff and the base is main now.

Finding 1 + 10 — redirect precedence. Confirmed the mechanism and it was worse than the six URLs you listed. /build/:slug* also shadowed the three thirdweb entries, which is a regression I shipped in #2291: /build/build-with-thirdweb/overview hit the wildcard, landed on /build-on-celo/build-with-thirdweb/overview, and my redirect from there was a second hop. Four pre-existing /build/* sources (composer-kit, mcp, mcp/celo-mcp, mcp/composer-mcp) were dead the same way.

I wrote a resolver that walks the array in order, expands :slug*, and checks the destination against the nav set:

chains (destination is itself a source):   0
dead destinations (not in navigation):     0
sources shadowed by an earlier wildcard:   0

Finding 2 — from-ethereum. Every item was right. EigenLayer→EigenDA, the finality phrasing, the reversed link and its non-resolving path. On the two you flagged as L1 leftovers I checked before rewriting: celo-org/rosetta is archived, and celo-org/celo-blockchain's own description now reads "Previous official repository... for current see op-geth". The precompile link points at core/vm/celo_contracts.go in op-geth (celo-rebase-17, verified 200) — Celo does still add precompiles, so the claim survives, just not the v1.3.2 link.

Finding 3 — migrating-to-viem. All four code defects confirmed. The one worth recording: 0x874069Fa1Eb16D44d622F2e0Ca25eeA172369bC1 passed as feeCurrency on a mainnet client —

$ eth_call symbol() @ 0x874069... on forno.celo.org  -> no code
$ eth_call symbol() @ 0x765DE8... on forno.celo.org  -> "USDm"

so it would revert exactly as you said. Also: the CeloTokens helper returned [string, string][], so tokenAddresses["StableToken"] was never going to work even with the quote closed. It now returns a Record and both blocks use it, which keeps the registry-lookup pattern rather than hardcoding.

Findings 4, 5, 6, 8, 9, 11, 12, 13, 14 — all applied as suggested. For 5 I took your three targets. For 9 I did the minimum fix (Foundry in the list); keeping foundry.mdx as a fifth page is the better shape long-term but that is a nav change for the Build-tab ticket.

Finding 7 — orphan gate. Both gaps closed, and I tested them rather than assuming:

# orphaned .md is caught
$ touch build-on-celo/zz-temp-orphan.md && bash scripts/check-orphans.sh
Found 1 orphan page(s) ... build-on-celo/zz-temp-orphan     (exit 1)

# href-only reference is not a false positive
$ # removed use-docs-with-ai from its pages array, leaving only the href at :519
$ bash scripts/check-orphans.sh
No orphan pages found.                                       (exit 0)

The .md widening needed the excludes you predicted (README, AGENTS, CLAUDE, scripts/, dotdirs).

Finding 15 — both directories gone, 18 files, 7.9 MB.

One thing I did not do: add the feedback block to docs.json for finding 11. I dropped the clause instead, since turning on suggest-edits site-wide is a bigger call than this PR should make. Worth its own issue if you want the control.

check-orphans.sh green, mintlify broken-links green.

@GigaHierz
GigaHierz requested a review from palango August 31, 2026 12:56
@GigaHierz

Copy link
Copy Markdown
Contributor Author

Reopening finding 11 — I got the call wrong, and the answer is more annoying than either of us assumed.

The docs used to have an edit-a-page control and it is wanted back, so "drop the clause" was not the right resolution. But your diagnosis was correct and the fix you offered is not available: feedback.suggestEdit was a mint.json v1 key. Against https://mintlify.com/docs.json, which this repo already declares as its $schema:

$ grep -oiE "feedback|suggestEdit|raiseIssue|thumbsRating" mint-schema.json | sort -u
(no output)

Zero hits for all four. There is no edit key of any kind in the schema, nothing in Mintlify's own llms.txt about the control, and the live site renders none.

The closest supported mechanism is a custom entry in contextual.options, which is now added. One real limitation, which the description is worded around rather than hiding: the href cannot be per-page. Mintlify substitutes $path only inside query-parameter values, not in the base URL, so github.com/celo-org/docs/edit/main/<path>.mdx is not expressible. The entry opens the repository and GitHub's own edit-and-PR flow takes over — which is the workflow that was actually being used.

The GitHub-search alternative (base: github.com/search, query: [{key: q, value: $path}]) would give a per-page deep link, but GitHub code search requires a login, so a logged-out reader hits a wall instead of a file. Not worth it.

So this PR now carries the site-wide contextual entry after all, which is a bigger footprint than an orphan-audit PR would normally take. Say the word and I will split it out into its own PR — it is one object in docs.json plus one sentence in build-on-celo/index.

c5c313a9. Branch is up to date with main; broken-links and check-orphans both green.

The sentence this replaces named an "Edit this page" control that does not
render. Rather than promise a control, it names the repository and the flow
GitHub provides from there.

The context-menu entry that restores the per-page affordance is split out into
its own PR, since it is a site-wide UI change.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@GigaHierz

Copy link
Copy Markdown
Contributor Author

Split done — the context-menu change is now #2297, and this PR is back to the orphan audit plus its review fixes only.

What stayed here is one sentence on build-on-celo/index: the support section no longer names an "Edit this page" control, and instead points at celo-org/docs and the flow GitHub provides from there. That reads correctly whether or not #2297 lands, so there is no forward reference and the two PRs can merge in either order.

46500e91.

@@ -13,7 +13,7 @@ For a general overview of the Celo network and architecture, see [the Celo Overv

## What is Celo's Relationship to Ethereum?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Required change. Putting this page in the sidebar brings its headings under the AGENTS.md heading rules, the same ones this PR applied to socialconnect and wit-oracle.

Line 14 is a question heading on a page that is not an FAQ (AGENTS.md:72). Title case is still on lines 14, 23, 58, 89, 93, 99 and 103. AGENTS.md:71 does say not to mass-retitle old pages for case alone, but it scopes that to pages you are not otherwise touching, and this PR rewrites four sections of this one.

Comment thread docs.json
@@ -2178,7 +2312,7 @@
},
{
"source": "/protocol/socialconnect",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Required change. /protocol/identity/index at line 2230 still points at https://self.xyz/. With this line fixed the two legacy identity paths now disagree: /celo-codebase/protocol/identity/index reaches the SocialConnect page this PR adds to nav, while /protocol/identity/index leaves the site for a different product. AGENTS.md section 7 keeps Self and SocialConnect apart, so self.xyz does not answer the identifier-mapping question. Give it the same destination as this line.

palango and others added 2 commits September 1, 2026 19:32
Type the Witnet valueFor ABI as bytes4, matching the Solidity block above
and the upstream interface; the bytes32 form selected a function the proxy
does not have. Rename the heading over that Python snippet.

Sentence-case the from-ethereum headings the PR rewrites, and turn the
question heading into a statement.

Point /protocol/identity/index at the SocialConnect page, the same
destination as /celo-codebase/protocol/identity/index.
@palango
palango enabled auto-merge (squash) September 1, 2026 17:59
@palango
palango merged commit bb57fda into main Sep 1, 2026
5 checks passed
@palango
palango deleted the GigaHierz/2253-orphan-audit branch September 1, 2026 18:00
GigaHierz added a commit that referenced this pull request Sep 2, 2026
…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>
GigaHierz added a commit that referenced this pull request Sep 2, 2026
ANALYTICS.md is internal maintainer documentation, deliberately not in
docs.json navigation. The orphan check began enforcing when #2293 removed
its continue-on-error, so it now fails on the same category of file it
already excludes for README.md, AGENTS.md and CLAUDE.md.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
GigaHierz added a commit that referenced this pull request Sep 2, 2026
ANALYTICS.md is internal maintainer documentation, deliberately not in
docs.json navigation. The orphan check began enforcing when #2293 removed
its continue-on-error, so it now fails on the same category of file it
already excludes for README.md, AGENTS.md and CLAUDE.md.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

task: Orphaned-pages audit — re-nav or delete the 22 pages on disk that are missing from navigation

2 participants