Wire notifyAdmins() into finalist lifecycle events so admins receive in-app (+ email when enabled) notifications on each key transition: - finalist.confirm → FINALIST_CONFIRMED - finalist.decline / adminDecline → FINALIST_DECLINED - expirePendingPastDeadline (per row) → FINALIST_EXPIRED - promoteNextWaitlistEntry + manualPromote → FINALIST_WAITLIST_PROMOTED All calls are wrapped in try/catch — comms never throw inside a mutation or cron (CLAUDE.md: "round notifications never throw"). Added project title to the project select where it was missing. Tests: tests/unit/finalist-comms.test.ts — 3 tests passing (TDD). Regression: finalist-confirmation, finalist-admin-confirm, finalist-enrollment — 30 tests all passing. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7.8 KiB
7.8 KiB