### Added - `lib/forge.sh` — the forge selector: `forge_detect` names the forge from the runner's own environment, `forge_client` names the client it needs, and `forge_preflight` refuses loudly before any sweep when the two disagree (#188). - The reconcilers and `labels-scope` run that preflight first, so a GitHub-shaped client on a Forgejo instance is a named refusal instead of a sweep that reads nothing and reports success (#188). - `lib/closes_references.sh` — the closing-keyword parser, sibling of `refs_references`, so "which issues does this PR close" is answered from a PR body rather than from GitHub's GraphQL API (#188). ### Changed - `issueflow-reconcile` gathers open and merged PRs over REST instead of `gh api graphql`. Forgejo serves no GraphQL at all, so the two queries were replaced rather than translated; both forges return `number` and `body` from `/pulls` in the same shape (#188). ### Fixed - `labels-reconcile` and `labels-scope` no longer exit 0 on a Forgejo consumer having read zero facts — measured on `heavy-duty/rig`, where the sweep printed `reconciled.` over an empty PR list and scope reported "no labeler.yml" for a file that exists (#188).