Replace the simple nil-title → "Unknown" logic in printDeal with a
fallbackDealTitle() function that tries multiple fields in priority
order before giving up:
1. Title (cleaned) — the happy path, same as before
2. Brand + Department — e.g. "Publix deal (Meat)"
3. Brand alone — e.g. "Publix deal"
4. Department alone — e.g. "Meat deal"
5. Description truncated to 48 chars — last-resort meaningful text
6. Item ID — e.g. "Deal 12345"
7. "Untitled deal" — only when every field is empty
This makes the output more useful for the ~5-10% of weekly ad items
that ship with a nil Title from the Publix API, which previously all
showed as "Unknown" and were indistinguishable from each other.
Tests:
- TestPrintDeals_FallbackTitleFromBrandAndDepartment
- TestPrintDeals_FallbackTitleFromID
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>