github: Rework GraphQL batching and error handling to salvage partial work - #253
Merged
Conversation
Collaborator
Author
Collaborator
Author
|
This was referenced May 21, 2026
jerry-skydio
force-pushed
the
jerry/revup/main/graphqutil
branch
from
May 21, 2026 20:44
978add5 to
550ecf7
Compare
brian-kubisiak-skydio
approved these changes
Jun 19, 2026
jerry-skydio
force-pushed
the
jerry/revup/main/fakeforge
branch
from
June 19, 2026 17:47
4599c0b to
b7cbff5
Compare
jerry-skydio
force-pushed
the
jerry/revup/main/graphqutil
branch
from
June 19, 2026 17:47
550ecf7 to
3466dcb
Compare
jerry-skydio
force-pushed
the
jerry/revup/main/graphqutil
branch
2 times, most recently
from
June 19, 2026 20:17
252ff61 to
9645b7f
Compare
Closed
jerry-skydio
force-pushed
the
jerry/revup/main/graphqutil
branch
2 times, most recently
from
June 26, 2026 17:38
262cc29 to
07520e5
Compare
jerry-skydio
force-pushed
the
jerry/revup/main/graphqutil
branch
7 times, most recently
from
July 25, 2026 03:00
1a44d10 to
65c7b87
Compare
jerry-skydio
force-pushed
the
jerry/revup/main/graphqutil
branch
3 times, most recently
from
July 27, 2026 21:34
5efbae6 to
26f0396
Compare
jerry-skydio
force-pushed
the
jerry/revup/main/graphqutil
branch
3 times, most recently
from
July 27, 2026 23:16
d050ee5 to
483b9ab
Compare
… work Restructure the GitHub GraphQL layer around a flat, resizable query so that partial results are never thrown away and failed work is re-transacted precisely. GraphqlQuery now holds a heterogeneous list of aliased fields (SingleQuery) with stable per-prefix alias indices, so it can split() in half or subset() to arbitrary fields without result aliases colliding. GithubQuery subclasses it with the repo-specific field builders and result parsers. endpoint.graphql no longer raises on GraphQL field errors. It returns a GraphqlResponse carrying partial data plus per-field errors, and only raises for a request error (200 with no data) or a non-retryable HTTP status. Retry backoff is now driven by GitHub's headers, honoring Retry-After and waiting out an exhausted rate-limit budget, and retries secondary-limit (403) as well as transient 5xx. Also recover a PR's id via a head-ref lookup when a create comes back "already exists", so a later update never targets an empty id, and log the remaining rate-limit budget at the end of a verbose run.
jerry-skydio
force-pushed
the
jerry/revup/main/graphqutil
branch
from
July 27, 2026 23:25
483b9ab to
dff3aa7
Compare
brian-kubisiak-skydio
approved these changes
Jul 28, 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.
Restructure the GitHub GraphQL layer around a flat, resizable query so that
partial results are never thrown away and failed work is re-transacted
precisely.
GraphqlQuery now holds a heterogeneous list of aliased fields (SingleQuery)
with stable per-prefix alias indices, so it can split() in half or subset()
to arbitrary fields without result aliases colliding. GithubQuery subclasses
it with the repo-specific field builders and result parsers.
endpoint.graphql no longer raises on GraphQL field errors. It returns a
GraphqlResponse carrying partial data plus per-field errors, and only raises
for a request error (200 with no data) or a non-retryable HTTP status. Retry
backoff is now driven by GitHub's headers, honoring Retry-After and waiting
out an exhausted rate-limit budget, and retries secondary-limit (403) as well
as transient 5xx.
Also recover a PR's id via a head-ref lookup when a create comes back
"already exists", so a later update never targets an empty id, and log the
remaining rate-limit budget at the end of a verbose run.