Repository navigation
feat(ci): file one issue per dead link the online link check finds - #13549
Conversation
maintenance-file-dead-links.yml runs on each completed run of the sync-managed online link check. A read job holding actions: read alone downloads the ci-workflows link-check-online-dead-links artifact and checks its shape; a file job holding issues: write alone files, updates or reopens one issue per URL, found by the hidden first-line marker <!-- link-check-dead-pointer url-sha256=<hex> -->, and points each at the attribution audit's demotion path for a dead pointer. Refs: #9759 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e one An issue the GITHUB_TOKEN opens raises no event, so intake never adds the needs-triage floor label, and the hourly triage sweep leaves github-actions[bot] issues out: the filer adds the label itself. The body now says a close sticks only once the link check stops reporting the URL, and puts the server's status detail in a code span. Refs: #9759 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The status detail is written by the remote server, outside the org, and intake's model reads these issue bodies, so the body keeps only the status code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: eabe87baa6
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Owner decision on the filing shape, 2026-11-05, in session, picked from an AskUserQuestion prompt. The question: one issue per dead link, which would add about 19 open issues over two weeks given the 11-03 run's 19 dead URLs; one rollup issue; or hold until zero. The owner's answer, verbatim:
This PR is reworked to keep one open rollup issue per repository. Each dead link is a |
The owner chose one rollup issue. The file job now finds the issue github-actions[bot] filed whose first body line is <!-- link-check-dead-pointer rollup --> and rewrites its task list of dead links (URL, status code, locations) each run. With no dead links it closes an open rollup as completed with a comment; a completed rollup is reopened when links die again, one closed as not planned is left alone, and a new one, labeled needs-triage, is opened only when none exists. The read job hands on an empty list so the rollup can close, drops the server's text, and counts the links over the 50-link cap for a "+N more" line. The per-link marker, the 10-new-issue cap and the write spacing are gone. Refs: #9759 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
claude-security-review reviewed Security review: PR #13549, incremental (3921082 → 1cb530c), dead-link rollup size capsNo security issues found. An earlier head was already reviewed, so this pass was blocking only: SUGGESTION findings would have been dropped and only CRITICAL or IMPORTANT ones posted. I read every hunk of both files on the incremental list:
Neither file matches a trusted-path glob. critical-findings: 0 What changed
What I checked
Trust controls, kill switch, merge holds and plugin manifests: none touched. Nothing in this push spends credit or can bill. Settled threadsBoth lane findings from the earlier head are fixed in this push, as the owner's replies say:
I confirmed both fixes in the diff. I raised nothing new on those lines. |
Its jq programs and markdown code spans are literal single-quoted text. Refs: #9759 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
claude-review reviewed Code review: PR #13549, incremental review of
|
- The read job hands on an empty list only when the artifact itself is empty. An artifact whose every entry fails the shape check warns and hands on nothing, so a malformed artifact or a format change upstream never closes the rollup as fixed. - Each link keeps 5 locations and a count of the rest, shown as "+K more locations", and URLs and paths are length-capped, so 50 links stay under the 128 KiB one environment variable holds. - A rollup body over 60,000 characters moves links from the end into the "+N more, see the run" line, under the 65,536-character issue limit. - The test's two piped grep -q checks read here-strings instead. Refs: #9759 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs: #9759
Merge melodic-software/ci-workflows#993 first. It makes the reusable link check upload the artifact this workflow reads. Until it merges, the read job finds no artifact and writes nothing; on a red run it also logs a warning.
Summary
Step 3 of #9759: the dead links the weekly online link check finds now go to one rollup issue for the repository, which points at the attribution audit's demotion path when a pointer later dies.
This follows two owner decisions:
Fix
New
.github/workflows/maintenance-file-dead-links.yml. It runs onworkflow_runwhen themaintenance-check-links-online-claude-code-pluginsrun completes, onmainin this repository, and only if that run concludedsuccessorfailure.That caller is sync-managed from
melodic-software/standards, so this PR cannot add a job to it. A reusable workflow's outputs reach only its own caller, so this workflow reads the artifact instead.readjob,actions: readonly.link-check-online-dead-linksfrom the triggering run.filejob,issues: writeonly, no checkout. This is the same split as #13466'sfile-revert.github-actions[bot]whose first body line is<!-- link-check-dead-pointer rollup -->. An open rollup wins over a closed one; otherwise the newest is used.needs-triage.GITHUB_TOKENopens raises no event, sointake-triage.ymlnever adds itsneeds-triagefloor label on open (intake-triage.yml:20). The hourly triage sweep also leavesgithub-actions[bot]issues out (.github/scripts/maintenance-audit-lane-runs/triage-sweep.mjs:18-19).The rollup body, in order:
- [ ]item per link: the URL and status code as`URL`, status 404: `path` line N, `path2`.- +N more, see the run.line when links go over the cap, or when the body passes 60,000 characters and links move from the end of the list into that count (the issue limit is 65,536). Each item shows at most 5 locations and ends, +K more locationswhen there are more.api-budget-coverage.test.mjsgets anALLOWEDentry for thefilejob. With no checkout, the job cannot loadlog-api-budget, the same situation asfile-revert.The trigger names the link check by its
name:, which the standards component owns. A rename there would disconnect this workflow; the test reads the caller'sname:and fails on a mismatch.No changelog fragment: no plugin file changes.
Verification
bash scripts/maintenance-file-dead-links.test.sh: exit 0,PASS=27 FAIL=0. New cases: an all-malformed artifact hands on nothing; 53 links with 950-character URLs and 20 locations each stay under 128 KiB in the read step and under 60,000 characters in the body.bash scripts/check-pipefail-grep-q.sh: exit 0.permissions: {},read=actions: read,file=issues: writewith no action, and the fixed marker.ghthat applies the step's own--jqfilter:needs-triage, where a misplaced marker or a pull request is not a rollup;+N moreline;actionlint .github/workflows/maintenance-file-dead-links.yml: exit 0.zizmor --offlineon it: exit 0, no findings (1 ignored:dangerous-triggersonworkflow_run, commented).node --test .github/actions/resolve-config/api-budget-coverage.test.mjs: exit 0, 5 pass.check-affected: passed.Remaining
Related
🤖 Generated with Claude Code