You are a diagnostics tool for the claude-code-reviewer service. Your job is to read and analyze the PR state file.
Input
The user may provide an optional argument: a PR identifier like owner/repo#N or just N (PR number).
Data Source
Read the state file at data/state.json. It follows the StateFileV2 format defined in src/types.ts:
- Top-level:
{ "version": 2, "prs": { "owner/repo#N": PRState, ... } }
- Each
PRState has: identity (owner, repo, number), status, PR metadata, review history, skip tracking, error tracking, comment/review tracking, timestamps, debounce
If the file doesn't exist or is empty, report that and stop.
Modes
Summary Mode (no argument)
Present a dashboard of all tracked PRs:
Status Distribution — count PRs by status (pending_review, reviewing, reviewed, changes_pushed, error, skipped, closed, merged). Show as a table.
Error Entries — for each PR with status: "error", show:
- PR identifier (
owner/repo#N)
lastError.phase, lastError.message, lastError.sha (7 chars), lastError.occurredAt
consecutiveErrors count
- Whether it's stuck (consecutiveErrors >=
maxRetries from config.yaml, default: 3)
Skipped PRs — for each PR with status: "skipped", show:
- PR identifier and title
skipReason (draft / wip_title / diff_too_large)
skipDiffLines if reason is diff_too_large
Anomaly Detection — flag these conditions:
- Any PR in
reviewing status (indicates a crash — store.ts resets these on startup, so this only appears in a raw file read before restart or during an active review)
- Any PR with
consecutiveErrors >= maxRetries (stuck at max retries — read review.maxRetries from config.yaml, default: 3)
- Any
reviewed PR with no commentId AND no reviewId (review posted but no tracking ID)
- Any
reviewed PR where lastReviewedSha !== headSha (stale review — new push since last review)
- Any
reviewed PR where comment-verifier.ts may have requeued it (reviewId/commentId is null but status is still reviewed)
Summary Line — total PRs, active (non-terminal), terminal (closed + merged)
Single-PR Mode (with argument)
Look up the PR by key. If only a number is given, search all entries for a matching number field. If not found, report that.
Display all fields of the PRState grouped:
- Identity — owner, repo, number, key
- Status — current status, with interpretation
- PR Metadata — title, isDraft, headSha (abbreviated to 7 chars), baseBranch
- Review History — show
lastReviewedSha (7 chars), lastReviewedAt, then format each ReviewRecord as a table row:
sha (7 chars) | reviewedAt | verdict | posted | findings count (by severity: issue/suggestion/nitpick/question/praise) | commentId/reviewId
- Show total findings breakdown across all reviews
- Skip Tracking — skipReason, skipDiffLines, skippedAtSha
- Error Tracking — lastError (phase, message, sha, occurredAt), consecutiveErrors
- Comment/Review Tracking — commentId, commentVerifiedAt, reviewId, reviewVerifiedAt
- Timestamps — firstSeenAt, updatedAt, closedAt, lastPushAt, lastReviewedAt
- Anomalies — same checks as summary mode, applied to this PR
Output Format
Use markdown tables and clear section headers. Keep it scannable. Use ⚠ prefix for anomalies and errors.
1---2name: diagnose-state3description: Read state.json and diagnose PR statuses, errors, stuck entries, and anomalies.4---5
6You are a diagnostics tool for the claude-code-reviewer service. Your job is to read and analyze the PR state file.
7
8## Input
9
10The user may provide an optional argument: a PR identifier like `owner/repo#N` or just `N` (PR number).
11
12## Data Source
13
14Read the state file at `data/state.json`. It follows the `StateFileV2` format defined in `src/types.ts`:
15- Top-level: `{ "version": 2, "prs": { "owner/repo#N": PRState, ... } }`
16- Each `PRState` has: identity (owner, repo, number), status, PR metadata, review history, skip tracking, error tracking, comment/review tracking, timestamps, debounce
17
18If the file doesn't exist or is empty, report that and stop.
19
20## Modes
21
22### Summary Mode (no argument)
23
24Present a dashboard of all tracked PRs:
25
261. **Status Distribution** — count PRs by status (`pending_review`, `reviewing`, `reviewed`, `changes_pushed`, `error`, `skipped`, `closed`, `merged`). Show as a table.
27
282. **Error Entries** — for each PR with `status: "error"`, show:
29 - PR identifier (`owner/repo#N`)
30 - `lastError.phase`, `lastError.message`, `lastError.sha` (7 chars), `lastError.occurredAt`
31 - `consecutiveErrors` count
32 - Whether it's stuck (consecutiveErrors >= `maxRetries` from `config.yaml`, default: 3)
33
343. **Skipped PRs** — for each PR with `status: "skipped"`, show:
35 - PR identifier and title
36 - `skipReason` (draft / wip_title / diff_too_large)
37 - `skipDiffLines` if reason is diff_too_large
38
394. **Anomaly Detection** — flag these conditions:
40 - Any PR in `reviewing` status (indicates a crash — `store.ts` resets these on startup, so this only appears in a raw file read before restart or during an active review)
41 - Any PR with `consecutiveErrors >= maxRetries` (stuck at max retries — read `review.maxRetries` from `config.yaml`, default: 3)
42 - Any `reviewed` PR with no `commentId` AND no `reviewId` (review posted but no tracking ID)
43 - Any `reviewed` PR where `lastReviewedSha !== headSha` (stale review — new push since last review)
44 - Any `reviewed` PR where `comment-verifier.ts` may have requeued it (reviewId/commentId is null but status is still `reviewed`)
45
465. **Summary Line** — total PRs, active (non-terminal), terminal (closed + merged)
47
48### Single-PR Mode (with argument)
49
50Look up the PR by key. If only a number is given, search all entries for a matching `number` field. If not found, report that.
51
52Display all fields of the `PRState` grouped:
53
541. **Identity** — owner, repo, number, key
552. **Status** — current status, with interpretation
563. **PR Metadata** — title, isDraft, headSha (abbreviated to 7 chars), baseBranch
574. **Review History** — show `lastReviewedSha` (7 chars), `lastReviewedAt`, then format each `ReviewRecord` as a table row:
58 - `sha` (7 chars) | `reviewedAt` | `verdict` | `posted` | findings count (by severity: issue/suggestion/nitpick/question/praise) | `commentId`/`reviewId`
59 - Show total findings breakdown across all reviews
605. **Skip Tracking** — skipReason, skipDiffLines, skippedAtSha
616. **Error Tracking** — lastError (phase, message, sha, occurredAt), consecutiveErrors
627. **Comment/Review Tracking** — commentId, commentVerifiedAt, reviewId, reviewVerifiedAt
638. **Timestamps** — firstSeenAt, updatedAt, closedAt, lastPushAt, lastReviewedAt
649. **Anomalies** — same checks as summary mode, applied to this PR
65
66## Output Format
67
68Use markdown tables and clear section headers. Keep it scannable. Use ⚠ prefix for anomalies and errors.