diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc index 06d500f0..8cec6510 100644 --- a/CONTRIBUTING.adoc +++ b/CONTRIBUTING.adoc @@ -428,3 +428,20 @@ Questions? Open an issue or check CLAUDE.md for project context. *Last Updated*: 2025-11-22 *Version*: 1.0 *Maintainer*: See MAINTAINERS.adoc + +== Signed commits + +Every commit that reaches the default branch must be signed; a ruleset refuses +unsigned pushes. Estate policy: +https://github.com/hyperpolymath/standards/blob/main/docs/SIGNING-POLICY.adoc[SIGNING-POLICY]. + +* **People and interactive agents** sign with an SSH key registered on GitHub + as a *signing* key (`gpg.format=ssh`, `user.signingkey=.pub`, + `commit.gpgsign=true`). The committer email must be verified on that account. +* **Apps, bots and workflows** never `git push` local commits. They write + through the API (`createCommitOnBranch` or the estate `signed-push` action) + so that GitHub signs each commit. +* Merge PRs with **squash**. The ruleset checks every commit on the PR branch, + not just the result, so one unsigned commit blocks the merge. Re-create such a + branch with signed commits (`git cherry-pick -S`) and open a new PR. + Rebase-merge replays commits unsigned and is disabled.