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 builds the nixpkgs runner from the indri flake’s pinned nixpkgs input — the same package the generation’s unit runs — and invokes it directly, 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, build the same nixpkgs package the unit runs:

ssh indri 'runner_bin="$(nix build --no-link /etc/blumeops/darwin/indri#forgejo-runner --print-out-paths)/bin/forgejo-runner"; "$runner_bin" validate --directory ~/code/personal/blumeops'

Anywhere with docker (gilbert), the upstream runner image carries the binary — match the version to the indri flake’s nixpkgs pin (13.1.0):

docker run --rm -v (pwd):/workspace -w /workspace \
    code.forgejo.org/forgejo/runner:13.1.0 \
    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.