81d77c280a
Photon forked BasePlatformAdapter._send_with_retry before three fixes landed there: the server's retry_after is honoured over exponential backoff, a long server penalty (> 60s) returns a typed failure instead of sleeping inline (#91969), and an exhausted rate-limited send no longer posts the failure notice inside the flood penalty. The fork got none of them. Photon's two genuine differences are now hooks on the base — `_send_retry_is_final(result)` (structured auth/target refusals are returned as-is, no retry, no plain-text resend) and `_send_plain_fallback(...)` (no Markdown banner, richlink() bypassed) — and the 42-line fork is deleted. Slack's `_retry_after_from_exc` and Discord's `_extract_discord_retry_after` parsed the header by hand and only understood the numeric form; both now call agent.retry_utils.parse_retry_after_seconds (numeric or HTTP-date, either header casing). Discord keeps its `retry_after` attribute path, the `X-RateLimit-Reset-After` fallback and the 1s floor. Behavior change: Photon retries now add up to 1s of jitter to the backoff and honour a server retry_after; Slack/Discord recognise an HTTP-date Retry-After they previously ignored.