### Fixed - `.github/workflows/labels.yml` wakes the sweep over REST instead of `gh workflow run`, so a board event reconciles within seconds on any forge rather than waiting up to an hour for the scheduled sweep (#205). - The workflow-dispatch endpoint has the same shape on both forges, so that step no longer decides one: the `CEREMONY_FORGE_CLIENT=gh` declaration and both inline refusals are gone rather than ported (#205). - The dispatch supplies its `ref` explicitly, because REST has no default branch where `gh workflow run` had one, and refuses without it (#205). - It takes that ref from the repository, never from `GITHUB_REF_NAME` — on a `pull_request_target` run that is `/merge`, which is not a branch (#205). - A failed dispatch names the endpoint, the ref and the status, and says that an empty `500` body from Forgejo means the workflow name or the ref did not resolve — a bare status sends the reader after a server fault that is not there (#205). ### Added - `test/labels-dispatch.test.sh` extracts the shipped step and executes it against a recording stub, asserting the method, endpoint, ref and `inputs.bootstrap` actually sent (#205). - That test also drives the failure path: any non-204 still fails the job, so the misconfiguration alarm the trigger exists to be cannot decay into a warning (#205).