From 1b630ebebe961b893f5a69f9e63e110cb5083e29 Mon Sep 17 00:00:00 2001 From: alexander-sei Date: Sun, 27 Sep 2026 11:08:31 +0200 Subject: [PATCH 1/3] docs(particle): link the renamed connectkit-aa-demo repo Particle renamed connectkit-aa-usage to connectkit-aa-demo, so the starter-repository link only resolved through a GitHub redirect. It keeps the same pinned commit, and #L117 still lands on executeTxNative. Co-authored-by: Cursor --- evm/wallet-integrations/particle.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evm/wallet-integrations/particle.mdx b/evm/wallet-integrations/particle.mdx index 937d197..96feeb6 100644 --- a/evm/wallet-integrations/particle.mdx +++ b/evm/wallet-integrations/particle.mdx @@ -267,7 +267,7 @@ This transaction will be gasless because it meets two key conditions: This example demonstrates how to use an existing EIP-1193 provider, but you can also construct a `userOp` directly with Particle Connect. For an example, refer to the -[starter repository](https://github.com/Particle-Network/connectkit-aa-usage/blob/2017262daf297624362d51f3d50cccd3b4606ef9/app/page.tsx#L117). +[starter repository](https://github.com/Particle-Network/connectkit-aa-demo/blob/2017262daf297624362d51f3d50cccd3b4606ef9/app/page.tsx#L117). ## Full app example From 20fed719bce6bd78a8006dd99b5cdb20780ea961 Mon Sep 17 00:00:00 2001 From: alexander-sei Date: Sun, 27 Sep 2026 11:08:31 +0200 Subject: [PATCH 2/3] fix(links): re-check failures and check GitHub files via raw CDN The five URLs flagged in #81 all return 200. As in #77, GitHub answered the weekly check with 503s, and the per-host throttle added for #77 did not stop them: 3 GitHub failures on Sep 14 without it, 5 on Sep 21 with it. lychee 0.24.2 retries a rejected 429 but never a 503, so a single 503 becomes a reported error. Every GitHub false positive so far was a rendered blob page, so remap github.com///blob// links to raw.githubusercontent.com, which still answers 404 for a missing file, ref, or repo. For every host, give failures a second look before filing an issue: if the first pass fails, wait two minutes and run lychee again. --cache lets the second pass replay passing links from .lycheecache and re-request only the failures, since lychee never caches a failure. Accepting 503 outright would have hidden learnweb3.io, which answered 502/503 for weeks (#52, #70, #73) before it was removed as dead. Verified with lychee 0.24.2 across the 142 tracked docs: 0 errors, 46 s for the first pass (57 s before the remap), and the second pass is served entirely from the cache. Against a mock server, a one-off 503 cleared on the re-check while a persistent 503 and a 404 were still reported. Closes #81 Co-authored-by: Cursor --- .github/workflows/external-links.yml | 25 +++++++++++++++++++++++-- lychee.toml | 16 ++++++++++++++-- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/.github/workflows/external-links.yml b/.github/workflows/external-links.yml index 39a579e..d4a36ab 100644 --- a/.github/workflows/external-links.yml +++ b/.github/workflows/external-links.yml @@ -26,6 +26,10 @@ jobs: lychee: runs-on: ubuntu-latest timeout-minutes: 15 + env: + # --cache saves passing links to .lycheecache so the re-check below only + # re-requests the links that failed. lychee never caches a failure. + LYCHEE_ARGS: "--config lychee.toml --no-progress --cache '**/*.md' '**/*.mdx'" steps: - uses: actions/checkout@v4 @@ -33,13 +37,30 @@ jobs: id: lychee uses: lycheeverse/lychee-action@v2 with: - args: "--config lychee.toml --no-progress '**/*.md' '**/*.mdx'" + args: ${{ env.LYCHEE_ARGS }} fail: false format: markdown output: ./lychee-report.md - - name: Open or update tracking issue on broken links + # Throttled or briefly unavailable hosts (GitHub in particular) answer + # live pages with a 503, and lychee reports that without retrying. Only + # links that still fail after a pause count as broken. + - name: Wait before re-checking failures + if: steps.lychee.outputs.exit_code != 0 + run: sleep 120 + + - name: Re-check failed links + id: recheck if: steps.lychee.outputs.exit_code != 0 + uses: lycheeverse/lychee-action@v2 + with: + args: ${{ env.LYCHEE_ARGS }} + fail: false + format: markdown + output: ./lychee-report.md + + - name: Open or update tracking issue on broken links + if: steps.lychee.outputs.exit_code != 0 && steps.recheck.outputs.exit_code != 0 uses: peter-evans/create-issue-from-file@v5 with: title: 🔗 Broken external links detected diff --git a/lychee.toml b/lychee.toml index d9127fc..ae7b139 100644 --- a/lychee.toml +++ b/lychee.toml @@ -60,6 +60,16 @@ exclude = [ # Don't check mailto: links (this is the default; set explicitly for clarity). include_mail = false +# Check GitHub file links (github.com///blob//) against +# raw.githubusercontent.com, the CDN that serves the same file for scripted +# downloads. A missing file, ref, or repo still returns 404 there, while +# github.com's rendered blob pages are the ones that answer the checker with +# 503s for files that exist. Reports show the raw URL. A blob link must point +# at a file; the CDN returns 404 for directories, so use /tree/ for those. +remap = [ + "^https://github\\.com/([^/]+)/([^/]+)/blob/([^?#]+).* https://raw.githubusercontent.com/$1/$2/$3", +] + # Per-host throttling. NOTE: TOML table headers capture every key that follows # them, so keep all top-level options above this line. # @@ -69,8 +79,10 @@ include_mail = false # for pages that are perfectly fine. That produced the false positives in # https://github.com/sei-protocol/sei-docs/issues/77. lychee does not retry a # 503, and the GITHUB_TOKEN API fallback can only validate bare owner/repo URLs -# (not blob/tree paths), so the fix is to slow down instead. Measured cost: -# ~80 GitHub requests at one per second adds about 40 seconds to the weekly run. +# (not blob/tree paths), so slowing down is what keeps 503s rare. It does not +# stop them entirely, which is why external-links.yml re-checks every failure +# before reporting it. Measured cost: with blob links remapped above, ~45 +# github.com requests at one per second keep the full run under a minute. [hosts."github.com"] concurrency = 2 request_interval = "1s" From 6bc51b585273891415a194ac955667f3fa1eb48c Mon Sep 17 00:00:00 2001 From: alexander-sei Date: Sun, 27 Sep 2026 11:17:58 +0200 Subject: [PATCH 3/3] fix(links): keep the lychee report out of the re-check's inputs The first pass wrote ./lychee-report.md into the checkout, where the re-check's '**/*.md' glob picks it up as a docs page, so every link that still failed would be listed twice in the tracking issue. Write the report to the runner's temp directory instead. Co-authored-by: Cursor --- .github/workflows/external-links.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/external-links.yml b/.github/workflows/external-links.yml index d4a36ab..9475b08 100644 --- a/.github/workflows/external-links.yml +++ b/.github/workflows/external-links.yml @@ -40,7 +40,9 @@ jobs: args: ${{ env.LYCHEE_ARGS }} fail: false format: markdown - output: ./lychee-report.md + # Keep the report outside the checkout, or the re-check's '**/*.md' + # glob reads it as a docs page and lists every failure twice. + output: ${{ runner.temp }}/lychee-report.md # Throttled or briefly unavailable hosts (GitHub in particular) answer # live pages with a 503, and lychee reports that without retrying. Only @@ -57,12 +59,12 @@ jobs: args: ${{ env.LYCHEE_ARGS }} fail: false format: markdown - output: ./lychee-report.md + output: ${{ runner.temp }}/lychee-report.md - name: Open or update tracking issue on broken links if: steps.lychee.outputs.exit_code != 0 && steps.recheck.outputs.exit_code != 0 uses: peter-evans/create-issue-from-file@v5 with: title: 🔗 Broken external links detected - content-filepath: ./lychee-report.md + content-filepath: ${{ runner.temp }}/lychee-report.md labels: broken-links, automated