ci: block the maintainer's address, leave contributors' alone - #70
Merged
Conversation
The scan matched @gmail, @yahoo, @Hotmail, @outlook and @ProtonMail. A contributor at a corporate or self-hosted domain passed straight through, and so did an address pasted into a commit body from a log or a quote -- which is the way an address actually reaches a commit message by accident. It now matches any address and allows only the ones that identify a service rather than a person: a GitHub noreply address, noreply@anthropic.com, support@github.com and noreply@github.com. Two false positives were found by running the new rule over the last 60 commits of all four repositories before shipping it, and both are handled: dependabot signs off as support@github.com, and matches like claude_code@2.1.263.json or pkg@1.2.3.tar.gz are filenames rather than addresses, so the last label must look like a TLD and known file suffixes are excluded. After those fixes, no commit fails for an email reason -- every remaining failure over that window is a session identifier this check already caught. The consequence worth stating: signing off with a personal address now fails CI, for maintainers and outside contributors alike. GitHub issues every account a noreply address for exactly this, and it satisfies DCO. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
jothimani-rajendran
marked this pull request as ready for review
September 9, 2026 12:42
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
The "Scan commit messages for local or personal data" job matched five consumer domains —
@gmail,@yahoo,@hotmail,@outlook,@protonmail. A contributor at a corporate or self-hosted domain passed straight through, and so did an address pasted into a commit body from a log excerpt or a quoted report, which is how one actually arrives by accident.Three rules replace that blocklist:
Signed-off-by,Co-Authored-By,Reported-by,Reviewed-by,Tested-byandAcked-byare exempt. DCO sign-off is somebody's own attestation — their address there is their choice, not a leak, and blocking it would turn a privacy check into a barrier to contributing.Why rule 3 uses a digest
Writing the address into a public workflow file in the clear would publish it far more prominently than the old commits this check exists to stop repeating. It is matched by SHA-256 digest instead, so the file never contains it.
Validated before pushing, not after
Against the last 60 commits of all four repositories: not one email false positive. An earlier revision of this branch had two, both found the same way and fixed —
support@github.com, and this repo's recent history includes such commits, so it would have failed every dependency PR;claude_code@2.1.263.jsonandpkg@1.2.3.tar.gzare filenames, so the last label must look like a TLD and known file suffixes are excluded.Every remaining failure across that window is a session identifier this check already caught.
The workflow's own
run:block was then extracted and executed end to end against three throwaway commits: a contributor@gmailsign-off passes, the maintainer address fails, a pasteduser=bob@example.orglog line fails — and neither address is echoed into the log, because a log line is a publication too.Scope unchanged
Still scans only
BASE_SHA..HEAD— never full history. This repo has 83 pre-existing session-link violations onmain, by far the most in the org; a full-history scan would fail every build from day one. This stops new leaks; it does not clean old ones, which is a settled decision.🤖 Generated with Claude Code