feat(github): attribute commits to accounts, capture more fields - #2545
Merged
Conversation
|
Important Review available on request
Reviews should be triggered manually for repositories with fewer than 10 stars. Select Trigger review above or comment ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Commits carry an e-mail and no account, and the roster can only claim an e-mail for a member who publishes one, so a member who keeps their address private got no commit attribution. The pull-request commit response names the e-mail and the account together; collect those pairs, plus the ones a noreply address encodes, and publish them as e-mail claims. Every stream now keeps the identity its payload already carried (account ids, triggering actor, merged-by, review threading) and the process fields dropped alongside them, rather than the subset the first pass declared. Also restores fork exclusion from the repository roster: a fork's clone carries its whole upstream history, so admitting one credits every upstream commit to this organization. The file-extension expression split the whole path, so a dot in a directory name returned the rest of the path as the extension; it moves to a shared macro that takes the basename first, fixing all three git connectors. Signed-off-by: Aleksandr Barkhatov <pm@aleks.bar>
aleksdotbar
force-pushed
the
claude/github-connector-fields
branch
from
August 14, 2026 11:56
67bd234 to
742898d
Compare
aleksdotbar
enabled auto-merge
August 14, 2026 12:10
aleksdotbar
disabled auto-merge
August 14, 2026 12:11
aleksdotbar
enabled auto-merge
August 14, 2026 12:11
An author who never opens a pull request and does not use a noreply address claims no e-mail today, so their commits reach no person. The proxy now enumerates a repository's distinct authors from the clone it already holds, and this stream asks GitHub who each one is — one call per author rather than per commit, which is what the proxy exists to avoid. `author: null` marks an e-mail verified on no account (CI and service identities); those records are dropped rather than stored as unresolved. The filter compares the login against '' because the interpolation renders an absent one as the string "None", which is not falsy. Requires a git-cli-proxy serving /v1/authors. Signed-off-by: Aleksandr Barkhatov <pm@aleks.bar>
Signed-off-by: Aleksandr Barkhatov <pm@aleks.bar>
hello1101n
approved these changes
Aug 16, 2026
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.
Problem
Commits carry an e-mail and never an account — git has no concept of one. Gold attributes activity by e-mail, and the roster connector can only claim an e-mail for a member who publishes one, so a member who keeps their address private gets no commit attribution at all.
Separately, the streams declared a narrow subset of the payloads they already fetch: account ids, the triggering actor of a CI re-run, who merged a pull request, and review-comment threading were all discarded.
Two defects found while working here:
file_extensionsplit the whole path, so a dot in a directory name returned the rest of the path as the extension. Present in all three git connectors.Fix
Commit attribution. Three sources now claim an e-mail for an account, strongest first:
commit_authors— the proxy enumerates a repository's distinct authors from the clone it already holds, and the connector asks GitHub who each one is. One vendor call per author, not per commit. Reaches authors who never open a pull request.pull_request_commits— its response already named the commit e-mail and the account together, including addresses that are not public; the connector was dropping both.github__account_emailscollects the pairs;github__identity_inputspublishes them asvalue_type='email'claims intosilver.identity_inputs. Novalue_type='id'binding is emitted — what an account means is the persons-seed's decision, so an account the roster does not know resolves through an e-mail match or is minted, as for any other source.Field capture. Every stream now keeps the identity and process fields its payload already carried. Hypermedia URLs, avatars and reaction breakdowns stay dropped.
Fork exclusion restored on all three repository rosters, with a test pinning it.
file_extensionmoves to a sharedgit_file_extensionmacro that takes the basename before splitting, applied to all three git connectors.Merge order and deploy notes
/v1/authors(feat(git-cli-proxy): serve distinct commit authors per repository #2555). Merge that first and ship a proxy image; until thencommit_authorsgets a 404, which the repo-scoped handler treats as "skip this repository" — silent, not loud.file_extensionneeds a one-off backfill. The*__file_changesmodels are incremental, so rows already in silver keep the old values and identical paths would disagree depending on ingestion time. Run the three models once with--full-refreshafter deploy.github-directorymust be configured with the sameinsight_source_id— both describe the same accounts, and resolution keys on (source type, source id, login). Documented in the connector README.descriptor.yamlversion bumped so reconcile rolls the manifest out.connectors-ddl/github.sqlregenerated from a full bootstrap; field-parity audit passes.