Skip to content

Roadmap

Wouter Meetsma edited this page Jun 23, 2026 · 48 revisions

Development Roadmap

🎯 Overview

RubricMaker is an offline-first rubric creation and grading tool for educators. This roadmap lists completed phases first (newest at the top of that section is the most recently shipped), then planned work.


✅ Completed Phases

Phase 0: MVP & Core Features (Launched)

  • ✅ Rubric builder with multiple scoring modes (Total Points, Weighted, Single-Point)
  • ✅ Interactive grading interface with score modifiers
  • ✅ CEFR framework integration (Can-Do statements)
  • ✅ Student self-assessment & peer review
  • ✅ Essay assignments with rich text editor
  • ✅ Analytics dashboard with class statistics
  • ✅ Multi-format export (PDF, DOCX, CSV)
  • ✅ Student portal with shareable links
  • ✅ Offline-first architecture with localStorage
  • ✅ Basic theme customization

Phase 1: Cloud Sync & Collaboration (PR #128)

  • ✅ Sync conflict resolution — src/utils/syncMerge.ts, remote-as-baseline merge with LWW on rubrics, wired into all three hydration sites (startup, reconnect, OTP sign-in)
  • ✅ Cambridge English framework — CEFR ↔ exam mapping (src/data/cambridgeExams.ts), opt-in "B2 · FCE" badges, optional Cambridge Dictionary API vocabulary lookups
  • ✅ Theme bundles — 5 one-click presets (src/data/themes.ts), tonal accent scale via color-mix(), 5 decorative export fonts for PDF/DOCX

Phase 2: Infrastructure Stabilization (PR #131 + wiki updates)

  • ✅ 2.1 Multi-device e2e — second-browser-context Supabase fixture, propagation/LWW-race/network-partition specs (e2e/specs/18-multi-device-sync.spec.ts)
  • ✅ 2.2 LWW extended to every editable collection (rubrics, grades, peer reviews, classes, students, grade scales, comment snippets/bank, self-assessments, speaking sessions, analysis results); add/delete-only collections (attachments, exportTemplates, favoriteStandards) intentionally left on pending-queue protection only
  • ✅ 2.3 Wiki documentation pass — Cambridge + theming guides added to Features.md, conflict-resolution strategy documented in Supabase-Sync.md

Phase 3: EFL Classroom Enhancements (PR #134#136)

  • ✅ 3.1 Speaking session recordings — IndexedDB blob store, local-only audio, DB-gated video, optional cloud sync with cascade delete
  • ✅ 3.2 Vocabulary profiling dashboard (/vocabulary) — per-student/class CEFR distribution charts, open CEFR word lists, CSV export
  • ✅ 3.3 Peer review analytics (/peer-analytics/:rubricId) — consistency scoring, leniency bias, inter-rater spread, comment heatmap
  • ✅ 3.4 Full testing environment (/tests, /test/:code) — MC/short-answer/open questions, auto-scoring, class-average adjustment, live proctoring monitor

Phase 3.5: Hot Text Questions & Standalone Essays Workspace (PR #140)

  • ✅ Hot-text question type — src/utils/clozeParse.ts parses {{cloze}} and [[hot-text]] syntax; scoring in testCalc.ts
  • ✅ Standalone /essays workspace (parallel to /tests) — prompt editor, rubric connector, per-student share links, submission-code import, reusable assignment templates (PR #143)

Phase 4: Admin & School Operations (PR #144#146)

  • ✅ 4.1 Expanded statistics — multi-class Compare view, trend overlay, rule-based insights, track/year filters
  • ✅ 4.2 Activity dashboard (/activity-dashboard) — rubric/test/essay × class grid, assign-from-view, submission count badges
  • ✅ 4.3 Admin hardening — teacher/admin/observer roles + RLS, pg_cron data retention, student soft-delete archive (restore/anonymize), audit log with CSV export
  • ✅ 4.4 SIS roster sync (partial) — CSV upsert + optional roster-removal sync; native Magister API integration still reserved for community contribution
  • ✅ 4.5 Self-hosting ops — docs/SELF_HOSTING_OPS.md, HestiaCP/Virtualmin guides

Phase 5: UI/UX Polish (PR #147#153)

  • ✅ 5.1 Mobile grading — touch stepper alongside sliders, single-column ComparativeGrading reflow <768px, iPad CSS, mobile e2e
  • ✅ 5.2 WCAG 2.1 AAA — src/utils/contrastCheck.ts + enforcement test, accessible modals with focus trap/restoration, keyboard drag-and-drop, i18n'd skip link
  • ✅ 5.3 Help & documentation — page tours (Joyride) on 12 pages total, contextual tooltips (src/components/ui/HelpPopover.tsx) for score modifiers/LWW sync/proctoring flags
  • ✅ a11y test coverage — RubricBuilder/GradeStudent/ComparativeGrading added to the jest-axe page suite (PR #152, closing the Phase 5.2 follow-up)
  • ✅ Route-shaped skeleton loading for lazy routes and async actions (PR #153)

Phase 6: Strategic Features (PR #157)

Scoped down from the original proposal before implementation — see "Deferred from Phase 6" below for what was cut and why.

  • ✅ 6.1 Student Learning Paths — rule-based (no AI/LLM) rubric recommendations from CEFR-skill cohort gaps, consecutive-low-score intervention flagging, /students/:id/learning-path (src/utils/learningPathAggregator.ts)
  • ✅ 6.2 Rubric Marketplace (school-scoped) — publish/browse/clone/upvote within a school via the existing schools/school_members tables, /marketplace (supabase/migrations/040_rubric_marketplace.sql, src/pages/MarketplacePage.tsx)
  • ✅ 6.3 Integration Ecosystem (CSV import only) — Clever CSV and OneRoster CSV roster-import auto-detection added to the existing CSV import modal; LTI 1.3 LMS integration deferred (see below)
  • ✅ 6.4 Test Summary Export — per-question and per-skill/standard strong/weak breakdown, PDF/DOCX export (single + batch) from the test results page, feature parity with the rubric summary export (src/utils/testSummaryAggregator.ts)
  • ✅ 6.5 Report Card Improvement — consolidated PDF/DOCX report card per student combining rubric grades, standards coverage, learning goals, CEFR overview, and test summary, with section toggles and single/batch export from the Export page (src/utils/reportCardAggregator.ts)

Verification baseline (carried through every phase above): typecheck/lint clean, full unit suite green (1755+ tests), i18n parity across en/nl/fr/de/es, e2e suite green on chromium/firefox/webkit/mobile-chrome (pre-existing/environmental flakes tracked separately, not regressions).

Phase 7: Longitudinal & Historical Insight (PR #159)

  • ✅ 7.1 Multi-year student history — Student.pastClassMemberships recorded on every class change (manual move via Edit Student, and CSV sync-mode re-import transfers), with a confirmation summary before sync-mode CSV mutates anything; trail rendered on the student profile
  • ✅ 7.2 Rubric version diffing — "Compare" button per saved version opens a diff against the current rubric (criteria added/removed/changed, title/weight, level points/labels) (src/utils/rubricVersionDiff.ts, RubricVersionDiffModal.tsx); version history/snapshot/restore already existed
  • ✅ 7.3 Standards coverage gap analysis — class-level aggregator cross-references every linked standard against what's been graded, split into Assessed/Not yet assessed, surfaced on the Activity Dashboard (src/utils/standardsCoverageAggregator.ts, ClassCoverageGapPanel.tsx)

Phase 8: Collaboration & Department Workflow (PR #160)

  • ✅ 8.1 Co-grading & moderation — second-marker grade reuses the peer-review data model (StudentRubric with isPeerReview: true); src/utils/coGradingModerationQueue.ts flags disputes above a configurable point threshold; /moderation lists disputes with a per-criterion delta and keep/accept resolution
  • ✅ 8.2 Department rubric/comment-bank libraries — sharedWithSchool flag on rubrics and comment-bank items, read-only to every teacher in the same school (041_school_sharing.sql, mirrors the Phase 6 marketplace's school_members join pattern)
  • ✅ 8.3 Grading task assignment — batch-assign a class's ungraded submissions for a rubric to a colleague from the Activity Dashboard (GradingTask type, 042_grading_tasks.sql); completion is derived, not a stored flag
  • ✅ 8.4 Manual reordering — drag-and-drop reordering (src/utils/displayOrder.ts, @hello-pangea/dnd) on RubricList, TestListPage, EssayListPage, the Activity Dashboard, and the class list on the Students page, per teacher. List containers use flexbox-wrap rather than CSS grid, since @hello-pangea/dnd computes drag displacement from sibling bounding rects and doesn't support CSS grid track layout — grid caused incorrect cross-row drag animation and made it impossible to drop a card between two others in a different row.
  • ✅ 8.5 Cohort-based filtering — year/track cohort filter on the Rubrics, Tests, and Essays lists (src/utils/cohortAggregator.ts, src/components/CohortFilter.tsx); a student counts as in-cohort via their current class or any past class from pastClassMemberships, so an item stays visible to a cohort across a class transfer. Manual reordering is disabled while a cohort filter is active. Not added to the Activity Dashboard, since its existing class-level year/track filter already serves the same need for that per-class matrix view.

🔭 Future Roadmap: Phase 8 and beyond

Each phase below groups proposals under one theme so they can be scoped and shipped independently. None of these involve AI/LLM content generation — that remains explicitly out of scope for this project.

Deferred from Phase 6

Two items from the original Phase 6 proposal were cut from scope before implementation, since neither could be built and verified in the implementation environment:

  • LTI 1.3 LMS integration (Canvas, Blackboard, Moodle) — needs a live LMS sandbox to verify OAuth/launch flows; CSV-based roster import (Clever, OneRoster) shipped instead as a same-outcome, locally-testable substitute for the common "get students into the app" need.
  • Public/cross-tenant rubric marketplace — shipped as school-scoped only (reuses schools/school_members); a public marketplace would need a moderation queue, abuse controls, and report/flag tooling that don't exist yet.

Both remain candidates for a future phase if there's demand.

Phase 9: Accessibility & Reach Expansion

Phase 5 covered AAA contrast and keyboard nav inside the app shell; this phase extends reach further.

9.1 Additional locales

  • Expand beyond EN/NL/FR/DE/ES based on adopter demand (candidates: Portuguese, Polish, Turkish — common in EU language-education deployments)
  • RTL layout support (Arabic) — CSS logical properties audit, not a new framework

9.2 Installable offline app (PWA)

  • Service worker + manifest so the app installs to a home screen / desktop and launches without a browser chrome, while keeping the existing offline-first localStorage model unchanged
  • Useful for shared classroom devices

9.3 Dyslexia-friendly reading mode

  • Optional font/line-spacing preset (e.g. wider tracking, increased line-height) for rubric text and student-facing essay/test pages, toggled in Settings alongside the existing theme bundles

9.4 Expanded Exports

  • Essays written by students can be exported from HTML-code into Markdown, DOCX, and PDF.
  • Essays can be downloaded as separate documents or combined into a batch download (per class, or by selection)
  • Essays can be attached to the rubrics, and exported together. This can also include the grammar and vocabulary analysis.

Phase 10: Data Portability & School-System Interop

Closes the loop on "data leaves the device" use cases beyond JSON backup.

10.1 Gradebook export templates

  • Per-SIS CSV export presets (beyond the generic CSV in Phase 0) for common Dutch/EU school administration systems, so a Statistics export drops straight into the receiving gradebook's expected columns

10.2 Calendar/due-date sync

  • Export essay/test assignment due dates as a downloadable .ics file — no calendar API integration required, keeps the offline-first model intact

10.3 Read-only public API for institutional reporting

  • Optional, opt-in HTTP endpoint (Supabase Edge Function) exposing aggregated, anonymized class statistics for school-level reporting dashboards — gated behind the existing admin role, off by default

📌 Known Issues & Technical Debt

Issue Impact Owner Priority
Native Magister SIS API integration (bulk import + live sync) not built — CSV path covers production use today School IT can't fully automate roster sync Reserved for community contribution Low
Multi-device e2e specs (18-multi-device-sync.spec.ts) require a local Supabase stack to verify outside CI; no Docker daemon in some dev sandboxes Slower local iteration on sync code Low

🎓 Development Notes

Testing Standards

  • Unit tests: Vitest (coverage thresholds: 50% lines/statements, 37% functions/branches — see npm run coverage)
  • E2E tests: Playwright, including a dedicated mobile-chrome and supabase project
  • i18n: Parity tests across EN, NL, FR, DE, ES locales — new locales must pass the same parity check and be checked against existing UI layout for overflow
  • Accessibility: axe-core in CI (WCAG 2.1 AA minimum; AAA contrast enforced via contrastCheck.ts)
  • Performance: Offline-first validation; sync latency benchmarks for > 100 rubrics

Last updated: 23 June 2026 — Phase 8 complete (8.1–8.5): co-grading & moderation, department rubric/comment-bank sharing, grading task assignment, manual list reordering (PR #160), plus cohort-based filtering and a class-list/grid drag-and-drop fix shipped in this session. Phases 9–10 remain themed proposals.

Clone this wiki locally