feat: round finalization with ranking-based outcomes + award pool notifications
All checks were successful
Build and Push Docker Image / build (push) Successful in 10m0s

- processRoundClose EVALUATION uses ranking scores + advanceMode config
  (threshold vs count) to auto-set proposedOutcome instead of defaulting all to PASSED
- Advancement emails generate invite tokens for passwordless users with
  "Create Your Account" CTA; rejection emails have no link
- Finalization UI shows account stats (invite vs dashboard link counts)
- Fixed getFinalizationSummary ranking query (was using non-existent rankingsJson)
- New award pool notification system: getAwardSelectionNotificationTemplate email,
  notifyEligibleProjects mutation with invite token generation,
  "Notify Pool" button on award detail page with custom message dialog

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-03 19:14:41 +01:00
parent 7735f3ecdf
commit cfee3bc8a9
48 changed files with 5294 additions and 676 deletions

View File

@@ -14,8 +14,7 @@ const generalSettingsFields = {
conceptAdvanceCount: z.number().int().nonnegative().optional(),
advanceMode: z.enum(['count', 'threshold']).default('count'),
advanceScoreThreshold: z.number().min(0).max(10).optional(),
notifyOnEntry: z.boolean().default(false),
notifyOnAdvance: z.boolean().default(false),
gracePeriodHours: z.number().int().nonnegative().default(0),
}
// ─── 1. IntakeConfig ─────────────────────────────────────────────────────────
@@ -193,6 +192,9 @@ export const MentoringConfigSchema = z.object({
promotionTargetWindowId: z.string().optional(),
autoAssignMentors: z.boolean().default(false),
mentoringRequestDeadlineDays: z.number().int().positive().default(14),
passThroughIfNoRequest: z.boolean().default(true),
})
export type MentoringConfig = z.infer<typeof MentoringConfigSchema>