merge upstream 0.6.0 onto the forge tree, and port every gh call site it brought (#198)
`git merge` of upstream `8c3a4d1` onto `dad99dd`, common ancestor `84bb1a4`.
18 hunks in 10 files; `lib/forge.sh`, `lib/forge-github.sh` and
`lib/forge-forgejo.sh` conflict in none and come out byte-identical.
The resolutions the issue decided: VERSION and both CEREMONY_SELF_REF
carriers take upstream's numbers; `.github/labels.conf` and `drills/0.4.1.md`
keep this forge's; CHANGELOG keeps both sides and names the upstream commit
this tree carries.
The part the hunks did not contain. Upstream's 0.5.0/0.6.0 work added whole
functions to files this tree already owned, so `git merge` took its side
without raising a conflict — and with them, EIGHT runtime `gh` call sites
that #188 had removed. Seven are ported onto the shim: two reads and four
comment writes in issueflow-reconcile, and labels-reconcile's HEAD_COMMIT_AT
read. The eighth is `gh workflow run` in labels.yml, which a workflow cannot
declare a client for and whose Forgejo equivalent this instance answers with
500 rather than a 4xx — named with its reason rather than ported on a guess.
test/no-runtime-gh.test.sh makes the rule mechanical, because reviewing the
diff could not: four reviewers reading it each found a different subset, and
the contract suite stubs `gh`, so a reintroduced call site passes it.
Three seams the resolution decides are silent when resolved wrongly, and each
now has a case that fails on the wrong one: the merged record's `merged_at`
third column (without it every sort key ties and the highest PR number comes
back), the open gather's one-BODY-row-per-line feed (a whole decoded body as
one record loses every declaration including the first), and the whole-board
read whose COLLISION_FLAGS/WINDOW_FLAGS consumers auto-merged.
The open gather carries CLOSING rows as well as BODY rows. `Refs` alone would
drop every `Closes #N` link on the open side and reclaim a claim the PR was
holding — the existing base64 round-trip case is red without it.
actions/refs-not-closing declares CEREMONY_FORGE_CLIENT=gh: its only gather
is GraphQL, which Forgejo does not serve at all. #199 ports it.
test/run.sh: 28 test files, 0 failed. shellcheck and actionlint clean.
Refs #198
2026-08-05 11:56:23 +00:00
|
|
|
### 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).
|
|
|
|
|
|
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
|
|
|
- `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).
|
|
|
|
|
|
merge upstream 0.6.0 onto the forge tree, and port every gh call site it brought (#198)
`git merge` of upstream `8c3a4d1` onto `dad99dd`, common ancestor `84bb1a4`.
18 hunks in 10 files; `lib/forge.sh`, `lib/forge-github.sh` and
`lib/forge-forgejo.sh` conflict in none and come out byte-identical.
The resolutions the issue decided: VERSION and both CEREMONY_SELF_REF
carriers take upstream's numbers; `.github/labels.conf` and `drills/0.4.1.md`
keep this forge's; CHANGELOG keeps both sides and names the upstream commit
this tree carries.
The part the hunks did not contain. Upstream's 0.5.0/0.6.0 work added whole
functions to files this tree already owned, so `git merge` took its side
without raising a conflict — and with them, EIGHT runtime `gh` call sites
that #188 had removed. Seven are ported onto the shim: two reads and four
comment writes in issueflow-reconcile, and labels-reconcile's HEAD_COMMIT_AT
read. The eighth is `gh workflow run` in labels.yml, which a workflow cannot
declare a client for and whose Forgejo equivalent this instance answers with
500 rather than a 4xx — named with its reason rather than ported on a guess.
test/no-runtime-gh.test.sh makes the rule mechanical, because reviewing the
diff could not: four reviewers reading it each found a different subset, and
the contract suite stubs `gh`, so a reintroduced call site passes it.
Three seams the resolution decides are silent when resolved wrongly, and each
now has a case that fails on the wrong one: the merged record's `merged_at`
third column (without it every sort key ties and the highest PR number comes
back), the open gather's one-BODY-row-per-line feed (a whole decoded body as
one record loses every declaration including the first), and the whole-board
read whose COLLISION_FLAGS/WINDOW_FLAGS consumers auto-merged.
The open gather carries CLOSING rows as well as BODY rows. `Refs` alone would
drop every `Closes #N` link on the open side and reclaim a claim the PR was
holding — the existing base64 round-trip case is red without it.
actions/refs-not-closing declares CEREMONY_FORGE_CLIENT=gh: its only gather
is GraphQL, which Forgejo does not serve at all. #199 ports it.
test/run.sh: 28 test files, 0 failed. shellcheck and actionlint clean.
Refs #198
2026-08-05 11:56:23 +00:00
|
|
|
- `.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).
|