docs: repoint three dead links reported by the link checker - #1791
Conversation
All three moved rather than died, and each replacement was verified live against
the target rather than inferred from the URL shape.
GitHub retired the protected-branches path for the required-status-checks
troubleshooting page; it now lives under pull-requests/. Verified 200, titled
"Troubleshooting required status checks".
Dometrain moved its plans page from /pro/ to /dometrain-pro/. Verified 200,
titled "Dometrain Plans". The link text stays "Dometrain Pro" because the slug
and the product name still are.
The GraphQL enums page became a navigation index — it no longer carries any
enum definitions, which is why the fragment stopped resolving rather than the
page 404ing. MergeStateStatus now lives on the pulls reference page at
`#enum-mergestatestatus`; the id is present in the served HTML, and the page
carries the two descriptions this doc quotes verbatim ("The head ref is out of
date", "The merge is blocked").
The report's other five errors are not content defects and are handled in
melodic-software/standards, which owns lychee.toml for this repo.
Refs #640
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RhS3T7ShwJgKTrvk2Mvd3C
|
Claude finished @kyle-sexton's task in 1m 26s —— View job PR Review
LGTM. Three surgical one-line URL replacements, no logic or behavior changes. Notes below. Change-by-change assessment
Process/guideline checks
One observation (not a blocker)The GraphQL reference pages GitHub exposes ( |
|
Claude finished @kyle-sexton's task in 1m 7s —— View job Security Review
Scope: Three markdown documentation files, each with a single URL substitution (+1/-1). No code, no configuration, no workflows, no dependency pins touched. Finding: None. All three replacements land on the same trusted domains as the URLs they replace:
No homograph substitution, no lookalike domains, no redirect chains. The URLs are referenced only as hyperlinks for human readers — no code in the repo fetches or processes them programmatically, so there is no injection surface, open-redirect risk, or SSRF vector to consider. No secrets, credentials, tokens, GitHub Actions changes, permission changes, or dependency-pin changes are present. Nothing to report from a security standpoint. |
An independent lookup caught that the first replacement was itself a 301. The collaborating-with-pull-requests path redirects to a /how-tos/ path; only the latter answers 200 directly. Both work today, but a redirect is a second thing that can be retired, and lychee already hints to prefer resolved URLs. Verified: the previous URL returns 301 with that Location, the new one returns 200 with no redirect, and a lychee run over the file now reports 1 OK with no redirect hint at all. Refs #640 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RhS3T7ShwJgKTrvk2Mvd3C
|
Claude finished @kyle-sexton's task in 1m 17s —— View job PR Review
LGTM. This PR now contains two commits. The net cumulative change is still exactly 3 files, +3/-3 — no scope creep. New commit (
|
| File | Change |
|---|---|
docs/adr/0002-…md L89 |
repositories/…/managing-protected-branches/troubleshooting-… → pull-requests/how-tos/merge-and-close-pull-requests/troubleshooting-… (canonical, 200 direct) |
plugins/dometrain/README.md L10 |
/pro/ → /dometrain-pro/ slug rename |
plugins/source-control/…/freshness.md L18 |
graphql/reference/enums#mergestatestatus → graphql/reference/pulls#enum-mergestatestatus (fragment present in served HTML) |
Process/guideline checks
| Check | Result |
|---|---|
| Branch naming | fix/640-link-check-report ✓ |
| PR body — closing keyword | Fixes #640 ✓ |
PR body — ## Related section |
Present ✓ |
| Plugin version bump | Correctly omitted — no behavioral contract change ✓ |
lychee.toml not touched |
Correct — managed component; upstream in standards#303 ✓ |
| Specific files staged only | Both commits touch only the exact files changed ✓ |
No issues found.
|
Claude finished @kyle-sexton's task in 1m 5s —— View job Security Review
Scope: Three markdown documentation files, each with a single URL substitution (+1/−1). No code, configuration, workflows, secrets, dependency pins, or permissions touched. Finding: None. All three replacements land on the same trusted domains as the URLs they replace:
No homograph substitution, no lookalike domains, no redirect chains introduced. The URLs are referenced only as hyperlinks for human readers — no code in the repo fetches or processes them programmatically, so there is no injection surface, open-redirect risk, or SSRF vector. No secrets, credentials, tokens, GitHub Actions changes, permission changes, or dependency-pin changes are present. Nothing to report from a security standpoint. |
The rolling link-check report listed 8 errors. Only 3 were dead links — the other 5 are live
URLs the checker cannot reach, and their fix lands upstream (see below). Every replacement here was
verified against the live target, not inferred from the URL shape.
The three dead links
docs/adr/0002-…md— GitHub retired therepositories/configuring-branches-and-merges…/managing-protected-branches/path for the required-status-checks troubleshooting page. It now lives under
pull-requests/how-tos/merge-and-close-pull-requests/. Verified 200 with no redirect, H1 reads"Troubleshooting required status checks", and it still covers the check-never-reports case the ADR
cites it for ("Associated checks stay in a 'Pending' state and block merging").
An independent fresh-context lookup caught that my first replacement here was itself a 301 — the
collaborating-with-pull-requests/…path redirects to thehow-tos/one. Both resolve today, but aredirect is a second thing that can be retired, and lychee already hints to prefer resolved URLs, so
the second commit swaps in the canonical target. Verified both directions: the old path returns 301
with that Location, the new one returns 200 with none.
plugins/dometrain/README.md— Dometrain moved its plans page from/pro/to/dometrain-pro/.Verified 200,
<title>Dometrain Plans - Dometrain</title>. The link text stays "Dometrain Pro"because the slug and the product name both still are.
plugins/source-control/skills/babysit-prs/reference/freshness.md— the most interesting of thethree.
graphql/reference/enumsdid not 404; it became a navigation index and no longer carriesany enum definitions at all, which is why the failure was
Cannot find fragmentrather than a deadpage. GitHub split the GraphQL reference by domain, so
MergeStateStatusnow lives on thepullspage. The replacement was verified structurally, not just by status code:
id="enum-mergestatestatus"is present in the served HTML (so lychee's fragment check resolves it, rather than the anchor
being JS-injected), and the page carries both descriptions this doc quotes verbatim — "The head ref
is out of date" and "The merge is blocked".
The other five are not content defects, and are fixed upstream
lychee.tomlis amanagedcomponent for this repo perstandards/distribution/sync-manifest.yml,so editing it here would be silently overwritten by the next sync. The config half of this report is
therefore melodic-software/standards#303:
www.gnu.org/software/coreutils/…(429) — verified 200. A 429 is the server rate-limiting thechecker and lands on whichever host the shared runner IP is throttled against that run, so the fix
is
accept-ing 429 rather than excluding a healthy host that would just be replaced by adifferent one next run.
dl.acm.organdqueue.acm.org(403) — 403 even with a full browser User-Agent; no headertuning reaches them.
docs.genius.com(403) — 200 with a browser User-Agent; the documented bot-block case.www.ntia.gov(SSL not trusted) — the chain verifies locally (openssl s_client→Verify return code: 0 (ok), curl 200 under strict verification). A trust store failing an ECCchain, not an untrustworthy host.
This PR merging alone will not clear the report; #303 has to land and sync. Flagging that plainly
rather than letting a half-clear look like a regression.
Verification
Run with the real
lychee.tomlplus the proposed upstream config, over all seven files the reportnamed:
All 8 reported errors resolved. Also run against this repo's gates:
scripts/check-changed-skills.sh origin/main— 1 skill checked, 0 failedscripts/check-contract-slice-prune.sh --check-diff origin/main— pass (nodocs/topics/path istouched; that file's two ACM URLs are handled by exclusion, not by editing it)
scripts/check-changelog-parity.sh --check-bump origin/main— pass. No plugin version bump: acorrected external URL in a reference doc changes no behavior contract, no gate requires one, and
bumping
source-controlwould collide with the in-flight bump on feat(source-control): evidence-gated independent-resolver mode for thread resolution #1782 — the collision classtracked as Plugin version bumps computed from main collide across concurrent branches #1746.
markdownlint-cli2,typos— cleanRelated
lychee.tomlfor this reponothing
🤖 Generated with Claude Code
https://claude.ai/code/session_01RhS3T7ShwJgKTrvk2Mvd3C