upload-artifact@v4 requires the GitHub-only artifact v2 API
(GHESNotSupportedError on Gitea). v3 uses the v1 protocol that
Gitea's act_runner implements, and is mirrored on the Forgejo
mirror.
The node:20-bullseye runner image ships Python 3.9, which lacks
tomllib (3.11+). Extract inline workflow validation into
tools/validate_pack.py using regex-based parsing of the machine-
generated packwiz TOML subset, and call it from the workflow.
softprops/action-gh-release@v1 is not mirrored on the Forgejo action
mirror, which fatally aborted the job at action-download. Create the
release via the Gitea REST API using the built-in GITHUB_TOKEN and
upload both pack artifacts directly.
Builds the client pack on the media-server docker runner: refreshes the
packwiz index, runs integrity + download-resolvability checks, exports
Modrinth (.mrpack) and CurseForge (.zip) artifacts, validates the
CurseForge manifest completeness, uploads artifacts, and publishes a
release on v* tags.