Skip to content

docs: repoint three dead links reported by the link checker - #1791

Merged
kyle-sexton merged 2 commits into
mainfrom
fix/640-link-check-report
Jul 30, 2026
Merged

docs: repoint three dead links reported by the link checker#1791
kyle-sexton merged 2 commits into
mainfrom
fix/640-link-check-report

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

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 the repositories/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 the how-tos/ one. Both resolve today, but a
redirect 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 the
three. graphql/reference/enums did not 404; it became a navigation index and no longer carries
any enum definitions at all, which is why the failure was Cannot find fragment rather than a dead
page. GitHub split the GraphQL reference by domain, so MergeStateStatus now lives on the pulls
page. 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.toml is a managed component for this repo per standards/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 the
    checker 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 a
    different one next run.
  • dl.acm.org and queue.acm.org (403) — 403 even with a full browser User-Agent; no header
    tuning 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 ECC
    chain, 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.toml plus the proposed upstream config, over all seven files the report
named:

🔍 118 Total  🔗 116 Unique  ✅ 114 OK  🚫 0 Errors  👻 4 Excluded

All 8 reported errors resolved. Also run against this repo's gates:

Related

🤖 Generated with Claude Code

https://claude.ai/code/session_01RhS3T7ShwJgKTrvk2Mvd3C

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

claude Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 1m 26s —— View job


PR Review

  • Read changed files
  • Verify link replacements are correct
  • Check alignment with CLAUDE.md guidelines
  • Post review findings

LGTM. Three surgical one-line URL replacements, no logic or behavior changes. Notes below.

Change-by-change assessment

docs/adr/0002-…md L89
GitHub moved the required-status-checks troubleshooting page from repositories/…/managing-protected-branches/ to pull-requests/…/collaborating-on-repositories-with-code-quality-features/. The new path follows the current GitHub Docs taxonomy for PR-related content. The ADR still reads correctly — the surrounding sentence ("the ruleset flip stays LAST, after this caller restructure is verified") is purely organizational context and the linked page still covers the "pending check blocks merge" case cited there.

plugins/dometrain/README.md L10
Slug rename from /pro/ to /dometrain-pro/. Link text ("Dometrain Pro") is unchanged and still accurate. No surrounding text required updating.

plugins/source-control/skills/babysit-prs/reference/freshness.md L18
This is the only non-trivial case. The old URL (graphql/reference/enums#mergestatestatus) pointed to a navigation index that no longer carries enum definitions; the new URL (graphql/reference/pulls#enum-mergestatestatus) targets the domain-specific pulls page where MergeStateStatus now lives. The PR body notes the fragment (id="enum-mergestatestatus") is present in served HTML rather than injected by JS — meaning lychee's fragment check resolves cleanly. The document quotes two enum descriptions verbatim ("The head ref is out of date" for BEHIND, "The merge is blocked" for BLOCKED); the PR confirms both are still present at the new location.

Process/guideline checks

Check Result
Branch naming (<type>/<description>) fix/640-link-check-report
PR body — closing keyword Fixes #640
PR body — ## Related section Present with #1746 and standards#303 ✓
Plugin version bump Correctly omitted — external reference URL carries no behavioral contract; check-changelog-parity.sh confirmed pass
lychee.toml not touched Correct — it's a managed component; upstream fix is standards#303
Staged specific files only Single commit touches exactly the three files, no blanket add

One observation (not a blocker)

The GraphQL reference pages GitHub exposes (pulls, repositories, organizations, etc.) are organized by domain and have reorganized before — the enums index that caused this breakage was exactly that. The new pulls page is the right home for MergeStateStatus today. Worth keeping an eye on if the link checker flags it again, but nothing actionable here beyond what's been done.

@claude

claude Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 1m 7s —— View job


Security Review

  • Gather context and read changed files
  • Analyze PR diff for security issues
  • Report findings

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:

File Old domain New domain
docs/adr/0002-…md docs.github.com docs.github.com
plugins/dometrain/README.md dometrain.com dometrain.com
plugins/source-control/…/freshness.md docs.github.com docs.github.com

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

claude Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 1m 17s —— View job


PR Review

  • Gather context and read changed files
  • Review diff (including new commit)
  • Post findings

LGTM. This PR now contains two commits. The net cumulative change is still exactly 3 files, +3/-3 — no scope creep.

New commit (6898e83) — what changed and why it's correct

The initial commit (7b30fb6) replaced the dead ADR link with pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/troubleshooting-required-status-checks. An independent verification caught that this path is itself a 301 redirect to the canonical location.

The follow-up commit (6898e83) resolves that to the direct URL:

https://docs.github.com/en/pull-requests/how-tos/merge-and-close-pull-requests/troubleshooting-required-status-checks

This is the right call. A redirect is a second artifact that can be retired independently of the content — using the final resolved URL removes that fragility. The commit message documents the verification (301 vs. 200, lychee clean after).

Full change summary (origin/main → HEAD)

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#mergestatestatusgraphql/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

claude Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 1m 5s —— View job


Security Review

  • Read PR diff and changed files
  • Analyze for security vulnerabilities
  • Post findings

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:

File Old URL New URL Domain change?
docs/adr/0002-…md L89 docs.github.com/…/managing-protected-branches/troubleshooting-required-status-checks docs.github.com/…/merge-and-close-pull-requests/troubleshooting-required-status-checks No — path rename only
plugins/dometrain/README.md L10 dometrain.com/pro/ dometrain.com/dometrain-pro/ No — slug rename only
plugins/source-control/…/freshness.md L18 docs.github.com/…/graphql/reference/enums#mergestatestatus docs.github.com/…/graphql/reference/pulls#enum-mergestatestatus No — page + fragment rename only

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.

@kyle-sexton
kyle-sexton merged commit d2ffb77 into main Jul 30, 2026
33 checks passed
@kyle-sexton
kyle-sexton deleted the fix/640-link-check-report branch July 30, 2026 13:11
@kyle-sexton
kyle-sexton restored the fix/640-link-check-report branch August 1, 2026 01:39
@kyle-sexton
kyle-sexton deleted the fix/640-link-check-report branch August 14, 2026 20:41
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.

Link checker report

1 participant