8b3e82d960
New owner upgrade watcher: every 5 min it checks config.ownerIds against the chain state and, when a leg member is ONE upgrade from paying a position that isn't eligible yet (below the required level, or not qualified), emails config.ownerAlertEmail + pings Telegram — "upgrade #24 to Fabrica, #61 is one upgrade from paying you 2,486 POL." Deduped per (position, level) in owner-alerts.json, re-fires if the situation recurs. Same warning renders inline in the admin "My Positions" panel (upgradeNeeds in the income endpoint). New ownerAlertEmail settings field. Detection logic unit-tested. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>