I read this as a read-only QA investigation - I’ll execute the requested tests and static checks, compare the v1.5 worktree with v1.4, and report only verified blockers or PASS.


I read this as investigation - FAIL: source is not feature complete.

**Blockers**
- `gateway/platforms/telegram.py:14418`: channel-DM admin commands bypass `_channel_inbox_reserves_ingress`. With real PTB `Message.de_json` (`chat.type="channel"`, direct topic), an unsafe admin `/unknown` dispatched to generic handling.
- `gateway/platforms/telegram.py:11926`: valid customer callback queries are suppressed because the card message is bot-authored, so its `from_user` differs from `direct_messages_topic.user`. Validate `query.from_user` against the topic user instead.
- `gateway/platforms/telegram.py:15157-61`: configured channel DMs build `source.chat_type="channel"`, not the private `"dm"` asserted by `tests/gateway/test_telegram_channel_inbox.py:171`. The test fixture is not PTB-realistic (`:80-107` uses `type="private"`).
- No canonical registry migration exists. The registry address remains a plain exact tuple (`dualcoach/profile/checkin_cli/customer_coaching.py:778-94`); inbox parsing resolves only that exact tuple (`telegram.py:5736-45`). Scheduled outbound works only after an external registry rewrite (`nutrition_coaching.py:21331-68`), so migration is not sufficient end-to-end.
- Forward port is not clean: `nutrition_coaching.py` applies to v1.4; new files apply cleanly; `telegram.py` conflicts in the text-handler hunk. v1.4’s corresponding flow is at `gateway/platforms/telegram.py:14442-95`; resolve manually rather than applying the patch blindly.
- `ty` reports two new test errors at `tests/gateway/test_telegram_channel_inbox.py:174` and `:266`, caused by synthetic `_Message` objects passed to a method typed as PTB `Message`. Replace these with `Message.de_json` fixtures.

**Verified evidence**
- Isolated tests: new inbox `12 passed`; thread fallback `46 passed`; topic mode `44 passed`.
- Actual PTB paths:
  - customer resolves `('42', '-1009000000001', '9007199254740')`;
  - default-off remains generic;
  - admin command generically dispatches (bug);
  - customer callback on a bot-authored card is early-acked/suppressed (bug);
  - scheduled outbound uses `direct_messages_topic_id=9007199254740` with no `message_thread_id`.
- Ruff and compile pass for changed files. New production modules type-check clean; legacy type debt remains (`1019` target diagnostics vs `1049` v1.4).
- Pre-existing failures: target HEAD and current both have 13 `test_telegram_group_gating` failures; the selected nutrition-console test fails `409` on both. v1.4 has 10 pre-existing group-gating failures with its profile path configured.
- Pure LOC: new modules `136/85`, new test `213`; touched host modules remain oversized (`telegram.py` 13,696; `nutrition_coaching.py` 21,142).
- No live/profile/watcher paths changed.