name: Markdown link check # Verify every internal markdown link in the repo resolves to an existing # file (or anchor). # # Triggers: # - "/links" in commit message (manual, on that exact commit) # - Weekly cron Mon 05:00 UTC (catches link rot without any activity) # - workflow_dispatch (manual run on any branch) # # git commit -m "docs: rename section /links" on: push: branches: - main - dev - "claude/**" - "feature/**" - "review/**" schedule: - cron: "0 5 * * 1" # Monday 05:00 UTC weekly link-rot check workflow_dispatch: {} jobs: check: if: | github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || contains(github.event.head_commit.message, '/links') || contains(github.event.head_commit.message, '/ci-all') runs-on: eulernest container: image: git.eulernest.eu/conformallab/ci-cpp:latest steps: - uses: actions/checkout@v4 # ── Pure-python internal link check (no external network needed) ──── # We use the same logic that found the 2 broken links before the # reviewer meeting: parse every [text](path) link, check that the # target file exists relative to the source file's directory. Skips # http(s)://, mailto:, and pure-anchor (#fragment) links. - name: Internal link check (all *.md files) run: python3 scripts/check-markdown-links.py