Repository navigation
feat(maintenance-check-links-online): upload dead links as a short-lived artifact - #993
Conversation
…ved artifact Each run that checked links uploads its broken links (error_map only, one entry per URL with every location) as the link-check-online-dead-links JSON artifact, kept three days, and names it in the new dead-links-artifact and dead-links-count workflow outputs, so a caller can route them. No new input and no permission change: upload-artifact uses the runtime token. Refs: melodic-software/claude-code-plugins#9759 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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. |
|
claude-security-review reviewed Security review: no findingsI read the full diff in
What I checked:
No hold is needed. |
|
claude-review reviewed No findings. I reviewed the 3-file diff ( What I checked:
Two observations, both below the bar for a finding:
|
Refs: melodic-software/claude-code-plugins#9759
Summary
The online link check reported dead links only in its job summary, so nothing downstream could act on them. Each run that checked links now uploads its broken links as a small JSON artifact and names it in two new workflow outputs. This is step 3 of claude-code-plugins#9759, owner decision Q-9759-1 (a), recorded here. A claude-code-plugins pull request adds the local workflow that files them; it needs this one merged first.
Fix
.github/workflows/maintenance-check-links-online.yml:Extract the dead links, afterWrite the report, understeps.gate.outputs.run == 'true' && !cancelled(), so it still runs on the red runs that have broken links. It reads lychee'serror_maponly (timeouts and accepted 429/5xx are left out) and writes an array of{url, status, detail, locations: [{path, line, column}]}, one entry per URL, sorted by URL. A run with no broken links writes[], so a consumer can tell "clean" from "did not run". A missing or non-JSON report, which the report step already fails, writes nothing.Upload the dead links:actions/upload-artifact(same pinned SHA aspr-review-cli.yml), artifactlink-check-online-dead-links,retention-days: 3.workflow_call.outputs:dead-links-artifact(the artifact name, empty when nothing uploaded) anddead-links-count.allowedInputschange. Permissions unchanged (contents: read): upload-artifact uses the runner's runtime token, notGITHUB_TOKEN.Every caller now stores this artifact, private repositories included. The payload is one small JSON file and it expires after three days.
README.mdsays what the outputs and artifact are.Verification
node --test .github/scripts/maintenance-check-links-online.test.cjs: 19 pass, 0 fail. New tests cover the outputs and the unchanged input list, the upload's pin, name and retention, grouping one URL's locations across files, the empty list, and no artifact for a missing or non-JSON report.node --test ".github/scripts/*.test.cjs": 912 pass, 0 fail.actionlinton the workflow: exit 0.zizmor --offlineon the workflow: no findings.biome cion the test file: clean.Related
workflow_runworkflow; it merges after this one🤖 Generated with Claude Code