# TASK 45 — TEST-tab chat fix #2: insert body must declare `snippet.type` > Catalog: [`TASKS.md`](../TASKS.md). Status: ✅ **SHIPPED 2026-09-25** — the live > "YouTube rejected the message (error 400)" report from the creator's Test Stream run > after TASK 44 shipped. ## Provenance - **2026-09-25, creator run:** TASK 44's liveChatId fix worked — the drawer opened with a resolved liveChatId and Mock Chat Input became enabled — but every send was rejected: `YouTube rejected the message (error 400)`. The runtime log (`%APPDATA%\ytLlive\startup.log`) captured the body: `400 MISSING_REQUIRED_FIELD`, `domain: youtube.api.v3.LiveChatMessageInsertResponse.Error`. - **Diagnosis:** the official `liveChatMessages.insert` reference lists three **required** snippet properties: `liveChatId`, **`type`** (`textMessageEvent` or `pollEvent`), and `textMessageDetails.messageText` (if text). The TASK 41 body sent only `liveChatId` + `textMessageDetails`, omitting `type`. The TASK 41 Good Dog test asserted the body contained `liveChatId` + `messageText` — but never `type` — so it stayed **false-green** while real YouTube rejected every insert. ## What shipped - `Services/YouTubeStreamService.cs` — `InsertChatMessageAsync`: the POST body now includes **`type = "textMessageEvent"`** in the snippet. - `ytLive.Tests/TestStreamTests.cs` — the TASK 41 test's POST-body assertion now also asserts `"type":"textMessageEvent"` is present (the false-green fixed at its source: assertion = WHAT WE SEND must mirror YouTube's required fields). - Docs: `ai.md` (Test Stream section), `TASKS.md` (row 45), `HANDOFF.md` rewritten, `MyMistakes.md` recipe added. ## Validation (Good Dog: ONE integration test) The strengthened `TestStream_DockTooling_And_ThreeWayDrawerExclusivity` — the existing TASK 41 insert-to-HTTP assertion now fails if `type` is ever dropped again. **Gate: clean build 0 warnings; full vstest passed (count recorded in HANDOFF).** ## Reference - https://developers.google.com/youtube/v3/live/docs/liveChatMessages/insert (required props include `snippet.type`; `textMessageEvent` or `pollEvent`)