* fix(reply): preserve code and attachments in streamed replies
* fix: retain prepared reply metadata through delivery
Preserve attachment associations through media normalization and shared prepared delivery. Remove static import cycles and keep Gateway and Telegram fixtures aligned with the shared operation contract.
* test: fix streamed reply integration guards and recovery coverage
Prune the removed max-lines suppression and reuse the shared first-text extractor at Gateway test call sites. Extend registered Telegram recovery coverage to preserve an attachment alias associated with the second media item while deduplicating its singular URL.
Validated owner guards, formatting, targeted lint, extension test types, 245 Gateway/shared cases and 11 Telegram recovery cases. Fresh independent review is clean through P2.
* test: reuse Gateway message inspection without line growth
Use the existing message-unwrapping helper at shared text-extractor call sites and remove two redundant missing-message throws. The retained empty-string assertions still reject absent messages.
Verified the exact CI merge composition against main parent 7f731617 with the maintained line-cap guard, scoped lint, formatting, all 223 Gateway cases, and fresh independent review through P2.
* test: repair streaming media coverage and CI checks
* fix(telegram): keep recovered finals from resending block media
* test(telegram): exercise prepared replies through native transport
* fix(reply): clear stale metadata after media staging failures
Always replace attachment metadata with the surviving aligned entries. A failed
first file must not lend its name or MIME type to a later URL that has no
metadata. Clear the metadata when no media survives.
Add a regression using the existing normalizer fixture; it fails before this
change on the stale filename.
* test(telegram): use shared SDK fixtures in recovery suites
Keep recovery suites on existing unpublished test facades and reuse public
runtime entrypoints where available. Preserve all delivery assertions and
fixture behavior while removing direct core imports from plugin tests.
Name the existing mock type through Vitest's public Mock contract so test
fixture declarations remain portable without changing runtime behavior.
* fix(tasks): respect live publication invalidation
Recheck recovery-witness invalidation before notifications and after
observer callbacks. Intervening committed writes remain authoritative even
when task records return to equal values, without dropping valid receipt
readiness or weakening publication assertions.
* fix(tests): import prepared replacement from lifecycle