Skip to content

CI: weekly external link-rot check (lychee) - #58

Merged
rivassec merged 1 commit into
mainfrom
lychee-link-rot
Sep 11, 2026
Merged

rivassec merged 1 commit into
mainfrom
lychee-link-rot

Conversation

@rivassec

Copy link
Copy Markdown
Owner

New scheduled workflow checking every external citation in content/ for rot. Complements the per-PR internal link-graph guard, which never touches external URLs.

Design

  • Scheduled weekly (Mon 14:00 UTC) + manual dispatch, deliberately NOT per-PR - external checks are network-flaky and a third-party outage must never block merges.
  • Scans content/**/*.md + README, https/http only; --base-url https://rivassec.com resolves root-relative links against the live site (so the 404 page's links and the tool link get checked for real).
  • .lycheeignore: Pelican {filename}/{static} syntax (covered by the internal guard), code-example placeholders (localhost, host:port), and bot-hostile hosts (LinkedIn 999s, X gates).
  • Failures open/update a link-rot tracking issue with the full report, then fail the run - scheduled reds otherwise go unread.

Validated locally (lychee 0.24.2)

135 Total | 90 Unique | 103 OK | 0 Errors | 32 Excluded | 4 Redirects

All 32 exclusions are Pelican syntax and placeholders - zero real citations excluded. DOJ links pass (they 200 even behind the Akamai interstitial).

First real run: trigger via workflow_dispatch after merge, or wait for Monday. Expect the allowlist to need a tweak or two over the first weeks - that's normal for link checkers.

Scheduled, not per-PR: external checks are network-flaky and a
third-party outage must never block merges. Internal links keep their
per-PR guard (check_link_graph.py); this covers the external citations
(DOJ, IC3, vendor docs, papers) that rot silently.

- scans content/**/*.md + README, https/http schemes only
- --base-url resolves root-relative links against the live site
- .lycheeignore: Pelican {filename}/{static} syntax, code-example
  placeholders (localhost, host:port), bot-hostile hosts (LinkedIn/X)
- failures open/update a 'link-rot' tracking issue and fail the run
- validated locally with lychee 0.24.2: 103 OK, 0 errors, 32 excluded
@rivassec
rivassec merged commit edb14fa into main Sep 11, 2026
16 checks passed
@rivassec
rivassec deleted the lychee-link-rot branch September 11, 2026 23:20
rivassec added a commit that referenced this pull request Sep 12, 2026
Vendored external READMEs are not site content (ARTICLE_EXCLUDES skips
them at build) and their repo-relative links (/LICENSE) resolve as
false 404s against --base-url. First-week allowlist tuning, as
predicted in #58.

Co-authored-by: rivassec <rivassec@rivassec.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.

1 participant