MOPC-App/docs/claude-architecture-redesign/00-executive-summary.md

11 KiB

Executive Summary: MOPC Architecture Redesign

Why This Redesign

The MOPC platform currently uses a Pipeline -> Track -> Stage model with generic JSON configs to orchestrate the competition. While technically sound, this architecture introduces unnecessary abstraction for what is fundamentally a linear sequential competition flow.

Current Problems

Problem Impact
3-level nesting (Pipeline->Track->Stage) Cognitive overhead for admins configuring rounds
Generic configJson blobs per stage type "Vague" — hard to know what's configurable without reading code
No explicit jury entities Juries are implicit (per-stage assignments), can't manage "Jury 1" as a thing
Single submission round No way to open a second submission window for semi-finalists
Track layer for main flow MAIN track adds indirection without value for a linear flow
No mentoring workspace Mentor file exchange exists but no comments, no promotion to submission
No winner confirmation No multi-party agreement step to cement winners
Missing round types Can't model a "Semi-finalist Submission" or "Mentoring" or "Confirmation" step

Design Principles

  1. Domain over abstraction — Models map directly to competition concepts (Jury 1, Round 2, etc.)
  2. Linear by default — The main flow is sequential. Branching is only for special awards.
  3. Typed configs over JSON blobs — Each round type has explicit, documented fields.
  4. Explicit entities — Juries, submission windows, and confirmation steps are first-class models.
  5. Deep integration — Every feature connects. Jury groups link to rounds, rounds link to submissions, submissions link to evaluations.
  6. Admin override everywhere — Any automated decision can be manually overridden with audit trail.

Before & After: Architecture Comparison

BEFORE (Current System)

Program
 └── Pipeline (generic container)
      ├── Track: "Main Competition" (MAIN)
      │    ├── Stage: "Intake" (INTAKE, configJson: {...})
      │    ├── Stage: "Filtering" (FILTER, configJson: {...})
      │    ├── Stage: "Evaluation" (EVALUATION, configJson: {...})
      │    ├── Stage: "Selection" (SELECTION, configJson: {...})
      │    ├── Stage: "Live Finals" (LIVE_FINAL, configJson: {...})
      │    └── Stage: "Results" (RESULTS, configJson: {...})
      ├── Track: "Award 1" (AWARD)
      │    ├── Stage: "Evaluation" (EVALUATION)
      │    └── Stage: "Results" (RESULTS)
      └── Track: "Award 2" (AWARD)
           ├── Stage: "Evaluation" (EVALUATION)
           └── Stage: "Results" (RESULTS)

Juries: implicit (assignments per stage, no named entity)
Submissions: single round (one INTAKE stage)
Mentoring: basic (messages + notes, no workspace)
Winner confirmation: none

AFTER (Redesigned System)

Program
 └── Competition (purpose-built, replaces Pipeline)
      ├── Rounds (linear sequence, replaces Track+Stage):
      │    ├── Round 1: "Application Window" ─────── (INTAKE)
      │    ├── Round 2: "AI Screening" ──────────── (FILTERING)
      │    ├── Round 3: "Jury 1 - Semi-finalist" ── (EVALUATION) ── juryGroupId: jury-1
      │    ├── Round 4: "Semi-finalist Docs" ─────── (SUBMISSION) ── submissionWindowId: sw-2
      │    ├── Round 5: "Jury 2 - Finalist" ──────── (EVALUATION) ── juryGroupId: jury-2
      │    ├── Round 6: "Finalist Mentoring" ─────── (MENTORING)
      │    ├── Round 7: "Live Finals" ────────────── (LIVE_FINAL) ── juryGroupId: jury-3
      │    └── Round 8: "Confirm Winners" ─────────── (CONFIRMATION)
      │
      ├── Jury Groups (explicit, named):
      │    ├── "Jury 1" ── members: [judge-a, judge-b, ...] ── linked to Round 3
      │    ├── "Jury 2" ── members: [judge-c, judge-d, ...] ── linked to Round 5
      │    └── "Jury 3" ── members: [judge-e, judge-f, ...] ── linked to Round 7
      │
      ├── Submission Windows (multi-round):
      │    ├── Window 1: "Round 1 Docs" ── requirements: [Exec Summary, Business Plan]
      │    └── Window 2: "Round 2 Docs" ── requirements: [Updated Plan, Video Pitch]
      │
      └── Special Awards (standalone):
           ├── "Innovation Award" ── mode: STAY_IN_MAIN, juryGroup: jury-2-award
           └── "Impact Award" ── mode: SEPARATE_POOL, juryGroup: dedicated-jury

Key Decisions

1. Eliminate the Track Layer

Decision: Remove the Track model entirely. The main competition is a linear sequence of Rounds. Special awards become standalone entities.

Rationale: The MOPC competition has one main flow (Intake -> Filtering -> Jury 1 -> Submission 2 -> Jury 2 -> Mentoring -> Finals -> Confirmation). The Track concept (MAIN/AWARD/SHOWCASE with RoutingMode and DecisionMode) was designed for branching flows that don't exist in this competition. Awards don't need their own track — they're parallel evaluation/voting processes that reference the same projects.

Impact:

  • Track model deleted
  • TrackKind, RoutingMode enums deleted
  • ProjectStageState.trackId removed (becomes ProjectRoundState with just projectId + roundId)
  • Award tracks replaced with enhanced SpecialAward model
  • ~200 lines of Track CRUD code eliminated

2. Rename Pipeline -> Competition, Stage -> Round

Decision: Use domain-specific names that map to the competition vocabulary.

Rationale: Admins think in terms of "Competition 2026" and "Round 3: Jury 1 Evaluation", not "Pipeline" and "Stage". The rename costs nothing but improves comprehension.

3. Expand RoundType Enum

Decision: Add SUBMISSION, MENTORING, and CONFIRMATION to the existing types.

Current: INTAKE | FILTER | EVALUATION | SELECTION | LIVE_FINAL | RESULTS

New: INTAKE | FILTERING | EVALUATION | SUBMISSION | MENTORING | LIVE_FINAL | CONFIRMATION

Changes:

  • FILTER -> FILTERING (clearer naming)
  • SELECTION removed (merged into EVALUATION's advancement config)
  • RESULTS removed (results are a view, not a round — handled by the CONFIRMATION round output)
  • SUBMISSION added (new doc requirements for advancing teams)
  • MENTORING added (mentor-team workspace activation)
  • CONFIRMATION added (multi-party winner agreement)

4. Explicit JuryGroup Model

Decision: Juries are first-class entities with names, members, and per-juror configuration.

Before: Assignments were per-stage with no grouping concept. "Jury 1" only existed in the admin's head.

After: JuryGroup model with members, linked to specific evaluation/live-final rounds. A juror can belong to multiple groups.

5. Multi-Round Submissions via SubmissionWindow

Decision: A new SubmissionWindow model handles document requirements per round, with automatic locking of previous windows.

Before: One INTAKE stage with one set of FileRequirement records.

After: Each submission window has its own requirements. When a new window opens, previous ones lock for applicants. Jury rounds can see docs from specific windows.

6. Typed Configs Replace JSON Blobs

Decision: Replace generic configJson: Json? with round-type-specific config models or strongly-typed JSON with Zod validation.

Before: Stage.configJson could be anything — you'd have to read the code to know what fields exist for each StageType.

After: Each round type has a documented, validated config shape. The wizard presents only the fields relevant to each type.


Scope Summary

Area Action Complexity
Schema Major changes (new models, renamed models, deleted Track) High
Stage engine Rename to round engine, simplify (no Track references) Medium
Assignment service Enhance with jury groups, hard/soft caps, category ratios Medium
Filtering service Minimal changes (rename stageId -> roundId) Low
Live control Enhanced stage manager UI, same core logic Medium
Mentor system Major enhancement (workspace, files, comments, promotion) High
Winner confirmation New system (proposal, approvals, freezing) High
Special awards Enhanced (standalone, two modes, own jury groups) Medium
Notification system Enhanced (deadline countdowns, reminder triggers) Medium
Admin UI Full redesign (competition wizard, round management) High
Jury UI Enhanced (multi-jury dashboard, cross-round docs) Medium
Applicant UI Enhanced (multi-round submissions, mentoring workspace) Medium
Mentor UI New (dedicated mentor dashboard and workspace) High
API routers Major refactor (rename, new endpoints, removed endpoints) High
Migration Data migration from old schema to new Medium

Document Index

# Document Purpose
00 This document Executive summary and key decisions
01 Current System Audit What exists today — models, services, routers, UI
02 Gap Analysis Current vs required, feature-by-feature comparison
03 Data Model Complete Prisma schema redesign with migration SQL
04 Round: Intake Application window, forms, deadlines, drafts
05 Round: Filtering AI screening, eligibility, admin overrides
06 Round: Evaluation Multi-jury, caps, ratios, scoring, advancement
07 Round: Submission Multi-round docs, locking, jury visibility
08 Round: Mentoring Private workspace, file comments, promotion
09 Round: Live Finals Stage manager, live voting, deliberation
10 Round: Confirmation Jury signatures, admin override, result freezing
11 Special Awards Two modes, award juries, integration
12 Jury Groups Multi-jury architecture, members, overrides
13 Notifications & Deadlines Countdowns, reminders, window management
14 AI Services Filtering, assignment, summaries, eligibility
15 Admin UI Redesign Dashboard, wizard, round management
16 Jury UI Redesign Dashboard, evaluation, live voting
17 Applicant UI Redesign Dashboard, multi-round uploads, mentoring
18 Mentor UI Redesign Dashboard, workspace, file review
19 API Router Reference tRPC changes — new, modified, removed
20 Service Layer Changes Engine, assignment, new services
21 Migration Strategy Schema migration, data migration, rollback
22 Integration Map Cross-reference of all feature connections
23 Implementation Sequence Phased order with dependencies