### Fixed - The release doors run on a Forgejo consumer. `lib/facts.sh` and `release.yml` gathered and published through `gh`, which the runner image does not ship, so the merge door read `labeled=no` for a correctly labeled ceremony PR and the tag door died at the publish (#191). - A release fact that could not be read is no longer reported as a definite `no`. A completed read finding no label is still `no` and still fail-closed; a read that did not complete refuses and emits no fact — the distinction that demoted a ceremony PR to "a bare push" (#191). ### Added - `forge_release_exists`, `forge_commit_pulls`, `forge_tag_create`, `forge_release_create` and `forge_pr_create` on both backends, so the release path names no client. Forgejo serves one PR object at `/commits/{sha}/pull` where GitHub serves an array at `/pulls`, and creates tags at `/tags` where GitHub POSTs to `/git/refs`; both verbs emit the GitHub shape so the call sites carry one expression (#191).