We have the issue events synced anyway, so the data's in the corpus. We just need to track the oldest close event per issue.
That's a great idea to consider, then no need for extra queries. The close event has additional information like the SHA of the commit that closed the issue (if any): GitHubIssueEvent.CommitID. That can also be useful information to expose.
The ClosedBy field is currently always nil due to the cause described
in the linked issue. Document it with a TODO comment so people don't
need to spend time on figuring that out for themselves.
Reviewed-by: Brad Fitzpatrick <firstname.lastname@example.org>