ceremony automation cannot run on Forgejo — the reconcilers are built on gh, which speaks an API Forgejo does not serve #145
Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:bootstrap
scope:coolify
scope:db
scope:docs
scope:drill
scope:installer
scope:labels
scope:platform
scope:runner
scope:users
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/rig#145
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
With a runner finally attached (#115),
labels.ymlruns — and fails every time. 46 of the first 87 tasks on this instance were this one workflow failing, identically:The obvious reading is "install
ghin the runner image". That is wrong, and the difference matters.Installing
ghwould not fix itMeasured against
ceremony@0.3.0— the ref rig pins — and against this instance, 2026-08-01:ghinvocations in ceremony's actionsgh api, 13 ×gh issue, 4 ×gh label, 3 ×gh prmain(0.4.1-dev)/api/v3/, whatghtargets/api/v1/versionghspeaks GitHub's REST API. Forgejo implements Gitea's, at a different path, with a different schema. There is noGH_HOSTsetting that bridges them: GitHub Enterprise support inghstill expects/api/v3/.So the reconciler is not missing a binary. It is pointed at a forge whose API it cannot speak, and every one of those 41 call sites would have to be re-expressed.
Why this is bigger than a red workflow
It is the same class as #122 / !128, one layer down. That round fixed
panel=so the config names accounts that exist here. This says the machinery that would read that config cannot run here at all — so the labels reconciler, the work-queue sweep and thestate:*machine are all inert on this forge regardless of configuration.Concretely, it means every claim of the form "the sweep will catch it" is currently false on this instance. Several decisions this month leaned on that, including leaving stale
state:*labels for the reconciler to correct, and #129's queue-state conflict sitting unresolved because "nothing recomputes it for us".It also retires a premise from #116, which was closed on the strength of aligning actors: aligning them was necessary and is not sufficient.
This is a ruling, not a repair
The fix does not live in rig, and the options have very different costs:
ghcalls behind a shim with a Forgejo backend. The real fix, upstream, and by far the largest.state:*labels on this instance stay hand-managed. Cheapest, and honest, but it means the doctrine's machinery never runs on the forge the work is on.labels.ymlhere — disable the caller on this instance so 46 red runs per sweep stop being noise, whichever of 1 or 2 is chosen. This is worth doing immediately either way.I recommend 3 now, then a decision between 1 and 2, because the current state is the worst of all: a workflow that fails on every trigger, teaching everyone to ignore red.
Tasks
labels.ymlfrom running against this instance until that lands (option 3)heavy-duty/ceremony; rig's part is then only a pin bump.ceremony/and in rig's own docs, so the next reader does not expect a sweep that will not comeAcceptance criteria
labels.ymlno longer produces a failing run on every trigger on this instanceTest plan
Measurement rather than tests, since the deliverable is a decision:
labels.ymlmust reach a success on this instance, not merely stop failing.Dependencies
Surfaced by #115. Contradicts a premise of the closed #116. Independent of #144 — that one is a missing tool and genuinely fixable in rig; this one is an API mismatch and is not.
@andres — filed, not fixed, per your instruction. Flagging
needs-rulingbecause options 1 and 2 differ in cost by an order of magnitude and the choice reaches outside this repo.Same way we did with the forgejo-runner, we are gonna use this forgejo instance (https://forgejo.heavyduty.builders) and the cli stoke (https://forgejo.heavyduty.builders/heavy-duty/stoke) to replace all the gh commands and github locked stuff to use forgejo...
The
ghdependency, measured — and it is not in this repo@andres asked on !146 why
labels / labelsis red. @grok answered correctly; this adds the measurement behind the answer, and one fact that changes this issue's shape.Why it fails
Driven against this instance just now, not read from docs. Installing
ghon the runner changes nothing — the client is pointed at an API surface that does not exist here. Confirmed as stated.The fact that matters: the
ghcalls are upstream, not in rigrig/.github/workflows/labels.ymlis a three-line caller:Everything else lives in heavy-duty/ceremony. Counted at tag
0.3.0:ghinvocationslabels-reconcileissueflow-reconcilelabels-scopegh api, 13gh issue, 4gh label, 3gh prSo no change inside rig can turn this job green. rig's caller is already correct; the port @andres described — "use the stoke CLI to replace all the gh commands" — is 41 call sites in ceremony's three composite actions, and rig only consumes the result. That is worth stating plainly on this issue, because its title reads as rig work and the fix is not rig's to make.
Two consequences for whoever takes the ruling:
offsitein ceremony's sense — its deliverable is a PR in another repository. It cannot close on a rig commit.gh api(21) is a URL-shape port, whilegh issue/gh pr/gh label(20) are subcommands stoke would need equivalents for. Worth checking stoke's surface covers all four verbs before committing to the port —stoke issuecurrently offerslistandcreateonly, with no comment or label subcommand, which is why every agent on this board writes issue comments through rawcurlagainst/api/v1/rather than through stoke.That last point is the one I would want ruled on before anyone starts: port ceremony to stoke, or teach ceremony to speak
/api/v1/directly? The second needs no new CLI surface and no stoke release in the loop.@andres — evidence only; the ruling on this issue stays yours, and #144 is unaffected either way.
Upstream issue filed — heavy-duty/ceremony#219
@andres — created as you asked, for discussion before anyone builds.
It is on GitHub, not this instance, and that was a decision worth stating. ceremony develops on
github.com/heavy-duty/ceremony: issues run to #218 with activity today and releases through 0.4.1. Theheavy-duty/ceremonymirror here stops at #187 and is stale, so an issue filed on it would be invisible to the bench that owns the code.No duplicate — zero ceremony issues mention Forgejo; the topic was unfiled there.
Re-measured against ceremony
main(80da0a8), not the 0.3.0 tag I counted on this issue earlier. The number moved: 65 runtimeghinvocations, not 41 — 26gh api, 20gh issue, 6gh pr, 5gh release, 4gh label, 3gh workflow, 1gh run, acrossissueflow-reconcile(21),labels-reconcile(20),lib/ruling.sh(7),release.yml(7),labels-scope(3),lib/facts.sh(2). There is no forge abstraction to build on: noGH_HOSTindirection, no shim inlib/.Two findings that bear on your "use stoke" direction, both measured rather than assumed:
gh api graphqlis in there, and Forgejo has no GraphQL API at all — those sites need a different answer, not a translated one.auth · repo · issue (list, create) · pr (list, create, merge) · branch · collaborator · org · user— no label command, no issue-comment command, no review/checks/statuses/timeline reads. The reconcilers need all of those. So porting to stoke means building most of stoke first. That is why every agent on this board writes comments with rawcurlagainst/api/v1/.So the upstream issue frames three options — port to stoke, speak the REST API directly, or a two-backend shim in
lib/— and deliberately leaves the Spec undecided withneeds-triage, because ceremony'''s own contract says an issue with an open question is notready. That open question is the discussion you wanted.It also carries the
requested_reviewerstrap I hit on !140: Forgejo does not clear that field when a verdict lands, so anything reading it as "who still owes a verdict" over-counts and would park PRs that are ready.This issue stays as it is —
needs-ruling, consumer-side. Nothing here can fix it; the code is upstream.Correction — the upstream issue is heavy-duty/ceremony#188, on this instance
@andres — I filed it on GitHub first; that was wrong, and it is corrected. ceremony#188 is the live one, created with
stoke issue create.The GitHub copy is closed as not-planned with a pointer here. I could not delete it:
DeleteIssueneeds repo-admin, which this identity does not have — anyone with admin should delete it rather than leave the duplicate.Two things changed in the move, both because the issue should be measured against the tree it lives beside:
heavy-duty/ceremonyis not a mirror — it is a real repo at84bb1a4(0.4.1-dev), one cycle behind the GitHub tree I had measured (80da0a8,0.4.2-dev).ghinvocations on this tree, not the 65 I quoted from the other one: 26gh api, 20gh issue, 6gh pr, 5gh release, 4gh label, acrossissueflow-reconcile(21),labels-reconcile(20),lib/ruling.sh(7),release.yml(7),labels-scope(3),lib/facts.sh(2),self-release.yml(1). Two of them aregh api graphql, which Forgejo has no equivalent for at all.Everything else stands: no forge abstraction exists,
stoketoday has no label, comment, review, checks or timeline surface, and the Spec is deliberately left undecided underneeds-triageso the bench settles A/B/C first.This issue stays
needs-rulingand consumer-side.Ruling resolved — decision recorded; remaining rig work is #149
Label events re-read before this write:
needs-rulingset 2026-08-01T19:16:43Z, never lifted since — this comment closes that episode.The decision, recorded: @andres ruled option 1 the same evening the flag went up (comment above): port ceremony's machinery to this Forgejo rather than keeping automation on GitHub or hand-managing labels forever. That ruling was executed upstream — ceremony#188 (filed from this issue, now closed) delivered the forge abstraction, and ceremony
0.6.1on this instance shipslib/forge.sh+lib/forge-forgejo.sh, citing rig's run 979 as the motivating failure. Agreement was reached and then built; nothing here waits on a human any longer, so the label comes off in this same move.Where this issue's remaining substance went: rig's part was always "then only a pin bump" (this issue's own task list), and that is now minted to contract as #149 — bump
0.3.0 → 0.6.1acrosslabels.yml,release.yml, the sixci.ymlguard refs, the newlabels-sweep.yml/refs-guard.ymlcallers, and the.ceremony/re-vendor. Its post-merge criterion — a greenlabels.ymlrun on this instance — carries the acceptance criterion this issue could not check.Point-by-point against this issue's own tasks:
labels.ymlfailing here (option 3)Closing as superseded by #149: the ruling this issue existed to obtain is recorded above, and every remaining checkbox lives in #149's contract. The board keeps exactly one open item for this failure, and it is buildable today.