# Server PR-watch evidence: issue 23712

Comparison: [7b0e72e1a2](https://github.com/pingdotgg/t3code/commit/7b0e72e1a2761128320a9e2df82125d424ca3aff) vs [23bd753806](https://github.com/pingdotgg/t3code/commit/23bd753806). Workspace: /home/ubuntu/wt/issue-23712.

Result: baseline emits the early required-check pass, then misses the all-checks pass. Fixed emits both and emits nothing on the supplied repeated final read after restart. All rows use head c07e70680d2c1f678b48a79ea6a9b3f47fb73fd8 and unchanged check names required/remaining.

Exact source JSONL rows (1-based; not reconstructed evaluator calls):

## Baseline early — issue-23712-baseline.jsonl line 1
```json
{"at": 1792715281943, "head": "c07e70680d2c1f678b48a79ea6a9b3f47fb73fd8", "checks": [{"name": "required", "status": "success", "required": true, "description": null, "url": null}, {"name": "remaining", "status": "pending", "required": false, "description": null, "url": null}], "before": {"startedAt": "2026-10-23T00:27:59.386Z", "headSha": null, "failedChecks": [], "passed": false, "passedChecks": [], "remarksThrough": "2026-10-23T00:27:59.386Z", "remarkIds": [], "conflicting": false, "wakes": 0}, "changes": [{"kind": "checks-passed", "count": 1, "required": true}], "next": {"startedAt": "2026-10-23T00:27:59.386Z", "headSha": "c07e70680d2c1f678b48a79ea6a9b3f47fb73fd8", "failedChecks": [], "passed": true, "passedChecks": ["required"], "remarksThrough": "2026-10-23T00:27:59.386Z", "remarkIds": [], "conflicting": false, "wakes": 0, "checksAwaitedSince": null}}
```

## Baseline final — issue-23712-baseline.jsonl line 4
```json
{"at": 1792715297558, "head": "c07e70680d2c1f678b48a79ea6a9b3f47fb73fd8", "checks": [{"name": "required", "status": "success", "required": true, "description": null, "url": null}, {"name": "remaining", "status": "success", "required": false, "description": null, "url": null}], "before": {"startedAt": "2026-10-23T00:27:59.386Z", "headSha": "c07e70680d2c1f678b48a79ea6a9b3f47fb73fd8", "failedChecks": [], "passed": true, "passedChecks": ["required"], "remarksThrough": "2026-10-23T00:27:59.386Z", "remarkIds": [], "conflicting": false, "wakes": 0, "checksAwaitedSince": null}, "changes": [], "next": {"startedAt": "2026-10-23T00:27:59.386Z", "headSha": "c07e70680d2c1f678b48a79ea6a9b3f47fb73fd8", "failedChecks": [], "passed": true, "passedChecks": ["required"], "remarksThrough": "2026-10-23T00:27:59.386Z", "remarkIds": [], "conflicting": false, "wakes": 0, "checksAwaitedSince": null}}
```

## Fixed early — issue-23712-fixed.jsonl line 1
```json
{"at": 1792715157574, "head": "c07e70680d2c1f678b48a79ea6a9b3f47fb73fd8", "checks": [{"name": "required", "status": "success", "required": true, "description": null, "url": null}, {"name": "remaining", "status": "pending", "required": false, "description": null, "url": null}], "before": {"startedAt": "2026-10-23T00:25:55.470Z", "headSha": null, "failedChecks": [], "passed": false, "passedChecks": [], "remarksThrough": "2026-10-23T00:25:55.470Z", "remarkIds": [], "conflicting": false, "wakes": 0}, "changes": [{"kind": "checks-passed", "count": 1, "required": true}], "next": {"startedAt": "2026-10-23T00:25:55.470Z", "headSha": "c07e70680d2c1f678b48a79ea6a9b3f47fb73fd8", "failedChecks": [], "passed": true, "passedChecks": ["required", "remaining"], "remarksThrough": "2026-10-23T00:25:55.470Z", "remarkIds": [], "conflicting": false, "wakes": 0, "checksAwaitedSince": null}}
```

## Fixed final — issue-23712-fixed.jsonl line 4
```json
{"at": 1792715189740, "head": "c07e70680d2c1f678b48a79ea6a9b3f47fb73fd8", "checks": [{"name": "required", "status": "success", "required": true, "description": null, "url": null}, {"name": "remaining", "status": "success", "required": false, "description": null, "url": null}], "before": {"startedAt": "2026-10-23T00:25:55.470Z", "headSha": "c07e70680d2c1f678b48a79ea6a9b3f47fb73fd8", "failedChecks": [], "passed": true, "passedChecks": ["required", "remaining"], "remarksThrough": "2026-10-23T00:25:55.470Z", "remarkIds": [], "conflicting": false, "wakes": 0, "checksAwaitedSince": null}, "changes": [{"kind": "checks-passed", "count": 2, "required": false}], "next": {"startedAt": "2026-10-23T00:25:55.470Z", "headSha": "c07e70680d2c1f678b48a79ea6a9b3f47fb73fd8", "failedChecks": [], "passed": true, "passedChecks": ["required"], "remarksThrough": "2026-10-23T00:25:55.470Z", "remarkIds": [], "conflicting": false, "wakes": 0, "checksAwaitedSince": null}}
```

## Fixed repeated final after restart — issue-23712-fixed.jsonl line 5
```json
{"at": 1792715244955, "head": "c07e70680d2c1f678b48a79ea6a9b3f47fb73fd8", "checks": [{"name": "required", "status": "success", "required": true, "description": null, "url": null}, {"name": "remaining", "status": "success", "required": false, "description": null, "url": null}], "before": {"startedAt": "2026-10-23T00:25:55.470Z", "headSha": "c07e70680d2c1f678b48a79ea6a9b3f47fb73fd8", "failedChecks": [], "passed": true, "passedChecks": ["required"], "remarksThrough": "2026-10-23T00:25:55.470Z", "remarkIds": [], "conflicting": false, "wakes": 0, "checksAwaitedSince": null}, "changes": [], "next": {"startedAt": "2026-10-23T00:25:55.470Z", "headSha": "c07e70680d2c1f678b48a79ea6a9b3f47fb73fd8", "failedChecks": [], "passed": true, "passedChecks": ["required"], "remarksThrough": "2026-10-23T00:25:55.470Z", "remarkIds": [], "conflicting": false, "wakes": 0, "checksAwaitedSince": null}}
```

## Persisted delivery
Exact check-notification text and timestamps below; the system restart-continuation notification is excluded from the check count but retained in the JSON evidence.

```json
{"id": "message:pr-watch:b67cad79-074b-46c9-9e0b-69590de8393f", "threadId": "triage-23712-baseline", "createdAt": "2026-10-23T00:28:03.844Z", "text": "Update on pull request #23901 (https://github.com/pingdotgg/t3code/pull/23901), which T3 Code is watching for you:\n- All 1 required check passed on c07e706.\n\nLook into each item and act on it as your task requires. T3 Code keeps watching and wakes you on the next change, so end your turn when you are done. When you hand the work back to the user, call unwatch_pull_request first so the thread returns to their inbox."}
```

```json
{"id": "message:pr-watch:b5e6c19a-7bda-42e8-b528-76b30b1f8c04", "threadId": "triage-23712-fixture", "createdAt": "2026-10-23T00:25:59.350Z", "text": "Update on pull request #23901 (https://github.com/pingdotgg/t3code/pull/23901), which T3 Code is watching for you:\n- All 1 required check passed on c07e706.\n\nLook into each item and act on it as your task requires. T3 Code keeps watching and wakes you on the next change, so end your turn when you are done. When you hand the work back to the user, call unwatch_pull_request first so the thread returns to their inbox."}
```

```json
{"id": "message:pr-watch:c9b067d3-920b-438c-909e-a2d9e957a43d", "threadId": "triage-23712-fixture", "createdAt": "2026-10-23T00:26:31.899Z", "text": "Update on pull request #23901 (https://github.com/pingdotgg/t3code/pull/23901), which T3 Code is watching for you:\n- All 2 checks passed on c07e706.\n\nLook into each item and act on it as your task requires. T3 Code keeps watching and wakes you on the next change, so end your turn when you are done. When you hand the work back to the user, call unwatch_pull_request first so the thread returns to their inbox."}
```

## Instrumentation and reproduction
The lead reports a real `vp run dev` session on Linux fs31 with isolated worktree `.t3` state and the collaborative Browser. This transcript was assembled from the supplied capture files; this evidence step did not launch a server/browser or change the repository or forge.

To reproduce the controlled runtime experiment in a disposable isolated checkout:

1. Keep live metadata reads from [#23901](https://github.com/pingdotgg/t3code/pull/23901) read-only. In PullRequestService.ts temporarily force both mapped PR state fields to `"open"`; replace the detail result’s `checks: changeRequest.checks` with `JSON.parse(readFileSync("/tmp/issue-23712-checks.json", "utf8"))` and import readFileSync from node:fs. Other metadata, including the head, still comes from the real PR.
2. Set that temporary JSON file to the two checks shown in the early rows: required/success/required:true and remaining/pending/required:false, each with description:null and url:null. Later change only remaining.status to success, retaining names and head.
3. In PullRequestWatchReactor.ts temporarily set SWEEP_MINUTES from 2 to 0.05 (3 seconds), import appendFileSync from node:fs, and immediately after evaluatePullRequestWatch append JSON.stringify({at:now,head:detail.headSha,checks:detail.checks,before:target.watch,changes:report.changes,next:report.next}) plus a newline to a temporary JSONL log. This captures actual reactor evaluations, not manually invoked evaluator output.
4. Run `vp run dev` with isolated worktree `.t3` state. Start a fresh watched thread for each comparison. For baseline use the evaluator from baseline commit 23bd753806 unchanged; for fixed use the committed evaluator from 7b0e72e1a2. Keep service fixture and reactor instrumentation equivalent. Observe early evaluation, change the file to final success, observe final evaluation and persisted delivered notifications. For fixed, restart against the same isolated state and observe the repeated final read. Do not reset the watch between early/final/restart. Stop only processes started for the experiment.
5. Collect JSONL and persisted notifications read-only. Expected sequence: baseline changes count1 required:true → []; fixed count1 required:true → count2 required:false → []. Expected delivered check notifications: baseline one; fixed two. No live forge checks need alteration.

Limitations: this is a real server/reactor/persistence/delivery run with substituted check data and forced-open state. It does not reproduce live CI timing, host check discovery, normal two-minute sweep latency, or uninstrumented production operation. The runtime captures happened fixed-first, then baseline (see timestamps); labels indicate evaluator version, not chronological execution order. Restart attribution comes from the lead’s supplied capture description; JSONL itself contains no process identifier. No visible surface changed; proof-auditor matrix was empty, so screenshots/recordings are not required. No fixture seeding script is needed in the PR for this server-only transcript; any committed visual-fixture seeding script is outside this evidence scope.

FRICTION: No red-test execution log was supplied or found among /tmp/issue-23712* inputs, so this artifact does not claim a captured red test or a fresh test run. The focused regression is `wakes again when the other checks finish after the required ones passed` in apps/server/src/orchestration-v2/pullRequestWatch.test.ts; the runtime baseline final row supplies direct failing-behavior evidence. Reproducing test red/green would require separately running that regression against each evaluator. No repository edits, commits, forge comments, server launches, or browser actions were performed in this evidence step.

Input SHA-256 (raw originals):
- issue-23712-baseline.jsonl: 74bd124a41c19f6ae4794e55bfff285e430fdb1705c2dffc6f818aca35797c10
- issue-23712-fixed.jsonl: 34e60d4926b08f609a580efef6e0cc2f69747d35190dae3925b65caa0ac59044
- issue-23712-notifications.json: 26e2c4df5cd6b5635b3cb8a3047a2b0ba924a2ee056cfdb73cb4a1acd965d802
