feat(git): pre-push signature guard gated on the target repo's require_signed_commits protection (#425 item 2) #479
No reviewers
Labels
No labels
breaking
bug
documentation
enhancement
epic
good first issue
help wanted
refactoring
resolution/duplicate
resolution/invalid
resolution/wontfix
security
severity/critical
severity/high
severity/low
severity/medium
status/abandoned
status/blocked
status/needs-decision
status/needs-info
status/needs-verification
testing
upstream
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
sixfold-space/madtea!479
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "issue-425-fix-commit-authorcommitter-come-from-the-global-gi"
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?
Summary
Closes #425. The three items, with where each is satisfied:
Item 1 (identity from the target repo, plus the pre-push identity guard) landed in PR #448:
svcgit.CheckBranchIdentityininternal/service/git/identity_guard.go, wired inPushandfinishRun.pushStep.Item 2 (pre-push signing verification) lands here, on the posture ADR 0013 recorded on 2026-09-08:
svcgit.CheckBranchSignatures(internal/service/git/signing_guard.go). It lists the TARGET repo's branch protection rules from the forge (dir-scoped client, same construction as the push exit-128 diagnostic, ADR 0025), and only when a rule covering the default branch setsrequire_signed_commits(exact name or the forge's glob rule form) does it read each commit object the branch adds (git log <range> --format=%H %G?, the identity guard's own range) and refuse on the first commit that is not G or U, naming the sha and what git found (unsigned, bad, unverifiable here, expired, revoked) and the remedy. No key material in madtea; git verifies against the operator's own key.Push(pushSigningGuard) and in both legs offinishRun.pushStep(finishPushSigningGuard); refusals return verbatim.resetPushSeams.Item 3 (no unsigned server-side merge commit from finish): finish honors the repo's
default_merge_style; on this repo that is fast-forward-only, so no merge commit is minted (every merge today landed with main at the work commit's own sha). The residual case, a signing-required base whose merge style mints a merge commit, is filed as #478.Gate:
./scripts/gate.shfull run passes (all 18 checks).Closes #425