Skip to content

feat(docs): check external links on a schedule, and fix the nine that were dead - #44

Merged
fmind merged 1 commit into
mainfrom
fix/dead-external-links
Aug 10, 2026
Merged

feat(docs): check external links on a schedule, and fix the nine that were dead#44
fmind merged 1 commit into
mainfrom
fix/dead-external-links

Conversation

@fmind

@fmind fmind commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Follow-up to #43.

Why

#39 was a reader telling us a link was dead. A course is mostly links to other people's work, and nothing in this repository noticed when one rotted. So I ran the check we did not have.

A full lychee sweep over the README and every chapter found nine genuinely dead links beyond the neptune ones — including three of this project's own MLOps Community articles.

What was dead

Link Fate
3 × mlops.community/<slug> Site restructured to /blog/<slug>
docs.microsoft.com/.../use-vscode Module retired
code.visualstudio.com/learn/collaboration/live-share Moved to visualstudio.microsoft.com
jupyterbook.org/interactive/hiding.html Docs restructured
docs.zenml.io/user-guide/... user-guideuser-guides
licenses.ai/blog/.../bigscience-open-rail-m-license Gone; now the Hugging Face OpenRAIL announcement
marquezproject.github.io Moved to marquezproject.ai
censius.ai (2 links) TLS handshake fails outright; replaced with Molnar's Interpretable Machine Learning

Why check:links is not in check

The first run reported 63 failures against 706 unique URLs, and only 9 were real: 37 were HTTP 429 and 14 were bot-blocking 403s from hosts that serve a reader perfectly well. Putting that in the commit gate would teach everyone to ignore a red check — the opposite of what a gate is for.

So it runs monthly and on demand from links.yml, with:

  • a .lycheeignore for hosts that refuse scanners (Medium, Read the Docs, Reddit, LinkedIn) and for illustrative localhost URLs in the prose;
  • --accept 200..=299,429, because a host that rate-limits a scanner is a host that is up — treating that as a failure reports the opposite of what the check exists to find.

Test plan

  • mise run check:links0 errors across 706 unique links (was 63).
  • mise run all — exit 0.
  • zizmor clean on the new workflow.

… were dead

The neptune.ai breakage in #39 was found by a reader, not by the repository. A
course is mostly links to other people's work, and nothing here noticed when one
of them rotted. A full lychee run over the README and every chapter found nine
genuinely dead links besides the neptune ones:

- three of this project's own MLOps Community articles, which moved to
  /blog/<slug> when that site restructured
- Microsoft Learn's VS Code module, VS Code Live Share, Jupyter Book's cell
  hiding page, ZenML's starter guide, the OpenRAIL announcement, and Marquez,
  all moved or renamed
- Censius, whose TLS handshake now fails outright; the two explainability
  definitions it backed now point at Molnar's Interpretable Machine Learning

`check:links` is deliberately NOT part of `check`. The first run reported 63
failures against 706 unique URLs, and only 9 were real: 37 were HTTP 429 and 14
were bot-blocking 403s from hosts that serve a reader fine. A gate that cries
wolf 85% of the time teaches people to ignore it. It runs monthly and on demand
from links.yml instead, with a .lycheeignore for the hosts that refuse scanners
and 429 accepted as proof a host is alive rather than evidence it is broken.

The whole set now reports 0 errors.
@fmind
fmind merged commit bc4b9a1 into main Aug 10, 2026
1 check passed
@fmind
fmind deleted the fix/dead-external-links branch August 10, 2026 18:35
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