Forge README parity and link audit

Forge README Parity runs two independent checks against the README subsystem.

The parity job reads enabled surfaces from config/fsa-deployments.yml. It uses the shared platform adapter to enumerate projects and retrieve README.md from GitHub, GitLab, Gitea, Forgejo, or Codeberg. GitLab root groups are traversed recursively so subgroup placement does not hide a project. Observed downstream projects are matched by project name to the canonical source deployment and their README SHA-256 digests are compared. Documented exceptions in config/mirror-readme-baseline.json remain out of scope.

The external-link job clones the Interested-Deving-1896, OSP, and OOC profile projects and checks their Markdown files. scripts/check-markdown-links.py uses a Markdown-aware tokenizer: fenced and indented code, inline code, comments, images, local fragments, and non-HTTP schemes are excluded. Inline links, reference definitions, autolinks, and HTML anchors are checked once per unique URL with bounded retries for transient network and server errors. JSON and Markdown reports retain every source-file and line-number occurrence. The profile workflow records HTTP 403 responses as allowed because several working community-link services reject automated clients; the status remains visible in JSON rather than being discarded.

Local commands

python3 -m pip install pyyaml
GH_TOKEN=... GITLAB_TOKEN=... \
  python3 scripts/audit-forge-readme-parity.py \
    --output-json /tmp/forge-readme-parity.json \
    --output-markdown /tmp/forge-readme-parity.md \
    --fail-on-findings

python3 scripts/check-markdown-links.py README.md DOCS \
  --output-json /tmp/markdown-link-audit.json \
  --output-markdown /tmp/markdown-link-audit.md

Adding an enabled deployment to config/fsa-deployments.yml automatically includes it in the audit. Configure the corresponding platform token in Actions; the collector reports a missing token instead of silently skipping the surface.