92ab59de4e
_upsert_contact_from_fundraising now reads contact.phone and writes contacts.phone on both the insert and update paths, so a phone captured from a business card persists on the canonical contact record. Phone stays contact-level (not a grid pill field), matching how the team edits it. Validated by test_grid_add_investor.py. This is the SERVER half of business-card phone capture, staged for the next s9pk (version bump + build + install). The bot's phone extraction/card/payload lands in the same deploy, so phone never shows on a card before the box can store it. NOT yet built or installed to the box.