# Synthetic runtime provider-to-watch decision/message transcript

**live Azure DevOps not exercised**. Constructed, sanitized JSON fixtures; no actual live CLI recordings or correlated build-result recordings were provided. All Azure commands launch the PATH stub as real subprocesses. The stub has no network calls or genuine az fallback. The rebuild driver removes ambient provider/Azure credential variables from child environments without recording their values. No server or application database was used.

BEFORE [3cc31ed27c](https://github.com/pingdotgg/t3code/commit/3cc31ed27c8956b36cee35a50509fb7c6869592b); AFTER [e13265440a](https://github.com/pingdotgg/t3code/commit/e13265440a44b51116f9c3427b50c3d0e2c3ca1e).

Both fresh Node processes use identical fixtures and logical times for all 32 detail observations (verified programmatically). Preview reads use the same fixed event schedule but do not evaluate a watch. Extra AFTER-only C2/C3 and decoder assertions are labelled focused assertions.

BEFORE: 73 assertions, 96 stub subprocess calls. AFTER: 140 assertions, 141 stub subprocess calls. Both exit 0.

The raw logs retain complete checks, typed errors, previous/next watch state, changes and formatted text. The separate argv logs retain sequence, event, cwd, exact az arguments, selected JSON fixture and subprocess exit. This transcript proves decisions/messages; it does not prove persisted enqueue, thread state or an agent starting. On provider errors the harness skips evaluation and retains its in-memory watch, matching the source-traced reactor error branch.

## R1 — lifecycle, rerun and duplicates

| Event / logical time | Scenario | BEFORE | AFTER |
| --- | --- | --- | --- |
| 1 / 2026-10-02T12:01:00.000Z | R1-0-running | checks []; no changes/message | Tests (#12): pending; no changes/message |
| 2 / 2026-10-02T12:02:00.000Z | R1-1-rejected | checks []; no changes/message | Tests (#12): failure; checks-failed |
| 3 / 2026-10-02T12:03:00.000Z | R1-2-rejected | checks []; no changes/message | Tests (#12): failure; no changes/message |
| 4 / 2026-10-02T12:04:00.000Z | R1-3-queued | checks []; no changes/message | Tests (#12): pending; no changes/message |
| 5 / 2026-10-02T12:05:00.000Z | R1-4-approved | checks []; no changes/message | Tests (#12): success; checks-passed count=1 required=True |
| 6 / 2026-10-02T12:06:00.000Z | R1-5-approved | checks []; no changes/message | Tests (#12): success; no changes/message |

## R2 — raw pagination and mixed required/advisory gating

| Event / logical time | Scenario | BEFORE | AFTER |
| --- | --- | --- | --- |
| 7 / 2026-10-02T12:07:00.000Z | R2-fail | checks []; no changes/message | Tests (#12): failure, Tests (#13): success, Tests (#14): pending; checks-failed |
| 8 / 2026-10-02T12:08:00.000Z | R2-gate | checks []; no changes/message | Tests (#12): success, Tests (#13): success, Tests (#14): pending; checks-passed count=2 required=True |
| 9 / 2026-10-02T12:09:00.000Z | R2-settled | checks []; no changes/message | Tests (#12): success, Tests (#13): success, Tests (#14): success; checks-passed count=3 required=False |
| 10 / 2026-10-02T12:10:00.000Z | R2-settled | checks []; no changes/message | Tests (#12): success, Tests (#13): success, Tests (#14): success; no changes/message |

## R3 — fail closed and preview isolation

| Event / logical time | Scenario | BEFORE | AFTER |
| --- | --- | --- | --- |
| 11 / 2026-10-02T12:11:00.000Z | R3-prior-failure | checks []; no changes/message | Tests (#12): failure; checks-failed |
| 12 / 2026-10-02T12:12:00.000Z | R3-unreadable-bad-object | checks []; no changes/message | ERROR failed; evaluator not called; no message |
| 13 / 2026-10-02T12:13:00.000Z | R3-unreadable-invalid | checks []; no changes/message | ERROR failed; evaluator not called; no message |
| 14 / 2026-10-02T12:14:00.000Z | R3-unreadable-bad-row | checks []; no changes/message | ERROR failed; evaluator not called; no message |
| 15 / 2026-10-02T12:15:00.000Z | R3-unreadable-overflow | checks []; no changes/message | ERROR failed; evaluator not called; no message |
| 16 / 2026-10-02T12:16:00.000Z | R3-same-failure | checks []; no changes/message | Tests (#12): failure; no changes/message |
| 17 / 2026-10-02T12:17:00.000Z | R3-rerun | checks []; no changes/message | Tests (#12): pending; no changes/message |
| 18 / 2026-10-02T12:18:00.000Z | R3-new-failure | checks []; no changes/message | Tests (#12): failure; checks-failed |
| 19 / 2026-10-02T12:19:00.000Z | R3-command-denied | checks []; no changes/message | ERROR failed; evaluator not called; no message |
| 20 / 2026-10-02T12:20:00.000Z | R3-command-auth | checks []; no changes/message | ERROR unauthenticated; evaluator not called; no message |
| 21 / 2026-10-02T12:21:00.000Z | R3-command-rate | checks []; no changes/message | ERROR failed; evaluator not called; no message |
| 22 / 2026-10-02T12:22:00.000Z | R3-command-notfound | checks []; no changes/message | ERROR not-found; evaluator not called; no message |
| 24 / 2026-10-02T12:24:00.000Z | R3-full-detail-denied | checks []; no changes/message | ERROR failed; evaluator not called; no message |

Preview subphase (fresh calls, same denied-policy fixture):

BEFORE: optional preview reader False; returned preview {"number": 42, "title": "Add the page", "url": "https://dev.azure.com/acme/platform/_git/web/pullrequest/42", "author": null, "state": "open", "isDraft": false, "createdAt": "2026-07-01T00:00:00Z"}; subprocess resources: az repos pr show --detect true --id 42 --only-show-errors --output json, az devops invoke --detect true --area git --resource pullRequestIterations --api-version 7.1 --route-parameters project=platform repositoryId=web pullRequestId=42 --only-show-errors --output json, az devops invoke --detect true --area git --resource pullRequestIterationChanges --api-version 7.1 --route-parameters project=platform repositoryId=web pullRequestId=42 iterationId=1 --query-parameters $top=2000 $skip=0 --only-show-errors --output json.

AFTER: optional preview reader True; returned preview {"number": 42, "title": "Add the page", "url": "https://dev.azure.com/acme/platform/_git/web/pullrequest/42", "author": null, "state": "open", "isDraft": false, "createdAt": "2026-07-01T00:00:00Z"}; subprocess resources: az repos pr show --detect true --id 42 --only-show-errors --output json.


## R4 — latest head and empty checks

| Event / logical time | Scenario | BEFORE | AFTER |
| --- | --- | --- | --- |
| 26 / 2026-10-02T12:00:00.000Z | R4-A-pass | checks []; no changes/message | Tests (#12): success; checks-passed count=1 required=True |
| 27 / 2026-10-02T12:01:00.000Z | R4-new-head-pending | checks []; no changes/message | Tests (#12): pending; no changes/message |
| 28 / 2026-10-02T12:02:00.000Z | R4-C-pass | checks []; no changes/message | Tests (#12): success; checks-passed count=1 required=True |
| 29 / 2026-10-02T12:18:00.000Z | R4-empty-plus16min | checks []; no changes/message | checks []; no changes/message |
| 30 / 2026-10-02T12:19:00.000Z | R4-filtered-plus16min | checks []; no changes/message | checks []; no changes/message |
| 31 / 2026-10-02T12:16:00.000Z | R4-never-checks-plus16min | checks []; no changes/message | checks []; no changes/message |

## Formatted message examples

### R1-1-rejected

```text
Update on pull request #42 (https://dev.azure.com/acme/platform/_git/web/pullrequest/42), which T3 Code is watching for you:
- Checks failed on aaaaaaa:
  - Tests (#12)

Look 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.
```

### R1-4-approved

```text
Update on pull request #42 (https://dev.azure.com/acme/platform/_git/web/pullrequest/42), which T3 Code is watching for you:
- All 1 required check passed on aaaaaaa.

Look 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.
```

### R2-gate

```text
Update on pull request #42 (https://dev.azure.com/acme/platform/_git/web/pullrequest/42), which T3 Code is watching for you:
- All 2 required checks passed on aaaaaaa.

Look 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.
```

### R2-settled

```text
Update on pull request #42 (https://dev.azure.com/acme/platform/_git/web/pullrequest/42), which T3 Code is watching for you:
- All 3 checks passed on aaaaaaa.

Look 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.
```

### R4-C-pass

```text
Update on pull request #42 (https://dev.azure.com/acme/platform/_git/web/pullrequest/42), which T3 Code is watching for you:
- All 1 required check passed on ccccccc.

Look 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.
```

## Focused boundary assertions and limits

AFTER runtime log includes direct decoder D1–D4 assertions; C2 real-subprocess empty/99/exact-100/999/1000 pagination; C3 actual 1,000,000-byte collector truncation even with a valid collected JSON prefix; C4 real missing executable and generic/auth/not-found failures. P1 argv ordering is asserted. P2 no-iterations/iteration-error/location-null detail reads retain checks. W3 error recovery and genuine rerun are in R3; W5 unseen checks at logical +16 minutes is in R4.

Rate-limit caveat: the approved TestSourceControlHost.layerWithRealGit helper deliberately omits generic process failure classification. Synthetic 429 stderr therefore yields `failed` in this replay, not `rate-limited`. The unchanged seven-test AzureDevOpsCli suite passes its explicit `failureKind: rate-limited` preservation assertion; provider mapping and reactor pause-before-readFailures are source-traced separately. Production host rate classification and reactor scheduling/persistence were not runtime-tested here.

The baseline broad port of the two AFTER test files failed four tests: the three intended new tests plus a changed preexisting latest-head queue fixture whose extra policy response misaligns the BEFORE request sequence. The isolated new-test filter removes that fixture mismatch: exactly three failures on BEFORE, exactly three passes on AFTER. The absent optional preview reader fails with TypeError on BEFORE; the paired runtime uses the service fallback and shows BEFORE preview still succeeds.
