The Open-Source Claim Check: Confirmed, Partial, Unverifiable, or Contradicted
Take any open-source resume line, split it into four checkable claims, run the searches and git commands for each, and grade it with an evidence link before the onsite.
Key takeaways
- An open-source resume line like "core maintainer of X, 40+ merged PRs, contributing since 2021" is four separate claims (authorship, merge count, tenure, role), and each needs its own record and its own grade.
- The GitHub contribution graph is drawn from the Git author date, which anyone can set with GIT_AUTHOR_DATE, so graph squares alone should never grade a tenure claim higher than Partial.
- A missing Co-authored-by trailer proves nothing: in one measured repo, PRs merged by their own author carried a trailer 0 times in 38, while PRs merged by someone else carried one 2 times in 2.
- The GitHub Events API only reaches back 30 days or 300 events, so checking a multi-year tenure claim means looking up head SHAs in GH Archive, and that only works when the commit was the tip of a push.
- A CODEOWNERS entry only proves the handle had write permission when it was added; it does not prove a governance role, so check the commit that added it and whether the handle reviews recent PRs.
- In Refolk's index, US profile headlines say "open source contributor" 5.7 times as often as "open source maintainer" (694 versus 121), which makes the maintainer claim the rarer one and the one most worth checking against repository history.
This is the check to run when a finalist's resume says something like "core maintainer of X, 40+ merged PRs, contributing since 2021" and the onsite is a few days away. It's for engineering managers, technical founders, developer-relations leads and technical sourcers who need to know which parts are true, which are inflated, and which can't be seen in public records. I carry that one line through every search and git command, including the three wrong turns that make honest candidates look like liars. It ends with a four-grade verdict sheet where every grade has its evidence link next to it.
What does an open-source resume line actually claim?
A line like "core maintainer of X, 40+ merged PRs, contributing since 2021" is four separate claims: authorship, merge count, tenure and role. Each one is proven by a different record and gets its own grade.
Most bad verdicts start by grading the line as a whole. Someone glances at a busy contribution graph, decides the candidate "checks out," and never notices that the maintainer claim was the inflated part. Split the line before you open anything.
| Claim | Resume words | Primary record | What it cannot prove |
|---|---|---|---|
| Authorship | "of X" | Commit author field, .patch email | Who typed the code |
| Merge count | "40+ merged PRs" | gh search prs is:merged | Size of each PR |
| Tenure | "since 2021" | Earliest merge, earliest push | Continuous activity |
| Role | "core maintainer" | Commit adding handle to CODEOWNERS | Governance standing |
The four grades
Every row gets exactly one grade, with a link next to it:
- Confirmed. A record the candidate can't edit (a PR merge record, a push record, the commit that added their handle) directly shows the claim.
- Partial. Some of the claim is true, or the only support is evidence the candidate can set themselves, such as graph squares or author dates.
- Unverifiable. The public record can't reach the claim. Examples: private repos, an expired event window, an email that can't be attributed.
- Contradicted. A record directly conflicts with the claim. Missing evidence never earns this grade, and neither does an odd-looking pattern.
The worked case is one finalist's line, anonymised. The project is called X, and the candidate's own counts appear only relative to the claim ("short of 40") rather than as raw numbers. That keeps the candidate unidentifiable and the method general. The measured figures in this guide come from published single-repo measurements and from Refolk's index, and I attribute each one where it appears.
Which public records can prove each claim, and how strong is each?
Records the platform writes when something happens, such as PR merges and push events, are strong. Records that carry dates the author chose, such as git history and the profile graph, are weak on timing. The graph is the weakest of all, because it is both author-dated and cached.
Evidence strength for open-source claims
- Platform recordsPR merge records and push events, written by GitHub at the moment they happen
- Repository historygit log, CODEOWNERS and MAINTAINERS commits; shared history, but author dates are settable
- Commit trailersCo-authored-by lines, present or absent depending on who clicked merge
- Profile graphAuthor-dated, cached at push, filtered by email linkage; caps a claim at Partial
Author date vs committer date on a GitHub profile
Every Git commit has two timestamps. The author date is when the change was originally written. The committer date is when the commit object was last created or rewritten. Practitioners have documented in community troubleshooting threads that the contribution graph uses the author date, while repository history views can show the committer date. GitHub's own troubleshooting page doesn't say this outright, so treat it as practitioner-documented, not official.
Both dates can be set to anything. Git accepts custom values through the GIT_AUTHOR_DATE and GIT_COMMITTER_DATE environment variables. Ordinary workflow also moves them. Amend and rebase usually reset the committer date to the current time and keep the original author date. So a gap between the two dates is normal in any project that rebases.
The push records, and their windows
The only public records of when a commit reached GitHub are push events, and there are two places to find them.
| Record | Window | Carries commit SHAs? |
|---|---|---|
| Profile graph | Author date, cached at push | Yes, via the commit pages |
| Events API | 30 days or 300 events | Head SHA only, since 2025 |
| GH Archive | Since 2011, mostly PushEvent from mid-2025 | Head SHA only, since October 2025 |
The Events API returns at most 300 events and only from the past 30 days, which makes it useless for a "since 2021" claim. GH Archive goes back to 2011. GitHub's changelog of 2025-08-08 announced that push events would drop commit summaries and counts. As checked against a public issue tracker, a PushEvent payload now holds only before, head, push_id, ref and repository_id. The ClickHouse GH Archive dataset notes that since the middle of 2025 the feed reports almost only PushEvent events. Payload shapes can change. To re-check the current shape, pull one recent PushEvent from the Events API and look at which fields are present.
What survived the change is enough for timing. The head SHA still places a commit on the earliest date it reached GitHub, provided that commit was the tip of a push.
The procedure: verifying open-source contributions on a resume
Seven steps, in order. Each ends with a written artifact, so a hiring manager, a sourcer and an engineer can split the work and still produce one sheet. The time estimates are rough guesses, not measurements. Nobody has documented a standard order for this job. I run the volume checks first because they produce the emails and SHAs the role check needs, but if the hiring decision depends only on the maintainer claim, step 6 can go first.
Open-source claim check
- Split the claim into four rowsBreak the line into authorship, merge count, tenure, and role, each with an empty grade and evidence column. About 10 minutes.
- Find the merged PRsRun gh search prs is:merged author:LOGIN repo:OWNER/REPO and record the count, the earliest merge date, and the search link. About 15 minutes.
- Clone the repo and dump both datesRun git log --author=EMAIL --pretty=fuller, taking the real author email from a commit's .patch view. Done when every in-scope SHA has both dates and an email. About 30 minutes.
- Find credit hidden in squash mergesGrep the default branch for Co-authored-by lines carrying the candidate's email, and count them separately from authored commits. About 15 minutes.
- Check push timingLook up PushEvent head SHAs in GH Archive and record the earliest push date, or mark it unavailable. About 30 to 60 minutes.
- Check the roleRun git log --follow -p CODEOWNERS (or MAINTAINERS) and record the SHA and date of the commit that added the handle. About 15 minutes.
- Grade each claim with a linkGrade every row Confirmed, Partial, Unverifiable, or Contradicted, and paste the evidence link beside it. About 10 minutes.
These are the commands, in the order the steps use them. Replace the capitalised placeholders.
# Step 2: merged PRs by the candidate (works for any merge strategy) gh search prs is:merged author:LOGIN repo:OWNER/REPO # Step 3: get the real author email from any known commit # open https://github.com/OWNER/REPO/commit/SHA.patch and read the From: line git clone https://github.com/OWNER/REPO && cd REPO git log --author="EMAIL" --pretty=fuller git show --stat SHA # empty diff = no work in this commit git cat-file -t SHA # confirms the SHA still exists in the repo # Step 4: squash-merge credit git log -i --grep="Co-authored-by:.*EMAIL" --oneline git log -i --grep="Co-authored-by:.*EMAIL" --oneline | wc -l # Step 6: who was added to code ownership, and when git log --follow -p CODEOWNERS git log --follow -p MAINTAINERS gh api repos/OWNER/REPO/codeowners/errors
Replace LOGIN, OWNER/REPO, EMAIL and SHA; run the git commands inside a fresh clone of the default branch.
Worked case, part one: merge count and authorship
In the worked case, the PR search came back short of 40. The commit log showed more work than the PR count did. Authorship came out Confirmed and merge count came out Partial. Two wrong turns along the way nearly produced a Contradicted grade.
Merge count: search PR records, not commits
The first query was gh search prs is:merged author:LOGIN repo:OWNER/REPO. The is:merged qualifier matches only merged pull requests. Because it searches PR records rather than commits, it gives the same answer whether the project squashes, rebases or merges. The search returned fewer than 40 merged PRs, and the earliest merge was in 2021.
The tempting move here is to stop and write "inflated." I didn't. "40+ merged PRs" could be a loose way of describing commits, PRs merged under a second account, or PRs the candidate co-authored on someone else's branch. Counting PRs and commits separately is the whole point of steps 2 and 3. One squash merge produces one commit however much work went into it, and one PR can carry dozens of commits.
Authorship: the first wrong turn
The candidate's GitHub profile showed very little activity in X. The first instinct was that most of the claimed work wasn't theirs. That would have been wrong.
GitHub counts a commit on a profile only when all three of these hold:
- The commit email is linked to the account.
- The commit is in a standalone repository, not a fork.
- The commit landed on the default branch or gh-pages.
Generic addresses such as jane@computer.local can't be linked to an account at all. The docs also list "commit made less than 24 hours ago" as a cause of missing contributions.
Opening the .patch view of one merged PR's commit showed the candidate had authored most of their work under a former employer's email, which wasn't linked to their personal account. Running git log --author with both emails changed the picture. The commits were there in the upstream history, with real diffs, under the candidate's name.
Matching the second email to the same person is where most of the friction sits. When the work email is the only lead, Refolk returns the person's GitHub handle and professional profile together, which tells you whether the commit name and the resume belong to the same human.
Squash-merge Co-authored-by credit: the second wrong turn
Next came the grep for Co-authored-by: trailers carrying the candidate's email. A Co-authored-by trailer is a line at the end of a commit message that credits additional authors. On a squash merge, GitHub adds one for each PR commit whose author differs from the person who clicks merge. The grep found trailer credit on some commits, but many squash commits that matched the candidate's PRs had no trailer at all.
That looks damning until you see the published measurements.
| Repo, condition | Merges | With trailer |
|---|---|---|
| AkaLab, merged by branch author | 38 | 0 |
| AkaLab, merged by someone else | 2 | 2 |
garamsh, gh pr merge --squash | 2 | 2 |
garamsh, --squash --body "" | 3 | 0 |
| garam, most recent merges | 8 | 0 |
Survival rates work out to 0%, 100%, 100%, 0% and 0%. Authors who merge their own PRs never get a trailer. Passing --body to gh pr merge replaces GitHub's default message, and the trailer goes with it. Every squash commit without a trailer in X turned out to be either a PR the candidate merged themselves, or one merged with a custom body. Both are consistent with honest authorship. I haven't established how rebase-merge records the author, so if X uses rebase merging, rely on the commit author field and the PR record and not on trailers. These rows come from two repositories, and no ecosystem-wide rate has been published.
A missing trailer tells you who clicked merge, not who did the work.
Grades after part one
- Authorship: Confirmed. Linked commits with real diffs under both emails, each tied to a merged PR record.
- Merge count: Partial. Merged PRs authored by the candidate came in short of 40. Authored commits plus trailer-credited commits came close to the claimed volume, but "merged PRs" literally describes PR records, and those fell short. The evidence link is the saved search.
If you want a baseline for what an ordinary multi-year PR record looks like in a large project, look at a cohort of real contributors before you judge one finalist against your own expectations.
Worked case, part two: tenure and maintainer role
Tenure came out Confirmed from the PR merge record. The graph alone would only have supported Partial. The role came out Partial: the handle was in CODEOWNERS, but nothing showed a governance role that would make "core" true.
Tenure: the third wrong turn
The profile graph showed squares in 2021, and the tempting grade was Confirmed. That's the mistake behind most "fake GitHub contribution graph" stories in hiring, in both directions. The graph uses author dates, which can be set to anything. Its squares are also cached at push time, so commits removed by a force-push can stay on the graph after they no longer exist. Graph evidence caps a tenure claim at Partial.
Three checks did the actual work:
- Earliest merged PR. The step 2 search already had a 2021 merge date. GitHub records that when the PR is merged. The author's clock doesn't set it.
- Empty commits.
git show --staton the earliest commits showed real diffs, which rules out the--allow-emptybackdating pattern. - Earliest push. The Events API's 30-day window was no help for 2021. In GH Archive, a lookup of the head SHAs from the earliest pushes found one of the candidate's early commits as a push tip.
A gap between author and committer dates showed up on several later commits. The project rebases, and rebasing moves the committer date by design. A gap is only suspicious when the author date comes before any push to the repository. Here the author dates were close to their pushes.
Reading a dated commit
Tenure: Confirmed. The evidence link is the earliest merged PR, with the GH Archive event as a second source. "Contributing since 2021" claims a start date, not continuous activity, and I graded only what was claimed.
Verifying a candidate is a maintainer of an open-source project
The role claim is the one worth the most care, and the numbers show why. In Refolk's index of professional profiles, 121 US profiles have a headline matching "open source maintainer" and 694 match "open source contributor." The maintainer claim is the rarer one, and it's the one a hiring manager will lean on in the debrief.
| Segment | Profiles | Ratio |
|---|---|---|
| US, "open source maintainer" | 121 | 1.00 |
| Germany, "open source maintainer" | 46 | 0.38 of US |
| US, "open source contributor" | 694 | 5.7x US maintainer |
The ratios are derived. Visible top employers among the US maintainer headlines include AboutCode.org, CNCF, Docker and Microsoft. In Germany the top regions are Karlsruhe (4) and Berlin (3). The title and employer breakdowns come from a 25-profile sample, so read them as texture, not distribution.
For X, git log --follow -p CODEOWNERS found the commit that added the candidate's handle. It came after their first merged PRs, which is the normal order for someone who earned write access. The two facts that matter about CODEOWNERS:
- What it proves. GitHub requires code owners to have write permission on the repository, and teams listed there must be visible. An entry proves write access at the time of the adding commit.
- What it does not prove. Governance. Write access is how most people end up there, and it doesn't amount to a "core maintainer" role.
gh api repos/OWNER/REPO/codeowners/errorslists lines GitHub couldn't resolve, so an entry that looks valid may be inert.
The next check was behavioural. Does the handle review recent PRs? It did, on a steady share of PRs touching the paths they owned. MAINTAINERS and GOVERNANCE files are project conventions the platform doesn't enforce, and X's governance file listed a smaller core group that didn't include the candidate.
To see who the real maintainer set is, it helps to know who else claims the role. A Refolk search for maintainers of that project brings back the other people who say they maintain it, which you can then check against the governance file.
Two things I haven't verified, so check them locally if they matter to the claim:
- Release and registry records. I haven't established how release tags are attributed or how npm and PyPI publisher records work. If the candidate says they "cut releases," open the release page and the registry's own maintainer listing for the package, and treat what you find as supporting evidence only.
- Org membership. I haven't established how visible org membership is. A missing org badge on a profile proves nothing.
Role: Partial. The link goes to the commit that added them to CODEOWNERS, with the governance file noted next to it. They are a code owner who actively reviews. "Core maintainer" isn't supported.
How this check goes wrong: failure modes and false positives
Almost every way this check fails points the same direction: an honest candidate gets graded as a liar because of how GitHub records and displays work. The opposite failure, a fabricated record that passes, is rarer and mostly comes from trusting the graph.
| Failure mode | What it looks like | Real cause, usually | Check |
|---|---|---|---|
| Graph as tenure proof | 2021 squares, graded Confirmed | Backdated empty commits | git show --stat, GH Archive push |
| Missing profile commits | Sparse graph, graded Contradicted | Unlinked or generic email, fork work | .patch email, upstream log |
| No trailer | Squash commits uncredited | Self-merge or custom --body | Author field, PR record |
| PRs counted as commits | Count mismatch, graded inflated | One squash equals one commit | Count steps 2 and 3 separately |
| Date gap read as fraud | AuthorDate before CommitDate | Rebase or amend | Gap only matters before first push |
Three more need room to explain:
- Treating CODEOWNERS presence as maintainership. It only needs write permission. Check whether the handle actually reviewed recent PRs, and read the governance file if there is one.
- Trusting graph squares after a force-push. The graph caches commit events when they're first pushed, so squares can outlive the commits they stand for. Run
git cat-file -t SHAon each in-scope SHA to confirm it still resolves in the repository. - Grading on pattern anomalies alone. Bursty activity, odd hours and a sudden run of squares are all patterns, and none of them is proof. Anomalies justify Unverifiable, never Contradicted.
The last point needs context because it's where hiring teams most want a tool. There is no published, vetted detector for commit inflation, and no published count of accounts that fake their contribution graph. The nearest measurement covers stars. The StarScout study found 6.0 million fake stars and 18,617 repositories with fake star campaigns, involving about 301,000 accounts. It caught 81% of repositories and 76% of accounts in one confirmed malware campaign. Its authors still say its evidence alone is insufficient for disciplinary action. If a peer-reviewed detector with a known miss rate isn't enough for that, a hiring team's eyeball read of a graph isn't enough to call a candidate a liar.
Squares can be wrong in the other direction too. GitHub's docs say the graph rebuilds automatically when a new email is added. One user still reported historical commits missing more than two weeks after verifying the email. If a candidate says "I just linked that email," believe the upstream log, not the profile.
Writing the verdict and what to do before the onsite
The deliverable is one sheet: four rows, one grade each, one evidence link each, and a note on what to ask in the interview. Anything graded Partial or Unverifiable becomes an interview question, not a rejection.
For the worked case the sheet read: authorship Confirmed, merge count Partial, tenure Confirmed, role Partial. That's an honest engineer who rounded up twice. Both rounding-ups go to the interviewer as direct questions: "Walk me through how you count the 40 PRs" and "What does core mean in X's governance, and are you in that group?" A candidate who answers both cleanly has told you more than the graph ever could.
Candidate: Resume line (verbatim): Repo checked (OWNER/REPO, default branch): Emails attributed (source: .patch view of SHA): Claim | Grade | Evidence link | Note Authorship | | | Merge count | | | PRs merged: __ Commits authored: __ Trailer-credited: __ Tenure | | | Earliest merge: __ Earliest push: __ (or unavailable) Role | | | Added to CODEOWNERS in SHA __ on __; reviews recent PRs: yes/no Questions for the onsite: 1. 2. Checked by / date:
One sheet per resume line; never leave a grade without a link, and keep authored and trailer-credited counts in separate cells.
On confirming with the project: I know of no published procedure for asking a maintainer to confirm a candidate's contribution that also protects the candidate's confidentiality. Naming a finalist to a third party can expose a job search they haven't told their employer about. Do the record checks, then ask the candidate. If they want a maintainer to vouch for them, let them make the introduction.
The mechanisms behind this guide change from time to time. Before relying on the push-timing step, pull one fresh PushEvent and confirm which fields it carries. Before relying on the email rules, re-read GitHub's "Troubleshooting missing contributions" page. There is an open community feature request to show push dates on the graph. If GitHub ships it, steps 3 and 5 get much shorter.
Before the verdict goes to the hiring manager
- The resume line is split into four rows: authorship, merge count, tenure, and role.
- Merged PRs and authored commits are counted separately, and trailer-credited commits are in their own cell.
- The author email was taken from a .patch view, and the upstream log was searched with every attributed email.
- No tenure grade above Partial rests on graph squares or author dates alone.
- Every in-scope SHA still resolves in the repository.
- The role grade cites the commit that added the handle and says whether the handle reviews recent PRs.
- No claim is graded Contradicted without a conflicting record the candidate does not control.
- Every grade has an evidence link next to it, and every Partial or Unverifiable row has an interview question.
Questions practitioners ask
Can I tell if GitHub commits are backdated?
Sometimes, but not from the graph alone. The graph uses the Git author date, which anyone can set with GIT_AUTHOR_DATE. Look for commits with no diff using git show --stat, then look up the commit's earliest push in GH Archive. If the author date is earlier than any push to the repository and the commits are empty, that matches the backdating pattern. Even then, grade the claim Unverifiable and ask about it in the interview. Don't grade it Contradicted.
Does a gap between author date and committer date mean the commits are fake?
No. Rebase and amend usually move the committer date to the time of the rewrite and leave the original author date alone. A gap is normal in any project that rebases. It only becomes suspicious when the author date comes before any push to the repository, and you can only check that against a platform push record such as GH Archive.
Why don't the candidate's contributions show on their GitHub profile?
The most common causes are mundane. The commit email isn't linked to the account (generic addresses like jane@computer.local can't be linked at all), the work was in a fork, or the commits never landed on the default branch or gh-pages. Get the real author email from the commit's .patch view and search the upstream repository's own log with it before you conclude anything.
Does being listed in CODEOWNERS make someone a maintainer?
Not by itself. GitHub requires code owners to have write permission on the repository, so a CODEOWNERS entry proves write access at the time it was added. It doesn't prove a governance role. Find the commit that added the handle with git log --follow -p CODEOWNERS, then check whether the handle actually reviews recent PRs. MAINTAINERS and GOVERNANCE files are project conventions that the platform doesn't enforce.
Should I contact the project's maintainers to confirm a candidate's contributions?
Not without the candidate's consent. I know of no published procedure for confirming a contribution with a maintainer that also protects the candidate's confidentiality, and naming a finalist to a third party can expose their job search. Do the record checks first. Then ask the candidate directly about anything still graded Unverifiable, and let them point you to the evidence or put you in touch with a reference.
Try it on the search you came here for
Stop building boolean strings. Just describe the person.
Type one sentence. I plan the search, read GitHub, public LinkedIn and Crunchbase records, and the open web as it is right now, and hand back a ranked list with the reason next to every name.
01Describe them
One plain sentence. Role, city, stack, stage, whatever matters to you.
02I read the web live
GitHub, public LinkedIn and Crunchbase records, the open web. Not a database that went stale last quarter.
03You read the shortlist
Ranked, with the reasoning under every name. Open a profile, ask a follow-up, narrow it down.
- Staff backend engineers in NYC who shipped Rust in production
- Series A fintechs in SF under 50 people, growing headcount this year
- Maintainers of fast-growing Rust web frameworks on GitHub
- No boolean, no filters, no seat to buy. One box.
- Read at search time, so a profile updated yesterday counts today.
- Every step visible as it runs, every name with its reason.
500 free credits on sign-up. No card, no demo call. See real searches.