# PR #22987 runtime evidence: `pullRequests.detail` check-rollup fallback

**Environment:** Node v26.12.1 (repo toolchain via vite-plus, process.execPath of driver and server), Linux 6.1.102 x64, host fs-11. Before = `8d3b061121` (merge-base with origin/main; touched src files swapped in place, list in swapped-files.txt), After = `6a346ccad1` (PR head). **All forge responses are STUBBED**: an HTTPS stub for GitHub Enterprise host `github.localtest.me` on [::1]:443 inside an unprivileged user+net namespace (`unshare -rnm`), self-signed cert trusted via NODE_EXTRA_CA_CERTS. Real server `apps/server/src/bin.ts start` with isolated T3CODE_HOME under /tmp/ev-22987/<label>/home; client = effect RpcClient over the authenticated WebSocket calling `pullRequests.detail({projectId, repository:"acme/web", number})`. Credential: GH_HOST=github.localtest.me, GH_ENTERPRISE_TOKEN=stub-token. Captured 2026-10-22T11:13:44.522Z.

Driver: `apps/server/scripts/evidence/pr-22987/driver.ts` (fixtures.json beside it). Same driver, same fixtures for both runs.

## Summary

| Row | Case | Before | After |
|---|---|---|---|
| F1 | readable checks | detail (2 checks) (1 req) | detail (2 checks) (1 req) |
| F2 | contexts refused, HTTP 200, PAT message, path length 8 | error: GitHub returned an error: Resource not accessible by personal access token (1 req) | degraded detail (2 req) |
| F2b | as F2 with rollup FAILURE | error: GitHub returned an error: Resource not accessible by personal access token (1 req) | degraded detail (2 req) |
| F3 | contexts refused, HTTP 403, integration message | error: GitHub returned an error: Resource not accessible by integration (1 req) | degraded detail (2 req) |
| F3b | per-node refusal, path length 10, partial data | error: GitHub returned an error: Resource not accessible by personal access token; Resource not accessible by personal access token (1 req) | degraded detail (2 req) |
| F4 | reviewers and contexts refused together (200) | error: GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token (1 req) | degraded detail (2 req) |
| F4b | reviewers refused only (regression guard) | detail (2 checks) (2 req) | detail (2 checks) (2 req) |
| F4c | reviewers and contexts refused at HTTP 403 (stays an error) | error: GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token (1 req) | error: GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token (1 req) |
| F5a | unrelated: generic Forbidden message at contexts | error: GitHub returned an error: Forbidden (1 req) | error: GitHub returned an error: Forbidden (1 req) |
| F5b | unrelated: HTTP 500 INTERNAL | error: GitHub returned an error: Something went wrong (1 req) | error: GitHub returned an error: Something went wrong (1 req) |
| F5c | unrelated: PAT message at contexts.totalCount (bad path) | error: GitHub returned an error: Resource not accessible by personal access token (1 req) | error: GitHub returned an error: Resource not accessible by personal access token (1 req) |
| F5d | unrelated: contexts refusal plus an INTERNAL error | error: GitHub returned an error: Resource not accessible by personal access token; Something went wrong (1 req) | error: GitHub returned an error: Resource not accessible by personal access token; Something went wrong (1 req) |
| F5t | transport failure (socket destroyed) | error: Could not reach GitHub at github.localtest.me. (1 req) | error: Could not reach GitHub at github.localtest.me. (1 req) |
| F6 | more than 100 checks, walked | detail (105 checks) (3 req) | detail (105 checks) (3 req) |
| F6b | walk refused mid-pagination | error: GitHub returned an error: Resource not accessible by personal access token (2 req) | degraded detail (3 req) |
| F7 | head changed during the walk | error: GitHub returned an unreadable getPullRequestDetail response. (2 req) | error: GitHub returned an unreadable getPullRequestDetail response. (2 req) |
| F8 | not found | error: GitHub could not find the requested resource, or the credential cannot see it. (1 req) | error: GitHub could not find the requested resource, or the credential cannot see it. (1 req) |

## F1 (#101): readable checks

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 200 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 200 |
| Client receives | detail (2 checks) | detail (2 checks) |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "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"
    }
  ],
  "reviewers": [
    "reviewer"
  ],
  "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "labels": [
    "bug"
  ],
  "additions": 10,
  "mergeability": "mergeable"
}
```
After:
```json
{
  "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"
    }
  ],
  "reviewers": [
    "reviewer"
  ],
  "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "labels": [
    "bug"
  ],
  "additions": 10,
  "mergeability": "mergeable"
}
```
</details>

## F2 (#102): contexts refused, HTTP 200, PAT message, path length 8

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 200 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 200<br>PullRequestCore(detailedChecks=false, requestedReviewers=100) → 200 |
| Client receives | error: GitHub returned an error: Resource not accessible by personal access token | degraded detail |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Resource not accessible by personal access token"
  }
}
```
After:
```json
{
  "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.",
  "reviewers": [
    "reviewer"
  ],
  "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "labels": [
    "bug"
  ],
  "additions": 10,
  "mergeability": "mergeable"
}
```
</details>

## F2b (#112): as F2 with rollup FAILURE

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 200 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 200<br>PullRequestCore(detailedChecks=false, requestedReviewers=100) → 200 |
| Client receives | error: GitHub returned an error: Resource not accessible by personal access token | degraded detail |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Resource not accessible by personal access token"
  }
}
```
After:
```json
{
  "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.",
  "reviewers": [
    "reviewer"
  ],
  "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "labels": [
    "bug"
  ],
  "additions": 10,
  "mergeability": "mergeable"
}
```
</details>

## F3 (#103): contexts refused, HTTP 403, integration message

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 403 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 403<br>PullRequestCore(detailedChecks=false, requestedReviewers=100) → 200 |
| Client receives | error: GitHub returned an error: Resource not accessible by integration | degraded detail |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Resource not accessible by integration"
  }
}
```
After:
```json
{
  "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.",
  "reviewers": [
    "reviewer"
  ],
  "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "labels": [
    "bug"
  ],
  "additions": 10,
  "mergeability": "mergeable"
}
```
</details>

## F3b (#113): per-node refusal, path length 10, partial data

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 200 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 200<br>PullRequestCore(detailedChecks=false, requestedReviewers=100) → 200 |
| Client receives | error: GitHub returned an error: Resource not accessible by personal access token; Resource not accessible by personal access token | degraded detail |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Resource not accessible by personal access token; Resource not accessible by personal access token"
  }
}
```
After:
```json
{
  "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.",
  "reviewers": [
    "reviewer"
  ],
  "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "labels": [
    "bug"
  ],
  "additions": 10,
  "mergeability": "mergeable"
}
```
</details>

## F4 (#104): reviewers and contexts refused together (200)

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 200 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 200<br>PullRequestCore(detailedChecks=false, requestedReviewers=0) → 200 |
| Client receives | error: GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token | degraded detail |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token"
  }
}
```
After:
```json
{
  "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.",
  "reviewers": [],
  "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "labels": [
    "bug"
  ],
  "additions": 10,
  "mergeability": "mergeable"
}
```
</details>

## F4b (#114): reviewers refused only (regression guard)

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 200<br>PullRequestCore(detailedChecks not sent, requestedReviewers=0) → 200 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 200<br>PullRequestCore(detailedChecks=true, requestedReviewers=0) → 200 |
| Client receives | detail (2 checks) | detail (2 checks) |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "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"
    }
  ],
  "reviewers": [],
  "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "labels": [
    "bug"
  ],
  "additions": 10,
  "mergeability": "mergeable"
}
```
After:
```json
{
  "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"
    }
  ],
  "reviewers": [],
  "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "labels": [
    "bug"
  ],
  "additions": 10,
  "mergeability": "mergeable"
}
```
</details>

## F4c (#124): reviewers and contexts refused at HTTP 403 (stays an error)

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 403 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 403 |
| Client receives | error: GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token | error: GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token"
  }
}
```
After:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Resource not accessible by integration; Resource not accessible by personal access token"
  }
}
```
</details>

## F5a (#105): unrelated: generic Forbidden message at contexts

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 200 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 200 |
| Client receives | error: GitHub returned an error: Forbidden | error: GitHub returned an error: Forbidden |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Forbidden"
  }
}
```
After:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Forbidden"
  }
}
```
</details>

## F5b (#115): unrelated: HTTP 500 INTERNAL

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 500 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 500 |
| Client receives | error: GitHub returned an error: Something went wrong | error: GitHub returned an error: Something went wrong |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Something went wrong"
  }
}
```
After:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Something went wrong"
  }
}
```
</details>

## F5c (#125): unrelated: PAT message at contexts.totalCount (bad path)

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 200 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 200 |
| Client receives | error: GitHub returned an error: Resource not accessible by personal access token | error: GitHub returned an error: Resource not accessible by personal access token |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Resource not accessible by personal access token"
  }
}
```
After:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Resource not accessible by personal access token"
  }
}
```
</details>

## F5d (#135): unrelated: contexts refusal plus an INTERNAL error

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 200 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 200 |
| Client receives | error: GitHub returned an error: Resource not accessible by personal access token; Something went wrong | error: GitHub returned an error: Resource not accessible by personal access token; Something went wrong |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Resource not accessible by personal access token; Something went wrong"
  }
}
```
After:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Resource not accessible by personal access token; Something went wrong"
  }
}
```
</details>

## F5t (#145): transport failure (socket destroyed)

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → socket destroyed | PullRequestCore(detailedChecks=true, requestedReviewers=100) → socket destroyed |
| Client receives | error: Could not reach GitHub at github.localtest.me. | error: Could not reach GitHub at github.localtest.me. |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "Could not reach GitHub at github.localtest.me."
  }
}
```
After:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "Could not reach GitHub at github.localtest.me."
  }
}
```
</details>

## F6 (#106): more than 100 checks, walked

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 200<br>PullRequestCheckContexts(after=null) → 200<br>PullRequestCheckContexts(after=c1) → 200 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 200<br>PullRequestCheckContexts(after=null) → 200<br>PullRequestCheckContexts(after=c1) → 200 |
| Client receives | detail (105 checks) | detail (105 checks) |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "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"
    },
    "… 105 total"
  ],
  "reviewers": [
    "reviewer"
  ],
  "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "labels": [
    "bug"
  ],
  "additions": 10,
  "mergeability": "mergeable"
}
```
After:
```json
{
  "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"
    },
    "… 105 total"
  ],
  "reviewers": [
    "reviewer"
  ],
  "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "labels": [
    "bug"
  ],
  "additions": 10,
  "mergeability": "mergeable"
}
```
</details>

## F6b (#116): walk refused mid-pagination

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 200<br>PullRequestCheckContexts(after=null) → 200 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 200<br>PullRequestCheckContexts(after=null) → 200<br>PullRequestCore(detailedChecks=false, requestedReviewers=100) → 200 |
| Client receives | error: GitHub returned an error: Resource not accessible by personal access token | degraded detail |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an error: Resource not accessible by personal access token"
  }
}
```
After:
```json
{
  "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.",
  "reviewers": [
    "reviewer"
  ],
  "headSha": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "labels": [
    "bug"
  ],
  "additions": 10,
  "mergeability": "mergeable"
}
```
</details>

## F7 (#107): head changed during the walk

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 200<br>PullRequestCheckContexts(after=null) → 200 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 200<br>PullRequestCheckContexts(after=null) → 200 |
| Client receives | error: GitHub returned an unreadable getPullRequestDetail response. | error: GitHub returned an unreadable getPullRequestDetail response. |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an unreadable getPullRequestDetail response."
  }
}
```
After:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "detail": "GitHub returned an unreadable getPullRequestDetail response."
  }
}
```
</details>

## F8 (#108): not found

| | Before `8d3b061121` | After `6a346ccad1` |
|---|---|---|
| Stub requests | PullRequestCore(detailedChecks not sent, requestedReviewers=100) → 200 | PullRequestCore(detailedChecks=true, requestedReviewers=100) → 200 |
| Client receives | error: GitHub could not find the requested resource, or the credential cannot see it. | error: GitHub could not find the requested resource, or the credential cannot see it. |

<details><summary>Trimmed PullRequestDetail / error JSON</summary>

Before:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "reason": "not-found",
    "detail": "GitHub could not find the requested resource, or the credential cannot see it."
  }
}
```
After:
```json
{
  "error": {
    "_tag": "PullRequestOperationError",
    "operation": "detail",
    "reason": "not-found",
    "detail": "GitHub could not find the requested resource, or the credential cannot see it."
  }
}
```
</details>

## What else changed

- F1 (detail in both): no field differences outside projectId/workspaceRoot/observedAt
- F4b (detail in both): no field differences outside projectId/workspaceRoot/observedAt
- F4c (error in both): identical error
- F5a (error in both): identical error
- F5b (error in both): identical error
- F5c (error in both): identical error
- F5d (error in both): identical error
- F5t (error in both): identical error
- F6 (detail in both): no field differences outside projectId/workspaceRoot/observedAt
- F7 (error in both): identical error
- F8 (error in both): identical error
- Non-GraphQL stub requests: before ["GET /api/v3/user"], after ["GET /api/v3/user"].
- Total stub requests: before 23, after 29. Extra after-requests are exactly the `detailedChecks:false` retries in F2, F2b, F3, F3b, F4, F6b (F4b's second request exists in both).
- Every after `PullRequestCore` request sends `detailedChecks` (true first); before sends no such variable. The after query text includes `$detailedChecks` and `statusCheckRollup.state`.
- Degraded rows keep the PR's other fields (title, body, labels, additions, headSha, mergeability, reviewers) from the retry answer; F4 drops reviewers because its retry asks `requestedReviewers:0`.
- F7 (head changed mid-walk) surfaces to the client as the generic "unreadable getPullRequestDetail response" in both versions; the head-changed reason is not on the wire and the server log at default level does not mention it either (inferred from code: readError(..., "Pull request head changed while reading checks.") wraps it as GitHubPullRequestReadError).
- `apps/web` does not read `checksUnavailable`; a client only sees the synthetic "Overall check status" row. No web still captured.
- Not captured: rate-limited variants of F5 (would pause the host's SourceControlRateLimit for later rows), F9 REST check-runs path (not reached through `pullRequests.detail`).

## Full wire shape: F2 after (degraded PullRequestDetail as the client decodes it)

```json
{
  "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
}
```
