# DualCoach Specification 20 evidence

- Pinned HEAD: `0dc0f228dcec8fa54430882daf72e901d6a89f79`
- Final candidate: 92 manifest paths; digest `fd358d90530eb803c5ad8b5868d83cb378ab15699d24d6eb9d01fc688ff42d80`
- Machine-consumed receipt: [`dualcoach-task-20-gates.json`](dualcoach-task-20-gates.json)

## Task20 review remediation

A new failing-first regression preloaded package-like `telegram`, `telegram.constants`, `telegram.error`, `telegram.ext`, and `telegram.request` modules. It failed for both missing and `None` `telegram.constants.ChatType` (2 failed, 1 valid-fake case passed). `_ensure_telegram_mock()` now preserves a complete installed/fake tree but overwrites an incomplete cached tree, so `ChatType` cannot bypass the shared mock. The final regression passes all three cases.

`test_signal_initiated_shutdown_persists_stopped_terminal_state` now has a docstring matching its existing `gateway_state=stopped` assertion. No production file or runtime behavior changed in this review.

## Final receipts

| Gate | Result |
|---|---:|
| Failing-first cached Telegram tree | 2 failed / 1 passed (expected) |
| Candidate cached-tree regression | 3 passed |
| Candidate Ruff + compileall | pass |
| Candidate golden path | 1 passed |
| Candidate Task 19 exact matrix | 22 passed |
| Task20 repair bundle | 102 passed |
| Shutdown/lifecycle runner | 218 passed / 11 files |
| Focused owning suites + regression | 534 passed / 12 files |
| Full Gateway runner | 8,250 passed / 368 files |
| Scoped review `ty` changed ranges | 0 diagnostics |
| Candidate diff hygiene | pass |

JUnit receipts retained here:

- `dualcoach-task-20-review-failing-first-junit.xml` - 2 failures, SHA-256 `4cbc050aa09ca8a37c480e2f38a2a404f81770d722327801e851cedaf7b8254a`
- `dualcoach-task-20-review-telegram-mock-junit.xml` - 3 passed, SHA-256 `d1e33982422581f7b374969fce4340e07698c9c144be2d33ec5fafa85a9ead69`
- `dualcoach-task-20-regression-repair-junit.xml` - 102 passed, SHA-256 `31c07a69b8b6ba20c75b84a72902105537f83c2a19432597fc7b428e30bbceaf`
- `dualcoach-task-20-golden-junit.xml` - 1 passed, SHA-256 `af19e8e67e7b397c28ce177245eed18405dfc70a7ea9e1523f97b66e12142f0f`
- `dualcoach-task-20-matrix-junit.xml` - 22 passed, SHA-256 `759aa68af3d512a0daeac35a6f88b076ad9b2284a09e1c746f1eb28a418e43f0`

The raw scoped `ty` command retains 23 diagnostics outside this review's changed ranges; no changed-range diagnostic remains. LSP analysis was unavailable because the tool rejected repository paths outside its task workspace root. The candidate raw hashes and normal worktree snapshot were reverified, the test-duration cache was restored, and task scratch was removed.

**Bounded DoneClaim:** the confirmed review findings are remediated and verified. This evidence does not authorize release.
