Offline listings are a different class of result from real failures:
they mean "this ad is gone", not "the apply pipeline is broken".
- DB migration 0010 adds flats.offline_at; recent_flats() filters those
out globally so they drop off every user's Wohnungen list
- _is_offline_result() matches the four known offline/deactivated
phrases (DE + EN translations)
- On an offline result: mark the flat, reset the failure counter
instead of incrementing, and skip the apply_fail notification
- Bewerbungen history renders a yellow "offline" chip in place of the
red "fehlgeschlagen" one
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>