Overarching Strategy: Parallel, Non-Disruptive Implementation
The core principle of this plan is to build the entire new registration and grading system in parallel with the existing, operational one. The new features will be built against new database tables and services and will only be activated for courses in the next academic semester. This ensures zero disruption to students and staff using the platform for the current, ongoing semester. Frontend development is integrated into each step, delivering complete "vertical slices" of functionality.
Workstreams and step repetition
We implement major areas as separate workstreams (Registration, Grading, Dashboards, Student Performance). Each workstream has a Foundations phase. In this plan: Registration foundations are at Step 2; Grading foundations are at Step 6; Student Performance foundations are at Step 12. Dashboards have partial integration at Step 11 and complete integration at Step 14. Foundations are schema-only for each workstream; controllers/services and UI arrive in subsequent steps. The PR Roadmap chapter provides a concrete crosswalk for the Registration workstream.
Visual Implementation Roadmap
graph TD
subgraph "Phase 1: Tutorial/Talk Registration"
S1["1. Dashboard Shell"] --> S2["2. Registration Foundations"];
S2 --> S3["3. FCFS Mode"];
S3 --> S4["4. Preference-Based Mode"];
S4 --> S5["5. Roster Maintenance"];
end
subgraph "Phase 2: Grading & Assessments"
S5 --> S6["6. Assessment Foundations"];
S6 --> S7["7. Assessments (Formalize)"];
S7 --> S8["8. Assignment Grading"];
S8 --> S9["9. Exams (Registration + Grading)"];
S9 --> S10["10. Participation Tracking"];
end
subgraph "Phase 3: Dashboard Integration (Partial)"
S10 --> S11["11. Dashboard Impl. (Partial)"];
end
subgraph "Phase 4: Student Performance & Eligibility"
S11 --> S12["12. Student Performance System"];
S12 --> S13["13. Exam Eligibility Policies"];
S13 --> S14["14. Dashboard Extension"];
end
subgraph "Phase 5: Quality & Hardening"
S14 --> S15["15. Quality & Hardening"];
end
style S11 fill:#cde4ff,stroke:#5461c8
style S14 fill:#cde4ff,stroke:#5461c8
The 15-Step Implementation Plan
-
[Dashboards] Dashboard Shell & Flags Action: Introduce Student + Teacher/Editor dashboard controllers, blank widgets, navigation entries. All new feature areas render as disabled cards until their step enables them.
-
[Registration] Foundations (Additive Schema per Workstream) Active workstream: Registration. Action: Create only the new tables and AR models for the active workstream. This step is purely backend and involves no UI changes.
For the Registration workstream this includes
registration_campaigns,registration_items,registration_user_registrations, andregistration_policies. Grading- and exam-related tables are added later when those workstreams are active.Also implement
Registration::PolicyEnginewith core policy kinds (institutional_email,prerequisite_campaign) and introduce core concerns for controllers to target in the next step:Registration::Campaignablefor hosts of campaigns; include inLecture.Registration::Registerablefor assignable targets; include inTutorial. Provide interface stubs such asmaterialize_allocation!andallocated_user_ids.
Exam registration is deferred to Step 9, and student performance eligibility policies to Step 13. This step focuses on tutorial/talk registration only.
This step is purely additive. It creates new, unused tables and models scoped to the active workstream. It does not alter existing tables (
assignments,submissions, etc.) serving the current semester. -
[Registration] Open FCFS Tutorial/Talk Campaigns Action: Implement the backend controllers and frontend UIs for the FCFS registration mode. This includes creating teacher/editor UIs to set up and manage campaigns and student UIs to view and register for items. FCFS logic uses simple capacity checks (no complex allocation).
Controllers: Wire
Registration::CampaignsController,Registration::UserRegistrationsController, andRegistration::PoliciesController(HTML + Turbo Frames/Streams).Also add minimal dashboard widget data endpoints (counts/status) and update hidden cards under feature flags.
Initial FCFS rollout targets Tutorials and Talks. Exam registration is deferred to Step 9.
-
[Registration] Preference-Based Mode (incl. Solver & Finalization) Action: Deliver preference-based registration, building on FCFS foundations. Implement student ranking UI and persistence, roster foundations for finalize (minimal persistence/service so
materialize_allocation!can replace roster memberships), and solver integration with finalize wiring end-to-end.Controllers: Add
Registration::AllocationControllerfor trigger/retry/finalize and Turbo updates from background jobs.Also update hidden dashboard cards to surface preference-based counters and latest results when enabled via feature flags.
Build roster foundations before implementing
finalize!, sincematerialize_allocation!replaces roster memberships. Addsource_campaign_idto roster join tables for tracking. -
[Registration] Roster Maintenance (UI & Operations) Action: Implement
Roster::MaintenanceControllerandRoster::MaintenanceServicewith an admin-facing UI for post-allocation roster management (moves, adds/removes) with capacity enforcement. Finalize the UX:-
Candidates panel lives on the Roster Overview (not on Detail) and lists unassigned users from a selected, completed campaign.
-
Provide a manual "Add student" action on Overview.
-
Tutor view is read-only; exams do not show a candidates panel.
Also add
RecountAssignedJobfor integrity. Finalize abilities so tutors see read-only Detail for their groups. Add a hidden dashboard widget for teacher/editor with roster links and counts.
-
-
[Grading] Assessment Foundations (Schema) Action: Create core assessment tables and AR models:
assessment_assessments,assessment_tasks,assessment_participations,assessment_task_points. Optional multiple-choice support fields can also be added here to keep schema changes concentrated.Exam-related tables (
exams) and grade scheme tables (grade_schemes,grade_scheme_thresholds) are deferred to Step 9. Student performance tables (student_performance_records,student_performance_certifications, etc.) are deferred to Step 12. This step focuses on core assessment infrastructure for assignment grading. -
[Grading] Assessments (Formalize
Assignmentas Assessable) Action: Run a background migration to create a correspondingAssessment::Assessmentrecord for each existingAssignment. Expose controllers for read-only exploration.Controllers:
Assessment::AssessmentsController(CRUD, read-only views) andAssessment::ParticipationsController(read-only). These become fully interactive after Step 8. -
[Grading] Grading Flow & Submission Fan-out Action: Introduce the backend
Assessment::GradingService. Build new grading UIs for instructors and TAs where they can view submissions and enter points. This UI will call the new service to save points and grades to the new tables (assessment_participations,assessment_task_points).Controllers: Enable
Assessment::GradingControllerandAssessment::ParticipationsController. Addpublish_resultsandunpublish_resultsactions onAssessment::AssessmentsController. -
[Exams] Exam Registration & Grading Action: Create
Exammodel and enable full exam workflow including registration and grading. Build complete vertical slice from campaign creation through grade publication.Schema: Create
examstable,grade_schemes, andgrade_scheme_thresholdstables.Model concerns:
ExamincludesRegistration::Registerable,Roster::Rosterable, andAssessment::Assessable. Note thatLecture(already campaignable from Step 2) hosts exam registration campaigns.Services: Implement
GradeScheme::Applierfor converting exam points to final grades.Controllers:
ExamsController(CRUD, scheduling),GradeScheme::SchemesController(scheme configuration, preview, apply). ExtendRegistration::CampaignsControllerto support exam registration campaigns (lecture as campaignable, exam as registerable item).UI: Exam registration flows (reuses existing campaign infrastructure), exam grading interface with grade scheme configuration (two-point auto-generation and manual adjustment), and results publication.
At this stage, exam campaigns can use existing policies (
institutional_email,prerequisite_campaign). Thestudent_performancepolicy kind is added in Step 13. -
[Grading] Participation Tracking Action: Implement Achievement model as a new assessable type for tracking non-graded participation (presentations, attendance). Build UI for teachers to mark achievements and for students to view their progress.
Controllers: Add
Assessment::AchievementsControllerfor CRUD andAssessment::ParticipationsControllerextensions for achievement marking. -
[Dashboards] Dashboard Implementation (Partial) Action: Implement initial versions of Student Dashboard and Teacher/Editor Dashboard with widgets for tutorial/talk registration, assignment grading, exam registration, and roster management. Lecture performance and exam eligibility widgets remain hidden.
Controllers:
DashboardsController(student/teacher views) with widget partials for completed workstreams (Steps 2-10).Dashboards will not show lecture performance certification or exam eligibility status yet. These widgets are added in Step 14.
-
[Student Performance] System Foundations Action: Create student performance tables and models:
student_performance_records,student_performance_rules,student_performance_achievements, andstudent_performance_certifications. ImplementStudentPerformance::ComputationServiceto materialize Records from assessment data. ImplementStudentPerformance::Evaluatorto generate certification proposals. Build teacher certification workflow UI.Controllers:
StudentPerformance::RecordsController(factual data display),StudentPerformance::CertificationsController(teacher certification workflow), andStudentPerformance::EvaluatorController(proposal generation).The
student_performancepolicy kind is added in Step 13 when exam eligibility policies are implemented. -
[Exam Eligibility] Student Performance Policy Integration Action: Integrate student performance certifications into exam registration as an eligibility gate. Add the
student_performancepolicy kind to enable exam campaigns to require certification before students can register.Policy Engine: Add
student_performancepolicy kind toRegistration::PolicyEngine. Policy checksStudentPerformance::Certification.statusat runtime.Pre-flight checks: Implement certification completeness validation in
Registration::CampaignsController(before campaign open) andRegistration::AllocationController(before finalize). Campaigns withstudent_performancepolicies cannot open if any lecture students lack certifications or have pending status.Finalization filtering: On finalize, auto-reject students with
status: :failedand only materialize students withstatus: :passedto exam rosters.UI: Add pre-flight validation warnings, remediation interface for incomplete certifications, and student-facing eligibility status displays.
MC exam support can be added as optional extension after core functionality is stable.
-
[Dashboards] Dashboard Extension (Complete) Action: Add student performance and exam eligibility widgets to dashboards. Connect "Exam Eligibility Status", "Certification Pending List", and "Performance Overview" to backend services from Steps 12-13.
Controllers: Extend
DashboardsControllerwith widgets for lecture performance certification status and exam eligibility. -
[Quality] Hardening & Integrity Action: Create backend jobs for data integrity and reporting (
PerformanceRecordUpdateJob,CertificationStaleCheckJob,AllocatedAssignedMatchJob). Build admin dashboards and reporting views.