I read this as a focused blocker repair - I’ll inspect the v15 evidence and local typing patterns, apply only surgical patches, then run the requested offline verification gates.


The blocker roots are isolated: dynamic PTB aliases leaked into annotations, callback-query narrowing still retained PTB’s `Any` answer method, one test payload inferred a heterogeneous union, and an OSError path used a generic exception despite an existing integration error. I’m moving to surgical type-safe patches now.


The repairs are applied without behavioral changes. I’m at verification: first rechecking the exact strict-typing locations and formatter/lint contracts, then I’ll execute the offline focused and profile matrices.


All behavioral matrices are green, including the exact v14-backed 198/169/99 suites. I recovered the original v15 gate commands and am now running the same five-file basedpyright/no-excuse filtering and precise formatter intersection logic directly against the repaired worktree, with outputs confined to `/tmp`.


I read this as completed blocker repair - the exact v15 findings are fixed and verified offline.

Repairs:
- Replaced PTB runtime-variable annotations with typed ingress protocols.
- Narrowed callback queries/messages through typed protocols, removing four `Any` diagnostics.
- Typed the JSON payload with `JsonValue` and schema-aware list narrowing.
- Localized `activate_customer` import to its use site.
- Replaced generic `RuntimeError` with `NutritionCoachingIntegrationError`.

Proof:
- Added-line basedpyright blockers: **0**
- Added-line no-excuse blockers: **0**
- `formatter_changed_feature_added_lines=0`
- Ruff lint: clean
- All 16 new files formatted
- Compile: clean
- multi15: **15 passed**
- profile198: **198 passed**
- mixed35x3: **35 passed** each
- PTB6: **6 passed**
- related: **169 passed**
- weekly: **99 passed**
- lifecycle: **10 + 4 passed**
- Diff check: clean

An additional full current-worktree nutrition suite exposed unrelated pre-existing fixture/API drift; the exact requested v15 matrices remain green. No live, service, Telegram, network, git, watcher, or evidence files were modified.