Common Assessment Platform
A comprehensive platform enabling school and district administrators to create standardized assessments, distribute them district-wide via SIS integration, monitor live sessions, and benchmark student performance with multi-level cross-hierarchy analytics.
THE PROBLEM
School districts lacked a unified way to administer standardized assessments across all schools and grade levels. Teachers ran assessments in isolation — there was no cross-hierarchy visibility into how students performed relative to peers in other classrooms, schools, or demographic groups.
Without standardized benchmarking, districts couldn't identify systemic learning gaps, measure curriculum fidelity, or provide data-driven support to Professional Learning Communities. The result: instructional decisions based on incomplete data and no way to track accountability goals across the organization.
0 → 1
Product development in 4 months
4 Roles
District Admin, School Admin, Coordinator, Instructor
3-Level
District, school, and class-level reporting
ASSESSMENT LIFECYCLE
Each assessment follows a four-stage lifecycle. At every stage, the product experience is backed by deliberate engineering decisions.
Author
Create standards-aligned assessments with configurable settings: accommodations, integrity controls, performance bands, and accountability goals
2-step settings form with 8 config sections. State-aware editing: RUNNING / SCHEDULED / COMPLETED each expose different editable fields — no accidental overwrites of live assessments
Distribute
Assign assessments to schools and classes district-wide via SIS integration or manual team selection
SIS integration with term/course/school picker and automatic class mapping. Distribution criteria persisted as structured membership rules, not flat lists
Administer
Teachers start live sessions with join codes, real-time student progress tracking, and a secure testing environment
Live game orchestration: lobby (join code + QR + pending approvals) → running (per-student progress, pause/resume, force-end) → summary. Lockdown browser + impersonation support
Analyze
Multi-level reports for teachers (class), school admins (school), and district admins (district) with AI-generated insights
Cross-hierarchy L1 → L2 drill-down report system. 8+ widget types with desktop, mobile, and print rendering variants. Powered by a new Go analytics microservice
ROLE-BASED ACCESS
Four distinct user roles with cascading permissions. Available actions per assessment are computed dynamically from status + role at render time.
District Admin
School Admin
Assessment Coordinator
Instructor
Dynamic Action System
Each assessment card computes its available actions at render time based on the assessment's current status and the viewer's role. Actions are split into primary CTAs and a secondary dropdown.
Start Session
Running, no sessions started
Admin, Creator
View Report
24h+ after start
Admin, Coordinator
View Sessions
Has active sessions
Any with activity
View Quiz
Creator or shared
Varies
Delete
Any status
Creator only
COMPONENT ARCHITECTURE
A self-contained Vue 3 package with its own routes, stores, services, and domain logic. The assessment flows through five major page-level components.
Listing
Tab-based list (Active / Scheduled / Ended), filters, search, role-aware actions
5 componentsSettings
2-step creation: preferences (8 sections) + assignment (SIS or manual)
12 componentsSessions
Running and completed class sessions, settings summary, reopen modal
6 componentsTeacher Dash
Live game: lobby with join code, running game with player cards, summary
15+ componentsReports
Cross-hierarchy L1/L2 reports, 8+ widgets, desktop/mobile/print
25+ componentsSettings Form — 8 Configuration Sections
Details (Name, Quiz)
Schedule (Start/End, Duration)
Preferences (Timer, Jumble)
Integrity (Lockdown, Impersonation)
Reporting (Bands, Goals)
Accommodations (Read-Aloud, Calculator)
Other (Share, Hide Reports, Grade Sync)
Assignment (SIS / Manual Teams)
DATA FLOWS
Assessment Creation
Step 1: Configure Preferences
Name, quiz, schedule, integrity, accommodations, reporting bands, accountability goals
Step 2: Assign Distribution
SIS flow: search terms → courses → schools → preview class mapping. Or: manual team selection
Validation
isSafeToProceed() — validates all required fields, schedule conflicts, member criteria
API Call
Create assessment with full payload: settings + distribution criteria + schedule
Redirect to Sessions
Assessment created — navigate to session monitoring page
Live Game Session
Teacher clicks "Start Session"
Select classes from assignment list, configure accommodations per student
Backend creates games
One game per class — each gets a unique join code and room
Lobby (Waiting State)
Join Code + QR
Student List Panel
Pending Approvals Queue
Lockdown Browser Status
Teacher Controls
Student Instructions
Running (Active Game)
Per-Student Progress
Score, completion %
Pause / Resume
Via game service API
Force-End Students
Individual or bulk
Join Approval Queue
Approve / reject late joiners
Summary
Post-game overview — results compiled, sessions marked complete
Report Loading
Page mount
Fetch assessment data + performance band configuration
Determine report level
DISTRICT or SCHOOL — based on current user's role and permissions
Load L1 facets
Fetch available filter options: schools, classes, races for dropdowns
Parallel widget loading
8 widgets fetch data concurrently: overview, accuracy, performance bands, item analysis, deep dives, ungraded
User clicks entity → L2 drill-down opens
By Standard
By School
By Participation
L2 Side Drawer
District accuracy, performance bands, accountability goals — scoped to selected entity
REPORT ARCHITECTURE
The most complex subsystem — a cross-hierarchy reporting engine with 8+ widget types, L1/L2 drill-down, and three rendering variants.
L1 Report — Cross-Hierarchy Overview
District-wide or school-wide view with filterable widgets
Overview
Performance band summary with total accuracy
Accuracy Bars
Horizontal bars with district average comparison
Performance Bands
Distribution across band thresholds
Item Analysis
Per-question accuracy + response distribution
Standards Heatmap
Color-coded standards deep-dive with pagination
Questions Heatmap
Question-level deep-dive with sorting
Response Distribution
Per-option response breakdown
Ungraded Students
Schools/classes with pending evaluations
L2 Report — Drill-Down Side Drawer
Click any entity in L1 to open a scoped deep-dive
By Standard
Learning standard drill-down
By School
School → class → student
By Participation
Participation level breakdown
Desktop
Full widget dashboard with interactive filters, heatmaps, and clickable drill-down
Mobile
Dedicated mobile widget set with filter sheets, summary sections, and side sheets
Print-optimized layout with header, metadata, and static widget rendering
STORE ARCHITECTURE
Listing Store
Assessment list, search, filters, cursor-based pagination
~450 linesSessions Store
Running/completed sessions, settings, member management
~140 linesReport Store
CA data loading, filter state, performance bands
~190 linesL2 Report Store
Drill-down state: entity type, ID, name, visibility
~35 linesClasses Store
Class list, selection, student lists, accommodations
~300 linesUser Store
Current user role detection and permission mapping
~90 linesListing Store — Deep Dive
The most complex store: concurrent tab fetching with cursor pagination and race condition prevention
State per Tab
RUNNING → hits[] + pagination cursor
SCHEDULED → hits[] + pagination cursor
COMPLETED → hits[] + pagination cursor
ALL → hits[] (search mode)
Key Patterns
- Cursor-based pagination (searchAfter per tab)
- AbortController per status tab
- 500ms debounced search keyword
- Deduplication by assessment ID
- Filter composition (grade, subject, date, creator)
SERVICE LAYER
Three service layers: the legacy Node monolith for CRUD, a new Go microservice for analytics/reports, and a dedicated game service for live operations — migrated incrementally behind feature flags.
Legacy API (Node)
- CRUD: create, read, update, delete
- Search with v1/v2 pagination
- Start assessment sessions
- Class list and member management
- SIS resource search
Analytics API (Go)
- L1 facets and overview
- Performance distribution by entity
- Accuracy distribution by school/class
- Item analysis + response distribution
- Standards and questions deep-dive
- Ungraded students tracking
- Accountability goal tracking
Game Service
- Pause / resume live games
- Player join approval queue
- Bulk approve / reject players
- Force-end individual students
- Real-time game state management
Feature-Flagged Migration Path
Node Monolith
V1 UI + V1 API
Feature Flag
Instant rollback
Go Microservice
V2 UI + Go API
KEY DECISIONS
Self-Contained Package Architecture
Common Assessments ships as its own Vue 3 package with dedicated routes, stores, services, and domain types. This gave the team full autonomy — no merge conflicts with other product teams, independent release cycles, and clear ownership boundaries in a monorepo with 10+ packages.
State-Aware Editing
A RUNNING assessment can only edit end time and duration. A SCHEDULED one can additionally change start time, integrity, and accommodations. A COMPLETED one can only update reporting config. This is enforced by a status-to-fields mapping that controls which form sections are editable — preventing accidental changes to live assessments.
Feature-Flagged Backend Migration
The legacy Node monolith was replaced with a Go microservice for analytics — but not all at once. Feature flags switch between V1 (Node) and V2 (Go) service layers, as well as corresponding V1/V2 UI components. This allowed zero-downtime migration with instant rollback if regressions appeared.
Cursor-Based Pagination + Abort Controllers
The listing page has 3 concurrent tabs (Active, Scheduled, Ended) that each paginate independently. Using cursor-based pagination (searchAfter) instead of offset pagination avoids drift on real-time data. Each tab has its own AbortController — switching tabs cancels the previous request, preventing race conditions.
Cross-Hierarchy L1/L2 Report Architecture
Rather than building separate report pages for district, school, and class views, a single report page adapts based on the user's role. L1 shows the overview with 8 widgets. Clicking any entity opens an L2 side drawer with scoped drill-down. This reduced the component surface area by ~60% while supporting all hierarchy levels.
PACKAGE ARCHITECTURE
Common Assessment Package
Self-contained: routes, pages, stores, services, domain logic
Shared CA Library
- Shared CA types and interfaces
- Shared services and API clients
- Shared stores and utilities
- Cross-package CA constants
Shared Platform Libraries
- Domain types (classes, performance bands)
- Service discovery and HTTP client
- Analytics, routing, logging
- Differentiation / accommodations
Design System
Reusable UI components and tokens
Editor Shared
Quiz viewer, assessment utilities
Built with Vue 3, TypeScript, Go, PostgreSQL, and MongoDB