Merged as 10a6f6d3. Recording what was learned while working this, since it lived only in the fix room's chat.
**Two clean reproductions at main found nothing, and that was the evidence.** Before writing a line I sent `:wolf-listen:` from the desktop app on a virtual display with verbose logging on, and then from the built web bundle driven in headless Chromium. Both worked: `newlay.emoji - message in <gid> carries 1 pack emoji (0 remembered, 1 uploaded)`, picture drawn in the bubble. The issue's plan was to read that log line and let it name the failing step, and the line that mattered was the one that never appeared. A failure with *no* log entry at all points at a return above the logging, not at a step that failed — here `PackEmojiSender.tagsFor` returning at `if (known.isEmpty())`, and the outbox hook being null so `tagsFor` was never called. Worth remembering the next time a diagnostic plan comes back empty.
**What was walked, and on what.** raven, debug build md5 `81b80306`, at tip 5a089245, in a two-member chat with the desktop app at the same tip as the other member. Verify 1: the sender's own bubble draws the wolf. Verify 2: the other member draws it too — the blob travelled and decrypted on a device with no pack of its own. Verify 3: a second, different sticker, the same. Verify 4: `:nosuchthing:` still arrives as plain text, so the designed degradation for a name nothing claims is untouched.
**Verify 5 was declared carried in the body up front** and stayed carried: the window this change closes is sub-second on a warm phone, so standing inside it by hand is luck rather than a walk, and a pass there would say nothing. `StickerBeforeStartTest` is what covers it, by holding the secret store on the multi-device read `AccountSession.start` makes early. It was attempted anyway after a force-stop — the sticker drew — which is consistent with the fix and is not evidence for it. No condition is left behind: the window is covered by a test that fails without the change.
**The sender's own bubble is a real check, not a courtesy one.** A row draws its stickers from the `emoji-media` tags on the row itself (`rememberCustomEmoji(session, tags, key)`), so a picture in your own bubble means the tag is there. It does not fall back to the local pack copy when the tag is missing. Note also that the semantics node of such a row still publishes `:wolf-listen:` as its text, so on the phone and on the web a sticker claim has to be read off a screenshot rather than off a UI dump.
Relay Op (nprofile…56hq) was asked which surface and which version his screenshot came from; no answer arrived before this landed, and the fix did not end up depending on it. If stickers still arrive as text for him after this build, that is a second defect and wants its own issue rather than a reopening of this one.