ceremony/actions
cluade-reviewer-andresmgsl 7d52b2cd4a feat(forge): refuse loudly when the client cannot speak the forge
The preflight half of #188, landed first so it stands alone: the forge is
decided once, before any sweep, and a client that cannot speak it exits
non-zero with a named reason.

Measured against forgejo.heavyduty.builders at 84bb1a4 — two of the three
actions reported SUCCESS having read nothing:

  labels-scope         exit 0  "no .github/labeler.yml" (the file is HTTP 200)
  labels-reconcile     exit 0  "reconciled."            (zero PRs enumerated)
  issueflow-reconcile  exit 1  "unexpected end of JSON input"

labels-reconcile's blind-sweep warning (#96) could not fire: it counts
unreadable PRs against a list `gh pr list` never produced, and a process
substitution's failure does not trip set -e, so total stayed 0. Installing
gh makes it worse, silencing the one loud failure.

Detection is measured, not inferred from docs: a real forgejo-runner v6.3.1
job (probe task 278) shows Forgejo populating the whole GITHUB_* namespace,
so GITHUB_ACTIONS proves nothing. GITHUB_API_URL's shape, GITEA_ACTIONS and
GITHUB_SERVER_URL do. The same probe shows the runner image carries neither
gh nor stoke, which is what makes the forgejo backend REST.

Tests declare CEREMONY_FORGE at the forge boundary rather than stubbing gh
and staying silent about the forge — the boundary move term 5 asks for.

Refs #188
2026-08-02 18:29:08 +00:00
..
changelog-armed feat: enforce changelog shape in guard and assembler 2026-07-24 16:14:35 +00:00
changelog-assembled feat: changelog-assembled — the release section must be exactly the fragments it consumed 2026-07-24 09:29:07 +00:00
changelog-monotonic feat: actions/changelog-monotonic — shipped headings are append-only 2026-07-22 21:09:59 +00:00
docs-sync fix: refuse non-regular nodes everywhere; machine-verify the mirror README 2026-07-22 21:59:37 +00:00
drill-recorded feat: actions/drill-recorded — a release carries its evidence 2026-07-22 21:28:06 +00:00
issueflow-reconcile feat(forge): refuse loudly when the client cannot speak the forge 2026-08-02 18:29:08 +00:00
labels-reconcile feat(forge): refuse loudly when the client cannot speak the forge 2026-08-02 18:29:08 +00:00
labels-scope feat(forge): refuse loudly when the client cannot speak the forge 2026-08-02 18:29:08 +00:00
runner-isolated feat(guards): actions/runner-isolated — the scan, the two-condition rule, the exit codes (#58) 2026-07-23 12:03:55 +00:00
.gitkeep ci: scaffold test and lint workspace 2026-07-22 16:56:25 +00:00