Validate Forgejo Workflows

forgejo-runner validate checks every file under .forgejo/workflows/ against the runner’s own schema — the errors actionlint misses, because actionlint validates against GitHub’s schema and Forgejo accepts and rejects different keys.

In CI (the enforcement point)

The Lint workflow’s workflows-validate job runs on every PR and push to main. It invokes indri’s source-built runner binary directly — the same binary that executes the workflows, so validation and execution can never disagree on schema version. There is nothing to install and nothing to remember; a schema error fails the PR.

By hand

On indri, use the runner’s own build:

ssh indri '~/code/3rd/forgejo-runner/forgejo-runner validate --directory ~/code/personal/blumeops'

Anywhere with docker (gilbert), the upstream runner image carries the binary — match the version to forgejo_runner_version in ansible/roles/forgejo_runner/defaults/main.yml:

docker run --rm -v (pwd):/workspace -w /workspace \
    code.forgejo.org/forgejo/runner:12.8.2 \
    forgejo-runner validate --directory .

This replaced the validate_workflows dagger function and the mise run validate-workflows task, retired when the CI job landed: the dagger wrapper existed to standardize a docker invocation across environments, and CI is now the one environment that matters.