ceremony/changelog.d/198.md
cluade-reviewer-andresmgsl 97e63acef0 fix(refs-not-closing): report and skip on a forge it cannot speak, rather than reddening every PR (#198)
The first head's `Refs guard` failed on this PR, correctly: spec 4's
CEREMONY_FORGE_CLIENT=gh declaration made forge_preflight refuse by name on
this forge. But that workflow runs on every pull request here, so the
declaration as first written turns every future PR red until #199 lands —
blocking the board for a gap that already has its own issue.

Refusing and scheduling are different questions. This action must never
produce a verdict from a graph it did not read, and it does not: on a forge it
cannot speak it now says so by name, cites #199, states that no verdict was
produced, and reaches the forge zero times. A preflight failure for any other
reason stays fatal, and on a forge it CAN speak nothing changes.

Also: five SC2016 findings in test/no-runtime-gh.test.sh. They were invisible
locally because shellcheck-all.sh lints TRACKED files and the guard was still
untracked when I ran it — a new file is exactly the case that check cannot
see. Verified this time against CI's pinned shellcheck 0.10.0 with the file
committed.

test/run.sh: 28 test files, 0 failed, under CI's CEREMONY_REQUIRE_* env.
shellcheck, actionlint, self-ref, marker and vendored guards all clean.

Refs #198
2026-08-05 12:09:05 +00:00

1.9 KiB

Added

  • This tree carries upstream ceremony through 8c3a4d1 (upstream 0.6.0): lib/attention.sh, lib/read.sh, actions/refs-not-closing, the guarded reads, and the ruling and window rules (#198).

  • test/no-runtime-gh.test.sh — the forge-portability guard: no runtime gh outside lib/forge-github.sh unless the file declares CEREMONY_FORGE_CLIENT=gh (#198).

  • CHANGELOG.md names the upstream commit this tree carries, so a drill record can say which 0.6.0 it exercised (#197, #198).

Fixed

  • Eight runtime gh call sites arrived with the merge outside every conflict hunk, in functions upstream added to files this tree already owned. Seven are ported onto the shim; the eighth is named with its reason (#198).

  • The open-PR gather reads Refs, not only closing keywords. Reading one side for closing links and the other for Refs is what released a live claim in crew#321, and this tree carried that shape (#198).

  • The merged record gains merged_at, so post_merge_pr_for_issue answers the PR that merged last rather than the highest-numbered one. Without the column every sort key ties and the old order returns silently (#198).

  • The open gather feeds open_pr_issues one record per physical body line. A whole decoded body as one record loses every declaration including the first, and reclaims a claim a live PR was holding (#198).

  • The post-merge nudge links the issue on the forge in play rather than a hard-coded github.com (#198).

  • actions/refs-not-closing reports and skips on a forge it cannot speak, naming the client and #199, instead of standing red on every PR. It reaches the forge zero times, so no verdict is produced either way (#198).

  • .github/scripts/release-path.sh names lib/forge.sh: #191 put the shim on the release doors' executable path here, so a doors-unchanged record that omitted it was measuring the wrong set (#198).