fj pr merge reports a required check missing on PRs that fj pr checks reports fully green #238
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?
fj pr mergerefuses PRs thatfj pr checksreports as fully green, so everyparagon merge has to be done in the web UI.
Reproduction
Same for #1099 (15/15 green), and earlier for fjord-platform !951 and !955.
The likely cause
Branch protection on these repos sets:
In Forgejo,
*instatus_check_contextsis a glob meaning "every reportedcheck must pass". The error text quotes
"*"as though it were a literalcontext name and reports it
missing, which is what you would see if therequired-context list were compared literally instead of glob-matched.
The web UI merges these PRs without complaint, so Forgejo itself evaluates the
glob correctly.
Why it is not simply "protection working"
fj pr checksandfj pr mergedisagree about the same commit. One saysCombined: success, the other says a required check is missing. Whichever isright, they should not contradict each other on identical input.
Not universal, which may narrow it
Merges through
fjsucceeded tonight onrasterstate/forseti(#99) andrasterstate/fjord-platform(!948, !949, !950), all of which also havecontexts: ['*']. Every failure has been onrasterstate/paragon, plusfjord-platform PRs that had one genuinely-failing check attached to the head
commit.
That suggests the trigger is a check in a non-success terminal state that the
combined status still treats as passing — paragon has several that report
Has been skipped(lint / develop-superset-of-main) and one that reportsBlocked by required conditions(Test / rust-required). A skipped or blockedcontext may be what surfaces as
missing.Impact
Every paragon merge needs a human in the web UI, which removes the CLI from the
merge path entirely and blocks automation that would otherwise merge
develop-targeted work.
Root cause confirmed, and it is repo configuration rather than an
fjdefect,though
fjcould say so far more clearly.*is a literal wildcard: Forgejo requires every context reported on thecommit to be green, not just a required set. On paragon's develop PRs one context
is always
skipped:It is a promotion check, so it correctly skips on every feature-to-develop PR.
Skipped is not success, so
*never goes green and no PR can ever merge. Thatis why
fj pr checksandfj pr mergedisagree:checkssummarises the runsthat ran,
mergeevaluates the wildcard against all reported contexts includingthe skipped one.
Surveyed 7 develop PRs:
lint / develop-superset-of-mainwas skipped on all 7.Fixed repo-side on 2026-08-08 by replacing the wildcard on
developwith 17explicitly named contexts, excluding that promotion check, the advisory Forseti
context, and
Test / ci-script-tests(which reports on only one branch and wouldblock everything else as
missing). PRs merge normally now.mainstill has'*'. I left it alone deliberately: the only develop-to-main PRI can inspect post-merge carries only
(push)-suffixed contexts, so I cannottell what a live promotion PR reports, and naming
(pull_request)contexts therecould brick promotion entirely. It wants doing against the next real promotion PR.
Two things
fjcould do that would have saved the investigation:*, say so: "branch protection requiresALL reported contexts to be green (
status_check_contexts: ['*']); 1 of 19 isskipped: lint / develop-superset-of-main".
fj pr checksshow skipped contexts rather than folding them into thegreen summary.
Combined: success 15 checkswhile a skipped context blocksthe merge is the exact gap this issue is about.
Note the disagreement here is not the same bug as #240, which is about the merge
style flag. They compounded tonight: fixing the wildcard exposed a second,
unrelated rejection underneath it.