diff --git a/apps/server/scripts/evidence/pr-22987/driver.ts b/apps/server/scripts/evidence/pr-22987/driver.ts new file mode 100644 index 0000000000000..8530f4e923745 --- /dev/null +++ b/apps/server/scripts/evidence/pr-22987/driver.ts @@ -0,0 +1,759 @@ +// @effect-diagnostics nodeBuiltinImport:off globalTimers:off globalDate:off globalFetch:off globalConsole:off globalConsoleInEffect:off preferSchemaOverJson:off - Host-side evidence driver retains raw wire evidence and owns its stub forge. +/** + * Runtime evidence for PR #22987: `pullRequests.detail` degrades to the check rollup when a GitHub + * credential cannot read check contexts. + * + * Every forge answer is STUBBED. An HTTPS server on [::1] plays a GitHub Enterprise host + * (`github.localtest.me`, which resolves to ::1), and each pull request number selects one fixture + * row from `fixtures.json`. The real server (`apps/server/src/bin.ts start`) runs against an + * isolated home under `--out`, never `~/.t3/userdata`, and the driver calls + * `pullRequests.detail` over the authenticated WebSocket RPC for each row. + * + * Run from the repository root (one command, all rows): + * + * node apps/server/scripts/evidence/pr-22987/driver.ts --label after --out /tmp/ev-22987/after + * + * One row: add `--rows F2`. Rewrite fixtures.json from the builders below: `--emit-fixtures`. + * Writes `/requests.jsonl` (every stub request), `/results.json` (what the client + * received per row) and `/server.log`. + */ +import * as NodeAssert from "node:assert/strict"; +import * as NodeChildProcess from "node:child_process"; +import * as NodeCrypto from "node:crypto"; +import * as NodeFS from "node:fs"; +import * as NodeHttp from "node:http"; +import * as NodeHttps from "node:https"; +import * as NodePath from "node:path"; +import * as NodeUtil from "node:util"; +import * as Effect from "effect/Effect"; +import * as Cause from "effect/Cause"; +import * as Exit from "effect/Exit"; +import * as Layer from "effect/Layer"; +import * as Schema from "effect/Schema"; +import { Socket } from "effect/socket"; +import { RpcClient, RpcSerialization } from "effect/rpc"; +import { + ORCHESTRATION_PROTOCOL_HEADER, + ORCHESTRATION_PROTOCOL_VERSION, + ProjectId, + WsRpcGroup, +} from "@t3tools/contracts"; + +const { values } = NodeUtil.parseArgs({ + options: { + label: { type: "string", default: "run" }, + out: { type: "string" }, + rows: { type: "string" }, + "stub-port": { type: "string", default: "443" }, + "in-namespace": { type: "boolean", default: false }, + "emit-fixtures": { type: "boolean", default: false }, + }, +}); + +const here = import.meta.dirname; +const root = NodePath.resolve(here, "../../../../.."); +const HOST = "github.localtest.me"; +const PAT = "Resource not accessible by personal access token"; +const INTEGRATION = "Resource not accessible by integration"; +const contextsPath = [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts", +]; +const reviewerPath = [ + "repository", + "pullRequest", + "reviewRequests", + "nodes", + 0, + "requestedReviewer", +]; + +const checkRun = (name: string, conclusion: string, workflow = "ci") => ({ + __typename: "CheckRun", + name, + status: "COMPLETED", + conclusion, + startedAt: "2026-10-01T00:00:00Z", + completedAt: "2026-10-01T00:05:00Z", + detailsUrl: `https://${HOST}/acme/web/actions/runs/1`, + checkSuite: { workflowRun: { workflow: { name: workflow } } }, +}); + +type Rollup = { state: string; contexts?: unknown } | null; + +/** A `PullRequestCore` answer for pull request `number`, with `rollup` as its head's checks. */ +const core = (number: number, rollup: Rollup, extra: Record = {}) => ({ + data: { + repository: { + mergeCommitAllowed: true, + squashMergeAllowed: true, + rebaseMergeAllowed: true, + autoMergeAllowed: false, + viewerPermission: "WRITE", + pullRequest: { + number, + title: `Fixture pull request ${number}`, + url: `https://${HOST}/acme/web/pull/${number}`, + body: "Stubbed body", + state: "OPEN", + isDraft: false, + mergeable: "MERGEABLE", + mergeStateStatus: "CLEAN", + reviewDecision: null, + additions: 10, + deletions: 2, + changedFiles: 1, + createdAt: "2026-10-01T00:00:00Z", + updatedAt: "2026-10-02T00:00:00Z", + mergedAt: null, + closedAt: null, + headRefName: `feature-${number}`, + baseRefName: "main", + headRefOid: "a".repeat(40), + isCrossRepository: false, + headRepositoryOwner: { __typename: "Organization", login: "acme" }, + headRepository: { nameWithOwner: "acme/web", viewerPermission: "WRITE" }, + headRef: { id: `ref-${number}` }, + author: { + __typename: "User", + login: "octo", + avatarUrl: `https://${HOST}/octo.png`, + id: "u1", + name: "Octo", + }, + autoMergeRequest: null, + viewerCanUpdate: true, + viewerDidAuthor: false, + viewerCanUpdateBranch: true, + baseRef: { compare: { behindBy: 0 } }, + reviewRequests: { + nodes: [{ requestedReviewer: { __typename: "User", login: "reviewer", name: null } }], + }, + labels: { nodes: [{ name: "bug", color: "ff0000" }] }, + commits: { nodes: [{ commit: { statusCheckRollup: rollup } }] }, + ...extra, + }, + }, + }, +}); + +const contexts = (nodes: ReadonlyArray, hasNextPage = false) => ({ + nodes, + pageInfo: { hasNextPage }, +}); +const readable = (state = "FAILURE") => ({ + state, + contexts: contexts([checkRun("build", "SUCCESS"), checkRun("test", "FAILURE")]), +}); +const refused = (message: string, path: ReadonlyArray = contextsPath) => ({ + type: "FORBIDDEN", + message, + path, + locations: [{ line: 1, column: 1 }], +}); +const contextsPage = ( + nodes: ReadonlyArray, + endCursor: string | null, + headRefOid = "a".repeat(40), +) => ({ + data: { + repository: { + pullRequest: { + headRefOid, + commits: { + nodes: [ + { + commit: { + statusCheckRollup: { + contexts: { nodes, pageInfo: { hasNextPage: endCursor !== null, endCursor } }, + }, + }, + }, + ], + }, + }, + }, + }, +}); +const manyChecks = (count: number, offset = 0) => + Array.from({ length: count }, (_, index) => checkRun(`job-${offset + index}`, "SUCCESS")); + +/** One stub answer. `match` fields are compared against the request; missing means any. */ +interface Answer { + readonly match: { + readonly operation: string; + readonly detailedChecks?: boolean; + readonly requestedReviewers?: number; + readonly after?: string | null; + }; + readonly status?: number; + readonly body?: unknown; + readonly destroySocket?: boolean; +} +interface Fixture { + readonly id: string; + readonly number: number; + readonly title: string; + readonly answers: ReadonlyArray; +} + +const coreOp = "PullRequestCore"; +const walkOp = "PullRequestCheckContexts"; +const degradedRetry = (number: number, state = "SUCCESS"): Answer => ({ + match: { operation: coreOp, detailedChecks: false }, + body: core(number, { state }), +}); + +const buildFixtures = (): ReadonlyArray => [ + { + id: "F1", + number: 101, + title: "readable checks", + answers: [{ match: { operation: coreOp }, body: core(101, readable()) }], + }, + { + id: "F2", + number: 102, + title: "contexts refused, HTTP 200, PAT message, path length 8", + answers: [ + { + match: { operation: coreOp, detailedChecks: true }, + body: { data: null, errors: [refused(PAT)] }, + }, + degradedRetry(102), + ], + }, + { + id: "F2b", + number: 112, + title: "as F2 with rollup FAILURE", + answers: [ + { + match: { operation: coreOp, detailedChecks: true }, + body: { data: null, errors: [refused(PAT)] }, + }, + degradedRetry(112, "FAILURE"), + ], + }, + { + id: "F3", + number: 103, + title: "contexts refused, HTTP 403, integration message", + answers: [ + { + match: { operation: coreOp, detailedChecks: true }, + status: 403, + body: { errors: [refused(INTEGRATION)] }, + }, + degradedRetry(103), + ], + }, + { + id: "F3b", + number: 113, + title: "per-node refusal, path length 10, partial data", + answers: [ + { + match: { operation: coreOp, detailedChecks: true }, + body: { + ...core(113, { state: "PENDING", contexts: contexts([null, null]) }), + errors: [ + refused(PAT, [...contextsPath, "nodes", 0]), + refused(PAT, [...contextsPath, "nodes", 1]), + ], + }, + }, + degradedRetry(113, "PENDING"), + ], + }, + { + id: "F4", + number: 104, + title: "reviewers and contexts refused together (200)", + answers: [ + { + match: { operation: coreOp, detailedChecks: true, requestedReviewers: 100 }, + body: { data: null, errors: [refused(INTEGRATION, reviewerPath), refused(PAT)] }, + }, + { + match: { operation: coreOp, detailedChecks: false, requestedReviewers: 0 }, + body: core(104, { state: "SUCCESS" }, { reviewRequests: { nodes: [] } }), + }, + ], + }, + { + id: "F4b", + number: 114, + title: "reviewers refused only (regression guard)", + answers: [ + { + match: { operation: coreOp, requestedReviewers: 100 }, + body: { ...core(114, readable()), errors: [refused(INTEGRATION, reviewerPath)] }, + }, + { + match: { operation: coreOp, requestedReviewers: 0 }, + body: core(114, readable(), { reviewRequests: { nodes: [] } }), + }, + ], + }, + { + id: "F4c", + number: 124, + title: "reviewers and contexts refused at HTTP 403 (stays an error)", + answers: [ + { + match: { operation: coreOp }, + status: 403, + body: { errors: [refused(INTEGRATION, reviewerPath), refused(PAT)] }, + }, + ], + }, + { + id: "F5a", + number: 105, + title: "unrelated: generic Forbidden message at contexts", + answers: [ + { + match: { operation: coreOp }, + body: { data: null, errors: [refused("Forbidden")] }, + }, + ], + }, + { + id: "F5b", + number: 115, + title: "unrelated: HTTP 500 INTERNAL", + answers: [ + { + match: { operation: coreOp }, + status: 500, + body: { errors: [{ type: "INTERNAL", message: "Something went wrong" }] }, + }, + ], + }, + { + id: "F5c", + number: 125, + title: "unrelated: PAT message at contexts.totalCount (bad path)", + answers: [ + { + match: { operation: coreOp }, + body: { data: null, errors: [refused(PAT, [...contextsPath, "totalCount"])] }, + }, + ], + }, + { + id: "F5d", + number: 135, + title: "unrelated: contexts refusal plus an INTERNAL error", + answers: [ + { + match: { operation: coreOp }, + body: { + data: null, + errors: [refused(PAT), { type: "INTERNAL", message: "Something went wrong" }], + }, + }, + ], + }, + { + id: "F5t", + number: 145, + title: "transport failure (socket destroyed)", + answers: [{ match: { operation: coreOp }, destroySocket: true }], + }, + { + id: "F6", + number: 106, + title: "more than 100 checks, walked", + answers: [ + { + match: { operation: coreOp }, + body: core(106, { state: "SUCCESS", contexts: contexts(manyChecks(100), true) }), + }, + { match: { operation: walkOp, after: null }, body: contextsPage(manyChecks(100), "c1") }, + { match: { operation: walkOp, after: "c1" }, body: contextsPage(manyChecks(5, 100), null) }, + ], + }, + { + id: "F6b", + number: 116, + title: "walk refused mid-pagination", + answers: [ + { + match: { operation: coreOp, detailedChecks: true }, + body: core(116, { state: "FAILURE", contexts: contexts(manyChecks(100), true) }), + }, + { + match: { operation: walkOp }, + body: { data: null, errors: [refused(PAT)] }, + }, + degradedRetry(116, "FAILURE"), + ], + }, + { + id: "F7", + number: 107, + title: "head changed during the walk", + answers: [ + { + match: { operation: coreOp }, + body: core(107, { state: "SUCCESS", contexts: contexts(manyChecks(100), true) }), + }, + { + match: { operation: walkOp }, + body: contextsPage(manyChecks(100), null, "b".repeat(40)), + }, + ], + }, + { + id: "F8", + number: 108, + title: "not found", + answers: [ + { + match: { operation: coreOp }, + body: { + data: { repository: { pullRequest: null } }, + errors: [ + { + type: "NOT_FOUND", + message: "Could not resolve to a PullRequest with the number of 108.", + path: ["repository", "pullRequest"], + }, + ], + }, + }, + ], + }, +]; + +if (values["emit-fixtures"]) { + NodeFS.writeFileSync( + NodePath.join(here, "fixtures.json"), + `${JSON.stringify(buildFixtures(), null, 2)}\n`, + ); + console.log(`Wrote ${NodePath.join(here, "fixtures.json")}`); + process.exit(0); +} + +NodeAssert.ok(values.out, "--out is required"); +const out = NodePath.resolve(values.out); +NodeFS.mkdirSync(out, { recursive: true }); + +// The GitHub driver keys a project by its remote's host without the port, so the stub has to +// answer on 443 for `github.localtest.me`. An unprivileged user and network namespace gives the +// run its own loopback, port 443 and /etc/hosts without touching the machine. +if (!values["in-namespace"]) { + const hosts = NodePath.join(out, "hosts"); + NodeFS.writeFileSync(hosts, `127.0.0.1 localhost\n::1 localhost ${HOST}\n`); + const result = NodeChildProcess.spawnSync( + "unshare", + [ + "-rnm", + "sh", + "-c", + 'mount --bind "$0" /etc/hosts && ip link set lo up && exec "$@"', + hosts, + process.execPath, + import.meta.filename, + ...process.argv.slice(2), + "--in-namespace", + ], + { cwd: root, stdio: "inherit" }, + ); + process.exit(result.status ?? 1); +} + +const fixtures: ReadonlyArray = JSON.parse( + NodeFS.readFileSync(NodePath.join(here, "fixtures.json"), "utf8"), +); +const selected = values.rows + ? fixtures.filter((fixture) => values.rows?.split(",").includes(fixture.id)) + : fixtures; +NodeAssert.ok(selected.length > 0, "no rows selected"); + +// Stub forge: a self-signed certificate for the fake Enterprise host, trusted by the server only. +const certDir = NodePath.join(out, "tls"); +NodeFS.mkdirSync(certDir, { recursive: true }); +const certFile = NodePath.join(certDir, "cert.pem"); +const keyFile = NodePath.join(certDir, "key.pem"); +NodeChildProcess.execFileSync( + "openssl", + [ + "req", + "-x509", + "-newkey", + "rsa:2048", + "-nodes", + "-days", + "2", + "-subj", + `/CN=${HOST}`, + "-addext", + `subjectAltName=DNS:${HOST}`, + "-keyout", + keyFile, + "-out", + certFile, + ], + { stdio: "ignore" }, +); +const caBundle = NodePath.join(certDir, "ca-bundle.pem"); +const systemBundle = process.env.NODE_EXTRA_CA_CERTS; +NodeFS.writeFileSync( + caBundle, + (systemBundle && NodeFS.existsSync(systemBundle) + ? NodeFS.readFileSync(systemBundle, "utf8") + : "") + NodeFS.readFileSync(certFile, "utf8"), +); + +const requestLog = NodePath.join(out, "requests.jsonl"); +NodeFS.writeFileSync(requestLog, ""); +let currentRow = "setup"; +const stubPort = Number(values["stub-port"]); +const stubHost = stubPort === 443 ? HOST : `${HOST}:${stubPort}`; +const stub = NodeHttps.createServer( + { cert: NodeFS.readFileSync(certFile), key: NodeFS.readFileSync(keyFile) }, + (req, res) => { + let raw = ""; + req.on("data", (chunk: Buffer) => (raw += chunk.toString())); + req.on("end", () => { + const url = req.url ?? ""; + let entry: Record = { row: currentRow, method: req.method, url }; + let answer: Answer | undefined; + if (req.method === "POST" && url === "/api/graphql") { + const body = JSON.parse(raw) as { query?: string; variables?: Record }; + const operation = /(?:query|mutation)\s+(\w+)/.exec(body.query ?? "")?.[1] ?? "unknown"; + const variables = body.variables ?? {}; + entry = { + ...entry, + operation, + variables: { + number: variables.number, + detailedChecks: variables.detailedChecks, + requestedReviewers: variables.requestedReviewers, + after: variables.after, + }, + queryHasDetailedChecks: (body.query ?? "").includes("$detailedChecks"), + }; + if (operation === "RoutingIdentityViewer") { + answer = { + match: { operation }, + body: { data: { viewer: { databaseId: 1, login: "stub" } } }, + }; + } else { + const fixture = fixtures.find((candidate) => candidate.number === variables.number); + // A server without `$detailedChecks` always reads the contexts. + const detailedChecks = variables.detailedChecks ?? true; + answer = fixture?.answers.find( + ({ match }) => + match.operation === operation && + (match.detailedChecks === undefined || match.detailedChecks === detailedChecks) && + (match.requestedReviewers === undefined || + match.requestedReviewers === variables.requestedReviewers) && + (match.after === undefined || match.after === (variables.after ?? null)), + ); + } + } else if (req.method === "GET" && url.startsWith("/api/v3/user")) { + answer = { match: { operation: "rest:user" }, body: { login: "stub", id: 1 } }; + } + if (answer?.destroySocket) { + NodeFS.appendFileSync( + requestLog, + `${JSON.stringify({ ...entry, answer: "socket destroyed" })}\n`, + ); + req.socket.destroy(); + return; + } + const status = answer ? (answer.status ?? 200) : 404; + NodeFS.appendFileSync( + requestLog, + `${JSON.stringify({ ...entry, status, unmatched: answer === undefined || undefined })}\n`, + ); + res.writeHead(status, { "Content-Type": "application/json" }); + res.end(JSON.stringify(answer?.body ?? { message: "Not Found (stub)" })); + }); + }, +); +stub.listen(stubPort, "::1"); +await new Promise((done) => stub.once("listening", done)); + +// Scratch project whose origin names the stub host. +const project = NodePath.join(out, "project"); +NodeFS.rmSync(project, { recursive: true, force: true }); +NodeFS.mkdirSync(project, { recursive: true }); +const git = (...args: string[]) => NodeChildProcess.execFileSync("git", args, { cwd: project }); +git("init", "-q", "-b", "main"); +git("remote", "add", "origin", `https://${stubHost}/acme/web.git`); +git( + "-c", + "user.name=ev", + "-c", + "user.email=ev@example.com", + "commit", + "-q", + "--allow-empty", + "-m", + "init", +); + +const home = NodePath.join(out, "home"); +NodeFS.rmSync(home, { recursive: true, force: true }); +NodeFS.mkdirSync(home, { recursive: true }); +const reservation = NodeHttp.createServer(); +reservation.listen(0, "127.0.0.1"); +await new Promise((done) => reservation.once("listening", done)); +const address = reservation.address(); +NodeAssert.ok(address && typeof address !== "string"); +await new Promise((done) => reservation.close(() => done())); +const port = address.port; +const origin = `http://127.0.0.1:${port}`; +const bootstrap = NodeCrypto.randomUUID(); +const server = NodeChildProcess.spawn( + process.execPath, + ["apps/server/src/bin.ts", "start", "--bootstrap-fd", "3"], + { + cwd: root, + stdio: ["ignore", "pipe", "pipe", "pipe"], + env: { + ...process.env, + T3CODE_HOME: home, + GH_HOST: stubHost, + GH_ENTERPRISE_TOKEN: "stub-token", + GH_TOKEN: "", + GITHUB_TOKEN: "", + NODE_EXTRA_CA_CERTS: caBundle, + NO_PROXY: `localhost,127.0.0.1,::1,${HOST}`, + no_proxy: `localhost,127.0.0.1,::1,${HOST}`, + }, + }, +); +console.log(`server pid ${server.pid}, port ${port}, stub [::1]:${stubPort}`); +const bootstrapPipe = server.stdio[3]; +NodeAssert.ok(bootstrapPipe && "write" in bootstrapPipe); +// The server closes its end once it has read the bootstrap. +bootstrapPipe.on("error", () => {}); +bootstrapPipe.end( + JSON.stringify({ + mode: "desktop", + noBrowser: true, + port, + t3Home: home, + host: "127.0.0.1", + desktopBootstrapToken: bootstrap, + tailscaleServeEnabled: false, + tailscaleServePort: 443, + }), +); +const ready = Promise.withResolvers(); +let tail = ""; +for (const pipe of [server.stdout, server.stderr]) + pipe?.on("data", (data: Buffer) => { + const text = data.toString().replaceAll(bootstrap, "[REDACTED]"); + NodeFS.appendFileSync(NodePath.join(out, "server.log"), text); + tail = (tail + text).slice(-8192); + if (tail.includes(`Listening on ${origin}`)) ready.resolve(); + }); +server.once("exit", (code) => ready.reject(new Error(`Server exited ${code}`))); +const deadline = setTimeout(() => ready.reject(new Error("Server startup timed out")), 90_000); + +const describeError = (error: unknown) => + error instanceof Error || (typeof error === "object" && error !== null) + ? { + ...JSON.parse(JSON.stringify(error)), + _tag: (error as { _tag?: unknown })._tag, + message: (error as { message?: unknown }).message, + } + : { message: String(error) }; +const results: Array> = []; +try { + await ready.promise; + clearTimeout(deadline); + const tokenResponse = await fetch(`${origin}/oauth/token`, { + method: "POST", + body: new URLSearchParams({ + grant_type: "urn:ietf:params:oauth:grant-type:token-exchange", + subject_token: bootstrap, + subject_token_type: "urn:t3:params:oauth:token-type:environment-bootstrap", + requested_token_type: "urn:ietf:params:oauth:token-type:access_token", + }), + }); + NodeAssert.ok(tokenResponse.ok, `Authentication failed: ${tokenResponse.status}`); + const token = Schema.decodeUnknownSync(Schema.Struct({ access_token: Schema.String }))( + await tokenResponse.json(), + ); + const headers = { + Authorization: `Bearer ${token.access_token}`, + "Content-Type": "application/json", + [ORCHESTRATION_PROTOCOL_HEADER]: String(ORCHESTRATION_PROTOCOL_VERSION), + }; + const projectId = ProjectId.make(NodeCrypto.randomUUID()); + const created = await fetch(`${origin}/api/projects/mutate`, { + method: "POST", + headers, + body: JSON.stringify({ + type: "project.create", + commandId: NodeCrypto.randomUUID(), + projectId, + title: "PR 22987 evidence", + workspaceRoot: project, + }), + }); + NodeAssert.ok(created.ok, `Project creation failed: ${created.status} ${await created.text()}`); + const ticketResponse = await fetch(`${origin}/api/auth/websocket-ticket`, { + method: "POST", + headers, + }); + NodeAssert.ok(ticketResponse.ok, `WebSocket authentication failed: ${ticketResponse.status}`); + const ticket = Schema.decodeUnknownSync(Schema.Struct({ ticket: Schema.String }))( + await ticketResponse.json(), + ); + const layerSocket = Socket.layerWebSocket( + `${origin.replace("http:", "ws:")}/ws?orchestrationProtocol=${ORCHESTRATION_PROTOCOL_VERSION}&wsTicket=${encodeURIComponent(ticket.ticket)}`, + ).pipe(Layer.provide(Socket.layerWebSocketConstructorGlobal)); + const layerProtocol = RpcClient.layerProtocolSocket().pipe( + Layer.provide(layerSocket), + Layer.provide(RpcSerialization.layerJson), + ); + const program = Effect.gen(function* () { + const client = yield* RpcClient.make(WsRpcGroup); + for (const fixture of selected) { + currentRow = fixture.id; + const exit = yield* client["pullRequests.detail"]({ + projectId, + repository: "acme/web", + number: fixture.number, + }).pipe(Effect.timeout("60 seconds"), Effect.exit); + const outcome = Exit.isSuccess(exit) + ? { ok: true, detail: exit.value } + : { ok: false, error: describeError(Cause.squash(exit.cause)) }; + results.push({ id: fixture.id, number: fixture.number, title: fixture.title, ...outcome }); + console.log(`${fixture.id} #${fixture.number}: ${outcome.ok ? "detail" : "error"}`); + } + }).pipe(Effect.scoped, Effect.provide(layerProtocol)); + await Effect.runPromise(program); +} finally { + clearTimeout(deadline); + NodeFS.writeFileSync( + NodePath.join(out, "results.json"), + `${JSON.stringify({ label: values.label, results }, null, 2)}\n`, + ); + server.kill("SIGTERM"); + await new Promise((done) => { + if (server.exitCode !== null) return done(); + const force = setTimeout(() => server.kill("SIGKILL"), 10_000); + server.once("exit", () => { + clearTimeout(force); + done(); + }); + }); + stub.close(); + stub.closeAllConnections(); +} diff --git a/apps/server/scripts/evidence/pr-22987/fixtures.json b/apps/server/scripts/evidence/pr-22987/fixtures.json new file mode 100644 index 0000000000000..a6801d6ee7019 --- /dev/null +++ b/apps/server/scripts/evidence/pr-22987/fixtures.json @@ -0,0 +1,10094 @@ +[ + { + "id": "F1", + "number": 101, + "title": "readable checks", + "answers": [ + { + "match": { + "operation": "PullRequestCore" + }, + "body": { + "data": { + "repository": { + "mergeCommitAllowed": true, + "squashMergeAllowed": true, + "rebaseMergeAllowed": true, + "autoMergeAllowed": false, + "viewerPermission": "WRITE", + "pullRequest": { + "number": 101, + "title": "Fixture pull request 101", + "url": "https://github.localtest.me/acme/web/pull/101", + "body": "Stubbed body", + "state": "OPEN", + "isDraft": false, + "mergeable": "MERGEABLE", + "mergeStateStatus": "CLEAN", + "reviewDecision": null, + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "mergedAt": null, + "closedAt": null, + "headRefName": "feature-101", + "baseRefName": "main", + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "isCrossRepository": false, + "headRepositoryOwner": { + "__typename": "Organization", + "login": "acme" + }, + "headRepository": { + "nameWithOwner": "acme/web", + "viewerPermission": "WRITE" + }, + "headRef": { + "id": "ref-101" + }, + "author": { + "__typename": "User", + "login": "octo", + "avatarUrl": "https://github.localtest.me/octo.png", + "id": "u1", + "name": "Octo" + }, + "autoMergeRequest": null, + "viewerCanUpdate": true, + "viewerDidAuthor": false, + "viewerCanUpdateBranch": true, + "baseRef": { + "compare": { + "behindBy": 0 + } + }, + "reviewRequests": { + "nodes": [ + { + "requestedReviewer": { + "__typename": "User", + "login": "reviewer", + "name": null + } + } + ] + }, + "labels": { + "nodes": [ + { + "name": "bug", + "color": "ff0000" + } + ] + }, + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "state": "FAILURE", + "contexts": { + "nodes": [ + { + "__typename": "CheckRun", + "name": "build", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "test", + "status": "COMPLETED", + "conclusion": "FAILURE", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + } + ], + "pageInfo": { + "hasNextPage": false + } + } + } + } + } + ] + } + } + } + } + } + } + ] + }, + { + "id": "F2", + "number": 102, + "title": "contexts refused, HTTP 200, PAT message, path length 8", + "answers": [ + { + "match": { + "operation": "PullRequestCore", + "detailedChecks": true + }, + "body": { + "data": null, + "errors": [ + { + "type": "FORBIDDEN", + "message": "Resource not accessible by personal access token", + "path": [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts" + ], + "locations": [ + { + "line": 1, + "column": 1 + } + ] + } + ] + } + }, + { + "match": { + "operation": "PullRequestCore", + "detailedChecks": false + }, + "body": { + "data": { + "repository": { + "mergeCommitAllowed": true, + "squashMergeAllowed": true, + "rebaseMergeAllowed": true, + "autoMergeAllowed": false, + "viewerPermission": "WRITE", + "pullRequest": { + "number": 102, + "title": "Fixture pull request 102", + "url": "https://github.localtest.me/acme/web/pull/102", + "body": "Stubbed body", + "state": "OPEN", + "isDraft": false, + "mergeable": "MERGEABLE", + "mergeStateStatus": "CLEAN", + "reviewDecision": null, + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "mergedAt": null, + "closedAt": null, + "headRefName": "feature-102", + "baseRefName": "main", + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "isCrossRepository": false, + "headRepositoryOwner": { + "__typename": "Organization", + "login": "acme" + }, + "headRepository": { + "nameWithOwner": "acme/web", + "viewerPermission": "WRITE" + }, + "headRef": { + "id": "ref-102" + }, + "author": { + "__typename": "User", + "login": "octo", + "avatarUrl": "https://github.localtest.me/octo.png", + "id": "u1", + "name": "Octo" + }, + "autoMergeRequest": null, + "viewerCanUpdate": true, + "viewerDidAuthor": false, + "viewerCanUpdateBranch": true, + "baseRef": { + "compare": { + "behindBy": 0 + } + }, + "reviewRequests": { + "nodes": [ + { + "requestedReviewer": { + "__typename": "User", + "login": "reviewer", + "name": null + } + } + ] + }, + "labels": { + "nodes": [ + { + "name": "bug", + "color": "ff0000" + } + ] + }, + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "state": "SUCCESS" + } + } + } + ] + } + } + } + } + } + } + ] + }, + { + "id": "F2b", + "number": 112, + "title": "as F2 with rollup FAILURE", + "answers": [ + { + "match": { + "operation": "PullRequestCore", + "detailedChecks": true + }, + "body": { + "data": null, + "errors": [ + { + "type": "FORBIDDEN", + "message": "Resource not accessible by personal access token", + "path": [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts" + ], + "locations": [ + { + "line": 1, + "column": 1 + } + ] + } + ] + } + }, + { + "match": { + "operation": "PullRequestCore", + "detailedChecks": false + }, + "body": { + "data": { + "repository": { + "mergeCommitAllowed": true, + "squashMergeAllowed": true, + "rebaseMergeAllowed": true, + "autoMergeAllowed": false, + "viewerPermission": "WRITE", + "pullRequest": { + "number": 112, + "title": "Fixture pull request 112", + "url": "https://github.localtest.me/acme/web/pull/112", + "body": "Stubbed body", + "state": "OPEN", + "isDraft": false, + "mergeable": "MERGEABLE", + "mergeStateStatus": "CLEAN", + "reviewDecision": null, + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "mergedAt": null, + "closedAt": null, + "headRefName": "feature-112", + "baseRefName": "main", + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "isCrossRepository": false, + "headRepositoryOwner": { + "__typename": "Organization", + "login": "acme" + }, + "headRepository": { + "nameWithOwner": "acme/web", + "viewerPermission": "WRITE" + }, + "headRef": { + "id": "ref-112" + }, + "author": { + "__typename": "User", + "login": "octo", + "avatarUrl": "https://github.localtest.me/octo.png", + "id": "u1", + "name": "Octo" + }, + "autoMergeRequest": null, + "viewerCanUpdate": true, + "viewerDidAuthor": false, + "viewerCanUpdateBranch": true, + "baseRef": { + "compare": { + "behindBy": 0 + } + }, + "reviewRequests": { + "nodes": [ + { + "requestedReviewer": { + "__typename": "User", + "login": "reviewer", + "name": null + } + } + ] + }, + "labels": { + "nodes": [ + { + "name": "bug", + "color": "ff0000" + } + ] + }, + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "state": "FAILURE" + } + } + } + ] + } + } + } + } + } + } + ] + }, + { + "id": "F3", + "number": 103, + "title": "contexts refused, HTTP 403, integration message", + "answers": [ + { + "match": { + "operation": "PullRequestCore", + "detailedChecks": true + }, + "status": 403, + "body": { + "errors": [ + { + "type": "FORBIDDEN", + "message": "Resource not accessible by integration", + "path": [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts" + ], + "locations": [ + { + "line": 1, + "column": 1 + } + ] + } + ] + } + }, + { + "match": { + "operation": "PullRequestCore", + "detailedChecks": false + }, + "body": { + "data": { + "repository": { + "mergeCommitAllowed": true, + "squashMergeAllowed": true, + "rebaseMergeAllowed": true, + "autoMergeAllowed": false, + "viewerPermission": "WRITE", + "pullRequest": { + "number": 103, + "title": "Fixture pull request 103", + "url": "https://github.localtest.me/acme/web/pull/103", + "body": "Stubbed body", + "state": "OPEN", + "isDraft": false, + "mergeable": "MERGEABLE", + "mergeStateStatus": "CLEAN", + "reviewDecision": null, + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "mergedAt": null, + "closedAt": null, + "headRefName": "feature-103", + "baseRefName": "main", + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "isCrossRepository": false, + "headRepositoryOwner": { + "__typename": "Organization", + "login": "acme" + }, + "headRepository": { + "nameWithOwner": "acme/web", + "viewerPermission": "WRITE" + }, + "headRef": { + "id": "ref-103" + }, + "author": { + "__typename": "User", + "login": "octo", + "avatarUrl": "https://github.localtest.me/octo.png", + "id": "u1", + "name": "Octo" + }, + "autoMergeRequest": null, + "viewerCanUpdate": true, + "viewerDidAuthor": false, + "viewerCanUpdateBranch": true, + "baseRef": { + "compare": { + "behindBy": 0 + } + }, + "reviewRequests": { + "nodes": [ + { + "requestedReviewer": { + "__typename": "User", + "login": "reviewer", + "name": null + } + } + ] + }, + "labels": { + "nodes": [ + { + "name": "bug", + "color": "ff0000" + } + ] + }, + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "state": "SUCCESS" + } + } + } + ] + } + } + } + } + } + } + ] + }, + { + "id": "F3b", + "number": 113, + "title": "per-node refusal, path length 10, partial data", + "answers": [ + { + "match": { + "operation": "PullRequestCore", + "detailedChecks": true + }, + "body": { + "data": { + "repository": { + "mergeCommitAllowed": true, + "squashMergeAllowed": true, + "rebaseMergeAllowed": true, + "autoMergeAllowed": false, + "viewerPermission": "WRITE", + "pullRequest": { + "number": 113, + "title": "Fixture pull request 113", + "url": "https://github.localtest.me/acme/web/pull/113", + "body": "Stubbed body", + "state": "OPEN", + "isDraft": false, + "mergeable": "MERGEABLE", + "mergeStateStatus": "CLEAN", + "reviewDecision": null, + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "mergedAt": null, + "closedAt": null, + "headRefName": "feature-113", + "baseRefName": "main", + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "isCrossRepository": false, + "headRepositoryOwner": { + "__typename": "Organization", + "login": "acme" + }, + "headRepository": { + "nameWithOwner": "acme/web", + "viewerPermission": "WRITE" + }, + "headRef": { + "id": "ref-113" + }, + "author": { + "__typename": "User", + "login": "octo", + "avatarUrl": "https://github.localtest.me/octo.png", + "id": "u1", + "name": "Octo" + }, + "autoMergeRequest": null, + "viewerCanUpdate": true, + "viewerDidAuthor": false, + "viewerCanUpdateBranch": true, + "baseRef": { + "compare": { + "behindBy": 0 + } + }, + "reviewRequests": { + "nodes": [ + { + "requestedReviewer": { + "__typename": "User", + "login": "reviewer", + "name": null + } + } + ] + }, + "labels": { + "nodes": [ + { + "name": "bug", + "color": "ff0000" + } + ] + }, + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "state": "PENDING", + "contexts": { + "nodes": [null, null], + "pageInfo": { + "hasNextPage": false + } + } + } + } + } + ] + } + } + } + }, + "errors": [ + { + "type": "FORBIDDEN", + "message": "Resource not accessible by personal access token", + "path": [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts", + "nodes", + 0 + ], + "locations": [ + { + "line": 1, + "column": 1 + } + ] + }, + { + "type": "FORBIDDEN", + "message": "Resource not accessible by personal access token", + "path": [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts", + "nodes", + 1 + ], + "locations": [ + { + "line": 1, + "column": 1 + } + ] + } + ] + } + }, + { + "match": { + "operation": "PullRequestCore", + "detailedChecks": false + }, + "body": { + "data": { + "repository": { + "mergeCommitAllowed": true, + "squashMergeAllowed": true, + "rebaseMergeAllowed": true, + "autoMergeAllowed": false, + "viewerPermission": "WRITE", + "pullRequest": { + "number": 113, + "title": "Fixture pull request 113", + "url": "https://github.localtest.me/acme/web/pull/113", + "body": "Stubbed body", + "state": "OPEN", + "isDraft": false, + "mergeable": "MERGEABLE", + "mergeStateStatus": "CLEAN", + "reviewDecision": null, + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "mergedAt": null, + "closedAt": null, + "headRefName": "feature-113", + "baseRefName": "main", + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "isCrossRepository": false, + "headRepositoryOwner": { + "__typename": "Organization", + "login": "acme" + }, + "headRepository": { + "nameWithOwner": "acme/web", + "viewerPermission": "WRITE" + }, + "headRef": { + "id": "ref-113" + }, + "author": { + "__typename": "User", + "login": "octo", + "avatarUrl": "https://github.localtest.me/octo.png", + "id": "u1", + "name": "Octo" + }, + "autoMergeRequest": null, + "viewerCanUpdate": true, + "viewerDidAuthor": false, + "viewerCanUpdateBranch": true, + "baseRef": { + "compare": { + "behindBy": 0 + } + }, + "reviewRequests": { + "nodes": [ + { + "requestedReviewer": { + "__typename": "User", + "login": "reviewer", + "name": null + } + } + ] + }, + "labels": { + "nodes": [ + { + "name": "bug", + "color": "ff0000" + } + ] + }, + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "state": "PENDING" + } + } + } + ] + } + } + } + } + } + } + ] + }, + { + "id": "F4", + "number": 104, + "title": "reviewers and contexts refused together (200)", + "answers": [ + { + "match": { + "operation": "PullRequestCore", + "detailedChecks": true, + "requestedReviewers": 100 + }, + "body": { + "data": null, + "errors": [ + { + "type": "FORBIDDEN", + "message": "Resource not accessible by integration", + "path": [ + "repository", + "pullRequest", + "reviewRequests", + "nodes", + 0, + "requestedReviewer" + ], + "locations": [ + { + "line": 1, + "column": 1 + } + ] + }, + { + "type": "FORBIDDEN", + "message": "Resource not accessible by personal access token", + "path": [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts" + ], + "locations": [ + { + "line": 1, + "column": 1 + } + ] + } + ] + } + }, + { + "match": { + "operation": "PullRequestCore", + "detailedChecks": false, + "requestedReviewers": 0 + }, + "body": { + "data": { + "repository": { + "mergeCommitAllowed": true, + "squashMergeAllowed": true, + "rebaseMergeAllowed": true, + "autoMergeAllowed": false, + "viewerPermission": "WRITE", + "pullRequest": { + "number": 104, + "title": "Fixture pull request 104", + "url": "https://github.localtest.me/acme/web/pull/104", + "body": "Stubbed body", + "state": "OPEN", + "isDraft": false, + "mergeable": "MERGEABLE", + "mergeStateStatus": "CLEAN", + "reviewDecision": null, + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "mergedAt": null, + "closedAt": null, + "headRefName": "feature-104", + "baseRefName": "main", + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "isCrossRepository": false, + "headRepositoryOwner": { + "__typename": "Organization", + "login": "acme" + }, + "headRepository": { + "nameWithOwner": "acme/web", + "viewerPermission": "WRITE" + }, + "headRef": { + "id": "ref-104" + }, + "author": { + "__typename": "User", + "login": "octo", + "avatarUrl": "https://github.localtest.me/octo.png", + "id": "u1", + "name": "Octo" + }, + "autoMergeRequest": null, + "viewerCanUpdate": true, + "viewerDidAuthor": false, + "viewerCanUpdateBranch": true, + "baseRef": { + "compare": { + "behindBy": 0 + } + }, + "reviewRequests": { + "nodes": [] + }, + "labels": { + "nodes": [ + { + "name": "bug", + "color": "ff0000" + } + ] + }, + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "state": "SUCCESS" + } + } + } + ] + } + } + } + } + } + } + ] + }, + { + "id": "F4b", + "number": 114, + "title": "reviewers refused only (regression guard)", + "answers": [ + { + "match": { + "operation": "PullRequestCore", + "requestedReviewers": 100 + }, + "body": { + "data": { + "repository": { + "mergeCommitAllowed": true, + "squashMergeAllowed": true, + "rebaseMergeAllowed": true, + "autoMergeAllowed": false, + "viewerPermission": "WRITE", + "pullRequest": { + "number": 114, + "title": "Fixture pull request 114", + "url": "https://github.localtest.me/acme/web/pull/114", + "body": "Stubbed body", + "state": "OPEN", + "isDraft": false, + "mergeable": "MERGEABLE", + "mergeStateStatus": "CLEAN", + "reviewDecision": null, + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "mergedAt": null, + "closedAt": null, + "headRefName": "feature-114", + "baseRefName": "main", + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "isCrossRepository": false, + "headRepositoryOwner": { + "__typename": "Organization", + "login": "acme" + }, + "headRepository": { + "nameWithOwner": "acme/web", + "viewerPermission": "WRITE" + }, + "headRef": { + "id": "ref-114" + }, + "author": { + "__typename": "User", + "login": "octo", + "avatarUrl": "https://github.localtest.me/octo.png", + "id": "u1", + "name": "Octo" + }, + "autoMergeRequest": null, + "viewerCanUpdate": true, + "viewerDidAuthor": false, + "viewerCanUpdateBranch": true, + "baseRef": { + "compare": { + "behindBy": 0 + } + }, + "reviewRequests": { + "nodes": [ + { + "requestedReviewer": { + "__typename": "User", + "login": "reviewer", + "name": null + } + } + ] + }, + "labels": { + "nodes": [ + { + "name": "bug", + "color": "ff0000" + } + ] + }, + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "state": "FAILURE", + "contexts": { + "nodes": [ + { + "__typename": "CheckRun", + "name": "build", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "test", + "status": "COMPLETED", + "conclusion": "FAILURE", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + } + ], + "pageInfo": { + "hasNextPage": false + } + } + } + } + } + ] + } + } + } + }, + "errors": [ + { + "type": "FORBIDDEN", + "message": "Resource not accessible by integration", + "path": [ + "repository", + "pullRequest", + "reviewRequests", + "nodes", + 0, + "requestedReviewer" + ], + "locations": [ + { + "line": 1, + "column": 1 + } + ] + } + ] + } + }, + { + "match": { + "operation": "PullRequestCore", + "requestedReviewers": 0 + }, + "body": { + "data": { + "repository": { + "mergeCommitAllowed": true, + "squashMergeAllowed": true, + "rebaseMergeAllowed": true, + "autoMergeAllowed": false, + "viewerPermission": "WRITE", + "pullRequest": { + "number": 114, + "title": "Fixture pull request 114", + "url": "https://github.localtest.me/acme/web/pull/114", + "body": "Stubbed body", + "state": "OPEN", + "isDraft": false, + "mergeable": "MERGEABLE", + "mergeStateStatus": "CLEAN", + "reviewDecision": null, + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "mergedAt": null, + "closedAt": null, + "headRefName": "feature-114", + "baseRefName": "main", + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "isCrossRepository": false, + "headRepositoryOwner": { + "__typename": "Organization", + "login": "acme" + }, + "headRepository": { + "nameWithOwner": "acme/web", + "viewerPermission": "WRITE" + }, + "headRef": { + "id": "ref-114" + }, + "author": { + "__typename": "User", + "login": "octo", + "avatarUrl": "https://github.localtest.me/octo.png", + "id": "u1", + "name": "Octo" + }, + "autoMergeRequest": null, + "viewerCanUpdate": true, + "viewerDidAuthor": false, + "viewerCanUpdateBranch": true, + "baseRef": { + "compare": { + "behindBy": 0 + } + }, + "reviewRequests": { + "nodes": [] + }, + "labels": { + "nodes": [ + { + "name": "bug", + "color": "ff0000" + } + ] + }, + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "state": "FAILURE", + "contexts": { + "nodes": [ + { + "__typename": "CheckRun", + "name": "build", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "test", + "status": "COMPLETED", + "conclusion": "FAILURE", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + } + ], + "pageInfo": { + "hasNextPage": false + } + } + } + } + } + ] + } + } + } + } + } + } + ] + }, + { + "id": "F4c", + "number": 124, + "title": "reviewers and contexts refused at HTTP 403 (stays an error)", + "answers": [ + { + "match": { + "operation": "PullRequestCore" + }, + "status": 403, + "body": { + "errors": [ + { + "type": "FORBIDDEN", + "message": "Resource not accessible by integration", + "path": [ + "repository", + "pullRequest", + "reviewRequests", + "nodes", + 0, + "requestedReviewer" + ], + "locations": [ + { + "line": 1, + "column": 1 + } + ] + }, + { + "type": "FORBIDDEN", + "message": "Resource not accessible by personal access token", + "path": [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts" + ], + "locations": [ + { + "line": 1, + "column": 1 + } + ] + } + ] + } + } + ] + }, + { + "id": "F5a", + "number": 105, + "title": "unrelated: generic Forbidden message at contexts", + "answers": [ + { + "match": { + "operation": "PullRequestCore" + }, + "body": { + "data": null, + "errors": [ + { + "type": "FORBIDDEN", + "message": "Forbidden", + "path": [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts" + ], + "locations": [ + { + "line": 1, + "column": 1 + } + ] + } + ] + } + } + ] + }, + { + "id": "F5b", + "number": 115, + "title": "unrelated: HTTP 500 INTERNAL", + "answers": [ + { + "match": { + "operation": "PullRequestCore" + }, + "status": 500, + "body": { + "errors": [ + { + "type": "INTERNAL", + "message": "Something went wrong" + } + ] + } + } + ] + }, + { + "id": "F5c", + "number": 125, + "title": "unrelated: PAT message at contexts.totalCount (bad path)", + "answers": [ + { + "match": { + "operation": "PullRequestCore" + }, + "body": { + "data": null, + "errors": [ + { + "type": "FORBIDDEN", + "message": "Resource not accessible by personal access token", + "path": [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts", + "totalCount" + ], + "locations": [ + { + "line": 1, + "column": 1 + } + ] + } + ] + } + } + ] + }, + { + "id": "F5d", + "number": 135, + "title": "unrelated: contexts refusal plus an INTERNAL error", + "answers": [ + { + "match": { + "operation": "PullRequestCore" + }, + "body": { + "data": null, + "errors": [ + { + "type": "FORBIDDEN", + "message": "Resource not accessible by personal access token", + "path": [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts" + ], + "locations": [ + { + "line": 1, + "column": 1 + } + ] + }, + { + "type": "INTERNAL", + "message": "Something went wrong" + } + ] + } + } + ] + }, + { + "id": "F5t", + "number": 145, + "title": "transport failure (socket destroyed)", + "answers": [ + { + "match": { + "operation": "PullRequestCore" + }, + "destroySocket": true + } + ] + }, + { + "id": "F6", + "number": 106, + "title": "more than 100 checks, walked", + "answers": [ + { + "match": { + "operation": "PullRequestCore" + }, + "body": { + "data": { + "repository": { + "mergeCommitAllowed": true, + "squashMergeAllowed": true, + "rebaseMergeAllowed": true, + "autoMergeAllowed": false, + "viewerPermission": "WRITE", + "pullRequest": { + "number": 106, + "title": "Fixture pull request 106", + "url": "https://github.localtest.me/acme/web/pull/106", + "body": "Stubbed body", + "state": "OPEN", + "isDraft": false, + "mergeable": "MERGEABLE", + "mergeStateStatus": "CLEAN", + "reviewDecision": null, + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "mergedAt": null, + "closedAt": null, + "headRefName": "feature-106", + "baseRefName": "main", + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "isCrossRepository": false, + "headRepositoryOwner": { + "__typename": "Organization", + "login": "acme" + }, + "headRepository": { + "nameWithOwner": "acme/web", + "viewerPermission": "WRITE" + }, + "headRef": { + "id": "ref-106" + }, + "author": { + "__typename": "User", + "login": "octo", + "avatarUrl": "https://github.localtest.me/octo.png", + "id": "u1", + "name": "Octo" + }, + "autoMergeRequest": null, + "viewerCanUpdate": true, + "viewerDidAuthor": false, + "viewerCanUpdateBranch": true, + "baseRef": { + "compare": { + "behindBy": 0 + } + }, + "reviewRequests": { + "nodes": [ + { + "requestedReviewer": { + "__typename": "User", + "login": "reviewer", + "name": null + } + } + ] + }, + "labels": { + "nodes": [ + { + "name": "bug", + "color": "ff0000" + } + ] + }, + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "state": "SUCCESS", + "contexts": { + "nodes": [ + { + "__typename": "CheckRun", + "name": "job-0", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-1", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-2", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-3", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-4", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-5", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-6", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-7", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-8", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-9", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-10", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-11", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-12", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-13", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-14", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-15", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-16", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-17", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-18", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-19", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-20", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-21", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-22", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-23", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-24", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-25", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-26", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-27", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-28", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-29", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-30", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-31", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-32", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-33", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-34", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-35", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-36", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-37", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-38", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-39", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-40", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-41", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-42", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-43", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-44", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-45", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-46", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-47", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-48", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-49", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-50", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-51", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-52", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-53", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-54", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-55", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-56", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-57", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-58", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-59", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-60", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-61", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-62", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-63", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-64", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-65", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-66", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-67", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-68", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-69", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-70", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-71", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-72", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-73", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-74", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-75", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-76", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-77", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-78", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-79", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-80", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-81", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-82", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-83", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-84", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-85", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-86", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-87", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-88", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-89", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-90", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-91", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-92", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-93", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-94", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-95", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-96", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-97", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-98", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-99", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + } + ], + "pageInfo": { + "hasNextPage": true + } + } + } + } + } + ] + } + } + } + } + } + }, + { + "match": { + "operation": "PullRequestCheckContexts", + "after": null + }, + "body": { + "data": { + "repository": { + "pullRequest": { + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "contexts": { + "nodes": [ + { + "__typename": "CheckRun", + "name": "job-0", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-1", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-2", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-3", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-4", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-5", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-6", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-7", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-8", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-9", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-10", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-11", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-12", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-13", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-14", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-15", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-16", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-17", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-18", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-19", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-20", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-21", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-22", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-23", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-24", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-25", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-26", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-27", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-28", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-29", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-30", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-31", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-32", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-33", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-34", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-35", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-36", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-37", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-38", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-39", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-40", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-41", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-42", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-43", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-44", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-45", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-46", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-47", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-48", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-49", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-50", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-51", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-52", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-53", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-54", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-55", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-56", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-57", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-58", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-59", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-60", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-61", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-62", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-63", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-64", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-65", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-66", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-67", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-68", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-69", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-70", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-71", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-72", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-73", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-74", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-75", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-76", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-77", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-78", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-79", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-80", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-81", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-82", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-83", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-84", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-85", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-86", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-87", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-88", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-89", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-90", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-91", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-92", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-93", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-94", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-95", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-96", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-97", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-98", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-99", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + } + ], + "pageInfo": { + "hasNextPage": true, + "endCursor": "c1" + } + } + } + } + } + ] + } + } + } + } + } + }, + { + "match": { + "operation": "PullRequestCheckContexts", + "after": "c1" + }, + "body": { + "data": { + "repository": { + "pullRequest": { + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "contexts": { + "nodes": [ + { + "__typename": "CheckRun", + "name": "job-100", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-101", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-102", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-103", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-104", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + } + ], + "pageInfo": { + "hasNextPage": false, + "endCursor": null + } + } + } + } + } + ] + } + } + } + } + } + } + ] + }, + { + "id": "F6b", + "number": 116, + "title": "walk refused mid-pagination", + "answers": [ + { + "match": { + "operation": "PullRequestCore", + "detailedChecks": true + }, + "body": { + "data": { + "repository": { + "mergeCommitAllowed": true, + "squashMergeAllowed": true, + "rebaseMergeAllowed": true, + "autoMergeAllowed": false, + "viewerPermission": "WRITE", + "pullRequest": { + "number": 116, + "title": "Fixture pull request 116", + "url": "https://github.localtest.me/acme/web/pull/116", + "body": "Stubbed body", + "state": "OPEN", + "isDraft": false, + "mergeable": "MERGEABLE", + "mergeStateStatus": "CLEAN", + "reviewDecision": null, + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "mergedAt": null, + "closedAt": null, + "headRefName": "feature-116", + "baseRefName": "main", + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "isCrossRepository": false, + "headRepositoryOwner": { + "__typename": "Organization", + "login": "acme" + }, + "headRepository": { + "nameWithOwner": "acme/web", + "viewerPermission": "WRITE" + }, + "headRef": { + "id": "ref-116" + }, + "author": { + "__typename": "User", + "login": "octo", + "avatarUrl": "https://github.localtest.me/octo.png", + "id": "u1", + "name": "Octo" + }, + "autoMergeRequest": null, + "viewerCanUpdate": true, + "viewerDidAuthor": false, + "viewerCanUpdateBranch": true, + "baseRef": { + "compare": { + "behindBy": 0 + } + }, + "reviewRequests": { + "nodes": [ + { + "requestedReviewer": { + "__typename": "User", + "login": "reviewer", + "name": null + } + } + ] + }, + "labels": { + "nodes": [ + { + "name": "bug", + "color": "ff0000" + } + ] + }, + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "state": "FAILURE", + "contexts": { + "nodes": [ + { + "__typename": "CheckRun", + "name": "job-0", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-1", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-2", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-3", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-4", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-5", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-6", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-7", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-8", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-9", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-10", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-11", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-12", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-13", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-14", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-15", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-16", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-17", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-18", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-19", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-20", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-21", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-22", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-23", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-24", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-25", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-26", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-27", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-28", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-29", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-30", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-31", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-32", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-33", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-34", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-35", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-36", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-37", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-38", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-39", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-40", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-41", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-42", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-43", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-44", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-45", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-46", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-47", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-48", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-49", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-50", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-51", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-52", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-53", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-54", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-55", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-56", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-57", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-58", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-59", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-60", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-61", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-62", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-63", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-64", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-65", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-66", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-67", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-68", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-69", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-70", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-71", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-72", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-73", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-74", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-75", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-76", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-77", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-78", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-79", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-80", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-81", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-82", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-83", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-84", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-85", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-86", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-87", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-88", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-89", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-90", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-91", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-92", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-93", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-94", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-95", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-96", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-97", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-98", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-99", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + } + ], + "pageInfo": { + "hasNextPage": true + } + } + } + } + } + ] + } + } + } + } + } + }, + { + "match": { + "operation": "PullRequestCheckContexts" + }, + "body": { + "data": null, + "errors": [ + { + "type": "FORBIDDEN", + "message": "Resource not accessible by personal access token", + "path": [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts" + ], + "locations": [ + { + "line": 1, + "column": 1 + } + ] + } + ] + } + }, + { + "match": { + "operation": "PullRequestCore", + "detailedChecks": false + }, + "body": { + "data": { + "repository": { + "mergeCommitAllowed": true, + "squashMergeAllowed": true, + "rebaseMergeAllowed": true, + "autoMergeAllowed": false, + "viewerPermission": "WRITE", + "pullRequest": { + "number": 116, + "title": "Fixture pull request 116", + "url": "https://github.localtest.me/acme/web/pull/116", + "body": "Stubbed body", + "state": "OPEN", + "isDraft": false, + "mergeable": "MERGEABLE", + "mergeStateStatus": "CLEAN", + "reviewDecision": null, + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "mergedAt": null, + "closedAt": null, + "headRefName": "feature-116", + "baseRefName": "main", + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "isCrossRepository": false, + "headRepositoryOwner": { + "__typename": "Organization", + "login": "acme" + }, + "headRepository": { + "nameWithOwner": "acme/web", + "viewerPermission": "WRITE" + }, + "headRef": { + "id": "ref-116" + }, + "author": { + "__typename": "User", + "login": "octo", + "avatarUrl": "https://github.localtest.me/octo.png", + "id": "u1", + "name": "Octo" + }, + "autoMergeRequest": null, + "viewerCanUpdate": true, + "viewerDidAuthor": false, + "viewerCanUpdateBranch": true, + "baseRef": { + "compare": { + "behindBy": 0 + } + }, + "reviewRequests": { + "nodes": [ + { + "requestedReviewer": { + "__typename": "User", + "login": "reviewer", + "name": null + } + } + ] + }, + "labels": { + "nodes": [ + { + "name": "bug", + "color": "ff0000" + } + ] + }, + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "state": "FAILURE" + } + } + } + ] + } + } + } + } + } + } + ] + }, + { + "id": "F7", + "number": 107, + "title": "head changed during the walk", + "answers": [ + { + "match": { + "operation": "PullRequestCore" + }, + "body": { + "data": { + "repository": { + "mergeCommitAllowed": true, + "squashMergeAllowed": true, + "rebaseMergeAllowed": true, + "autoMergeAllowed": false, + "viewerPermission": "WRITE", + "pullRequest": { + "number": 107, + "title": "Fixture pull request 107", + "url": "https://github.localtest.me/acme/web/pull/107", + "body": "Stubbed body", + "state": "OPEN", + "isDraft": false, + "mergeable": "MERGEABLE", + "mergeStateStatus": "CLEAN", + "reviewDecision": null, + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "mergedAt": null, + "closedAt": null, + "headRefName": "feature-107", + "baseRefName": "main", + "headRefOid": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "isCrossRepository": false, + "headRepositoryOwner": { + "__typename": "Organization", + "login": "acme" + }, + "headRepository": { + "nameWithOwner": "acme/web", + "viewerPermission": "WRITE" + }, + "headRef": { + "id": "ref-107" + }, + "author": { + "__typename": "User", + "login": "octo", + "avatarUrl": "https://github.localtest.me/octo.png", + "id": "u1", + "name": "Octo" + }, + "autoMergeRequest": null, + "viewerCanUpdate": true, + "viewerDidAuthor": false, + "viewerCanUpdateBranch": true, + "baseRef": { + "compare": { + "behindBy": 0 + } + }, + "reviewRequests": { + "nodes": [ + { + "requestedReviewer": { + "__typename": "User", + "login": "reviewer", + "name": null + } + } + ] + }, + "labels": { + "nodes": [ + { + "name": "bug", + "color": "ff0000" + } + ] + }, + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "state": "SUCCESS", + "contexts": { + "nodes": [ + { + "__typename": "CheckRun", + "name": "job-0", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-1", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-2", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-3", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-4", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-5", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-6", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-7", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-8", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-9", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-10", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-11", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-12", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-13", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-14", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-15", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-16", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-17", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-18", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-19", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-20", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-21", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-22", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-23", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-24", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-25", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-26", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-27", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-28", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-29", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-30", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-31", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-32", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-33", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-34", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-35", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-36", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-37", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-38", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-39", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-40", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-41", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-42", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-43", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-44", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-45", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-46", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-47", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-48", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-49", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-50", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-51", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-52", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-53", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-54", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-55", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-56", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-57", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-58", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-59", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-60", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-61", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-62", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-63", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-64", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-65", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-66", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-67", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-68", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-69", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-70", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-71", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-72", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-73", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-74", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-75", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-76", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-77", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-78", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-79", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-80", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-81", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-82", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-83", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-84", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-85", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-86", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-87", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-88", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-89", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-90", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-91", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-92", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-93", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-94", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-95", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-96", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-97", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-98", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-99", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + } + ], + "pageInfo": { + "hasNextPage": true + } + } + } + } + } + ] + } + } + } + } + } + }, + { + "match": { + "operation": "PullRequestCheckContexts" + }, + "body": { + "data": { + "repository": { + "pullRequest": { + "headRefOid": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "commits": { + "nodes": [ + { + "commit": { + "statusCheckRollup": { + "contexts": { + "nodes": [ + { + "__typename": "CheckRun", + "name": "job-0", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-1", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-2", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-3", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-4", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-5", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-6", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-7", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-8", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-9", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-10", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-11", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-12", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-13", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-14", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-15", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-16", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-17", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-18", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-19", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-20", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-21", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-22", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-23", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-24", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-25", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-26", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-27", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-28", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-29", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-30", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-31", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-32", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-33", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-34", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-35", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-36", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-37", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-38", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-39", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-40", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-41", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-42", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-43", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-44", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-45", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-46", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-47", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-48", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-49", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-50", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-51", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-52", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-53", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-54", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-55", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-56", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-57", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-58", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-59", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-60", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-61", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-62", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-63", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-64", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-65", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-66", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-67", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-68", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-69", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-70", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-71", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-72", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-73", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-74", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-75", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-76", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-77", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-78", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-79", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-80", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-81", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-82", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-83", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-84", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-85", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-86", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-87", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-88", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-89", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-90", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-91", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-92", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-93", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-94", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-95", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-96", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-97", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-98", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + }, + { + "__typename": "CheckRun", + "name": "job-99", + "status": "COMPLETED", + "conclusion": "SUCCESS", + "startedAt": "2026-10-01T00:00:00Z", + "completedAt": "2026-10-01T00:05:00Z", + "detailsUrl": "https://github.localtest.me/acme/web/actions/runs/1", + "checkSuite": { + "workflowRun": { + "workflow": { + "name": "ci" + } + } + } + } + ], + "pageInfo": { + "hasNextPage": false, + "endCursor": null + } + } + } + } + } + ] + } + } + } + } + } + } + ] + }, + { + "id": "F8", + "number": 108, + "title": "not found", + "answers": [ + { + "match": { + "operation": "PullRequestCore" + }, + "body": { + "data": { + "repository": { + "pullRequest": null + } + }, + "errors": [ + { + "type": "NOT_FOUND", + "message": "Could not resolve to a PullRequest with the number of 108.", + "path": ["repository", "pullRequest"] + } + ] + } + } + ] + } +] diff --git a/apps/server/scripts/evidence/pr-22987/recorded/after/requests.jsonl b/apps/server/scripts/evidence/pr-22987/recorded/after/requests.jsonl new file mode 100644 index 0000000000000..749d0f4d69cfd --- /dev/null +++ b/apps/server/scripts/evidence/pr-22987/recorded/after/requests.jsonl @@ -0,0 +1,29 @@ +{"row":"F1","method":"GET","url":"/api/v3/user","status":200} +{"row":"F1","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":101,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F2","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":102,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F2","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":102,"detailedChecks":false,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F2b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":112,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F2b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":112,"detailedChecks":false,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F3","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":103,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":403} +{"row":"F3","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":103,"detailedChecks":false,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F3b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":113,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F3b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":113,"detailedChecks":false,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F4","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":104,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F4","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":104,"detailedChecks":false,"requestedReviewers":0},"queryHasDetailedChecks":true,"status":200} +{"row":"F4b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":114,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F4b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":114,"detailedChecks":true,"requestedReviewers":0},"queryHasDetailedChecks":true,"status":200} +{"row":"F4c","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":124,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":403} +{"row":"F5a","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":105,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F5b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":115,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":500} +{"row":"F5c","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":125,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F5d","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":135,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F5t","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":145,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"answer":"socket destroyed"} +{"row":"F6","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":106,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F6","method":"POST","url":"/api/graphql","operation":"PullRequestCheckContexts","variables":{"number":106},"queryHasDetailedChecks":false,"status":200} +{"row":"F6","method":"POST","url":"/api/graphql","operation":"PullRequestCheckContexts","variables":{"number":106,"after":"c1"},"queryHasDetailedChecks":false,"status":200} +{"row":"F6b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":116,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F6b","method":"POST","url":"/api/graphql","operation":"PullRequestCheckContexts","variables":{"number":116},"queryHasDetailedChecks":false,"status":200} +{"row":"F6b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":116,"detailedChecks":false,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F7","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":107,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} +{"row":"F7","method":"POST","url":"/api/graphql","operation":"PullRequestCheckContexts","variables":{"number":107},"queryHasDetailedChecks":false,"status":200} +{"row":"F8","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":108,"detailedChecks":true,"requestedReviewers":100},"queryHasDetailedChecks":true,"status":200} diff --git a/apps/server/scripts/evidence/pr-22987/recorded/after/results.json b/apps/server/scripts/evidence/pr-22987/recorded/after/results.json new file mode 100644 index 0000000000000..61f13716d1c3e --- /dev/null +++ b/apps/server/scripts/evidence/pr-22987/recorded/after/results.json @@ -0,0 +1,1917 @@ +{ + "label": "after", + "results": [ + { + "id": "F1", + "number": 101, + "title": "readable checks", + "ok": true, + "detail": { + "provider": "github", + "capabilities": { + "diff": true, + "comment": true, + "actions": [ + "merge", + "ready", + "draft", + "close", + "reopen", + "delete-branch", + "update-branch", + "enable-auto-merge", + "disable-auto-merge", + "revert", + "approve-workflows" + ], + "mergeMethods": ["merge", "squash", "rebase"], + "deleteBranch": true, + "updateMethods": ["merge", "rebase"], + "search": true, + "reactions": true, + "viewedFiles": "host", + "review": { + "inlineComment": true, + "reply": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"] + }, + "reviewers": { + "request": true, + "listCandidates": true + }, + "edit": { + "changeRequest": true, + "comment": true + }, + "stacks": true, + "stackActions": true, + "labels": true + }, + "viewerPermissions": { + "stackRebase": true, + "actions": [ + "delete-branch", + "merge", + "disable-auto-merge", + "revert", + "approve-workflows", + "ready", + "draft", + "close", + "reopen", + "update-branch" + ], + "comment": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"], + "requestReviewers": true, + "updateMethods": ["merge", "rebase"], + "labels": true + }, + "projectId": "ad8d0b27-e98f-475c-acba-640c92407c14", + "projectTitle": "PR 22987 evidence", + "workspaceRoot": "/tmp/ev-22987/after/project", + "repository": "acme/web", + "number": 101, + "title": "Fixture pull request 101", + "body": "Stubbed body", + "url": "https://github.localtest.me/acme/web/pull/101", + "author": { + "login": "octo", + "name": "Octo", + "avatarUrl": "https://github.localtest.me/octo.png" + }, + "state": "open", + "isDraft": false, + "mergeability": "mergeable", + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "headBranch": "feature-101", + "headRepositoryNameWithOwner": "acme/web", + "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "baseBranch": "main", + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "observedAt": 1792667544963, + "mergedAt": null, + "closedAt": null, + "reviewers": [ + { + "login": "reviewer", + "name": null, + "avatarUrl": null + } + ], + "labels": [ + { + "name": "bug", + "color": "ff0000" + } + ], + "checks": [ + { + "name": "test", + "status": "failure", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "build", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + } + ], + "mergeCapabilities": { + "merge": true, + "squash": true, + "rebase": true + }, + "viewer": "stub", + "baseComparison": "up-to-date", + "behindBy": 0, + "autoMergeEnabled": false, + "workflowApprovalsRequired": 0 + } + }, + { + "id": "F2", + "number": 102, + "title": "contexts refused, HTTP 200, PAT message, path length 8", + "ok": true, + "detail": { + "provider": "github", + "capabilities": { + "diff": true, + "comment": true, + "actions": [ + "merge", + "ready", + "draft", + "close", + "reopen", + "delete-branch", + "update-branch", + "enable-auto-merge", + "disable-auto-merge", + "revert", + "approve-workflows" + ], + "mergeMethods": ["merge", "squash", "rebase"], + "deleteBranch": true, + "updateMethods": ["merge", "rebase"], + "search": true, + "reactions": true, + "viewedFiles": "host", + "review": { + "inlineComment": true, + "reply": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"] + }, + "reviewers": { + "request": true, + "listCandidates": true + }, + "edit": { + "changeRequest": true, + "comment": true + }, + "stacks": true, + "stackActions": true, + "labels": true + }, + "viewerPermissions": { + "stackRebase": true, + "actions": [ + "delete-branch", + "merge", + "disable-auto-merge", + "revert", + "approve-workflows", + "ready", + "draft", + "close", + "reopen", + "update-branch" + ], + "comment": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"], + "requestReviewers": true, + "updateMethods": ["merge", "rebase"], + "labels": true + }, + "projectId": "ad8d0b27-e98f-475c-acba-640c92407c14", + "projectTitle": "PR 22987 evidence", + "workspaceRoot": "/tmp/ev-22987/after/project", + "repository": "acme/web", + "number": 102, + "title": "Fixture pull request 102", + "body": "Stubbed body", + "url": "https://github.localtest.me/acme/web/pull/102", + "author": { + "login": "octo", + "name": "Octo", + "avatarUrl": "https://github.localtest.me/octo.png" + }, + "state": "open", + "isDraft": false, + "mergeability": "mergeable", + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "headBranch": "feature-102", + "headRepositoryNameWithOwner": "acme/web", + "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "baseBranch": "main", + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "observedAt": 1792667545427, + "mergedAt": null, + "closedAt": null, + "reviewers": [ + { + "login": "reviewer", + "name": null, + "avatarUrl": null + } + ], + "labels": [ + { + "name": "bug", + "color": "ff0000" + } + ], + "checks": [ + { + "name": "Overall check status", + "status": "success", + "description": "Individual checks are unavailable with the current GitHub credential.", + "url": "https://github.localtest.me/acme/web/pull/102/checks" + } + ], + "checksUnavailable": "Individual checks are unavailable with the current GitHub credential.", + "mergeCapabilities": { + "merge": true, + "squash": true, + "rebase": true + }, + "viewer": "stub", + "baseComparison": "up-to-date", + "behindBy": 0, + "autoMergeEnabled": false, + "workflowApprovalsRequired": 0 + } + }, + { + "id": "F2b", + "number": 112, + "title": "as F2 with rollup FAILURE", + "ok": true, + "detail": { + "provider": "github", + "capabilities": { + "diff": true, + "comment": true, + "actions": [ + "merge", + "ready", + "draft", + "close", + "reopen", + "delete-branch", + "update-branch", + "enable-auto-merge", + "disable-auto-merge", + "revert", + "approve-workflows" + ], + "mergeMethods": ["merge", "squash", "rebase"], + "deleteBranch": true, + "updateMethods": ["merge", "rebase"], + "search": true, + "reactions": true, + "viewedFiles": "host", + "review": { + "inlineComment": true, + "reply": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"] + }, + "reviewers": { + "request": true, + "listCandidates": true + }, + "edit": { + "changeRequest": true, + "comment": true + }, + "stacks": true, + "stackActions": true, + "labels": true + }, + "viewerPermissions": { + "stackRebase": true, + "actions": [ + "delete-branch", + "merge", + "disable-auto-merge", + "revert", + "approve-workflows", + "ready", + "draft", + "close", + "reopen", + "update-branch" + ], + "comment": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"], + "requestReviewers": true, + "updateMethods": ["merge", "rebase"], + "labels": true + }, + "projectId": "ad8d0b27-e98f-475c-acba-640c92407c14", + "projectTitle": "PR 22987 evidence", + "workspaceRoot": "/tmp/ev-22987/after/project", + "repository": "acme/web", + "number": 112, + "title": "Fixture pull request 112", + "body": "Stubbed body", + "url": "https://github.localtest.me/acme/web/pull/112", + "author": { + "login": "octo", + "name": "Octo", + "avatarUrl": "https://github.localtest.me/octo.png" + }, + "state": "open", + "isDraft": false, + "mergeability": "mergeable", + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "headBranch": "feature-112", + "headRepositoryNameWithOwner": "acme/web", + "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "baseBranch": "main", + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "observedAt": 1792667545658, + "mergedAt": null, + "closedAt": null, + "reviewers": [ + { + "login": "reviewer", + "name": null, + "avatarUrl": null + } + ], + "labels": [ + { + "name": "bug", + "color": "ff0000" + } + ], + "checks": [ + { + "name": "Overall check status", + "status": "failure", + "description": "Individual checks are unavailable with the current GitHub credential.", + "url": "https://github.localtest.me/acme/web/pull/112/checks" + } + ], + "checksUnavailable": "Individual checks are unavailable with the current GitHub credential.", + "mergeCapabilities": { + "merge": true, + "squash": true, + "rebase": true + }, + "viewer": "stub", + "baseComparison": "up-to-date", + "behindBy": 0, + "autoMergeEnabled": false, + "workflowApprovalsRequired": 0 + } + }, + { + "id": "F3", + "number": 103, + "title": "contexts refused, HTTP 403, integration message", + "ok": true, + "detail": { + "provider": "github", + "capabilities": { + "diff": true, + "comment": true, + "actions": [ + "merge", + "ready", + "draft", + "close", + "reopen", + "delete-branch", + "update-branch", + "enable-auto-merge", + "disable-auto-merge", + "revert", + "approve-workflows" + ], + "mergeMethods": ["merge", "squash", "rebase"], + "deleteBranch": true, + "updateMethods": ["merge", "rebase"], + "search": true, + "reactions": true, + "viewedFiles": "host", + "review": { + "inlineComment": true, + "reply": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"] + }, + "reviewers": { + "request": true, + "listCandidates": true + }, + "edit": { + "changeRequest": true, + "comment": true + }, + "stacks": true, + "stackActions": true, + "labels": true + }, + "viewerPermissions": { + "stackRebase": true, + "actions": [ + "delete-branch", + "merge", + "disable-auto-merge", + "revert", + "approve-workflows", + "ready", + "draft", + "close", + "reopen", + "update-branch" + ], + "comment": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"], + "requestReviewers": true, + "updateMethods": ["merge", "rebase"], + "labels": true + }, + "projectId": "ad8d0b27-e98f-475c-acba-640c92407c14", + "projectTitle": "PR 22987 evidence", + "workspaceRoot": "/tmp/ev-22987/after/project", + "repository": "acme/web", + "number": 103, + "title": "Fixture pull request 103", + "body": "Stubbed body", + "url": "https://github.localtest.me/acme/web/pull/103", + "author": { + "login": "octo", + "name": "Octo", + "avatarUrl": "https://github.localtest.me/octo.png" + }, + "state": "open", + "isDraft": false, + "mergeability": "mergeable", + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "headBranch": "feature-103", + "headRepositoryNameWithOwner": "acme/web", + "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "baseBranch": "main", + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "observedAt": 1792667545873, + "mergedAt": null, + "closedAt": null, + "reviewers": [ + { + "login": "reviewer", + "name": null, + "avatarUrl": null + } + ], + "labels": [ + { + "name": "bug", + "color": "ff0000" + } + ], + "checks": [ + { + "name": "Overall check status", + "status": "success", + "description": "Individual checks are unavailable with the current GitHub credential.", + "url": "https://github.localtest.me/acme/web/pull/103/checks" + } + ], + "checksUnavailable": "Individual checks are unavailable with the current GitHub credential.", + "mergeCapabilities": { + "merge": true, + "squash": true, + "rebase": true + }, + "viewer": "stub", + "baseComparison": "up-to-date", + "behindBy": 0, + "autoMergeEnabled": false, + "workflowApprovalsRequired": 0 + } + }, + { + "id": "F3b", + "number": 113, + "title": "per-node refusal, path length 10, partial data", + "ok": true, + "detail": { + "provider": "github", + "capabilities": { + "diff": true, + "comment": true, + "actions": [ + "merge", + "ready", + "draft", + "close", + "reopen", + "delete-branch", + "update-branch", + "enable-auto-merge", + "disable-auto-merge", + "revert", + "approve-workflows" + ], + "mergeMethods": ["merge", "squash", "rebase"], + "deleteBranch": true, + "updateMethods": ["merge", "rebase"], + "search": true, + "reactions": true, + "viewedFiles": "host", + "review": { + "inlineComment": true, + "reply": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"] + }, + "reviewers": { + "request": true, + "listCandidates": true + }, + "edit": { + "changeRequest": true, + "comment": true + }, + "stacks": true, + "stackActions": true, + "labels": true + }, + "viewerPermissions": { + "stackRebase": true, + "actions": [ + "delete-branch", + "merge", + "disable-auto-merge", + "revert", + "approve-workflows", + "ready", + "draft", + "close", + "reopen", + "update-branch" + ], + "comment": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"], + "requestReviewers": true, + "updateMethods": ["merge", "rebase"], + "labels": true + }, + "projectId": "ad8d0b27-e98f-475c-acba-640c92407c14", + "projectTitle": "PR 22987 evidence", + "workspaceRoot": "/tmp/ev-22987/after/project", + "repository": "acme/web", + "number": 113, + "title": "Fixture pull request 113", + "body": "Stubbed body", + "url": "https://github.localtest.me/acme/web/pull/113", + "author": { + "login": "octo", + "name": "Octo", + "avatarUrl": "https://github.localtest.me/octo.png" + }, + "state": "open", + "isDraft": false, + "mergeability": "mergeable", + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "headBranch": "feature-113", + "headRepositoryNameWithOwner": "acme/web", + "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "baseBranch": "main", + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "observedAt": 1792667546029, + "mergedAt": null, + "closedAt": null, + "reviewers": [ + { + "login": "reviewer", + "name": null, + "avatarUrl": null + } + ], + "labels": [ + { + "name": "bug", + "color": "ff0000" + } + ], + "checks": [ + { + "name": "Overall check status", + "status": "pending", + "description": "Individual checks are unavailable with the current GitHub credential.", + "url": "https://github.localtest.me/acme/web/pull/113/checks" + } + ], + "checksUnavailable": "Individual checks are unavailable with the current GitHub credential.", + "mergeCapabilities": { + "merge": true, + "squash": true, + "rebase": true + }, + "viewer": "stub", + "baseComparison": "up-to-date", + "behindBy": 0, + "autoMergeEnabled": false, + "workflowApprovalsRequired": 0 + } + }, + { + "id": "F4", + "number": 104, + "title": "reviewers and contexts refused together (200)", + "ok": true, + "detail": { + "provider": "github", + "capabilities": { + "diff": true, + "comment": true, + "actions": [ + "merge", + "ready", + "draft", + "close", + "reopen", + "delete-branch", + "update-branch", + "enable-auto-merge", + "disable-auto-merge", + "revert", + "approve-workflows" + ], + "mergeMethods": ["merge", "squash", "rebase"], + "deleteBranch": true, + "updateMethods": ["merge", "rebase"], + "search": true, + "reactions": true, + "viewedFiles": "host", + "review": { + "inlineComment": true, + "reply": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"] + }, + "reviewers": { + "request": true, + "listCandidates": true + }, + "edit": { + "changeRequest": true, + "comment": true + }, + "stacks": true, + "stackActions": true, + "labels": true + }, + "viewerPermissions": { + "stackRebase": true, + "actions": [ + "delete-branch", + "merge", + "disable-auto-merge", + "revert", + "approve-workflows", + "ready", + "draft", + "close", + "reopen", + "update-branch" + ], + "comment": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"], + "requestReviewers": true, + "updateMethods": ["merge", "rebase"], + "labels": true + }, + "projectId": "ad8d0b27-e98f-475c-acba-640c92407c14", + "projectTitle": "PR 22987 evidence", + "workspaceRoot": "/tmp/ev-22987/after/project", + "repository": "acme/web", + "number": 104, + "title": "Fixture pull request 104", + "body": "Stubbed body", + "url": "https://github.localtest.me/acme/web/pull/104", + "author": { + "login": "octo", + "name": "Octo", + "avatarUrl": "https://github.localtest.me/octo.png" + }, + "state": "open", + "isDraft": false, + "mergeability": "mergeable", + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "headBranch": "feature-104", + "headRepositoryNameWithOwner": "acme/web", + "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "baseBranch": "main", + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "observedAt": 1792667546135, + "mergedAt": null, + "closedAt": null, + "reviewers": [], + "labels": [ + { + "name": "bug", + "color": "ff0000" + } + ], + "checks": [ + { + "name": "Overall check status", + "status": "success", + "description": "Individual checks are unavailable with the current GitHub credential.", + "url": "https://github.localtest.me/acme/web/pull/104/checks" + } + ], + "checksUnavailable": "Individual checks are unavailable with the current GitHub credential.", + "mergeCapabilities": { + "merge": true, + "squash": true, + "rebase": true + }, + "viewer": "stub", + "baseComparison": "up-to-date", + "behindBy": 0, + "autoMergeEnabled": false, + "workflowApprovalsRequired": 0 + } + }, + { + "id": "F4b", + "number": 114, + "title": "reviewers refused only (regression guard)", + "ok": true, + "detail": { + "provider": "github", + "capabilities": { + "diff": true, + "comment": true, + "actions": [ + "merge", + "ready", + "draft", + "close", + "reopen", + "delete-branch", + "update-branch", + "enable-auto-merge", + "disable-auto-merge", + "revert", + "approve-workflows" + ], + "mergeMethods": ["merge", "squash", "rebase"], + "deleteBranch": true, + "updateMethods": ["merge", "rebase"], + "search": true, + "reactions": true, + "viewedFiles": "host", + "review": { + "inlineComment": true, + "reply": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"] + }, + "reviewers": { + "request": true, + "listCandidates": true + }, + "edit": { + "changeRequest": true, + "comment": true + }, + "stacks": true, + "stackActions": true, + "labels": true + }, + "viewerPermissions": { + "stackRebase": true, + "actions": [ + "delete-branch", + "merge", + "disable-auto-merge", + "revert", + "approve-workflows", + "ready", + "draft", + "close", + "reopen", + "update-branch" + ], + "comment": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"], + "requestReviewers": true, + "updateMethods": ["merge", "rebase"], + "labels": true + }, + "projectId": "ad8d0b27-e98f-475c-acba-640c92407c14", + "projectTitle": "PR 22987 evidence", + "workspaceRoot": "/tmp/ev-22987/after/project", + "repository": "acme/web", + "number": 114, + "title": "Fixture pull request 114", + "body": "Stubbed body", + "url": "https://github.localtest.me/acme/web/pull/114", + "author": { + "login": "octo", + "name": "Octo", + "avatarUrl": "https://github.localtest.me/octo.png" + }, + "state": "open", + "isDraft": false, + "mergeability": "mergeable", + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "headBranch": "feature-114", + "headRepositoryNameWithOwner": "acme/web", + "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "baseBranch": "main", + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "observedAt": 1792667546219, + "mergedAt": null, + "closedAt": null, + "reviewers": [], + "labels": [ + { + "name": "bug", + "color": "ff0000" + } + ], + "checks": [ + { + "name": "test", + "status": "failure", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "build", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + } + ], + "mergeCapabilities": { + "merge": true, + "squash": true, + "rebase": true + }, + "viewer": "stub", + "baseComparison": "up-to-date", + "behindBy": 0, + "autoMergeEnabled": false, + "workflowApprovalsRequired": 0 + } + }, + { + "id": "F4c", + "number": 124, + "title": "reviewers and contexts refused at HTTP 403 (stays an error)", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token" + } + }, + { + "id": "F5a", + "number": 105, + "title": "unrelated: generic Forbidden message at contexts", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Forbidden", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Forbidden" + } + }, + { + "id": "F5b", + "number": 115, + "title": "unrelated: HTTP 500 INTERNAL", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Something went wrong", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Something went wrong" + } + }, + { + "id": "F5c", + "number": 125, + "title": "unrelated: PAT message at contexts.totalCount (bad path)", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Resource not accessible by personal access token", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Resource not accessible by personal access token" + } + }, + { + "id": "F5d", + "number": 135, + "title": "unrelated: contexts refusal plus an INTERNAL error", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Resource not accessible by personal access token; Something went wrong", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Resource not accessible by personal access token; Something went wrong" + } + }, + { + "id": "F5t", + "number": 145, + "title": "transport failure (socket destroyed)", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "Could not reach GitHub at github.localtest.me.", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: Could not reach GitHub at github.localtest.me." + } + }, + { + "id": "F6", + "number": 106, + "title": "more than 100 checks, walked", + "ok": true, + "detail": { + "provider": "github", + "capabilities": { + "diff": true, + "comment": true, + "actions": [ + "merge", + "ready", + "draft", + "close", + "reopen", + "delete-branch", + "update-branch", + "enable-auto-merge", + "disable-auto-merge", + "revert", + "approve-workflows" + ], + "mergeMethods": ["merge", "squash", "rebase"], + "deleteBranch": true, + "updateMethods": ["merge", "rebase"], + "search": true, + "reactions": true, + "viewedFiles": "host", + "review": { + "inlineComment": true, + "reply": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"] + }, + "reviewers": { + "request": true, + "listCandidates": true + }, + "edit": { + "changeRequest": true, + "comment": true + }, + "stacks": true, + "stackActions": true, + "labels": true + }, + "viewerPermissions": { + "stackRebase": true, + "actions": [ + "delete-branch", + "merge", + "disable-auto-merge", + "revert", + "approve-workflows", + "ready", + "draft", + "close", + "reopen", + "update-branch" + ], + "comment": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"], + "requestReviewers": true, + "updateMethods": ["merge", "rebase"], + "labels": true + }, + "projectId": "ad8d0b27-e98f-475c-acba-640c92407c14", + "projectTitle": "PR 22987 evidence", + "workspaceRoot": "/tmp/ev-22987/after/project", + "repository": "acme/web", + "number": 106, + "title": "Fixture pull request 106", + "body": "Stubbed body", + "url": "https://github.localtest.me/acme/web/pull/106", + "author": { + "login": "octo", + "name": "Octo", + "avatarUrl": "https://github.localtest.me/octo.png" + }, + "state": "open", + "isDraft": false, + "mergeability": "mergeable", + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "headBranch": "feature-106", + "headRepositoryNameWithOwner": "acme/web", + "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "baseBranch": "main", + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "observedAt": 1792667546570, + "mergedAt": null, + "closedAt": null, + "reviewers": [ + { + "login": "reviewer", + "name": null, + "avatarUrl": null + } + ], + "labels": [ + { + "name": "bug", + "color": "ff0000" + } + ], + "checks": [ + { + "name": "job-0", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-1", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-2", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-3", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-4", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-5", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-6", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-7", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-8", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-9", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-10", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-11", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-12", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-13", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-14", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-15", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-16", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-17", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-18", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-19", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-20", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-21", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-22", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-23", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-24", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-25", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-26", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-27", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-28", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-29", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-30", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-31", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-32", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-33", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-34", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-35", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-36", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-37", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-38", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-39", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-40", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-41", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-42", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-43", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-44", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-45", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-46", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-47", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-48", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-49", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-50", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-51", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-52", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-53", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-54", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-55", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-56", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-57", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-58", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-59", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-60", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-61", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-62", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-63", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-64", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-65", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-66", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-67", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-68", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-69", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-70", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-71", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-72", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-73", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-74", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-75", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-76", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-77", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-78", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-79", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-80", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-81", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-82", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-83", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-84", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-85", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-86", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-87", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-88", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-89", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-90", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-91", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-92", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-93", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-94", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-95", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-96", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-97", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-98", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-99", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-100", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-101", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-102", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-103", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-104", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + } + ], + "mergeCapabilities": { + "merge": true, + "squash": true, + "rebase": true + }, + "viewer": "stub", + "baseComparison": "up-to-date", + "behindBy": 0, + "autoMergeEnabled": false, + "workflowApprovalsRequired": 0 + } + }, + { + "id": "F6b", + "number": 116, + "title": "walk refused mid-pagination", + "ok": true, + "detail": { + "provider": "github", + "capabilities": { + "diff": true, + "comment": true, + "actions": [ + "merge", + "ready", + "draft", + "close", + "reopen", + "delete-branch", + "update-branch", + "enable-auto-merge", + "disable-auto-merge", + "revert", + "approve-workflows" + ], + "mergeMethods": ["merge", "squash", "rebase"], + "deleteBranch": true, + "updateMethods": ["merge", "rebase"], + "search": true, + "reactions": true, + "viewedFiles": "host", + "review": { + "inlineComment": true, + "reply": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"] + }, + "reviewers": { + "request": true, + "listCandidates": true + }, + "edit": { + "changeRequest": true, + "comment": true + }, + "stacks": true, + "stackActions": true, + "labels": true + }, + "viewerPermissions": { + "stackRebase": true, + "actions": [ + "delete-branch", + "merge", + "disable-auto-merge", + "revert", + "approve-workflows", + "ready", + "draft", + "close", + "reopen", + "update-branch" + ], + "comment": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"], + "requestReviewers": true, + "updateMethods": ["merge", "rebase"], + "labels": true + }, + "projectId": "ad8d0b27-e98f-475c-acba-640c92407c14", + "projectTitle": "PR 22987 evidence", + "workspaceRoot": "/tmp/ev-22987/after/project", + "repository": "acme/web", + "number": 116, + "title": "Fixture pull request 116", + "body": "Stubbed body", + "url": "https://github.localtest.me/acme/web/pull/116", + "author": { + "login": "octo", + "name": "Octo", + "avatarUrl": "https://github.localtest.me/octo.png" + }, + "state": "open", + "isDraft": false, + "mergeability": "mergeable", + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "headBranch": "feature-116", + "headRepositoryNameWithOwner": "acme/web", + "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "baseBranch": "main", + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "observedAt": 1792667546663, + "mergedAt": null, + "closedAt": null, + "reviewers": [ + { + "login": "reviewer", + "name": null, + "avatarUrl": null + } + ], + "labels": [ + { + "name": "bug", + "color": "ff0000" + } + ], + "checks": [ + { + "name": "Overall check status", + "status": "failure", + "description": "Individual checks are unavailable with the current GitHub credential.", + "url": "https://github.localtest.me/acme/web/pull/116/checks" + } + ], + "checksUnavailable": "Individual checks are unavailable with the current GitHub credential.", + "mergeCapabilities": { + "merge": true, + "squash": true, + "rebase": true + }, + "viewer": "stub", + "baseComparison": "up-to-date", + "behindBy": 0, + "autoMergeEnabled": false, + "workflowApprovalsRequired": 0 + } + }, + { + "id": "F7", + "number": 107, + "title": "head changed during the walk", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an unreadable getPullRequestDetail response.", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an unreadable getPullRequestDetail response." + } + }, + { + "id": "F8", + "number": 108, + "title": "not found", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub could not find the requested resource, or the credential cannot see it.", + "reason": "not-found", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub could not find the requested resource, or the credential cannot see it." + } + } + ] +} diff --git a/apps/server/scripts/evidence/pr-22987/recorded/before/requests.jsonl b/apps/server/scripts/evidence/pr-22987/recorded/before/requests.jsonl new file mode 100644 index 0000000000000..f58c491938c55 --- /dev/null +++ b/apps/server/scripts/evidence/pr-22987/recorded/before/requests.jsonl @@ -0,0 +1,23 @@ +{"row":"F1","method":"GET","url":"/api/v3/user","status":200} +{"row":"F1","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":101,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":200} +{"row":"F2","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":102,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":200} +{"row":"F2b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":112,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":200} +{"row":"F3","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":103,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":403} +{"row":"F3b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":113,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":200} +{"row":"F4","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":104,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":200} +{"row":"F4b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":114,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":200} +{"row":"F4b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":114,"requestedReviewers":0},"queryHasDetailedChecks":false,"status":200} +{"row":"F4c","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":124,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":403} +{"row":"F5a","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":105,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":200} +{"row":"F5b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":115,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":500} +{"row":"F5c","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":125,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":200} +{"row":"F5d","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":135,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":200} +{"row":"F5t","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":145,"requestedReviewers":100},"queryHasDetailedChecks":false,"answer":"socket destroyed"} +{"row":"F6","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":106,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":200} +{"row":"F6","method":"POST","url":"/api/graphql","operation":"PullRequestCheckContexts","variables":{"number":106},"queryHasDetailedChecks":false,"status":200} +{"row":"F6","method":"POST","url":"/api/graphql","operation":"PullRequestCheckContexts","variables":{"number":106,"after":"c1"},"queryHasDetailedChecks":false,"status":200} +{"row":"F6b","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":116,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":200} +{"row":"F6b","method":"POST","url":"/api/graphql","operation":"PullRequestCheckContexts","variables":{"number":116},"queryHasDetailedChecks":false,"status":200} +{"row":"F7","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":107,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":200} +{"row":"F7","method":"POST","url":"/api/graphql","operation":"PullRequestCheckContexts","variables":{"number":107},"queryHasDetailedChecks":false,"status":200} +{"row":"F8","method":"POST","url":"/api/graphql","operation":"PullRequestCore","variables":{"number":108,"requestedReviewers":100},"queryHasDetailedChecks":false,"status":200} diff --git a/apps/server/scripts/evidence/pr-22987/recorded/before/results.json b/apps/server/scripts/evidence/pr-22987/recorded/before/results.json new file mode 100644 index 0000000000000..922273de33adb --- /dev/null +++ b/apps/server/scripts/evidence/pr-22987/recorded/before/results.json @@ -0,0 +1,1233 @@ +{ + "label": "before", + "results": [ + { + "id": "F1", + "number": 101, + "title": "readable checks", + "ok": true, + "detail": { + "provider": "github", + "capabilities": { + "diff": true, + "comment": true, + "actions": [ + "merge", + "ready", + "draft", + "close", + "reopen", + "delete-branch", + "update-branch", + "enable-auto-merge", + "disable-auto-merge", + "revert", + "approve-workflows" + ], + "mergeMethods": ["merge", "squash", "rebase"], + "deleteBranch": true, + "updateMethods": ["merge", "rebase"], + "search": true, + "reactions": true, + "viewedFiles": "host", + "review": { + "inlineComment": true, + "reply": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"] + }, + "reviewers": { + "request": true, + "listCandidates": true + }, + "edit": { + "changeRequest": true, + "comment": true + }, + "stacks": true, + "stackActions": true, + "labels": true + }, + "viewerPermissions": { + "stackRebase": true, + "actions": [ + "delete-branch", + "merge", + "disable-auto-merge", + "revert", + "approve-workflows", + "ready", + "draft", + "close", + "reopen", + "update-branch" + ], + "comment": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"], + "requestReviewers": true, + "updateMethods": ["merge", "rebase"], + "labels": true + }, + "projectId": "47ae7e78-c6b2-4eee-bc29-236e6459a26b", + "projectTitle": "PR 22987 evidence", + "workspaceRoot": "/tmp/ev-22987/before/project", + "repository": "acme/web", + "number": 101, + "title": "Fixture pull request 101", + "body": "Stubbed body", + "url": "https://github.localtest.me/acme/web/pull/101", + "author": { + "login": "octo", + "name": "Octo", + "avatarUrl": "https://github.localtest.me/octo.png" + }, + "state": "open", + "isDraft": false, + "mergeability": "mergeable", + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "headBranch": "feature-101", + "headRepositoryNameWithOwner": "acme/web", + "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "baseBranch": "main", + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "observedAt": 1792667569206, + "mergedAt": null, + "closedAt": null, + "reviewers": [ + { + "login": "reviewer", + "name": null, + "avatarUrl": null + } + ], + "labels": [ + { + "name": "bug", + "color": "ff0000" + } + ], + "checks": [ + { + "name": "test", + "status": "failure", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "build", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + } + ], + "mergeCapabilities": { + "merge": true, + "squash": true, + "rebase": true + }, + "viewer": "stub", + "baseComparison": "up-to-date", + "behindBy": 0, + "autoMergeEnabled": false, + "workflowApprovalsRequired": 0 + } + }, + { + "id": "F2", + "number": 102, + "title": "contexts refused, HTTP 200, PAT message, path length 8", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Resource not accessible by personal access token", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Resource not accessible by personal access token" + } + }, + { + "id": "F2b", + "number": 112, + "title": "as F2 with rollup FAILURE", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Resource not accessible by personal access token", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Resource not accessible by personal access token" + } + }, + { + "id": "F3", + "number": 103, + "title": "contexts refused, HTTP 403, integration message", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Resource not accessible by integration", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Resource not accessible by integration" + } + }, + { + "id": "F3b", + "number": 113, + "title": "per-node refusal, path length 10, partial data", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Resource not accessible by personal access token; Resource not accessible by personal access token", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Resource not accessible by personal access token; Resource not accessible by personal access token" + } + }, + { + "id": "F4", + "number": 104, + "title": "reviewers and contexts refused together (200)", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token" + } + }, + { + "id": "F4b", + "number": 114, + "title": "reviewers refused only (regression guard)", + "ok": true, + "detail": { + "provider": "github", + "capabilities": { + "diff": true, + "comment": true, + "actions": [ + "merge", + "ready", + "draft", + "close", + "reopen", + "delete-branch", + "update-branch", + "enable-auto-merge", + "disable-auto-merge", + "revert", + "approve-workflows" + ], + "mergeMethods": ["merge", "squash", "rebase"], + "deleteBranch": true, + "updateMethods": ["merge", "rebase"], + "search": true, + "reactions": true, + "viewedFiles": "host", + "review": { + "inlineComment": true, + "reply": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"] + }, + "reviewers": { + "request": true, + "listCandidates": true + }, + "edit": { + "changeRequest": true, + "comment": true + }, + "stacks": true, + "stackActions": true, + "labels": true + }, + "viewerPermissions": { + "stackRebase": true, + "actions": [ + "delete-branch", + "merge", + "disable-auto-merge", + "revert", + "approve-workflows", + "ready", + "draft", + "close", + "reopen", + "update-branch" + ], + "comment": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"], + "requestReviewers": true, + "updateMethods": ["merge", "rebase"], + "labels": true + }, + "projectId": "47ae7e78-c6b2-4eee-bc29-236e6459a26b", + "projectTitle": "PR 22987 evidence", + "workspaceRoot": "/tmp/ev-22987/before/project", + "repository": "acme/web", + "number": 114, + "title": "Fixture pull request 114", + "body": "Stubbed body", + "url": "https://github.localtest.me/acme/web/pull/114", + "author": { + "login": "octo", + "name": "Octo", + "avatarUrl": "https://github.localtest.me/octo.png" + }, + "state": "open", + "isDraft": false, + "mergeability": "mergeable", + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "headBranch": "feature-114", + "headRepositoryNameWithOwner": "acme/web", + "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "baseBranch": "main", + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "observedAt": 1792667569571, + "mergedAt": null, + "closedAt": null, + "reviewers": [], + "labels": [ + { + "name": "bug", + "color": "ff0000" + } + ], + "checks": [ + { + "name": "test", + "status": "failure", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "build", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + } + ], + "mergeCapabilities": { + "merge": true, + "squash": true, + "rebase": true + }, + "viewer": "stub", + "baseComparison": "up-to-date", + "behindBy": 0, + "autoMergeEnabled": false, + "workflowApprovalsRequired": 0 + } + }, + { + "id": "F4c", + "number": 124, + "title": "reviewers and contexts refused at HTTP 403 (stays an error)", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token" + } + }, + { + "id": "F5a", + "number": 105, + "title": "unrelated: generic Forbidden message at contexts", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Forbidden", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Forbidden" + } + }, + { + "id": "F5b", + "number": 115, + "title": "unrelated: HTTP 500 INTERNAL", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Something went wrong", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Something went wrong" + } + }, + { + "id": "F5c", + "number": 125, + "title": "unrelated: PAT message at contexts.totalCount (bad path)", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Resource not accessible by personal access token", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Resource not accessible by personal access token" + } + }, + { + "id": "F5d", + "number": 135, + "title": "unrelated: contexts refusal plus an INTERNAL error", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Resource not accessible by personal access token; Something went wrong", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Resource not accessible by personal access token; Something went wrong" + } + }, + { + "id": "F5t", + "number": 145, + "title": "transport failure (socket destroyed)", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "Could not reach GitHub at github.localtest.me.", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: Could not reach GitHub at github.localtest.me." + } + }, + { + "id": "F6", + "number": 106, + "title": "more than 100 checks, walked", + "ok": true, + "detail": { + "provider": "github", + "capabilities": { + "diff": true, + "comment": true, + "actions": [ + "merge", + "ready", + "draft", + "close", + "reopen", + "delete-branch", + "update-branch", + "enable-auto-merge", + "disable-auto-merge", + "revert", + "approve-workflows" + ], + "mergeMethods": ["merge", "squash", "rebase"], + "deleteBranch": true, + "updateMethods": ["merge", "rebase"], + "search": true, + "reactions": true, + "viewedFiles": "host", + "review": { + "inlineComment": true, + "reply": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"] + }, + "reviewers": { + "request": true, + "listCandidates": true + }, + "edit": { + "changeRequest": true, + "comment": true + }, + "stacks": true, + "stackActions": true, + "labels": true + }, + "viewerPermissions": { + "stackRebase": true, + "actions": [ + "delete-branch", + "merge", + "disable-auto-merge", + "revert", + "approve-workflows", + "ready", + "draft", + "close", + "reopen", + "update-branch" + ], + "comment": true, + "resolve": true, + "verdicts": ["comment", "approve", "request-changes"], + "requestReviewers": true, + "updateMethods": ["merge", "rebase"], + "labels": true + }, + "projectId": "47ae7e78-c6b2-4eee-bc29-236e6459a26b", + "projectTitle": "PR 22987 evidence", + "workspaceRoot": "/tmp/ev-22987/before/project", + "repository": "acme/web", + "number": 106, + "title": "Fixture pull request 106", + "body": "Stubbed body", + "url": "https://github.localtest.me/acme/web/pull/106", + "author": { + "login": "octo", + "name": "Octo", + "avatarUrl": "https://github.localtest.me/octo.png" + }, + "state": "open", + "isDraft": false, + "mergeability": "mergeable", + "additions": 10, + "deletions": 2, + "changedFiles": 1, + "headBranch": "feature-106", + "headRepositoryNameWithOwner": "acme/web", + "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "baseBranch": "main", + "createdAt": "2026-10-01T00:00:00Z", + "updatedAt": "2026-10-02T00:00:00Z", + "observedAt": 1792667569766, + "mergedAt": null, + "closedAt": null, + "reviewers": [ + { + "login": "reviewer", + "name": null, + "avatarUrl": null + } + ], + "labels": [ + { + "name": "bug", + "color": "ff0000" + } + ], + "checks": [ + { + "name": "job-0", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-1", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-2", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-3", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-4", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-5", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-6", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-7", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-8", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-9", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-10", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-11", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-12", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-13", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-14", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-15", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-16", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-17", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-18", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-19", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-20", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-21", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-22", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-23", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-24", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-25", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-26", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-27", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-28", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-29", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-30", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-31", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-32", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-33", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-34", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-35", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-36", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-37", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-38", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-39", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-40", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-41", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-42", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-43", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-44", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-45", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-46", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-47", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-48", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-49", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-50", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-51", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-52", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-53", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-54", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-55", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-56", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-57", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-58", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-59", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-60", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-61", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-62", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-63", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-64", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-65", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-66", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-67", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-68", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-69", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-70", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-71", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-72", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-73", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-74", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-75", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-76", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-77", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-78", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-79", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-80", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-81", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-82", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-83", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-84", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-85", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-86", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-87", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-88", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-89", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-90", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-91", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-92", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-93", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-94", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-95", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-96", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-97", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-98", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-99", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-100", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-101", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-102", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-103", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + }, + { + "name": "job-104", + "status": "success", + "description": null, + "url": "https://github.localtest.me/acme/web/actions/runs/1" + } + ], + "mergeCapabilities": { + "merge": true, + "squash": true, + "rebase": true + }, + "viewer": "stub", + "baseComparison": "up-to-date", + "behindBy": 0, + "autoMergeEnabled": false, + "workflowApprovalsRequired": 0 + } + }, + { + "id": "F6b", + "number": 116, + "title": "walk refused mid-pagination", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an error: Resource not accessible by personal access token", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an error: Resource not accessible by personal access token" + } + }, + { + "id": "F7", + "number": 107, + "title": "head changed during the walk", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub returned an unreadable getPullRequestDetail response.", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub returned an unreadable getPullRequestDetail response." + } + }, + { + "id": "F8", + "number": 108, + "title": "not found", + "ok": false, + "error": { + "_tag": "PullRequestOperationError", + "operation": "detail", + "detail": "GitHub could not find the requested resource, or the credential cannot see it.", + "reason": "not-found", + "cause": { + "name": "PullRequestProviderError" + }, + "message": "Pull request operation detail failed: GitHub could not find the requested resource, or the credential cannot see it." + } + } + ] +} diff --git a/apps/server/src/orchestration-v2/runtimeLayer.test.ts b/apps/server/src/orchestration-v2/runtimeLayer.test.ts index 9db0564cced01..22e9a3c5bfc0a 100644 --- a/apps/server/src/orchestration-v2/runtimeLayer.test.ts +++ b/apps/server/src/orchestration-v2/runtimeLayer.test.ts @@ -3003,6 +3003,137 @@ it.layer(layerTest)("OrchestrationV2LayerLive lifecycle", (it) => { }), ); + it.effect.each(["review", "comment", "aggregate success"] as const)( + "keeps a degraded watch alive through eight sweeps and wakes on %s", + (change) => + Effect.gen(function* () { + const orchestrator = yield* Orchestrator.OrchestratorV2; + const threadId = ThreadId.make(`degraded-watch-${change}`); + const projectId = ProjectId.make(`degraded-watch-project-${change}`); + yield* seedProject({ + projectId, + title: "Degraded watch", + workspaceRoot: "/workspace/watch", + defaultModelSelection: null, + createdAt: "2026-10-01T00:00:00.000Z", + }); + yield* orchestrator.dispatch({ + type: "thread.create", + createdBy: "user", + creationSource: "web", + commandId: CommandId.make(`degraded-create-${change}`), + threadId, + projectId, + title: "Degraded watch", + modelSelection, + runtimeMode: "full-access", + interactionMode: "default", + branch: null, + worktreePath: null, + }); + const key = { host: "github.com", repository: "pingdotgg/t3code", number: 7 }; + yield* orchestrator.dispatch({ + type: "thread.pull-request.link", + commandId: CommandId.make(`degraded-link-${change}`), + threadId, + ...key, + url: "https://github.com/pingdotgg/t3code/pull/7", + source: "agent", + }); + yield* orchestrator.dispatch({ + type: "thread.pull-request.watch", + commandId: CommandId.make(`degraded-start-${change}`), + threadId, + ...key, + watching: true, + }); + let changed = false; + let failing = false; + let reads = 0; + const remark: PullRequestComment = { + id: `new-${change}`, + kind: change === "review" ? "review" : "issue-comment", + author: { login: "reviewer", name: null, avatarUrl: null }, + body: "Please update this.", + createdAt: "2999-01-01T00:00:03.000Z", + url: null, + path: null, + reviewState: change === "review" ? "CHANGES_REQUESTED" : null, + }; + const reactor = yield* PullRequestWatchReactor.make.pipe( + Effect.provide( + Layer.mergeAll( + NodeServices.layer, + Layer.mock(PullRequestService.PullRequestService)({ + detail: (input) => { + if (input.projectId === projectId) reads += 1; + if (failing && input.projectId === projectId) + return Effect.fail( + new PullRequestOperationError({ + operation: "detail", + detail: "Temporary network failure", + }), + ); + return Effect.succeed({ + ...watchedPullRequestDetail({ + projectId, + number: 7, + at: "2026-10-02T12:00:00.000Z", + }), + checksUnavailable: "Resource not accessible by personal access token", + checks: [ + { + name: "Overall check status", + status: + changed && change === "aggregate success" + ? ("success" as const) + : ("pending" as const), + description: "Individual checks are unavailable.", + url: "https://github.com/pingdotgg/t3code/pull/7/checks", + }, + ], + }); + }, + activity: () => + Effect.succeed({ + comments: changed && change !== "aggregate success" ? [remark] : [], + commentCount: changed && change !== "aggregate success" ? 1 : 0, + commentsTruncated: false, + reviewThreadsTruncated: false, + reviewThreads: [], + commits: [], + }), + }), + ), + ), + ); + for (let index = 0; index < 8; index += 1) yield* reactor.sweep; + assert.equal(reads, 8); + assert.isDefined((yield* orchestrator.getThreadShell(threadId))?.pullRequests?.[0]?.watch); + assert.deepEqual( + (yield* orchestrator.getThreadRecords(threadId, ["messages"])).messages, + [], + ); + // Seven real errors after degraded reads must still be below the eight-failure cutoff. + failing = true; + for (let index = 0; index < 7; index += 1) yield* reactor.sweep; + assert.isDefined((yield* orchestrator.getThreadShell(threadId))?.pullRequests?.[0]?.watch); + failing = false; + changed = true; + yield* reactor.sweep; + const { messages } = yield* orchestrator.getThreadRecords(threadId, ["messages"]); + assert.deepEqual( + messages.map((message) => message.notification?.summary), + [change === "aggregate success" ? "#7: checks passed" : "#7: new comments"], + ); + yield* reactor.sweep; + assert.equal( + (yield* orchestrator.getThreadRecords(threadId, ["messages"])).messages.length, + 1, + ); + }), + ); + it.effect("persists rejected command receipts across retries", () => Effect.gen(function* () { const orchestrator = yield* Orchestrator.OrchestratorV2; diff --git a/apps/server/src/pullRequest/PullRequestService.ts b/apps/server/src/pullRequest/PullRequestService.ts index 3c6c9b333fbfe..7360774e52a37 100644 --- a/apps/server/src/pullRequest/PullRequestService.ts +++ b/apps/server/src/pullRequest/PullRequestService.ts @@ -1598,6 +1598,9 @@ export const make = Effect.gen(function* () { reviewers: changeRequest.reviewers, labels: changeRequest.labels, checks: changeRequest.checks, + ...(changeRequest.checksUnavailable === undefined + ? {} + : { checksUnavailable: changeRequest.checksUnavailable }), mergeCapabilities: changeRequest.mergeCapabilities, viewerPermissions: changeRequest.viewerPermissions, ...(viewer === null || viewer.trim().length === 0 ? {} : { viewer }), diff --git a/knip.jsonc b/knip.jsonc index 7fbfe38259951..c78799c2a4cef 100644 --- a/knip.jsonc +++ b/knip.jsonc @@ -39,6 +39,7 @@ "src/claude-history-worker.ts!", "scripts/cli.ts", "scripts/evaluate-thread-titles.ts", + "scripts/evidence/*/driver.ts", "scripts/fetch-expo-schema.ts", "scripts/measure-pr-preview.ts", "scripts/probe-claude-fork-local-rollback-replay.ts", diff --git a/packages/contracts/src/pullRequest.test.ts b/packages/contracts/src/pullRequest.test.ts index 1f63a559c899f..781a4ca43685b 100644 --- a/packages/contracts/src/pullRequest.test.ts +++ b/packages/contracts/src/pullRequest.test.ts @@ -144,3 +144,43 @@ describe("PullRequestCapabilities", () => { expect(decoded.title).toBe(detail.title); }); }); + +describe("PullRequestDetail unavailable checks", () => { + const detail = { + ...LIST_RESULT.entries[0], + workspaceRoot: "/workspace/t3code", + body: "", + changedFiles: 1, + mergedAt: null, + closedAt: null, + reviewers: [], + checks: [], + mergeCapabilities: { merge: true, squash: true, rebase: true }, + capabilities: { + diff: true, + comment: true, + actions: [], + mergeMethods: [], + search: true, + review: { inlineComment: true, reply: true, resolve: true, verdicts: [] }, + reviewers: { request: true, listCandidates: true }, + }, + viewerPermissions: { + actions: [], + verdicts: [], + comment: true, + resolve: true, + requestReviewers: true, + }, + }; + it("preserves a nonempty reason through the detail wire codec", () => { + const reason = "Resource not accessible by personal access token"; + expect(decodeDetail({ ...detail, checksUnavailable: reason })).toMatchObject({ + checksUnavailable: reason, + }); + expect(decodeDetail(detail)).not.toHaveProperty("checksUnavailable"); + }); + it("rejects an empty unavailable reason", () => { + expect(() => decodeDetail({ ...detail, checksUnavailable: "" })).toThrow(); + }); +}); diff --git a/packages/contracts/src/pullRequest.ts b/packages/contracts/src/pullRequest.ts index a68f5394b0dd1..9645f39fe1be6 100644 --- a/packages/contracts/src/pullRequest.ts +++ b/packages/contracts/src/pullRequest.ts @@ -573,6 +573,7 @@ export const PullRequestDetail = Schema.Struct({ reviewers: Schema.Array(PullRequestActor), labels: Schema.Array(PullRequestLabel), checks: Schema.Array(PullRequestCheck), + checksUnavailable: Schema.optional(TrimmedNonEmptyString), mergeCapabilities: PullRequestMergeCapabilities, viewer: Schema.optional(TrimmedNonEmptyString), baseComparison: Schema.optional(PullRequestBaseComparison), diff --git a/packages/source-control-core/src/server/PullRequestProvider.ts b/packages/source-control-core/src/server/PullRequestProvider.ts index 3bb7a757f7734..ca2bb47ba12ce 100644 --- a/packages/source-control-core/src/server/PullRequestProvider.ts +++ b/packages/source-control-core/src/server/PullRequestProvider.ts @@ -186,6 +186,7 @@ export interface ProviderChangeRequestDetail extends ProviderChangeRequest { readonly closedAt: string | null; readonly reviewers: ReadonlyArray; readonly checks: ReadonlyArray; + readonly checksUnavailable?: string; readonly mergeCapabilities: PullRequestMergeCapabilities; readonly viewerPermissions: PullRequestViewerPermissions; readonly baseComparison?: PullRequestBaseComparison; diff --git a/packages/source-control-github/src/server/GitHubPullRequestApi.test.ts b/packages/source-control-github/src/server/GitHubPullRequestApi.test.ts index 23cadae857751..40daf187ef4c8 100644 --- a/packages/source-control-github/src/server/GitHubPullRequestApi.test.ts +++ b/packages/source-control-github/src/server/GitHubPullRequestApi.test.ts @@ -10,7 +10,7 @@ import * as Schema from "effect/Schema"; import * as TestClock from "effect/testing/TestClock"; import * as Redacted from "effect/Redacted"; -import { HttpClient, HttpClientResponse } from "effect/http"; +import { HttpClient, HttpClientError, HttpClientResponse } from "effect/http"; import * as GitHubRest from "./GitHubRest.ts"; import * as GitHubRequestPolicy from "./GitHubRequestPolicy.ts"; @@ -100,6 +100,7 @@ type ApiCall = type ApiAnswer = Effect.Effect; +const mockedTransportFailure = vi.fn(() => false); const mockedExecute = vi.fn<(call: ApiCall) => ApiAnswer>(); const defaultCredential = (host: string) => Effect.succeed({ token: Redacted.make("token"), fingerprint: `${host}:token` }); @@ -126,6 +127,15 @@ const mockHttp = Layer.succeed( HttpClient.HttpClient, HttpClient.make((request) => Effect.gen(function* () { + if (mockedTransportFailure()) + return yield* Effect.fail( + new HttpClientError.HttpClientError({ + reason: new HttpClientError.TransportError({ + request, + cause: new Error("Connection reset"), + }), + }), + ); const host = new URL(request.url).hostname.replace(/^api\./, ""); const sent = request.body._tag === "Uint8Array" @@ -559,6 +569,7 @@ const checkContextsPage = ( { commit: { statusCheckRollup: { + state: "SUCCESS", contexts: { nodes, pageInfo: { hasNextPage: endCursor !== null, endCursor } }, }, }, @@ -629,6 +640,8 @@ const NODE_ID_QUERY = "PullRequestNodeId"; const nodeIdAnswer = (id: string) => ({ data: { repository: { pullRequest: { id } } } }); afterEach(() => { + mockedTransportFailure.mockReset(); + mockedTransportFailure.mockReturnValue(false); mockedExecute.mockReset(); mockedStackMemberships.mockReset(); mockedCredential.mockReset(); @@ -3117,6 +3130,553 @@ layer("GitHubPullRequestApi.layer", (it) => { }), ); + it.effect("recovers per-check PAT denials adapted from the parent issue", () => + Effect.gen(function* () { + // Sanitized adaptation of [#15229](https://github.com/pingdotgg/t3code/issues/15229): + // the reported list path uses pullRequests; this detail fixture uses pullRequest/commits. + // Partial data and the HTTP envelope are constructed, not a live-recorded response. + const answer = coreResponse({ + body: "Keep the full description", + additions: 42, + labels: { nodes: [{ name: "bug", color: "ff0000" }] }, + commits: { + nodes: [ + { + commit: { + statusCheckRollup: { state: "SUCCESS", contexts: { nodes: [null, null] } }, + }, + }, + ], + }, + }); + mockedExecute.mockReturnValueOnce( + Effect.succeed( + output( + encodeJson({ + ...answer, + errors: [0, 1].map((index) => ({ + type: "FORBIDDEN", + message: "Resource not accessible by personal access token", + path: [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts", + "nodes", + index, + ], + })), + }), + ), + ), + ); + mockedExecute.mockReturnValueOnce( + Effect.succeed( + output( + encodeJson( + coreResponse({ + ...answer.data.repository.pullRequest, + commits: { nodes: [{ commit: { statusCheckRollup: { state: "SUCCESS" } } }] }, + }), + ), + ), + ), + ); + const cli = yield* GitHubPullRequestApi.GitHubPullRequestApi; + const detail = yield* cli.getPullRequestDetail(pullRequestInput); + expect(detail).toMatchObject({ + number: 7, + title: "Pull request 7", + body: "Keep the full description", + additions: 42, + headSha: "abc123", + labels: [{ name: "bug", color: "ff0000" }], + checksState: "passing", + checksUnavailable: expect.stringMatching(/\S/), + checks: [{ name: "Overall check status", status: "success" }], + }); + expect(variablesOf("PullRequestCore").map((v) => v["detailedChecks"])).toEqual([true, false]); + expect(mockedExecute).toHaveBeenCalledTimes(2); + }), + ); + + it.effect.each([ + { aggregate: "SUCCESS", status: "success", checksState: "passing", httpStatus: 200 }, + { aggregate: "SUCCESS", status: "success", checksState: "passing", httpStatus: 403 }, + { aggregate: "FAILURE", status: "failure", checksState: "failing" }, + { aggregate: "PENDING", status: "pending", checksState: "pending" }, + ])( + "preserves full detail when PAT cannot read check contexts: $aggregate", + ({ aggregate, status, checksState, httpStatus = 200 }) => + Effect.gen(function* () { + const refusal = { + type: "FORBIDDEN", + message: "Resource not accessible by personal access token", + path: [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts", + ], + }; + const answer = coreResponse({ + body: "Keep the full description", + additions: 42, + labels: { nodes: [{ name: "bug", color: "ff0000" }] }, + reviewRequests: { + nodes: [{ requestedReviewer: { __typename: "User", login: "reviewer", name: null } }], + }, + commits: { nodes: [{ commit: { statusCheckRollup: { state: aggregate } } }] }, + }); + mockedExecute.mockReturnValueOnce( + Effect.succeed( + output(encodeJson({ data: null, errors: [refusal] }), false, false, {}, httpStatus), + ), + ); + mockedExecute.mockReturnValueOnce(Effect.succeed(output(encodeJson(answer)))); + const cli = yield* GitHubPullRequestApi.GitHubPullRequestApi; + const detail = yield* cli.getPullRequestDetail(pullRequestInput); + expect(detail).toMatchObject({ + number: 7, + title: "Pull request 7", + body: "Keep the full description", + additions: 42, + headSha: "abc123", + headBranch: "feature", + baseBranch: "main", + labels: [{ name: "bug", color: "ff0000" }], + reviewRequestLogins: ["reviewer"], + comparison: { behindBy: 2 }, + checksState, + checksUnavailable: expect.stringMatching(/\S/), + checks: [ + { + name: "Overall check status", + status, + description: expect.stringMatching(/individual checks.*unavailable/i), + url: "https://github.com/acme/web/pull/7/checks", + }, + ], + }); + expect(mockedExecute).toHaveBeenCalledTimes(2); + const retry = mockedExecute.mock.calls[1]?.[0]; + assert.equal(retry?.kind, "graphql"); + if (retry?.kind === "graphql") { + // A skipped field is safe too, but the retry must actually disable detailed contexts. + const contexts = /contexts\s*\([^)]*\)\s*(?:@(include|skip)\s*\(if:\s*\$(\w+)\))?/.exec( + retry.query, + ); + if (contexts !== null) { + expect(contexts[1]).toBeDefined(); + expect(retry.variables?.[contexts[2]!]).toBe(contexts[1] === "skip"); + } + expect(retry.query).toMatch(/statusCheckRollup\s*\{[^}]*\bstate\b/); + } + mockedExecute.mockReturnValueOnce( + Effect.succeed( + output(encodeJson({ data: null, errors: [refusal] }), false, false, {}, httpStatus), + ), + ); + mockedExecute.mockReturnValueOnce(Effect.succeed(output(encodeJson(answer)))); + const provider = yield* GitHubPullRequestProvider.make; + const publicDetail = yield* provider.getChangeRequest(pullRequestInput); + expect(publicDetail).toMatchObject({ + checks: detail.checks, + checksUnavailable: expect.stringMatching(/\S/), + body: detail.body, + }); + }), + ); + + it.effect.each([ + { unrelatedError: false, perNode: false }, + { unrelatedError: true, perNode: false }, + { unrelatedError: false, perNode: true }, + { unrelatedError: true, perNode: true }, + ])( + "handles combined detail denials: unrelated=$unrelatedError perNode=$perNode", + ({ unrelatedError, perNode }) => + Effect.gen(function* () { + mockedExecute.mockReturnValueOnce( + Effect.succeed( + output( + encodeJson({ + data: null, + errors: [ + refusedReviewer, + { + type: "FORBIDDEN", + message: "Resource not accessible by personal access token", + path: [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts", + ...(perNode ? ["nodes", 0] : []), + ], + }, + ...(unrelatedError + ? [{ type: "INTERNAL", message: "Internal server error" }] + : []), + ], + }), + ), + ), + ); + mockedExecute.mockReturnValueOnce( + Effect.succeed( + output( + encodeJson( + coreResponse({ + body: "Preserved after combined refusal", + commits: { nodes: [{ commit: { statusCheckRollup: { state: "SUCCESS" } } }] }, + }), + ), + ), + ), + ); + const cli = yield* GitHubPullRequestApi.GitHubPullRequestApi; + const result = yield* Effect.result(cli.getPullRequestDetail(pullRequestInput)); + if (unrelatedError) { + expect(result._tag).toBe("Failure"); + expect(mockedExecute).toHaveBeenCalledOnce(); + } else { + assert.ok(result._tag === "Success"); + expect(result.success).toMatchObject({ + body: "Preserved after combined refusal", + checksUnavailable: expect.stringMatching(/\S/), + checksState: "passing", + checks: [{ name: "Overall check status", status: "success" }], + }); + expect( + variablesOf("PullRequestCore").map((v) => [ + v["detailedChecks"], + v["requestedReviewers"], + ]), + ).toEqual([ + [true, 100], + [false, 0], + ]); + expect(mockedExecute).toHaveBeenCalledTimes(2); + } + }), + ); + + it.effect.each([ + { reviewerRefused: false, perNode: false }, + { reviewerRefused: true, perNode: false }, + { reviewerRefused: false, perNode: true }, + { reviewerRefused: true, perNode: true }, + ])( + "recovers paginated checks refusal: reviewer=$reviewerRefused perNode=$perNode", + ({ reviewerRefused, perNode }) => + Effect.gen(function* () { + const response = coreResponse({ + commits: { + nodes: [ + { + commit: { + statusCheckRollup: { + state: "FAILURE", + contexts: { nodes: [], pageInfo: { hasNextPage: true } }, + }, + }, + }, + ], + }, + }); + mockedExecute.mockReturnValueOnce(Effect.succeed(output(encodeJson(response)))); + mockedExecute.mockReturnValueOnce( + Effect.succeed( + output( + encodeJson({ + data: null, + errors: [ + { + type: "FORBIDDEN", + message: "Resource not accessible by personal access token", + path: [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts", + ...(perNode ? ["nodes", 1] : []), + ], + }, + ], + }), + ), + ), + ); + if (reviewerRefused) mockedExecute.mockReturnValueOnce(refusedReviewerResponse()); + mockedExecute.mockReturnValueOnce( + Effect.succeed( + output( + encodeJson( + coreResponse({ + body: "Preserved after pagination refusal", + commits: { nodes: [{ commit: { statusCheckRollup: { state: "FAILURE" } } }] }, + }), + ), + ), + ), + ); + const cli = yield* GitHubPullRequestApi.GitHubPullRequestApi; + const detail = yield* cli.getPullRequestDetail(pullRequestInput); + expect(detail).toMatchObject({ + body: "Preserved after pagination refusal", + checksState: "failing", + checksUnavailable: expect.stringMatching(/\S/), + checksTruncated: false, + checks: [{ name: "Overall check status", status: "failure" }], + }); + expect( + variablesOf("PullRequestCore").map((v) => [v["detailedChecks"], v["requestedReviewers"]]), + ).toEqual( + reviewerRefused + ? [ + [true, 100], + [false, 100], + [false, 0], + ] + : [ + [true, 100], + [false, 100], + ], + ); + expect(mockedExecute).toHaveBeenCalledTimes(reviewerRefused ? 4 : 3); + }), + ); + + it.effect.each([ + { name: "generic forbidden", status: 200, message: "Forbidden", type: "FORBIDDEN" }, + { name: "rate limited", status: 200, message: "API rate limit exceeded", type: "RATE_LIMITED" }, + { name: "HTTP forbidden", status: 403, message: "Forbidden", type: "FORBIDDEN" }, + { + name: "HTTP rate limited", + status: 403, + message: "API rate limit exceeded", + type: "RATE_LIMITED", + }, + { name: "server failure", status: 500, message: "Internal server error", type: "INTERNAL" }, + ])("does not degrade unrelated check-context errors: $name", ({ name, status, message, type }) => + Effect.gen(function* () { + mockedExecute.mockReturnValue( + Effect.succeed( + output( + encodeJson({ + data: null, + errors: [ + { + type, + message, + path: [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts", + ], + }, + ], + }), + false, + false, + {}, + status, + ), + ), + ); + const cli = yield* GitHubPullRequestApi.GitHubPullRequestApi; + const result = yield* Effect.result( + cli.getPullRequestDetail({ + ...pullRequestInput, + host: `github.check-${name.replaceAll(" ", "-")}.test`, + }), + ); + expect(result._tag).toBe("Failure"); + expect(mockedExecute).toHaveBeenCalledOnce(); + }), + ); + + it.effect.each([ + { name: "negative index", suffix: ["nodes", -1] }, + { name: "fractional index", suffix: ["nodes", 0.5] }, + { name: "string index", suffix: ["nodes", "0"] }, + { name: "connection field", suffix: ["totalCount"] }, + { name: "node field", suffix: ["nodes", 0, "name"] }, + { name: "other collection", suffix: ["edges", 0] }, + ])("does not degrade a PAT denial at an unrelated path: $name", ({ suffix }) => + Effect.gen(function* () { + mockedExecute.mockReturnValueOnce( + Effect.succeed( + output( + encodeJson({ + data: null, + errors: [ + { + type: "FORBIDDEN", + message: "Resource not accessible by personal access token", + path: [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts", + ...suffix, + ], + }, + ], + }), + ), + ), + ); + const cli = yield* GitHubPullRequestApi.GitHubPullRequestApi; + const result = yield* Effect.result(cli.getPullRequestDetail(pullRequestInput)); + expect(result._tag).toBe("Failure"); + expect(mockedExecute).toHaveBeenCalledOnce(); + }), + ); + + it.effect("keeps GraphQL network errors as failures rather than unavailable checks", () => + Effect.gen(function* () { + mockedTransportFailure.mockReturnValue(true); + const cli = yield* GitHubPullRequestApi.GitHubPullRequestApi; + const result = yield* Effect.result( + cli.getPullRequestDetail({ ...pullRequestInput, host: "github.network-failure.test" }), + ); + expect(result._tag).toBe("Failure"); + expect(mockedTransportFailure).toHaveBeenCalledOnce(); + expect(mockedExecute).not.toHaveBeenCalled(); + }), + ); + + it.effect( + "falls back from conditional REST check-runs PAT refusal to degraded GraphQL detail", + () => + Effect.gen(function* () { + const sha = "a".repeat(40); + const restPaths: string[] = []; + const restHttp = Layer.succeed( + HttpClient.HttpClient, + HttpClient.make((request) => { + restPaths.push(new URL(request.url).pathname); + const isPullRequest = request.url.endsWith("/pulls/7"); + if (!isPullRequest) expect(request.url).toContain("/check-runs?"); + // REST body reported in [#15229](https://github.com/pingdotgg/t3code/issues/15229). + return Effect.succeed( + HttpClientResponse.fromWeb( + request, + new Response( + encodeJson( + isPullRequest + ? { head: { sha, repo: { id: 1 } }, base: { repo: { id: 1 } } } + : { + message: "Resource not accessible by personal access token", + documentation_url: + "https://docs.github.com/rest/checks/runs#list-check-runs-for-a-git-reference", + status: "403", + }, + ), + { + status: isPullRequest ? 200 : 403, + headers: { "content-type": "application/json" }, + }, + ), + ), + ); + }), + ); + mockedExecute.mockImplementation((call) => { + expect(call.kind).toBe("graphql"); + const reads = mockedExecute.mock.calls.filter(([c]) => c.kind === "graphql").length; + return Effect.succeed( + output( + encodeJson( + reads === 1 + ? { + data: null, + errors: [ + { + type: "FORBIDDEN", + message: "Resource not accessible by personal access token", + path: [ + "repository", + "pullRequest", + "commits", + "nodes", + 0, + "commit", + "statusCheckRollup", + "contexts", + ], + }, + ], + } + : coreResponse({ + headRefOid: sha, + commits: { nodes: [{ commit: { statusCheckRollup: { state: "SUCCESS" } } }] }, + }), + ), + ), + ); + }); + const provider = yield* GitHubPullRequestProvider.make.pipe( + Effect.provide( + GitHubPullRequestApi.layer.pipe( + Layer.provide(GitHubRest.layer.pipe(Layer.provide(restHttp))), + Layer.provide(TestSourceControlHost.layer()), + Layer.provide(NodeServices.layer), + Layer.fresh, + ), + ), + ); + assert.ok(provider.getChangeRequestChecks); + const checks = yield* provider.getChangeRequestChecks(pullRequestInput).pipe( + Effect.provideService(GitHubRequestPolicy.PinnedGitHubCredential, { + host: "github.com", + token: Redacted.make("token"), + credentialFingerprint: "conditional-pat-refusal", + }), + ); + expect(checks.checks).toEqual([ + { + name: "Overall check status", + status: "success", + description: expect.stringMatching(/individual checks.*unavailable/i), + url: "https://github.com/acme/web/pull/7/checks", + }, + ]); + expect(restPaths).toEqual([ + "/repos/acme/web/pulls/7", + `/repos/acme/web/commits/${sha}/check-runs`, + ]); + expect(mockedExecute.mock.calls.filter(([c]) => c.kind === "graphql")).toHaveLength(2); + }), + ); + it.effect("decodes reviewers, labels and workflow checks without another detail read", () => Effect.gen(function* () { mockedExecute.mockReturnValueOnce( @@ -3145,6 +3705,7 @@ layer("GitHubPullRequestApi.layer", (it) => { { commit: { statusCheckRollup: { + state: "SUCCESS", contexts: { nodes: [ checkRun({ @@ -3211,6 +3772,7 @@ layer("GitHubPullRequestApi.layer", (it) => { { commit: { statusCheckRollup: { + state: "FAILURE", contexts: { nodes: [ checkRun({ @@ -3281,6 +3843,7 @@ layer("GitHubPullRequestApi.layer", (it) => { { commit: { statusCheckRollup: { + state: "SUCCESS", contexts: { nodes: [], pageInfo: { hasNextPage: true }, diff --git a/packages/source-control-github/src/server/GitHubPullRequestApi.ts b/packages/source-control-github/src/server/GitHubPullRequestApi.ts index c25699714d147..cd1d1c17c4a1b 100644 --- a/packages/source-control-github/src/server/GitHubPullRequestApi.ts +++ b/packages/source-control-github/src/server/GitHubPullRequestApi.ts @@ -321,22 +321,65 @@ const isGraphQlClientError = (error: unknown): error is GraphQLClientError.Graph const { isNotFoundOnly } = GitHubGraphQlClient; +type GraphQlResponseError = Extract< + GraphQLClientError.GraphQLClientError["reason"], + { readonly _tag: "ResponseError" } +>["errors"][number]; + +const isRefusedRequestedReviewer = ({ path, type }: GraphQlResponseError) => + type === "FORBIDDEN" && + path?.length === 6 && + path[0] === "repository" && + path[1] === "pullRequest" && + path[2] === "reviewRequests" && + path[3] === "nodes" && + typeof path[4] === "number" && + Number.isInteger(path[4]) && + path[4] >= 0 && + path[5] === "requestedReviewer"; + +const isRefusedCheckContext = ({ path, type, message }: GraphQlResponseError) => + type === "FORBIDDEN" && + (message === "Resource not accessible by personal access token" || + message === "Resource not accessible by integration") && + (path?.length === 8 || + (path?.length === 10 && + path[8] === "nodes" && + typeof path[9] === "number" && + Number.isInteger(path[9]) && + path[9] >= 0)) && + path[0] === "repository" && + path[1] === "pullRequest" && + path[2] === "commits" && + path[3] === "nodes" && + typeof path[4] === "number" && + Number.isInteger(path[4]) && + path[4] >= 0 && + path[5] === "commit" && + path[6] === "statusCheckRollup" && + path[7] === "contexts"; + const isRefusedRequestedReviewersOnly = (error: unknown): boolean => isGraphQlClientError(error) && error.reason._tag === "ResponseError" && error.reason.status === 200 && + error.reason.errors.every(isRefusedRequestedReviewer); + +const isRefusedCheckContextsOnly = (error: unknown): boolean => + isGraphQlClientError(error) && + error.reason._tag === "ResponseError" && + (error.reason.status === 200 || error.reason.status === 403) && + error.reason.errors.length > 0 && + error.reason.errors.every(isRefusedCheckContext); + +const isRefusedDetailFieldsOnly = (error: unknown): boolean => + isGraphQlClientError(error) && + error.reason._tag === "ResponseError" && + error.reason.status === 200 && + error.reason.errors.some(isRefusedRequestedReviewer) && + error.reason.errors.some(isRefusedCheckContext) && error.reason.errors.every( - ({ path, type }) => - type === "FORBIDDEN" && - path?.length === 6 && - path[0] === "repository" && - path[1] === "pullRequest" && - path[2] === "reviewRequests" && - path[3] === "nodes" && - typeof path[4] === "number" && - Number.isInteger(path[4]) && - path[4] >= 0 && - path[5] === "requestedReviewer", + (error) => isRefusedRequestedReviewer(error) || isRefusedCheckContext(error), ); /** A large pull request can produce a multi-megabyte patch; past this it is truncated. */ @@ -1385,10 +1428,9 @@ export const make = Effect.gen(function* () { */ const readAllCheckContexts = Effect.fn("GitHubPullRequestApi.readAllCheckContexts")(function* ( input: Parameters[0], - allowReserve: boolean, ) { const { owner, name } = parseRepositorySelector(input.repository); - const target = { ...input, operation: "getPullRequestDetail", allowReserve }; + const target = { ...input, operation: "getPullRequestDetail" }; let headSha: string | null = null; const { pages, truncated } = yield* readPages( GraphQLClient.pages(client.PullRequestCheckContexts, { @@ -1422,7 +1464,7 @@ export const make = Effect.gen(function* () { maxPages: CHECK_CONTEXT_PAGES, hasNextPage: (page) => page.nextCursor !== null, }, - ).pipe(graphql(target)); + ); return { headSha: pages[0]?.headSha ?? null, contexts: pages.flatMap((page) => page.contexts), @@ -1433,44 +1475,65 @@ export const make = Effect.gen(function* () { const getPullRequestDetail: GitHubPullRequestApi["Service"]["getPullRequestDetail"] = (input) => { const { owner, name } = parseRepositorySelector(input.repository); const operation = "getPullRequestDetail"; - const read = (requestedReviewers: number) => - client.PullRequestCore({ - owner, - name, - number: input.number, - headRef: `refs/pull/${input.number}/head`, - required: asksRequired(input.host), - requestedReviewers, - }); + const read = Effect.fn("GitHubPullRequestApi.readDetail")(function* (detailedChecks: boolean) { + const core = yield* client + .PullRequestCore({ + owner, + name, + number: input.number, + headRef: `refs/pull/${input.number}/head`, + required: asksRequired(input.host), + requestedReviewers: 100, + detailedChecks, + }) + .pipe( + Effect.catchIf(isRefusedRequestedReviewersOnly, () => + client.PullRequestCore({ + owner, + name, + number: input.number, + headRef: `refs/pull/${input.number}/head`, + required: asksRequired(input.host), + requestedReviewers: 0, + detailedChecks, + }), + ), + Effect.catchIf(isRefusedDetailFieldsOnly, () => { + detailedChecks = false; + return client.PullRequestCore({ + owner, + name, + number: input.number, + headRef: `refs/pull/${input.number}/head`, + required: asksRequired(input.host), + requestedReviewers: 0, + detailedChecks, + }); + }), + Effect.map((result) => toPullRequestCore(result, detailedChecks)), + Effect.flatMap(found({ ...input, operation })), + ); + if (!core.checksTruncated || !detailedChecks) return core; + // Walk the whole rollup so checks beyond the first page cannot imply success. + const all = yield* readAllCheckContexts(input); + if (all.headSha !== core.headSha) { + return yield* readError( + input.cwd, + operation, + new Error("Pull request head changed while reading checks."), + ); + } + return { + ...core, + ...pullRequestChecksFromContexts(all.contexts), + checksTruncated: all.truncated, + }; + }); return SourceControlRateLimit.Interactive.pipe( Effect.flatMap((allowReserve) => - read(100).pipe( - Effect.catchIf(isRefusedRequestedReviewersOnly, () => read(0)), + read(true).pipe( + Effect.catchIf(isRefusedCheckContextsOnly, () => read(false)), graphql({ ...input, operation, allowReserve }), - Effect.map(toPullRequestCore), - Effect.flatMap(found({ ...input, operation })), - // Past a hundred checks the first page would let the rest imply success, so the whole - // rollup is walked instead. - Effect.filterOrElse( - (core) => !core.checksTruncated, - (core) => - readAllCheckContexts(input, allowReserve).pipe( - Effect.filterOrFail( - (all) => all.headSha === core.headSha, - () => - readError( - input.cwd, - operation, - new Error("Pull request head changed while reading checks."), - ), - ), - Effect.map((all) => ({ - ...core, - ...pullRequestChecksFromContexts(all.contexts), - checksTruncated: all.truncated, - })), - ), - ), ), ), ); diff --git a/packages/source-control-github/src/server/gitHubPullRequestJson.test.ts b/packages/source-control-github/src/server/gitHubPullRequestJson.test.ts index 5a408c98044ba..f26f958d498d8 100644 --- a/packages/source-control-github/src/server/gitHubPullRequestJson.test.ts +++ b/packages/source-control-github/src/server/gitHubPullRequestJson.test.ts @@ -396,6 +396,7 @@ describe("pull request detail decoding", () => { { commit: { statusCheckRollup: { + state: "SUCCESS", contexts: { nodes: rollup, pageInfo: { hasNextPage: false } }, }, }, diff --git a/packages/source-control-github/src/server/gitHubPullRequestJson.ts b/packages/source-control-github/src/server/gitHubPullRequestJson.ts index 318ba41468c3e..7f86afe949bc0 100644 --- a/packages/source-control-github/src/server/gitHubPullRequestJson.ts +++ b/packages/source-control-github/src/server/gitHubPullRequestJson.ts @@ -385,6 +385,7 @@ export interface GitHubPullRequestDetail extends GitHubPullRequestListItem { readonly mergedAt: string | null; readonly closedAt: string | null; readonly checks: ReadonlyArray; + readonly checksUnavailable?: string; readonly autoMergeEnabled?: boolean; readonly autoMergeMethod?: PullRequestMergeMethod; } @@ -1098,7 +1099,10 @@ type CoreRequestedReviewer = NonNullable< >[number]; /** Null for a repository or number that names no pull request the viewer can see. */ -export function toPullRequestCore(result: PullRequestCore.Result): GitHubPullRequestCore | null { +export function toPullRequestCore( + result: PullRequestCore.Result, + detailedChecks = true, +): GitHubPullRequestCore | null { const repository = result.repository; const pr = repository?.pullRequest; if (repository == null || pr == null) return null; @@ -1132,6 +1136,21 @@ export function toPullRequestCore(result: PullRequestCore.Result): GitHubPullReq labels: nodesOf(pr.labels), statusCheckRollup: toCheckContexts(nodesOf(contexts)), }), + ...(!detailedChecks + ? { + checksUnavailable: + "Individual checks are unavailable with the current GitHub credential.", + checksState: rollupChecksState(rollupStates(pr.commits)), + checks: toChecks( + rollupStates(pr.commits).map((check) => ({ + ...check, + context: "Overall check status", + description: "Individual checks are unavailable with the current GitHub credential.", + targetUrl: `${pr.url}/checks`, + })), + ), + } + : {}), headRepositoryNameWithOwner: trimmed(pr.headRepository?.nameWithOwner), viewerAccess: { canWrite: toCanWrite(repository.viewerPermission), diff --git a/packages/source-control-github/src/server/pullRequestReads.graphql b/packages/source-control-github/src/server/pullRequestReads.graphql index 7281af8c898aa..957a897a6e5e9 100644 --- a/packages/source-control-github/src/server/pullRequestReads.graphql +++ b/packages/source-control-github/src/server/pullRequestReads.graphql @@ -59,6 +59,7 @@ query PullRequestCore( $headRef: String! $required: Boolean! $requestedReviewers: Int! + $detailedChecks: Boolean! ) { repository(owner: $owner, name: $name) { mergeCommitAllowed @@ -149,7 +150,8 @@ query PullRequestCore( nodes { commit { statusCheckRollup { - contexts(first: 100) { + state + contexts(first: 100) @include(if: $detailedChecks) { nodes { ...CheckContext } diff --git a/packages/source-control-github/src/server/pullRequestReads.graphql.ts b/packages/source-control-github/src/server/pullRequestReads.graphql.ts index fd0fef547ea9e..9f4518aa8792a 100644 --- a/packages/source-control-github/src/server/pullRequestReads.graphql.ts +++ b/packages/source-control-github/src/server/pullRequestReads.graphql.ts @@ -327,8 +327,10 @@ export interface PullRequestCoreRepositoryPullRequestCommitsNodesCommitStatusChe /** Represents the rollup for both the check runs and status for a commit. */ export const PullRequestCoreRepositoryPullRequestCommitsNodesCommitStatusCheckRollupStatusCheckRollup = Schema.Struct({ + /** The combined status for the commit. */ + state: GraphQL.enumLiterals(Shared.StatusState.literals), /** A list of status contexts and check runs for this commit. */ - contexts: PullRequestCoreRepositoryPullRequestCommitsNodesCommitStatusCheckRollupContextsStatusCheckRollupContextConnection + contexts: Schema.optionalKey(PullRequestCoreRepositoryPullRequestCommitsNodesCommitStatusCheckRollupContextsStatusCheckRollupContextConnection) }) export interface PullRequestCoreRepositoryPullRequestCommitsNodesCommitStatusCheckRollupStatusCheckRollup extends Schema.Struct.Type {} @@ -454,10 +456,11 @@ export const PullRequestCore = GraphQL.query("PullRequestCore", { { name: "number", body: "Int!" }, { name: "headRef", body: "String!" }, { name: "required", body: "Boolean!" }, - { name: "requestedReviewers", body: "Int!" } + { name: "requestedReviewers", body: "Int!" }, + { name: "detailedChecks", body: "Boolean!" } ], selections: [ - { name: "repository", body: ["(owner:$", "owner", " name:$", "name", "){mergeCommitAllowed squashMergeAllowed rebaseMergeAllowed autoMergeAllowed viewerPermission pullRequest(number:$", "number", "){number title url body state isDraft mergeable mergeStateStatus reviewDecision additions deletions changedFiles createdAt updatedAt mergedAt closedAt headRefName baseRefName headRefOid isCrossRepository headRepositoryOwner{__typename login}headRepository{nameWithOwner viewerPermission}headRef{id}author{__typename login avatarUrl...on User{id name}}autoMergeRequest{mergeMethod}viewerCanUpdate viewerDidAuthor viewerCanUpdateBranch baseRef{compare(headRef:$", "headRef", "){behindBy}}reviewRequests(first:$", "requestedReviewers", "){nodes{requestedReviewer{__typename...on User{login name}...on Bot{login}...on Team{slug combinedSlug teamName:name teamAvatarUrl:avatarUrl}}}}labels(first:100){nodes{name color}}commits(last:1){nodes{commit{statusCheckRollup{contexts(first:100){nodes{__typename...", "CheckContext", "}pageInfo{hasNextPage}}}}}}}}"] } + { name: "repository", body: ["(owner:$", "owner", " name:$", "name", "){mergeCommitAllowed squashMergeAllowed rebaseMergeAllowed autoMergeAllowed viewerPermission pullRequest(number:$", "number", "){number title url body state isDraft mergeable mergeStateStatus reviewDecision additions deletions changedFiles createdAt updatedAt mergedAt closedAt headRefName baseRefName headRefOid isCrossRepository headRepositoryOwner{__typename login}headRepository{nameWithOwner viewerPermission}headRef{id}author{__typename login avatarUrl...on User{id name}}autoMergeRequest{mergeMethod}viewerCanUpdate viewerDidAuthor viewerCanUpdateBranch baseRef{compare(headRef:$", "headRef", "){behindBy}}reviewRequests(first:$", "requestedReviewers", "){nodes{requestedReviewer{__typename...on User{login name}...on Bot{login}...on Team{slug combinedSlug teamName:name teamAvatarUrl:avatarUrl}}}}labels(first:100){nodes{name color}}commits(last:1){nodes{commit{statusCheckRollup{state contexts(first:100)@include(if:$", "detailedChecks", "){nodes{__typename...", "CheckContext", "}pageInfo{hasNextPage}}}}}}}}"] } ], fragments: [ { name: "CheckContext", body: ["on StatusCheckRollupContext{__typename...on StatusContext{context state targetUrl createdAt description isRequired(pullRequestNumber:$", "number", ")@include(if:$", "required", ")}...on CheckRun{name status conclusion startedAt completedAt detailsUrl isRequired(pullRequestNumber:$", "number", ")@include(if:$", "required", ")checkSuite{workflowRun{workflow{name}}}}}"] } @@ -469,7 +472,8 @@ export const PullRequestCore = GraphQL.query("PullRequestCore", { number: Shared.Int, headRef: Schema.String, required: Schema.Boolean, - requestedReviewers: Shared.Int + requestedReviewers: Shared.Int, + detailedChecks: Schema.Boolean }, result: Schema.Struct({ /** Lookup a given repository by the owner and repository name. */