From d8be468799d211cf6a93234a01d9247f5d6b613c Mon Sep 17 00:00:00 2001 From: Manu Ignatius Date: Fri, 7 Aug 2026 18:56:15 +0530 Subject: [PATCH 1/2] Fix broken link check workflow: remove dead Slack step, fix config path The markdown-link-check step's custom config (ignore patterns for {{...}} Liquid syntax, /images/* paths, and expected 403/202/999 statuses) was never being applied. The generate-config step wrote it to $RUNNER_TEMP, but that step's action runs in a Docker container where $RUNNER_TEMP is mounted at a different path, so the config file was never found and every internal link and third-party 403 got reported as dead. Write the generated config into $GITHUB_WORKSPACE instead, which mounts 1:1 into the container, and reference it as a workspace-relative path. Also drop the Slack notification step. It posted to a webhook that no longer exists (Slack returned 404/no_active_hooks on every run), and Slack is no longer used for this notification. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/broken-links.yml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/workflows/broken-links.yml b/.github/workflows/broken-links.yml index 887239b3..af49bae3 100644 --- a/.github/workflows/broken-links.yml +++ b/.github/workflows/broken-links.yml @@ -19,18 +19,10 @@ jobs: {"pattern": "^(/[^#?]+\\.[A-Za-z0-9]+)$", "replacement": ("file://" + $ws + "$1")} ] }' \ - .github/workflows/markdown.links.config.json > "$RUNNER_TEMP/mlc.config.json" + .github/workflows/markdown.links.config.json > "$GITHUB_WORKSPACE/.github/workflows/mlc.config.generated.json" - uses: gaurav-nelson/github-action-markdown-link-check@v1 id: checker with: use-quiet-mode: 'yes' use-verbose-mode: 'yes' - config-file: '${{ runner.temp }}/mlc.config.json' - - uses: slackapi/slack-github-action@v1 - if: failure() - id: slack - with: - payload: '{"blocks":[{"type":"section","text":{"type":"mrkdwn","text":"Website Broken Link Check Status : *${{steps.checker.outcome}}*. \n\n Details : https://github.com/${{github.repository}}/actions/runs/${{github.run_id}} "}}]}' - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK + config-file: '.github/workflows/mlc.config.generated.json' From a0cd2113f81d38354b513523cf73c752362b6169 Mon Sep 17 00:00:00 2001 From: Manu Ignatius Date: Fri, 7 Aug 2026 19:17:05 +0530 Subject: [PATCH 2/2] Fix host-path leak in link check container, allow IEEE anti-bot status The generated replacementPatterns embedded $GITHUB_WORKSPACE, which is the runner's host-side path (e.g. /home/runner/work/...). The check itself runs inside the markdown-link-check Docker container, where the workspace is mounted at the fixed path /github/workspace instead, so every internal link resolved to a path that doesn't exist in the container even though the file is really there. Hardcode /github/workspace since that mount point is a fixed property of this action, not the runner. Also add 418 to aliveStatusCodes. IEEE Xplore returns it to automated clients as an anti-bot response, the same way other publishers already allow-listed here return 403; it doesn't mean the paper is gone. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/broken-links.yml | 2 +- .github/workflows/markdown.links.config.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/broken-links.yml b/.github/workflows/broken-links.yml index af49bae3..eae41807 100644 --- a/.github/workflows/broken-links.yml +++ b/.github/workflows/broken-links.yml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v3 - name: Generate link check config with internal link replacement patterns run: | - jq --arg ws "$GITHUB_WORKSPACE" '. + { + jq --arg ws "/github/workspace" '. + { "replacementPatterns": [ {"pattern": "^(/[^#?]+/)$", "replacement": ("file://" + $ws + "$1")}, {"pattern": "^(/[^#?.]+)$", "replacement": ("file://" + $ws + "$1.md")}, diff --git a/.github/workflows/markdown.links.config.json b/.github/workflows/markdown.links.config.json index 2c78653f..f4e875fc 100644 --- a/.github/workflows/markdown.links.config.json +++ b/.github/workflows/markdown.links.config.json @@ -16,7 +16,7 @@ { "pattern" : "^https?://podcasts\\.apple\\.com/"}, { "pattern" : "^https://subnero\\.com/solutions/swan\\.html"} ], - "aliveStatusCodes": [200, 202, 206, 301, 302, 303, 304, 403, 429, 999], + "aliveStatusCodes": [200, 202, 206, 301, 302, 303, 304, 403, 418, 429, 999], "retryOn429": true, "retryCount": 5, "fallbackRetryDelay": "30s",