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 7; Student Performance foundations are at Step 11. Dashboards have partial integration at Step 10 and complete integration at Step 13. 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. Grading Foundations"];
S6 --> S7["7. Assessments (Formalize)"];
S7 --> S8["8. Assignment Grading"];
S8 --> S9["9. Participation Tracking"];
end
subgraph "Phase 3: Dashboard Integration (Partial)"
S9 --> S10["10. Dashboard Impl. (Partial)"];
end
subgraph "Phase 4: Student Performance & Exam Registration"
S10 --> S11["11. Student Performance System"];
S11 --> S12["12. Exam Registration"];
S12 --> S13["13. Dashboard Extension"];
end
subgraph "Phase 5: Quality & Hardening"
S13 --> S14["14. Quality & Hardening"];
end
style S10 fill:#cde4ff,stroke:#5461c8
style S13 fill:#cde4ff,stroke:#5461c8
The 14-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 and student performance policies are deferred to Steps 11-12. 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 12.
-
[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] Grading Foundations (Schema) Action: Create all grading-related tables and AR models. This includes core assessment tables (
assessment_assessments,assessment_tasks,assessment_participations,assessment_task_points), and grade scheme tables. Optional multiple-choice support fields can also be added here to keep schema changes concentrated.Exam-related tables (
exams) and student performance tables (student_performance_records,student_performance_certifications, etc.) are deferred to Steps 11-12. This step focuses on assignment grading only. -
[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. -
[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, and roster management. Lecture performance and exam registration widgets remain hidden.
Controllers:
DashboardsController(student/teacher views) with widget partials for completed workstreams (Steps 2-9).Dashboards will not show exam eligibility or certification status yet. These widgets are added in Step 13.
-
[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 12 when exam registration is implemented. -
[Exam] Registration & Certification Integration Action: Create
Exammodel with cross-cutting concerns:Registration::Campaignable(host campaigns)Registration::Registerable(be registered for)Roster::Rosterable(manage registrants)Assessment::Assessable(link to grading)
Add
student_performancepolicy kind toRegistration::PolicyEngine. Implement pre-flight certification checks inRegistration::CampaignsController(before open) andRegistration::AllocationController(before finalize). Wire exam grading to assessment system and implementGradeScheme::Applier.Controllers:
ExamsController(CRUD, scheduling),GradeScheme::SchemesController(preview/apply), and updates toRegistration::CampaignsControllerfor certification checks.MC exam support can be added as optional extension after core functionality is stable.
-
[Dashboards] Dashboard Extension (Complete) Action: Add student performance and exam registration widgets to dashboards. Connect "Exam Eligibility Status", "Certification Pending List", and "Performance Overview" to backend services from Steps 11-12.
Controllers: Extend
DashboardsControllerwith widgets for lecture performance and exam registration. -
[Quality] Hardening & Integrity Action: Create backend jobs for data integrity and reporting (
PerformanceRecordUpdateJob,CertificationStaleCheckJob,AllocatedAssignedMatchJob). Build admin dashboards and reporting views.