# Implementation Roadmap ## Overview The redesign is implemented in 9 phases, progressing from contract definition through schema migration, feature implementation, and legacy decommission. Each phase has defined scope, dependencies, and rollback points. --- ## Phase Summary | Phase | Scope | Duration | Dependencies | |-------|-------|----------|--------------| | 0 | **Contract Freeze** — type definitions, Zod schemas, feature flags, test factories | 1 week | None | | 1 | **Schema & Runtime Foundation** — Prisma migration, Competition/Round/JuryGroup CRUD | 2 weeks | Phase 0 | | 2 | **Policy Engine** — centralized context resolver, policy resolution, assignment policy evaluator | 1 week | Phase 1 | | 3 | **Invite/Onboarding Integration** — jury memberships on invite, assignment intent, onboarding routing | 1–2 weeks | Phase 1 | | 4 | **Backend Orchestration** — enhanced assignment, submission round manager, mentor workspace, deliberation service | 2 weeks | Phase 2, 3 | | 5 | **Admin Control Plane + Participant UX** — competition wizard, round management, jury/applicant/mentor dashboards | 2 weeks | Phase 4 | | 6 | **Special Awards + Live Finals + Deliberation** — award modes, stage manager, deliberation voting UI | 2 weeks | Phase 4, 5 | | 7 | **Platform-Wide Refit** — remove Pipeline/Track/Stage references, drop old tables | 2 weeks | Phase 5, 6 | | 8 | **Cutover & Legacy Decommission** — enable new contracts, deprecate legacy, burn-in period | 1 week | Phase 7 | **Total estimated duration**: 14–15 weeks --- ## Dependency Graph ``` Phase 0 ──→ Phase 1 ──→ Phase 2 ──→ Phase 4 ──→ Phase 5 ──→ Phase 7 ──→ Phase 8 └──→ Phase 3 ──┘ └──→ Phase 6 ──┘ ``` - Phases 2 and 3 can run in parallel after Phase 1 - Phase 4 requires both Phase 2 and 3 - Phases 5 and 6 can partially overlap - Phase 7 requires both Phase 5 and 6 **Critical path**: 0 → 1 → 2 → 4 → 5 → 7 → 8 (12 weeks minimum) --- ## Phase Details ### Phase 0: Contract Freeze (1 week) **Goal**: Lock down all type definitions, schemas, and interfaces before any implementation begins. **Deliverables**: - All Prisma model definitions finalized (see [02-data-model.md](./02-data-model.md)) - All 7 Zod config schemas finalized (IntakeConfig through DeliberationConfig) - All new enum definitions finalized - Feature flag infrastructure in place - Test factory functions for all new models - TypeScript type exports for all new models **Rollback**: No production changes. Delete type files if needed. **Gate**: All type definitions reviewed and approved. No changes to schemas after this phase without architecture sign-off (see "No Silent Contract Drift" in [13-open-questions-and-governance.md](./13-open-questions-and-governance.md)). --- ### Phase 1: Schema & Runtime Foundation (2 weeks) **Goal**: New database tables exist alongside old ones. Basic CRUD operations work. **Deliverables**: - Prisma migration: add Competition, Round, JuryGroup, JuryGroupMember, SubmissionWindow, SubmissionFileRequirement, DeliberationSession, DeliberationVote, DeliberationResult, DeliberationParticipant, ResultLock, ResultUnlockEvent, MentorMessage, AssignmentIntent, AssignmentException, SubmissionPromotionEvent tables - New enums: RoundType, RoundStatus, CompetitionStatus, CapMode, DeadlinePolicy, DeliberationMode, DeliberationStatus, TieBreakMethod, etc. - Basic tRPC routers: `competition.create`, `competition.getById`, `round.create`, `juryGroup.create`, `juryGroup.addMember` - Admin can create a Competition with Rounds through the API (no UI yet) **Rollback**: Drop new tables. No old tables modified. **Gate**: All new tables exist with correct schemas. CRUD operations pass integration tests. --- ### Phase 2: Policy Engine (1 week) **Goal**: Centralized resolution of competition context and assignment policies. **Deliverables**: - `CompetitionContextResolver` service: given a roundId, returns the full competition context (competition, round type, config, jury group, submission windows, etc.) - Policy resolution function: 5-layer precedence chain for assignment caps, ratios, and modes - Assignment policy evaluator: `canAssignMore(member)`, `getEffectiveCap(member)`, `getRemainingCapacity(member)` - Unit tests for all policy combinations **Rollback**: Remove new services. No data changes. **Gate**: Policy resolution returns correct values for all 5 layers. Edge cases (null overrides, conflicting settings) handled correctly. --- ### Phase 3: Invite/Onboarding Integration (1–2 weeks) **Goal**: Jury memberships are created at invite time. Judges can self-service during onboarding. **Deliverables**: - Invite flow creates `JuryGroupMember` record when judge is invited to a jury - `AssignmentIntent` records can be created during invite (pre-assignment) - Onboarding page shows cap/ratio preferences when `allowOnboardingSelfService` is true - Judge can adjust cap and category bias during onboarding - Admin can review and override self-service values **Rollback**: Revert invite flow changes. JuryGroupMember records can be deleted. **Gate**: End-to-end flow: invite judge → judge accepts → onboarding shows jury details → judge adjusts preferences → admin sees updated values. --- ### Phase 4: Backend Orchestration (2 weeks) **Goal**: All backend services for the 8-round flow are operational. **Deliverables**: - **RoundEngine** service: state machine for round transitions (replaces StageEngine) - **Enhanced Assignment** service: hard/soft cap algorithm, category bias, unassigned queue, COI check - **SubmissionRoundManager**: manages submission windows, file requirements, read-only enforcement - **MentorWorkspaceService**: messaging, file upload, file comments, file promotion - **DeliberationService**: session creation, vote submission, aggregation (Borda count / vote tally), tie-breaking, result lock - **AI Shortlist** service: generates ranked recommendations at end of evaluation rounds - **ResultLockService**: lock/unlock with audit trail **Rollback**: Remove new services. Feature flags prevent activation. **Gate**: All services pass unit tests. Integration test covers full R1→R8 flow with test data. --- ### Phase 5: Admin Control Plane + Participant UX (2 weeks) **Goal**: Admin can configure and run a competition through the UI. Participants see the correct experience. **Deliverables**: - **Competition Wizard**: create competition with rounds, configure each round type - **Round Management**: view/edit round configs, manage submission windows, set deadlines - **Juries Management (NEW section)**: create JuryGroups, add/remove members, configure caps/ratios, view assignments - **Assignment Dashboard**: view assignments, manage unassigned queue, manual override - **Jury Dashboard**: countdown, assigned projects, multi-round doc viewing, scoring/feedback - **Applicant Portal**: multi-round doc upload, read-only enforcement, submission status - **Mentor Dashboard**: assigned teams, messaging, file management, promotion **Rollback**: Revert UI pages. Backend services still work via API. **Gate**: Admin can create, configure, and manage a full competition through the UI. Jury, applicant, and mentor dashboards functional. --- ### Phase 6: Special Awards + Live Finals + Deliberation (2 weeks) **Goal**: The most complex runtime features are operational. **Deliverables**: - **Special Awards**: create awards with routing modes, eligibility filtering, per-award jury, doc requirements, review windows, single-judge mode - **Live Finals Stage Manager**: admin controls for ceremony flow, project cursor, voting windows - **Jury 3 Live Interface**: real-time notes, all docs from prior rounds, prior jury data (if enabled), live scoring - **Audience Voting**: optional per-category audience vote, reveal timing configuration - **Deliberation UI**: session management, juror voting interface (both modes), result display, tie-breaking, admin lock - **Result Lock**: admin locks results, unlock requires super-admin with reason **Rollback**: Feature flags disable awards, live finals, and deliberation. Fall back to basic flow. **Gate**: Full live finals ceremony simulation. Deliberation voting in both modes. Result lock and unlock. Award creation and selection. --- ### Phase 7: Platform-Wide Refit (2 weeks) **Goal**: Remove all references to Pipeline, Track, and Stage from the codebase. Estimated 120+ files, ~350 hours of work. **Sub-phases** (ordered by dependency): | Sub-Phase | Scope | Files | Est. Hours | |-----------|-------|-------|-----------| | **7a** | Database: rename FKs (stageId→roundId) in AudienceVote, COIDeclaration, ProjectStatusHistory, DigestLog, PartnerAccess | 1 (schema) + migration | 8 | | **7b** | Types & libraries: rewrite pipeline-wizard.ts, wizard-config.ts, pipeline-defaults.ts, pipeline-validation.ts, stage-config-schema.ts | 6 | 32 | | **7c** | Core routers: rename pipeline.ts→competition.ts, stage.ts→round.ts, track.ts→(delete), stageAssignment.ts→roundAssignment.ts | 4 | 24 | | **7d** | Dependent routers: update all 20 routers with stageId/pipelineId references (evaluation, file, live, invite, notification, etc.) | 20 | 80 | | **7e** | Services: rename stage-engine→round-engine, stage-filtering→round-filtering, stage-assignment→round-assignment, stage-notifications→round-notifications, live-control (update refs) | 11 | 50 | | **7f** | Admin pages: rename 35+ pages referencing pipeline/stage, update breadcrumbs, wizard, config editors | 35+ | 52 | | **7g** | Jury pages: update 16 jury pages + components (stage routes→round routes, assignment queries, evaluation forms) | 16 | 18 | | **7h** | Applicant pages: update 8 pages (pipeline visualization→competition progress, stage documents→round documents) | 8 | 12 | | **7i** | Infrastructure: update Docker entrypoint, cron jobs, webhook event names, notification templates, seed data | 4 | 11 | | **7j** | Tests: update 13+ test files + helpers.ts, rename factories, update all assertions | 13+ | 45 | **Week 1**: Sub-phases 7a–7e (database, types, routers, services — backend foundation) **Week 2**: Sub-phases 7f–7j (UI pages, infrastructure, tests — frontend + verification) **Deliverables**: - All `pipeline` references renamed to `competition` in routers, services, types, UI - All `stage` references renamed to `round` - All `track` references removed - All imports, type aliases, and variable names updated - Old database tables dropped (Pipeline, Track, Stage, ProjectStageState) - Seed data updated to use new models - All background jobs and webhook events using new names **Rollback**: This is the point of no return for the old schema. Rollback requires restoring from backup. **Gate**: `grep -r "pipeline\|Pipeline\|stage\|Stage\|track\|Track" src/` returns zero results (excluding legitimate uses like "stage manager" in live finals). All tests pass. Build succeeds. --- ### Phase 8: Cutover & Legacy Decommission (1 week) **Goal**: Production system running entirely on the new architecture. **Deliverables**: - Feature flags set to new system for all subsystems - Legacy API endpoints deprecated (return 410 Gone with migration guide) - Burn-in period: monitor for errors, performance regressions - Documentation updated (CLAUDE.md, README, API docs) - Seed data updated - Docker entrypoint updated for new migration flow **Rollback**: Feature flags can revert to legacy for individual subsystems (only if old tables still exist, i.e., Phase 7 wasn't completed). **Gate**: 72-hour burn-in with zero critical errors. All release gates A–F passed (see [12-observability-and-release-gates.md](./12-observability-and-release-gates.md)). --- ## Rollback Strategy | Phase | Rollback Method | Data Loss Risk | |-------|----------------|----------------| | 0 | Delete type files | None | | 1 | Drop new tables | None (old tables untouched) | | 2 | Remove services | None | | 3 | Revert invite flow | JuryGroupMember records deleted | | 4 | Feature flag off | None | | 5 | Revert UI pages | None | | 6 | Feature flag off | None | | 7 | **Point of no return** — restore from backup | Requires backup | | 8 | Feature flags to legacy | Only if Phase 7 not completed | --- ## Risk Mitigation | Risk | Mitigation | |------|-----------| | Schema migration breaks existing data | Phase 1 adds tables alongside old ones. No modifications to existing tables until Phase 7. | | Assignment algorithm incorrect | Extensive unit tests in Phase 2. Manual override always available. | | Deliberation edge cases | Phase 6 includes deliberation test matrix (see [11-testing-and-qa.md](./11-testing-and-qa.md)). | | Live finals concurrency | Load testing in Phase 6. See [12-observability-and-release-gates.md](./12-observability-and-release-gates.md). | | Late requirement changes | "No Silent Contract Drift" policy enforced after Phase 0. |