v2 Admin Spec — Semester Management
Semester Management
Domain 3 of the Enhanced Candidate A navigation structure. Contains: Semesters list + Semester Hub Page (5 tabs: Overview, Setup Checklist, Enrollment, End Checklist, Onboarding Support), Welcome Package, Tags, Operations. Primary workflows served: WF1 (Semester Setup), WF3 (Semester Close)
1. Domain Overview
Semester Management groups everything related to the lifecycle of a semester -- from initial setup through active management to close. Moving Welcome Package, Tags, and Operations here from the former Settings section puts them where they logically belong: these are all semester-scoped configuration items.
Key design decisions:
- Semester Hub Page is the centerpiece -- a multi-tab entity page consolidating all semester configuration, enrollment visibility, end-of-semester tracking, and onboarding support into one place
- Setup Checklist is a borrowed workflow concept (from WS1.3) that tracks completion without enforcing sequence -- the admin can configure items in any order
- End Checklist is a flat, non-gated checklist structurally parallel to Setup Checklist. Automatic items are driven by backend triggers; manual items are admin-completed. Directly addresses the pain point where gated sequencing felt too rigid for 1-3 power users
- Onboarding Support tab groups student-facing onboarding affordances (group chat links, welcome videos, countdown) separate from the operational Setup Checklist
- Tags moved here because tags are created per semester (semester-scoped)
- Operations moved here because bulk actions (promotions, registrations) are semester events
Sidebar items:
Semester Management
Semesters <- from top-level
[Semester Hub Page] (NEW -- rich multi-tab semester view)
[Tab: Overview]
[Tab: Setup Checklist]
[Tab: Enrollment]
[Tab: End Checklist] <!-- v2 change: replaces Close Workflow, see ADR-001 -->
[Tab: Onboarding Support] <!-- v2 change: new tab, see Framework v2 §3.2 -->
Welcome Package <- from Settings
Tags <- from Settings
Operations (bulk actions) <- from Settings (4 cards, down from 5 — Level 0 promote moved to Enrollment tab per ADR-005)
Data tables referenced: semester, user_link_level_tag, lessonsnew, assessment, resources, live_sessions, recordings, tutorials, mcqquestion, quiz, level_tag, users, user_profile, tags, subscriptions, group_members, group_name
Workarounds Eliminated
| ID | Workaround | Current Tool | Replaced By |
|---|---|---|---|
| W1 | Semester setup tracked via personal checklists | Google Sheets / paper | Setup Checklist tab (Section 3.6) |
| W2 | Content readiness verified by visiting each screen individually | Manual navigation (19+ screens) | Setup Checklist with inline previews and deep links (Section 3.6) |
| W3 | Promotion decisions tracked in spreadsheet before billing | Google Sheets | End Checklist Step 2 Pass/Fail (Section 3.8) |
| W4 | Payment setup done before promotions finalized | Stripe Dashboard + guesswork | End Checklist Step 4 scope-gated to passing L1–L4 students (Section 3.8) |
| W5 | Semester close tasks tracked manually with no verification | Email / verbal confirmation | End Checklist 5-step progress bar (Section 3.8) |
| W6 | Enrollment counts require manual cross-referencing | Database queries | Enrollment tab with live counts and filters (Section 3.7) |
2. Screen: Semesters List
2.1 Purpose
View all semesters with their status. Entry point to Semester Hub pages.
2.2 Entry Points
- Sidebar: Semester Management > Semesters
- Dashboard: phase prompt click
2.3 Layout
Data table (small dataset, no pagination needed). Uses standard Data Table pattern from 01-global-patterns.md Section 4.1. No filter bar (typically <10 semesters).
2.4 Data Displayed
| Column | Source | Sortable | Notes |
|---|---|---|---|
| Name | semester.name |
Yes (default: most recent first by start_date) |
Clickable --> Semester Hub |
| Start Date | semester.start_date |
Yes | Formatted as "Mar 10, 2026" |
| End Date | semester.end_date |
Yes | Formatted as "Jul 15, 2026" |
| Registration | semester.registration_status |
Yes | Badge: Open (green, when registration_status = 1) / Closed (gray, when registration_status = 0) |
| Status | semester.is_current |
Yes | Badge: Active (green, when is_current = 1) / Inactive (gray, when is_current = 0 and dates are past) / Draft (blue, when is_current = 0 and start_date is in the future) |
| Students | Count of user_link_level_tag where semester_id = this semester |
Yes | Number (e.g., "247") |
| Setup Progress | Computed: checklist completion percentage (configured items / total applicable items from Setup Checklist) | No | Progress bar or "X/Y" format (e.g., "14/18 configured") |
2.5 Actions
| Action | Trigger | Permission | Behavior | Confirmation |
|---|---|---|---|---|
| View Semester | Row click | All | Navigates to Semester Hub Page (default tab: Overview) | No |
| Create Semester | "Create Semester" button (top-right) | Admin | Opens create modal: Name (text), Start Date (date picker), End Date (date picker), Registration Start Date (date picker, optional), Content Availability Date (date picker, optional), "Clone content from previous semester" checkbox (default: ON, with dropdown showing most recent prior semester pre-selected). On save: creates semester record with is_current = 0 and registration_status = 0, auto-creates default Setup Checklist items. If clone checkbox is ON: automatically clones all content (video lessons, assessments, resources, tutorials, quizzes, MCQ questions, tags, welcome package files) from the selected previous semester. Toast: "Semester '[name]' created. Content cloned from [Previous Semester]." If clone fails: Toast (warning): "Semester created; content clone failed — use Clone from Previous button on Setup Checklist to retry." |
No |
| Edit Semester | Edit icon on row (appears before Delete) | Admin | Opens edit modal pre-filled with current semester fields: Name, Start Date, End Date, Registration Start Date, Content Availability Date. On save: updates semester record. Toast: "Semester '[name]' updated." Dates are also editable inline from the Overview tab (§3.5). |
No |
| Delete Semester | Delete icon on row (rightmost column) | Admin | Blocked if students enrolled: button disabled with tooltip "Cannot delete: X students enrolled. Remove all enrollments first." If 0 students: destructive confirmation (01-global-patterns.md Section 4.6): "Delete [name]? All associated content and tags will be permanently removed. This cannot be undone." On confirm: deletes semester record and cascades to associated content records. |
Destructive |
Auto-Transition quick access
A prominent "Auto-Transition" button appears in the toolbar above the table (primary style, with calendar-clock icon). Clicking opens a dialog listing all semesters with their current auto-transition status (on/off) and scheduled activate/deactivate dates. From this dialog the admin can toggle auto-transition for any semester without navigating into its Hub. The same toggle also remains in the Overview tab (§3.5) for in-context control.
2.6 States
| State | Display |
|---|---|
| Has semesters | Data table with semester rows, sorted by start date descending |
| No semesters | Empty state (01-global-patterns.md Section 4.8): "No semesters created." + "Create Semester" button |
| Loading | Skeleton data table (01-global-patterns.md Section 4.9) |
| Error | "Unable to load semesters. Please try again." + "Retry" button |
2.7 Role Visibility
- Admin: Full view + Create/Edit/Delete actions + Auto-Transition dialog
- View-Only: View table only (no Create, Edit, Delete, or Auto-Transition buttons)
- TA / Support Staff: Hidden (sidebar item not visible, per 01-global-patterns.md Section 3.2)
3. Screen: Semester Hub Page (Rich Entity Page)
3.1 Purpose
Single consolidated view of everything about a semester: configuration, content setup status, enrolled students, end-of-semester tracking, and onboarding support. This is the second most complex entity page in the system (after Student Detail Page with 6 tabs). Directly addresses WF1 (19+ screens --> 8-10) and WF3 (8+ screens --> 4-6).
3.2 Entry Points
- Semesters list: row click
- Dashboard: phase prompt link (e.g., "Spring 2026 -- Setup Phase" click)
- Global search: semester result click (01-global-patterns.md Section 2.3)
- Student Detail > Semester History tab: semester name click (03-student-management.md)
- Setup Checklist / End Checklist deep link return ("Return to Checklist" affordance from content screens -- see Section 3.6 / 3.8)
3.3 Entity Header
Persistent header visible across all tabs (follows Entity Page pattern from 01-global-patterns.md Section 4.11):
| Field | Source | Format |
|---|---|---|
| Semester Name | semester.name |
Large text (page title) |
| Date Range | semester.start_date -- semester.end_date |
Text: "Mar 10 -- Jul 15, 2026" |
| Status | semester.is_current |
Badge: Active (green, is_current = 1) / Inactive (gray, is_current = 0 and dates past) / Draft (blue, is_current = 0 and start_date future) |
| Registration | semester.registration_status |
Badge: Open (green, registration_status = 1) / Closed (gray, registration_status = 0) |
| Phase | Computed from dates and status: if start_date > today then "Setup"; if is_current = 1 and today between start_date and end_date then "Active"; if today > end_date or End Checklist has progress then "Close" |
Phase badge: Setup (blue) / Active (green) / Close (amber) |
| Students Enrolled | Count of user_link_level_tag where semester_id = this semester and user_semester_status = 1 (enrolled) |
Number (e.g., "247 students") |
| Setup Progress | Checklist completion percentage (from Setup Checklist tab data) | "X of Y configured" + progress bar |
Header action: Clone Content from Previous
A secondary-style "Clone from Previous" button in the header allows the admin to re-run or retry the auto-clone at any time (useful if auto-clone was skipped on create, partially failed, or a later-approved prior semester is preferred as the source). Opens the same semester selector dialog used by Setup Checklist's per-group clone. Confirmation: "Clone content from [Previous Semester]? Existing content in [Current Semester] will NOT be overwritten."
Breadcrumb: Semester Management > Semesters > [Semester Name]
3.4 Tab Structure
| Tab | Label | Badge | Default |
|---|---|---|---|
| 1 | Overview | -- | Yes |
| 2 | Setup Checklist | "X remaining" count (number of unconfigured, non-N/A items) | No |
| 3 | Enrollment | Student count (total enrolled) | No |
| 4 | End Checklist | "X remaining" count (number of incomplete, non-N/A items) | No |
| 5 | Onboarding Support | -- | No |
Tab behavior follows 01-global-patterns.md Section 4.11: lazy-load on first activation, state preserved when switching, URL updates with tab name (e.g., /semesters/123#setup-checklist, /semesters/123#end-checklist, /semesters/123#onboarding-support), sticky tab bar on scroll.
3.5 Tab: Overview
Data Displayed
Dates section (card layout with inline documentation -- info icon tooltips on each field, per 01-global-patterns.md Section 6.1):
| Field | Source | Display | Tooltip |
|---|---|---|---|
| Start Date | semester.start_date |
Formatted date or "Not set" with "Set Date" link | "The first day of the semester. Students can begin lessons on this date." |
| End Date | semester.end_date |
Formatted date or "Not set" with "Set Date" link | "The last day of the semester. Determines when end-of-semester tracking should begin." |
| Registration Start | semester.registration_start_date |
Formatted date or "Not set" with "Set Date" link | "When the registration form opens. Can be before the semester start date." |
| Content Availability Date | semester.content_availability_date |
Formatted date or "Not set" with "Set Date" link | "When students can see this semester's content in the app. Can differ from start date." |
Status Controls section (toggle switches with inline documentation):
| Control | Source | Behavior | Tooltip |
|---|---|---|---|
| Registration Open | semester.registration_status toggle (maps to 1/0) |
Toggles registration open/closed. Updates registration_status in database. Toast: "Registration [opened/closed] for [semester name]." |
"When ON, students can register for this semester. Turn OFF after enrollment is complete." |
| Active Semester | semester.is_current toggle (maps to 1/0) |
Makes this the active semester. WARNING modal before toggle: "Setting this as active will deactivate any currently active semester. Content will be served from this semester. Continue?" On confirm: sets is_current = 1 for this semester, sets is_current = 0 for all other semesters. Toast: "[Semester name] is now the active semester." |
"Only one semester can be active at a time. The active semester's content is served to students in the app." |
| Auto-Transition | New field: semester.auto_transition_enabled + uses existing date fields |
Toggle + date preview. When enabled, shows: "Will activate on [start_date] and deactivate on [end_date]." When toggled ON: confirmation "Enable auto-transition? This semester will automatically become active on [start_date] and deactivate on [end_date]." | "When enabled, this semester will automatically become active on its start date and deactivate on its end date. Requires both start and end dates to be set." |
Automation section (read-only summary cards):
| Field | Source | Purpose |
|---|---|---|
| Email Schedule Preview | Query automation email templates where semester_id = this semester, ordered by trigger date |
Shows list of configured automated emails with their trigger conditions and scheduled dates. Format: "[Template Name] -- [Trigger] -- [Date or 'On event']". Example: "Welcome Email -- On registration -- Immediate", "Week 1 Reminder -- Week 1 start -- Mar 17, 2026" |
| Upcoming Automations | Computed from dates and settings | List of scheduled automated actions with countdown. Examples: "Registration closes in 3 days (Mar 13)", "Semester activates in 7 days (Mar 17)", "Content becomes available in 5 days (Mar 15)", "Auto-transition scheduled: Mar 17" |
Actions
| Action | Trigger | Permission | Behavior |
|---|---|---|---|
| Edit Dates | "Edit" button on Dates section header | Admin | Inline edit mode: date fields become date pickers. "Save" / "Cancel" buttons appear. On save: updates semester record. Toast: "Dates updated." |
| Toggle Controls | Toggle switches in Status Controls section | Admin | See individual toggle behaviors above |
| Preview Email Schedule | "View All Emails" link in Automation section | All | Navigates to Communication > Automation Emails filtered to this semester |
States
| State | Display |
|---|---|
| Fully configured | All dates set, status controls shown with current values, automation section populated |
| New semester | Some dates may be "Not set" -- each empty field shows "Not set" with "Set Date" link (clicking enters inline edit mode for that field). Automation section shows "No automations scheduled -- configure dates and email templates to see scheduled actions." |
| Loading | Skeleton cards for each section (01-global-patterns.md Section 4.9) |
| Error | "Unable to load semester details. Please try again." + "Retry" button |
3.6 Tab: Setup Checklist
Borrowed from Workflow framework (WS1.3): tracks completion without enforcing sequence. The admin can configure items in any order. Enhanced with Candidate C elements: deep links to content screens with semester pre-filtered, inline content previews, and "return to checklist" affordance.
Layout
Grouped checklist with overall progress bar at top. Each group is a collapsible section. Each item shows status, count, and action link.
Overall Progress
Top of tab: progress summary card.
| Element | Source | Format |
|---|---|---|
| Progress Text | Computed: configured items / total applicable items (excluding N/A) | "Setup Progress: X of Y items configured (Z%)" |
| Progress Bar | Same computation | Visual progress bar: green fill proportional to completion percentage |
| Status Message | Computed from percentage | At 100%: green message "All setup items configured for [Semester Name]." At <100%: amber message "X items remaining." |
Checklist Structure
Items grouped by content type. Within each group, one item per level (where applicable) or one aggregate item (where content is not level-scoped).
Group: Video Lessons
| Item | Status Source | Status Display | Action |
|---|---|---|---|
| Level 0 Video Lessons | Count of lessonsnew where semester_id = this semester AND level_tag_id = Level 0 tag ID |
Configured: green checkmark + "X videos" / Not Configured: amber circle + "Not Configured" | "Configure -->" deep link to Content > Video Lessons with URL params ?semester=[id]&level=0 (semester + Level 0 pre-filtered) |
| Level 1 Video Lessons | Count of lessonsnew where semester_id = this semester AND level_tag_id = Level 1 tag ID |
Same pattern | Deep link to Content > Video Lessons with ?semester=[id]&level=1 |
| Level 2 Video Lessons | Count of lessonsnew where semester_id = this semester AND level_tag_id = Level 2 tag ID |
Same pattern | Deep link with ?semester=[id]&level=2 |
| Level 3 Video Lessons | Count of lessonsnew where semester_id = this semester AND level_tag_id = Level 3 tag ID |
Same pattern | Deep link with ?semester=[id]&level=3 |
| Level 4 Video Lessons | Count of lessonsnew where semester_id = this semester AND level_tag_id = Level 4 tag ID |
Same pattern | Deep link with ?semester=[id]&level=4 |
| Year 2 Video Lessons | Count of lessonsnew where semester_id = this semester AND level_tag_id = Year 2 tag ID |
Same pattern | Deep link with ?semester=[id]&level=year2 |
Group: Assessments (Submissions)
| Item | Status Source | Status Display | Action |
|---|---|---|---|
| Level 0 Assessments | Count of assessment where semester_id = this semester AND level_tag_id = Level 0 tag ID |
Configured: green checkmark + "X prompts" / Not Configured: amber circle | "Configure -->" deep link to Student Management > Submissions with ?semester=[id]&level=0 |
| Level 1 Assessments | Same query pattern for Level 1 | Same display pattern | Deep link with ?semester=[id]&level=1 |
| Level 2 Assessments | Same query pattern for Level 2 | Same display pattern | Deep link with ?semester=[id]&level=2 |
| Level 3 Assessments | Same query pattern for Level 3 | Same display pattern | Deep link with ?semester=[id]&level=3 |
| Level 4 Assessments | Same query pattern for Level 4 | Same display pattern | Deep link with ?semester=[id]&level=4 |
| Year 2 Assessments | Same query pattern for Year 2 | Same display pattern | Deep link with ?semester=[id]&level=year2 |
Group: Resources
| Item | Status Source | Status Display | Action |
|---|---|---|---|
| Level 0 Resources | Count of resources where semester_id = this semester AND level_tag_id = Level 0 tag ID |
Configured: green checkmark + "X files" / Not Configured: amber circle | "Configure -->" deep link to Content > Resources with ?semester=[id]&level=0 |
| Level 1 Resources | Same pattern for Level 1 | Same | Deep link with ?semester=[id]&level=1 |
| Level 2 Resources | Same pattern for Level 2 | Same | Deep link with ?semester=[id]&level=2 |
| Level 3 Resources | Same pattern for Level 3 | Same | Deep link with ?semester=[id]&level=3 |
| Level 4 Resources | Same pattern for Level 4 | Same | Deep link with ?semester=[id]&level=4 |
| Year 2 Resources | Same pattern for Year 2 | Same | Deep link with ?semester=[id]&level=year2 |
Group: Live Sessions
| Item | Status Source | Status Display | Action |
|---|---|---|---|
| Live Sessions (all levels) | Count of live_sessions where semester_id = this semester |
Configured: green checkmark + "X sessions" / Not Configured: amber circle | "Configure -->" deep link to Scheduling > Live Sessions with ?semester=[id] |
Group: Recordings
| Item | Status Source | Status Display | Action |
|---|---|---|---|
| Recordings (all levels) | Count of recordings where semester_id = this semester |
Configured: green checkmark + "X recordings" / Not Configured: amber circle | "Configure -->" deep link to Content > Recordings with ?semester=[id] |
Group: Tutorials
| Item | Status Source | Status Display | Action |
|---|---|---|---|
| Level 0 Tutorials | Count of tutorials where semester_id = this semester AND level_tag_id = Level 0 tag ID |
Configured: green checkmark + "X tutorials" / Not Configured: amber circle | "Configure -->" deep link to Content > Tutorials with ?semester=[id]&level=0 |
| Level 1 Tutorials | Same pattern | Same | Deep link with ?semester=[id]&level=1 |
| Level 2 Tutorials | Same pattern | Same | Deep link with ?semester=[id]&level=2 |
| Level 3 Tutorials | Same pattern | Same | Deep link with ?semester=[id]&level=3 |
| Level 4 Tutorials | Same pattern | Same | Deep link with ?semester=[id]&level=4 |
| Year 2 Tutorials | Same pattern | Same | Deep link with ?semester=[id]&level=year2 |
Group: Quizzes
| Item | Status Source | Status Display | Action |
|---|---|---|---|
| Level 0 Quizzes | Count of quiz where semester_id = this semester AND level_tag_id = Level 0 tag ID |
Configured: green checkmark + "X quizzes" / Not Configured: amber circle | "Configure -->" deep link to Content > Quizzes with ?semester=[id]&level=0 |
| Level 1 Quizzes | Same pattern | Same | Deep link with ?semester=[id]&level=1 |
| Level 2 Quizzes | Same pattern | Same | Deep link with ?semester=[id]&level=2 |
| Level 3 Quizzes | Same pattern | Same | Deep link with ?semester=[id]&level=3 |
| Level 4 Quizzes | Same pattern | Same | Deep link with ?semester=[id]&level=4 |
| Year 2 Quizzes | Same pattern | Same | Deep link with ?semester=[id]&level=year2 |
Group: MCQ Questions
| Item | Status Source | Status Display | Action |
|---|---|---|---|
| Level 0 MCQ Questions | Count of mcqquestion where semester_id = this semester AND level_tag_id = Level 0 tag ID |
Configured: green checkmark + "X questions" / Not Configured: amber circle | "Configure -->" deep link to Content > MCQ Questions with ?semester=[id]&level=0 |
| Level 1 MCQ Questions | Same pattern | Same | Deep link with ?semester=[id]&level=1 |
| Level 2 MCQ Questions | Same pattern | Same | Deep link with ?semester=[id]&level=2 |
| Level 3 MCQ Questions | Same pattern | Same | Deep link with ?semester=[id]&level=3 |
| Level 4 MCQ Questions | Same pattern | Same | Deep link with ?semester=[id]&level=4 |
| Year 2 MCQ Questions | Same pattern | Same | Deep link with ?semester=[id]&level=year2 |
Group: Configuration
| Item | Status Source | Status Display | Action |
|---|---|---|---|
| Welcome Package | Count of welcome package resources for this semester | Configured: green checkmark + "X files" / Not Configured: amber circle | "Configure -->" deep link to Semester Management > Welcome Package with ?semester=[id] |
| Email Templates | Count of automation email templates for this semester | Configured: green checkmark + "X templates" / Not Configured: amber circle | "Configure -->" deep link to Communication > Automation Emails with ?semester=[id] |
| Tags | Count of tags where semester_id = this semester |
Configured: green checkmark + "X tags" / Not Configured: amber circle | "Configure -->" deep link to Semester Management > Tags with ?semester=[id] |
| Teacher Assignments | Whether TAs have been assigned to groups for this semester (check group_name records where semester_id = this semester that have associated group_members) |
Configured: green checkmark + "X groups assigned" / Not Configured: amber circle | "Configure -->" deep link to Teacher Management > Teacher Assignment Criteria |
| TA Schedules | Whether TA availability slots exist for this semester's date range (check TA schedule records overlapping start_date to end_date) |
Configured: green checkmark / Not Configured: amber circle | "Configure -->" deep link to Scheduling > TA Schedules |
| Holidays | Whether holiday records exist for this semester's date range | Configured: green checkmark + "X holidays" / Not Configured: amber circle | "Configure -->" deep link to Scheduling > Holidays |
Group: Custom Items
Admin-defined checklist items specific to this semester. Empty by default.
| Item | Status Source | Status Display | Action |
|---|---|---|---|
| [Custom item name, admin-entered] | Admin-set manually: Pending / Complete / N/A | Complete: green checkmark + (optional) admin note / Pending: amber circle / N/A: gray dash | "Mark Complete" button (toggles status). Optional "Configure -->" link if admin supplied a URL when creating the item. |
Inline Content Preview (from Candidate C)
Each item with "Configured" status includes an expandable preview:
- Collapsed (default): Shows status badge + count only (e.g., "12 videos")
- Expanded (click to expand): Shows the first 3 items inline without navigating away:
- Video Lessons: thumbnail + title for the first 3 videos
- Resources: file icon + title for the first 3 resources
- Assessments: prompt title for the first 3 assessment prompts
- Email Templates: template name + trigger for the first 3 templates
- Other content types: title/name for the first 3 items
- "View all X items -->" link at bottom of expanded preview: navigates to the full content screen with semester pre-filtered (same as "Configure -->" link)
"Return to Checklist" Affordance (from Candidate C)
When navigating from a checklist deep link to a content screen:
| Element | Behavior |
|---|---|
| Banner | A persistent banner appears at the top of the target content screen: "<-- Return to Setup Checklist for [Semester Name]" |
| Trigger | Presence of query parameters ?from=checklist&semester=[id] in the URL |
| Click behavior | Returns to the Semester Hub > Setup Checklist tab with scroll position preserved (scroll position stored in session state before navigation) |
| Dismissal | Banner disappears if the admin navigates away from the content screen via sidebar or breadcrumb (i.e., not via the "Return" link) |
Actions
| Action | Trigger | Permission | Behavior |
|---|---|---|---|
| Mark as N/A | Checkbox per item (appears on hover or always visible) | Admin | Toggles item as "Not Applicable" -- grays out the item, excludes it from progress count. Toast: "[Item] marked as N/A." Reversible: uncheck to restore. |
| Add Note | Note icon per item (appears on hover) | Admin | Opens inline text input below the item. Free text note for tracking (e.g., "Waiting on Vimeo upload from instructor"). Note appears as small gray text below the item when saved. Editable and deletable. Implementation note: this feature was spec'd in v1 §3.6 but was not present in the mockup code as of v2 review — must be built. |
| Add Custom Item | "Add Custom Item" button at bottom of checklist (secondary style) | Admin | Opens modal: Item Name (text, required), Group (dropdown: existing groups or "Custom Items"), Link URL (optional — for an external Configure link), Note (optional). On save: adds item to the chosen group. New items start with "Pending" status. Toast: "Custom item '[name]' added." Custom items can be edited (pencil icon) and deleted (trash icon) from their row; default items cannot. |
| Clone from Previous | "Clone from [Previous Semester]" button per group header | Admin | Dropdown showing previous semesters. On select: confirmation "Clone all [content type] from [Previous Semester] to [Current Semester]? This creates independent copies (not linked to the original)." On confirm: copies all content records of that type from the selected semester, creating new records with this semester's ID. Progress updates after clone. Toast: "Cloned X [content type] from [Previous Semester]." Assumption (OQ5): Independent copies, not linked -- per 00-spec-index.md. |
| Clone All Content | "Clone All from Previous Semester" button at top of tab (prominent when nothing configured) | Admin | Same as per-group clone but applies to ALL content groups. Confirmation: "Clone ALL content from [Previous Semester] to [Current Semester]? This will copy video lessons, assessments, resources, tutorials, quizzes, MCQ questions, email templates, tags, and welcome package files. Existing content in [Current Semester] will NOT be overwritten." |
| Navigate to Configure | "Configure -->" link per item | Admin | Deep links to the target content screen with semester (and level, where applicable) pre-filtered via URL parameters. Sets ?from=checklist&semester=[id] to enable the "Return to Checklist" banner. |
States
| State | Display |
|---|---|
| All configured | Progress bar at 100%. Green message: "All setup items configured for [Semester Name]." All items show green checkmarks. |
| Partially configured | Progress bar shows percentage. Unconfigured items shown with amber circle and "Not Configured" text. Unconfigured items have subtle amber left border for visibility. |
| Nothing configured | Progress bar at 0%. Message: "No content has been configured for this semester." "Clone All from Previous Semester" button displayed prominently. |
| Loading | Skeleton checklist with placeholder groups and items |
| Error | "Unable to load setup checklist. Please try again." + "Retry" button |
3.7 Tab: Enrollment
Purpose
View and manage all students enrolled in this semester. Provides at-a-glance enrollment visibility without navigating to Student Management. Also serves as the Registration Tracker view during the registration window (via the Registration filter preset) and as the entry point for Level 0 bulk promotion.
Data Displayed
Summary bar (horizontal bar above table): "X students enrolled | Y in Level 0 | Z in Level 1 | ... | W in Year 2 | N new this semester"
Source: counts from user_link_level_tag grouped by level_tag_id where semester_id = this semester. "New this semester" count = students whose user_link_level_tag.created_at falls within the semester's registration window (registration_open_date to registration_close_date, or fall back to semester.start_date - 30 days to semester.start_date if those fields don't exist). Includes both first-time enrollees and returning students re-enrolling.
Filter presets (chip bar above filter fields)
| Preset Chip | Applies | Purpose |
|---|---|---|
| All Enrolled | Default — no additional filter | Full enrollment list |
| Registration | All students with user_link_level_tag.created_at in the semester's registration window (registration_open_date to registration_close_date, or fall back to semester.start_date - 30 days to semester.start_date); sorted by enrollment date (newest first) |
Shows all students enrolling in the semester (new first-time enrollees + returning students re-enrolling) — replaces the need for a standalone Registration Tracker screen. Matches stakeholder ask for "a live view of our student body" during the registration window. |
When the Registration preset is active, a sub-filter toggle appears in the filter bar labeled "New This Semester Only". When checked, the view further narrows to level_tag.name = 'Level 0' AND user_link_level_tag.is_first_semester = 1 (first-time enrollees awaiting level assessment).
The Registration preset is selectable regardless of semester phase; its filter criteria work year-round (see §9 open questions on whether to restrict visibility to the registration window).
Filter bar (standard pattern from 01-global-patterns.md Section 4.2):
| Filter | Type | Options |
|---|---|---|
| Search | Text input | Filters by student name or email |
| Level | Dropdown | All / Level 0 / Level 1 / Level 2 / Level 3 / Level 4 / Year 2 (from level_tag table) |
| TA | Dropdown | All / [TA names] (derived from group membership: group_members --> group_name --> assigned TA) |
| Status | Dropdown | All / Enrolled (user_semester_status = 1) / Pass (user_semester_status = 2) / Fail (user_semester_status = 0) |
| Subscription Status | Dropdown | All / Active / Past Due / Cancelled / No Subscription (from subscriptions table or Stripe status) |
Data table:
| Column | Source | Sortable | Filterable |
|---|---|---|---|
| Student Name | users.name via user_link_level_tag.user_id --> users |
Yes (default: alphabetical) | Yes (search in filter bar) |
| Level | level_tag.name via user_link_level_tag.level_tag_id |
Yes | Yes (dropdown in filter bar) |
| TA | Derived: user_link_level_tag.user_id --> group_members.user_id --> group_name --> assigned TA name |
Yes | Yes (dropdown in filter bar) |
| Status | user_link_level_tag.user_semester_status: 0 = Fail (red badge), 1 = Enrolled (blue badge), 2 = Pass (green badge) |
Yes | Yes (dropdown in filter bar) |
| Submissions | Count of student_submitted_assessment where user_id = this student AND semester matches (via assessment --> semester relationship) |
Yes | No |
| Submission Progress | Computed: submissions count / expected count (expected = number of weeks elapsed in semester, capped at total assessment prompts for this level) | No | No (displayed as "X/Y" with mini progress bar) |
| Subscription Status | subscriptions.status where user matches, or Stripe API lookup if no local record |
Yes | Yes (dropdown in filter bar) |
Pagination: Standard pagination (01-global-patterns.md Section 4.1): 25 records per page.
Actions
| Action | Trigger | Permission | Behavior | Confirmation |
|---|---|---|---|---|
| View Student | Student name click | All | Navigates to Student Detail Page (03-student-management.md), default tab | No |
| Enroll Student | "Enroll Student" button (top-right) | Admin | Opens modal: Student search autocomplete (searches users by name/email, excludes already-enrolled students) --> Level selector dropdown (from level_tag table) --> Optional: Core enrollment toggle (is_core_enrollment). On save: creates user_link_level_tag record with semester_id, user_id, level_tag_id, user_semester_status = 1. Toast: "[Student name] enrolled in [Semester] at [Level]." |
No |
| Remove Enrollment | Remove icon on row (rightmost column, appears on hover) | Admin | Destructive confirmation: "Remove [student name] from [semester name]? This will delete their enrollment record but not affect their account or subscription." On confirm: deletes user_link_level_tag record. Toast: "[Student name] removed from [Semester]." |
Destructive |
| Bulk Assign TA | Checkbox selection (leftmost column) + "Assign TA" button (appears in bulk action bar above table) | Admin | TA selector dropdown appears in bulk action bar. Select TA --> confirmation: "Assign [N] students to [TA name]?" On confirm: updates group_members records to assign selected students to the TA's group. Toast: "[N] students assigned to [TA name]." |
Yes (confirmation modal) |
| Bulk-Promote Level 0 | "Promote Level 0 to Level 2" button (toolbar, visible when the Level filter is set to "Level 0" OR the "New This Semester Only" sub-filter is active) | Admin | Opens a confirmation dialog listing all Level 0 students visible under the current filter who have NOT submitted any assessments for this semester (query: user_link_level_tag where level_tag_id = Level 0 AND semester_id = this semester AND user has no records in student_submitted_assessment for this semester). Admin can select/deselect individual students. Confirmation: "Promote [N] Level 0 students to Level 2?" On confirm: updates user_link_level_tag.level_tag_id to Level 2 for selected students. Toast: "[N] students promoted to Level 2." This action replaces the removed Operations Card 5 (see §7 and ADR-005). |
Yes |
| Export | "Export" button (top-right, secondary) | Admin | Downloads CSV of current filtered/sorted view with all visible columns | No |
States
| State | Display |
|---|---|
| Has students | Summary bar + preset chips + filter bar + data table |
| No students | Summary bar shows "0 students enrolled". Empty state below: "No students enrolled in [Semester Name]." + "Enroll Student" button |
| Filtered -- no results | "No students match your filters." + "Clear filters" link |
| Registration preset active, no new enrollees | "No new enrollees yet for [Semester Name]." + link to open registration if registration is currently closed |
| Loading | Skeleton summary bar + skeleton data table |
| Error | "Unable to load enrollment data. Please try again." + "Retry" button |
3.8 Tab: End Checklist
Replaces the v1 gated 5-step Close Workflow with a flat 5-step checklist structurally parallel to the Setup Checklist (§3.6). Each step has a defined scope (which students it applies to), an auto-completion trigger, and — where automation may fail or the admin needs to intervene — a manual fallback interface accessed by clicking the step. There is no ordering gate between steps; they may complete in any order as their trigger conditions fire. Progress bar across the top mirrors the Setup Checklist UX.
Layout
Flat list of 5 numbered steps plus a "Custom Items" section at the bottom. Progress bar at top. Each step row shows: step number, title, scope badge, status indicator, auto-complete trigger note, and "Open" link to the step's detail view. No sub-groups — 5 steps is a short enough list that grouping adds friction.
Inline Documentation Block (01-global-patterns.md Section 6.3)
Collapsible "How does this work?" block at top of tab:
"The End Checklist tracks the 5 tasks required to close a semester. Steps auto-complete as their conditions are met (e.g., the submission close date passes; every student has a final status assigned). For any step, you can click Open to see the current state and — if automation didn't fire or you need to intervene — manually complete individual students. Steps do not need to complete in order; they complete whenever their conditions are met. Add custom items below for anything this semester requires beyond the defaults. When all 5 steps (and any custom items) are complete, the semester closes automatically at midnight EST on the end date."
Overall Progress
| Element | Source | Format |
|---|---|---|
| Progress Text | Computed: complete steps / total applicable steps (excluding N/A) | "End Checklist: X of 5 steps complete" (plus custom-item count if any) |
| Progress Bar | Same computation | Visual progress bar: green fill proportional to completion percentage |
| Status Message | Computed from percentage | At 100%: green message "All end-of-semester steps complete for [Semester Name]. The semester will close automatically at midnight EST on [end_date]." At <100%: amber message "X steps remaining." |
| Last Auto-Update | Timestamp of most recent automatic-step state change | "Last system update: Mar 15, 2026 at 11:02 AM" — helps admins confirm triggers are firing. |
Checklist Structure
The canonical 5 steps per STAKEHOLDER-ANSWERS-2026-04-21.md §1 (Lejla's definition):
Step 1 — All Submissions Reviewed
- Scope: All enrolled students (all levels, including Mastery)
- Type: Automatic (manual fallback via "Open" view)
- Auto-complete trigger: Submission close date has passed AND zero pending submissions remain for this semester
- On click ("Open" action): Deep links to the Submissions screen (
03-student-management.md §4) filtered to this semester, pending-only. Admin (or TA for own students) reviews and grades from there. When the pending list is empty, Step 1 marks itself Complete automatically. Sets?from=end-checklist&semester=[id]for return banner. - Status display: Complete: green checkmark + "Reviewed on [date]" / Pending: amber circle + "[N] students with pending submissions"
Step 2 — Pass/Fail
- Scope: Level 1–4 students only (Mastery students are excluded — their
final_statusis set tomastery_passedautomatically at Step 5) - Type: Semi-automatic (TAs or admins set
final_statusper student; progress auto-tracked) - Auto-complete trigger: 100% of enrolled Level 1–4 students have a
final_statusassigned (pass or fail) - On click ("Open" action): Deep links to Students list (
03-student-management.md §2) filtered to this semester, Level 1–4,final_status IS NULL. TAs can set status for their own assigned students; admins can set for any student. Per-student action: "Set Pass/Fail" → selector (Pass / Fail). Bulk action: "Set Pass/Fail for Selected". Sets?from=end-checklist&semester=[id]for return banner. - Mastery handling: Mastery students do not appear in the Step 2 queue. Their status is deferred to Step 5 auto-pass.
- Status display: Complete: green checkmark + "All L1–L4 students assigned ([N] pass, [M] fail)" / Pending: amber circle + "[N] L1–L4 students without status"
Step 3 — Send Pass/Fail Emails
- Scope: All enrolled students, branched by track:
- L1–L4 students with
final_status = 'pass'→ "End of Semester — Pass (L1–L4)" template - L1–L4 students with
final_status = 'fail'→ "End of Semester — Fail (L1–L4, Opt-in Repeat)" template. Contains opt-in-to-repeat link. Students are NOT automatically re-enrolled; they must follow the link. Opt-in is fully self-service — no admin approval required (confirmed STAKEHOLDER-ANSWERS-2026-04-22 §C Q2). The link directs the student to the repeat-discount checkout (see08-billing-payments.md), which cross-references the per-semester repeat-eligible list. Students who need manual addition to that list (e.g., skipping a semester before repeating) are handled via the per-student "Mark as Repeat-Eligible" action on Student Detail (see03-student-management.md§3.10 Actions tab). - Mastery students → "End of Semester — Mastery Elective Prompt" template. Prompts signup for same or different elective next semester.
- L1–L4 students with
- Type: Automatic send + manual per-student fallback
- Auto-complete trigger: All students have been sent their appropriate email (per their track). Status is tracked per-student in
communication_logs. - On click ("Open" action): Deep links to the End Checklist Email Queue (
11-communication.md §2.6) for this semester, filtered to the "work to do" subset (Unsent + Failed + Bounced). Each row shows: student name, level,final_status, email template that applies to their track, send status, and a per-student "Send Now" button to trigger the correct template manually. Bulk action: "Send Pending Emails". Sets?from=end-checklist&semester=[id]&filter=unsentfor return banner. - Email templates: Three system-seeded templates live in Communication > Automation Emails (see
11-communication.md §2.4.5). Trigger conditions are fixed; template content is admin-editable. - Status display: Complete: green checkmark + "Emails sent: [N] pass, [M] fail, [K] mastery" / Pending: amber circle + "[N] students not yet emailed"
Step 4 — Set Up Automatic Payments
- Scope: Level 1–4 students with
final_status = 'pass'(failing students are excluded — they opt in via the Step 3 email link and re-enroll manually; Mastery students are excluded — they self-enroll in their next elective) - Type: Automatic + manual per-student fallback
- Auto-complete trigger: All eligible passing L1–L4 students have
payment_setup_status = 'created'(or'exempted'where applicable) - On click ("Open" action): Deep links to the End Checklist Payment Setup Queue (
08-billing-payments.md) for this semester, showing passing L1–L4 students with their per-studentpayment_setup_status(Pending / Created / Failed / Exempted). Per-student action: "Set Up Payment" → triggers Stripe subscription creation for next semester start date using the student's existing payment method and plan. Bulk action: "Set Up Payments for Selected". Sets?from=end-checklist&semester=[id]for return banner. - Payment setup definition: Creates a Stripe subscription for the passing student starting on the first day of the next semester. Failed setups (e.g., expired card) show
Failedstatus for admin triage. - Status display: Complete: green checkmark + "[N] payments set up" / Pending: amber circle + "[N] eligible students without payment setup"
Step 5 — Semester Close
- Scope: Semester-level (no per-student action)
- Type: Fully automatic
- Auto-complete trigger: System clock reaches midnight EST on
semester.end_date. At that moment: (a)semester.is_currentis flipped off, (b) Mastery students'final_statusis set tomastery_passed, (c) semester transitions to historical / read-only state. - On click ("Open" action): Read-only confirmation view showing "Semester closes automatically at midnight EST on [end_date]. No admin action required." Shows a countdown when <24 hours remain.
- Status display: Complete: green checkmark + "Closed on [timestamp]" / Pending: amber circle + "Closes at [timestamp]"
Leavers — No checklist step
Per STAKEHOLDER-ANSWERS-2026-04-21.md: "On leavers — no checklist step needed. They handle their own enrollment and payment; they'll simply stay inactive going forward." No admin action is required during semester close for leavers; they remain inactive until they independently re-enroll.
Custom Items
Admin-defined items specific to this semester. Empty by default. Same UX as Setup Checklist custom items (§3.6).
| Item | Type | Status Display | Action |
|---|---|---|---|
| [Custom item name, admin-entered] | Manual (Automatic available in production only — requires backend trigger binding) | Pending / Complete / N/A | Optional "Configure →" link if admin supplied a URL. "Mark Complete" button toggles status. |
Actions
| Action | Trigger | Permission | Behavior |
|---|---|---|---|
| Open (step detail) | "Open" link per step row | Admin for all steps; TAs may also open Step 1 (to review their own students' pending submissions) and Step 2 (to set Pass/Fail for their own students). Steps 3–5 are admin-only. | Deep links to the relevant filtered view per step (see each step's "On click" description). All set ?from=end-checklist&semester=[id] for return banner. |
| Manual Send (Step 3 per-student) | "Send Now" button per row in Step 3 detail view | Admin | Triggers the student's appropriate End Checklist email via Communication > Automation Emails. Toast: "[Template name] sent to [student name]." If already sent, shows resend confirmation. |
| Manual Payment Setup (Step 4 per-student) | "Set Up Payment" button per row in Step 4 detail view | Admin | Triggers Stripe subscription creation for this student for next semester. Toast: "Payment setup created for [student name]." Updates payment_setup_status. |
| Set Pass/Fail (Step 2 per-student) | "Set Pass/Fail" action on Students list row | Admin (any student); TA (own assigned students) | Opens selector (Pass / Fail). On save: updates final_status. Toast: "[Student name] marked [pass/fail]." Reversible by re-selecting. |
| Bulk Send Pending Emails (Step 3) | "Send Pending Emails" button on Step 3 detail view | Admin | Queues emails for all listed students. Confirmation: "Send pending End Checklist emails to [N] students?" |
| Bulk Set Up Payments (Step 4) | "Set Up Payments for Selected" button on Step 4 detail view | Admin | Queues Stripe subscription creation for all selected students. Confirmation: "Set up payments for [N] passing students?" |
| Bulk Set Pass/Fail (Step 2) | "Set Pass/Fail for Selected" button on Students list, L1–L4 filtered | Admin; TA (own students only) | Bulk selector (Pass / Fail) applies to all selected. Confirmation: "Set [N] students to [pass/fail]?" |
| Add Note | Note icon per step (appears on hover) | Admin | Opens inline text input. Free text note. Saved note shows as small gray text below the step. Editable and deletable. |
| Add Custom Item | "Add Custom Item" button at bottom of checklist | Admin | Opens modal: Item Name (required), Type (Manual; Automatic is production-only), Link URL (optional — for Configure link), Note (optional). On save: adds to Custom Items section. Custom items are editable (pencil) and deletable (trash); the 5 default steps are not. |
| Retry Automatic Check | "Retry" link on Pending automatic steps (admin troubleshooting) | Admin | Requests backend to re-evaluate the trigger condition immediately (production only). Mockup: toast "Trigger check requested" with no state mutation. |
"Return to End Checklist" Affordance
Same pattern as Setup Checklist's "Return to Checklist" banner (§3.6). When a step's "Open" link is followed, the target screen shows a persistent banner: "← Return to End Checklist for [Semester Name]." Triggered by ?from=end-checklist&semester=[id]. Clicking returns to this tab with scroll position preserved.
States
| State | Display |
|---|---|
| Not started | All steps Pending. Progress bar at 0%. Message: "End-of-semester tasks have not begun. Automatic steps will complete as their triggers fire; you can click any step to see its current state." |
| In progress | Progress bar shows percentage. Mix of Complete / Pending steps. Steps displayed in numerical order (1 through 5). |
| All complete | Progress bar at 100%. Green message: "All end-of-semester steps complete for [Semester Name]. The semester will close automatically at midnight EST on [end_date]." |
| Automatic step stuck | Pending automatic steps that have been Pending longer than their expected trigger window show an amber warning icon with tooltip: "Trigger condition has not fired as expected. Click Open to see current state or Retry to re-run the check." |
| Not yet applicable | If semester phase is Setup or early Active: informational message at top "End Checklist is primarily used in the Close phase. Current phase: [Setup/Active]. Steps are visible but most triggers fire closer to or after the end date." Does not block access. |
| Loading | Skeleton list of 5 step rows + progress bar. |
| Error | Per-step error handling: if data for a step fails to load, that row shows "Unable to load step status. Please try again." with a Retry button. Other steps remain functional. |
3.9 Tab: Onboarding Support
Purpose
Configure student-facing onboarding affordances for this semester: Telegram/WhatsApp group chat links, on-app welcome videos, and a semester-start countdown timer. This tab is admin-facing configuration; student-facing rendering is in the student app (backend-bound).
Layout
Three stacked cards on a single tab — one per sub-feature. Each card is self-contained with its own fields, controls, and state.
Card 1: Group Chat Links
Manages Telegram and/or WhatsApp group links that students see in the app. Each link has a label, URL, and access scope.
Data displayed (list within card):
| Column | Source | Notes |
|---|---|---|
| Label | Admin-entered text (e.g., "Spring 2026 Level 1 Telegram") | Required |
| Type | Dropdown: Telegram / WhatsApp / Other | Determines the icon displayed |
| URL | Admin-entered URL | Required; validated as a URL |
| Access Scope | Admin-set: All students / By role / By level / Per student | See Access Scope below |
| Status | Toggle: Active / Inactive | Inactive links hidden from students |
| Last Updated | Timestamp | Auto-set on save |
Access Scope options (determined at link creation / edit — see §9 open question on final scope model):
- All students — visible to every enrolled student in this semester
- By role — visible to students holding a selected role (e.g., mastery, regular). Role dropdown populated from user roles.
- By level — multi-select checkboxes: Level 0 / Level 1 / Level 2 / Level 3 / Level 4 / Year 2
- Per student — multi-select autocomplete of individual students enrolled in this semester
Actions:
| Action | Trigger | Permission | Behavior |
|---|---|---|---|
| Add Group Link | "Add Group Link" button (card top-right) | Admin | Opens modal: Label, Type, URL, Access Scope (with dependent UI per scope option), Active toggle. On save: creates link record for this semester. Toast: "Group link '[label]' added." |
| Edit | Edit icon per row | Admin | Opens modal pre-filled. All fields editable. |
| Toggle Active | Active toggle per row | Admin | Flips Active/Inactive. Toast: "[Label] [activated/deactivated]." |
| Delete | Delete icon per row | Admin | Destructive confirmation: "Delete '[label]'? Students who can see this link will lose access immediately." On confirm: deletes the link record. |
States:
| State | Display |
|---|---|
| Has links | List of links with edit/toggle/delete controls |
| Empty | "No group chat links configured for [Semester Name]." + "Add Group Link" button |
| Loading | Skeleton list |
| Error | "Unable to load group links. Please try again." + "Retry" button |
Card 2: Welcome Videos
Configures welcome videos that appear on the student home screen when they open the app (especially on first launch in this semester).
Notes:
[backend]: actual video playback and delivery to the student app is production-only. This card is a UI affordance only — the mockup allows configuration but does not play videos to students.- Videos are semester-scoped; a student sees videos assigned to their current semester.
Data displayed (list within card):
| Column | Source | Notes |
|---|---|---|
| Title | Admin-entered text | Required |
| Source | Dropdown: Upload / URL (YouTube/Vimeo/direct link) | Determines how the video is supplied |
| File / URL | File picker (if Upload) or URL field (if URL) | Required |
| Display Order | Integer (admin-set) | Lower numbers shown first |
| Status | Toggle: Active / Inactive | Inactive videos hidden from students |
| Thumbnail | Auto-generated for URL sources; admin-uploadable for file sources | Preview image |
Actions:
| Action | Trigger | Permission | Behavior |
|---|---|---|---|
| Add Video | "Add Video" button (card top-right) | Admin | Opens modal: Title, Source, File/URL, Thumbnail (optional), Display Order, Active toggle. On save: creates video record. Toast: "Welcome video '[title]' added." |
| Edit | Edit icon per row | Admin | Opens modal pre-filled. |
| Reorder | Drag handle per row | Admin | Drag-and-drop to reorder. Auto-saves on drop. |
| Toggle Active | Active toggle per row | Admin | Flips Active/Inactive. |
| Preview (admin) | Preview icon per row | Admin | Opens modal with video player — admin-only preview. [backend] for student-facing playback. |
| Delete | Delete icon per row | Admin | Destructive confirmation: "Delete '[title]'?" |
States:
| State | Display |
|---|---|
| Has videos | Ordered list with drag handles and controls |
| Empty | "No welcome videos configured for [Semester Name]." + "Add Video" button |
| Loading | Skeleton list |
| Error | "Unable to load welcome videos. Please try again." + "Retry" button |
Card 3: Countdown Timer
A single on/off timer that counts down to the semester start, surfaced on the student onboarding/home screen.
Fields:
| Field | Source | Behavior |
|---|---|---|
| Enabled | Toggle | When ON, countdown is visible to students. When OFF, hidden. Default: OFF. |
| Target Date & Time | Defaults to semester.start_date at 00:00 local time; admin can override |
Datetime picker. Validates that target is in the future when enabling. |
| Display Label | Admin-entered text | e.g., "Spring 2026 begins in:". Default: "[Semester Name] begins in:" |
| Audience | Dropdown: All new students / All students / By level | Mirrors access-scope patterns; default "All new students" |
| Preview | Read-only block | Shows live countdown using current target date: e.g., "14 days, 3 hours, 22 minutes". Updates once per minute. |
Actions:
| Action | Trigger | Permission | Behavior |
|---|---|---|---|
| Toggle Enabled | Enabled toggle | Admin | Flips on/off. Toast: "Countdown [enabled/disabled]." |
| Edit | "Edit" button on card | Admin | Inline edit mode: fields become editable. Save / Cancel. |
States:
| State | Display |
|---|---|
| Enabled, future target | Preview shows live countdown |
| Enabled, past target | Amber warning: "Target date is in the past. Students will not see a countdown." + "Edit" link |
| Disabled | Preview hidden or greyed out; fields editable |
| Loading | Skeleton card |
| Error | "Unable to load countdown settings. Please try again." + "Retry" button |
4. Screen: Welcome Package
4.1 Purpose
Manage resources included in the new student welcome package for each semester. These are files (PDFs, documents, media) sent or made available to students upon enrollment. Relocated from Settings to Semester Management because welcome packages are semester-scoped.
Transition hint (01-global-patterns.md Section 6.4): "Formerly under Settings" -- shown for first 30 days after launch.
4.2 Entry Points
- Sidebar: Semester Management > Welcome Package
- Semester Hub > Setup Checklist: "Configure -->" link (with
?from=checklist&semester=[id]for return affordance)
4.3 Layout
Semester selector (dropdown at top, defaults to current/active semester) + resource list with upload capability. Uses standard Data Table pattern for the resource list.
4.4 Data Displayed
| Column | Source | Sortable | Notes |
|---|---|---|---|
| Document Name | Resource title (admin-entered) | Yes (default: by display order) | Clickable to preview/download |
| File | File name + type icon (PDF, DOC, etc.) | No | Shows file extension badge |
| Semester | semester.name (from semester selector context) |
No | Shown if "All semesters" selected in dropdown |
| Upload Date | File upload timestamp | Yes | Formatted as "Mar 10, 2026" |
| Size | File size | Yes | Formatted as "2.4 MB" |
| Order | Display order number (determines order students see resources) | No | Editable via drag handle |
4.5 Actions
| Action | Trigger | Permission | Behavior | Confirmation |
|---|---|---|---|---|
| Upload Resource | "Upload" button (top-right) | Admin | Opens upload modal: Document Name (text), File (file picker -- accepts PDF, DOC, DOCX, PNG, JPG, MP4), Semester (pre-selected from current dropdown context). On save: uploads file, creates resource record. Toast: "[Document name] uploaded." | No |
| Edit | Edit icon on row | Admin | Opens edit modal pre-filled: Document Name (editable), File (replaceable). | No |
| Delete | Delete icon on row | Admin | Destructive confirmation: "Delete [document name]? Students will no longer be able to access this resource." | Destructive |
| Reorder | Drag handle on row (leftmost) | Admin | Drag-and-drop to reorder. Auto-saves on drop. Toast: "Order updated." | No |
| Preview/Download | Document name click | All | Opens file in browser preview (PDFs, images) or downloads (other file types) | No |
| Clone from Previous | "Clone from [Previous Semester]" button (secondary, top-right) | Admin | Dropdown of previous semesters. Confirmation: "Clone all welcome package files from [Previous Semester]? [N] files will be copied to [Current Semester]." Creates independent copies. Toast: "Cloned [N] files from [Previous Semester]." | Yes |
4.6 States
| State | Display |
|---|---|
| Has resources | Resource list with drag handles for reordering |
| Empty | "No welcome package resources for [Semester Name]." + "Upload" button + "Clone from [Previous Semester]" button |
| Loading | Skeleton resource list |
| Error | "Unable to load welcome package. Please try again." + "Retry" button |
4.7 Role Visibility
- Admin: Full CRUD (Upload, Edit, Delete, Reorder, Clone)
- View-Only: View list + Preview/Download. No Upload, Edit, Delete, Reorder, or Clone buttons.
- TA / Support Staff: Hidden (sidebar item not visible)
5. Screen: Email Management (MOVED)
Email Management has moved to Communication > Automation Emails. See
11-communication.mdfor the full specification of automation email templates, sequence view, trigger conditions, template library, preview, test-send, and clone-from-previous functionality.This section header is preserved in
04-semester-management.mdfor cross-reference traceability only. All Email Management functionality, entry points, and data responsibilities now live under the Communication domain.Impact on this domain:
- Sidebar item
Semester Management > Email Managementis removed.- Setup Checklist (§3.6) "Email Templates" deep link retargets to
Communication > Automation Emailswith?semester=[id].- Overview tab (§3.5) "View All Emails" link retargets to
Communication > Automation Emailsfiltered to the current semester.- Semester scoping is preserved in Communication > Automation Emails as a filter (not as a parent domain constraint).
6. Screen: Tags
6.1 Purpose
Create and manage tags for user segmentation. Tags are semester-scoped and sync bidirectionally with InfusionSoft (CRM). Used for marketing segmentation, student categorization, and automated workflow triggers. Relocated from Settings.
Transition hint: "Formerly under Settings" -- shown for first 30 days.
Auto-applied enrollment tags: Per-semester enrollment records carry an enrollment_type field (Continuing / New / Repeat / Year 2 — see 03-student-management.md Students list + Student Detail Enrollment section) which is the canonical source of truth for how a student is enrolled in that semester. To keep InfusionSoft in sync for marketing segmentation, a matching tag (new-[semester], repeat-[semester], continuing-[semester], year2-[semester]) is auto-created by the system and applied to students when their enrollment record is written. Admin can see these tags in this list (typically badged "System" and not deletable), and they sync to InfusionSoft like any other tag. Do NOT use the repeat-[semester] tag in place of the enrollment_type field for in-app filtering — the field is the canonical signal; the tag is a CRM projection.
6.2 Entry Points
- Sidebar: Semester Management > Tags
- Semester Hub > Setup Checklist: "Configure -->" link (with return affordance)
6.3 Layout
Semester selector (dropdown at top, defaults to current/active semester) + tags list. Uses standard Data Table pattern. No filter bar needed (typically <30 tags per semester).
6.4 Data Displayed
| Column | Source | Sortable | Notes |
|---|---|---|---|
| Tag Name | tags.name |
Yes (default: alphabetical) | |
| Semester | semester.name via tags.semester_id |
No | Shown if "All semesters" selected in dropdown |
| Students Tagged | Count of user-tag associations for this tag | Yes | Number (e.g., "45") |
| InfusionSoft Synced | Whether the tag exists in InfusionSoft and is in sync | No | Badge: Synced (green, checkmark) / Not Synced (red, warning icon) / Sync Pending (amber, clock icon) |
| Created | tags.created_at |
Yes | Formatted date |
6.5 Actions
| Action | Trigger | Permission | Behavior | Confirmation |
|---|---|---|---|---|
| Create Tag | "Create Tag" button (top-right) | Admin | Opens modal: Tag Name (text), Semester (pre-selected from dropdown context). On save: creates tags record AND triggers InfusionSoft API sync to create matching tag in CRM. Toast: "Tag '[name]' created and synced to InfusionSoft." If InfusionSoft sync fails: Toast (error): "Tag created locally but InfusionSoft sync failed. Retry from tag list." |
No |
| Edit | Edit icon on row | Admin | Opens modal pre-filled: Tag Name (editable). On save: updates local record AND updates InfusionSoft tag name. | No |
| Delete | Delete icon on row | Admin | Destructive confirmation: "Delete tag '[name]'? This will remove the tag from [N] students and delete it from InfusionSoft." On confirm: removes all user-tag associations, deletes tags record, deletes matching InfusionSoft tag. |
Destructive |
| Retry Sync | "Retry" link (shown only for tags with "Not Synced" status) | Admin | Re-attempts InfusionSoft API sync for this tag. Toast on success: "Tag synced to InfusionSoft." Toast on failure: "InfusionSoft sync failed. Check connection and try again." | No |
6.6 States
| State | Display |
|---|---|
| Has tags | Tags list table |
| Empty | "No tags for [Semester Name]." + "Create Tag" button |
| Loading | Skeleton data table |
| Error | "Unable to load tags. Please try again." + "Retry" button |
| InfusionSoft unavailable | Warning banner at top: "InfusionSoft connection unavailable. Tags can be created locally but will not sync until connection is restored." Tags table still shows with "Not Synced" badges. |
6.7 Role Visibility
- Admin: Full CRUD (Create, Edit, Delete, Retry Sync)
- View-Only: View list only. No Create, Edit, Delete, or Retry buttons.
- TA / Support Staff: Hidden (sidebar item not visible)
7. Screen: Operations (Bulk Actions)
7.1 Purpose
Perform bulk data operations that are semester-scoped. Provides a centralized place for high-volume administrative actions that would be tedious to perform one-by-one. Relocated from Settings.
Transition hint: "Formerly under Settings" -- shown for first 30 days.
7.2 Entry Points
- Sidebar: Semester Management > Operations
7.3 Layout
Action cards -- each bulk operation is a card with icon, title, description, and action button. Cards arranged in a responsive grid (2 columns on desktop, 1 on narrow screens). No data table -- this is a launcher page.
7.4 Available Operations
Card 1: Bulk Year 1 --> Year 2 Promotion
| Field | Detail |
|---|---|
| Icon | Arrow-up icon |
| Title | Bulk Year 1 --> Year 2 Promotion |
| Description | "Promote eligible students from Year 1 to Year 2. Upload a CSV with student IDs to process." |
| Action Button | "Start Promotion" |
| Permission | Admin only |
| Workflow | Click "Start Promotion" --> File picker (CSV, required columns: user_id) --> Upload + validation (checks: all user_ids exist, all are Year 1 students, none already in Year 2) --> Validation results modal showing valid/invalid rows --> Confirmation: "Promote [N] students from Year 1 to Year 2?" --> Processing with progress bar --> Results summary: "[X] promoted successfully, [Y] errors" with downloadable error log |
Card 2: Bulk User Registration
| Field | Detail |
|---|---|
| Icon | Users-plus icon |
| Title | Bulk User Registration |
| Description | "Register multiple students at once. Upload a CSV with student data (name, email, level)." |
| Action Button | "Start Registration" |
| Permission | Admin only |
| Workflow | Click "Start Registration" --> File picker (CSV, required columns: name, email, level) --> Upload + validation (checks: email format valid, no duplicate emails, level values valid) --> Validation results modal --> Semester selector (which semester to register students in) --> Confirmation: "Register [N] students for [Semester Name]?" --> Processing with progress bar --> Results summary: "[X] registered successfully, [Y] errors" with downloadable error log. Auto-generates passwords (4 characters, lowercase -- per business rule #10 in 01-global-patterns.md Section 7) |
Card 3: Upload Backend Resources
| Field | Detail |
|---|---|
| Icon | Upload-cloud icon |
| Title | Upload Backend Resources |
| Description | "Upload resources to the backend for administrative use (not student-facing)." |
| Action Button | "Upload Resources" |
| Permission | Admin only |
| Workflow | Click "Upload Resources" --> File picker (multiple files accepted) --> Semester selector --> Confirmation --> Upload with progress bar --> Results: "[X] files uploaded successfully." |
Card 4: Data Migration
| Field | Detail |
|---|---|
| Icon | Database icon |
| Title | Data Migration |
| Description | "Migrate data between databases. Use for semester transitions or data cleanup." |
| Action Button | "Start Migration" |
| Permission | Admin only |
| Workflow | Click "Start Migration" --> Configuration form (source, destination, data types to migrate) --> Dry run preview showing what will be migrated --> Confirmation: "Migrate [N] records? This will overwrite existing data in the destination." --> Processing with progress bar --> Results summary |
7.5 States
| State | Display |
|---|---|
| Default | All operation cards shown in grid, ready for use |
| In progress | Active operation card shows progress bar with percentage. Other cards remain clickable (operations are independent). Processing card shows "Cancel" button if cancellation is safe. |
| Completed | Active card shows result summary with green success banner: "[X] records processed successfully." If errors: amber banner: "[X] successful, [Y] errors." + "Download Error Log" link (CSV with error details per row). |
| Error | Active card shows red error banner: "Operation failed: [error message]." + "Retry" button + "Download Error Log" link |
| Validation failed | After CSV upload: modal showing validation issues. Table with: Row Number, Field, Issue (e.g., "Row 15: email 'invalid' is not a valid email format"). "Fix and Re-upload" button. |
7.6 Role Visibility
- Admin: All operation cards visible and actionable
- View-Only / TA / Support Staff: Hidden (sidebar item not visible -- bulk operations are admin-only)
8. Cross-Domain Integration Points
This section documents how Semester Management connects to other domains. Each integration is specified in detail in the target domain's spec document; this section provides a summary for reference.
8.1 Dashboard (02-dashboard.md)
| Dashboard Element | Links To | Data Source |
|---|---|---|
| Phase prompt tile | Semester Hub Page (appropriate tab based on phase) | semester.is_current, semester.start_date, semester.end_date, computed phase |
| Setup progress indicator | Semester Hub > Setup Checklist tab | Checklist completion computation |
| "Semester close due" alert | Semester Hub > End Checklist tab | Computed from semester.end_date proximity AND End Checklist item status (e.g., "[N] items remaining") |
8.2 Student Detail Page (03-student-management.md)
| Integration | Direction | Details |
|---|---|---|
| Semester History tab | Student --> Semester | Student Detail shows semester enrollment history with semester names clickable --> Semester Hub |
| Enrollment | Semester --> Student | Enrollment tab student names clickable --> Student Detail Page |
| End Checklist Step 1 — Submissions Review | Semester → Student | Step 1 "Open" link deep-links to the Submissions screen (03-student-management.md §4) filtered to this semester, pending submissions only. Sets ?from=end-checklist&semester=[id] for the return banner. Completion computed from submission-pending count reaching zero. |
| End Checklist Step 2 — Pass/Fail | Semester → Student | Step 2 "Open" link deep-links to 03-student-management.md §2 Students list filtered to this semester, Level 1–4, final_status IS NULL. Per-student action "Set Pass/Fail" writes final_status on user_link_level_tag. Mastery students are excluded from this scope. Bulk action available. TAs can set status for own assigned students; admins for any. Completion computed from L1–L4 students without final_status reaching zero. |
8.3 Content Domain (05-content.md)
| Integration | Direction | Details |
|---|---|---|
| Setup Checklist deep links | Semester --> Content | "Configure -->" links navigate to Content screens with ?semester=[id]&level=[level] pre-filtered |
| Return to Checklist | Content --> Semester | "Return to Setup Checklist" banner on Content screens when ?from=checklist param present |
| Content scoping | Shared | All content tables reference semester_id -- content is always scoped to a semester (business rule #6) |
8.4 Scheduling Domain (06-scheduling.md)
| Integration | Direction | Details |
|---|---|---|
| Live Sessions link | Semester --> Scheduling | Setup Checklist "Configure -->" for Live Sessions navigates to Scheduling > Live Sessions with semester filter |
| TA Schedules link | Semester --> Scheduling | Setup Checklist "Configure -->" for TA Schedules navigates to Scheduling > TA Schedules |
| Holidays link | Semester --> Scheduling | Setup Checklist "Configure -->" for Holidays navigates to Scheduling > Holidays |
8.5 Teacher Management Domain (07-teacher-management.md)
| Integration | Direction | Details |
|---|---|---|
| Teacher Assignment link | Semester --> Teacher | Setup Checklist "Configure -->" for Teacher Assignments navigates to Teacher Management > Teacher Assignment Criteria |
| Enrollment TA filter | Shared | Enrollment tab TA column and filter reference TA data from Teacher Management |
8.6 Billing & Payments Domain (08-billing-payments.md)
| Integration | Direction | Details |
|---|---|---|
| End Checklist Step 4 — Set Up Automatic Payments | Semester → Billing | Step 4 "Open" link deep-links to the End Checklist Payment Setup Queue in 08-billing-payments.md for this semester's passing L1–L4 students (final_status = 'pass' AND level IN (1,2,3,4)). Per-student payment_setup_status (Pending / Created / Failed / Exempted) is computed from Stripe subscription state. Per-student "Set Up Payment" triggers creation of a Stripe subscription for next semester start. Bulk action available. Completion computed from eligible students without payment_setup_status = 'created' reaching zero. |
| Enrollment subscription column | Billing --> Semester | Enrollment tab shows subscription status from subscriptions table |
v2 note — see ADR-001 and STAKEHOLDER-ANSWERS-2026-04-21: In v1, the Step 2→3 gate explicitly ordered promotions before billing. In v2, this is mitigated by Step 4's scope being defined as "L1–L4 passing students only" — only students with
final_status = 'pass'are eligible. Since Step 4 completion depends onfinal_statusbeing set (which is Step 2's purpose), the ordering is enforced by scope rather than by UI gating. The manual per-student fallback in Step 4 is scope-filtered too: admins can only manually set up payments for students already marked Pass.
8.7 Communication Domain (11-communication.md)
| Integration | Direction | Details |
|---|---|---|
| Automation Emails (semester filter) | Semester --> Communication | Overview tab "View All Emails" link and Setup Checklist "Email Templates" deep link both navigate to Communication > Automation Emails filtered to this semester (?semester=[id]). Setup Checklist sets ?from=checklist&semester=[id] so the Return banner works there too. |
| End Checklist Step 3 — Send Pass/Fail Emails | Semester → Communication | Step 3 "Open" link deep-links to the End Checklist Email Queue (11-communication.md §2.6) for this semester, showing students whose End Checklist email is unsent/failed/bounced. Per-student "Send Now" triggers the correct automation email template (pass, fail-with-opt-in, or mastery-elective; seeded in 11-communication.md §2.4.5). Email send status recorded on communication_logs. Completion computed from unsent-students count reaching zero. Students with final_status IS NULL are surfaced in the queue with an "Awaiting Pass/Fail" pill (blocked from send until Step 2 completes their status). |
| End Checklist Step 5 — Semester Close | Semester (self) | Fully automatic at midnight EST on semester.end_date. System flips is_current, sets Mastery students' final_status to mastery_passed, transitions semester to historical-read-only state. No cross-domain deep links. |
9. Assumptions and Open Questions
ADR-001 open questions resolved 2026-04-21: All ADR-001 open questions are now resolved per
docs/v2-review/STAKEHOLDER-ANSWERS-2026-04-21.md§1. See that document for the canonical 5-step End Checklist definition.
This domain relies on several assumptions documented in 00-spec-index.md. Summary of semester-management-specific assumptions:
| ID | Assumption | Impact on This Spec | Validation Needed |
|---|---|---|---|
| OQ5 | Content cloning creates independent copies (not linked) | Auto-clone on semester create (Section 2.5), Clone from Previous features in Setup Checklist (Section 3.6) and Welcome Package (Section 4), and Tags are all independent copies. No cross-semester versioning. | Confirm with admin: does cloned content ever need to stay linked to its source? |
| OQ7 | Immediate subscription creation (not Subscription Schedules) | End Checklist Step 4 (Set Up Automatic Payments) creates Stripe subscriptions for next semester start date (not scheduled via Subscription Schedules). Admin can backdate if needed. | Confirm: should subscriptions start immediately or be scheduled for next semester start date? |
New open questions for v2 (carry into 00-spec-index.md on next update):
- SQ1: How many Setup Checklist items per semester are typically applicable? If many items are consistently N/A, consider configurable templates per semester type. Assumed: all items applicable by default.
- SQ3: Should the auto-transition feature (Overview tab, §3.5) support registration auto-close in addition to semester activation/deactivation? Assumed: no -- registration close is a separate manual decision.
- SQ4: How should the Setup Checklist handle content that spans multiple levels (e.g., a resource available to all levels)? Assumed: content appears under each applicable level item (may result in some double-counting in progress, but avoids missing items).
- SQ6 (End Checklist defaults) — Resolved 2026-04-21 per STAKEHOLDER-ANSWERS-2026-04-21.md §1. Lejla's 5-step End Checklist (All Submissions Reviewed, Pass/Fail, Send Pass/Fail Emails, Set Up Automatic Payments, Semester Close) replaces the prior TBD scaffold. See §3.8 for the canonical definition.
- SQ7 (End Checklist trigger conditions) — Resolved 2026-04-21 per STAKEHOLDER-ANSWERS-2026-04-21.md §1. Each of the 5 canonical steps has a defined auto-completion trigger documented in §3.8.
- SQ8 (Automatic vs. semi-automatic) — Resolved 2026-04-21 per STAKEHOLDER-ANSWERS-2026-04-21.md §1. Step 1 (Automatic w/ manual fallback), Step 2 (Semi-automatic — per-student set by TA/admin), Step 3 (Automatic send w/ per-student manual fallback), Step 4 (Automatic w/ per-student manual fallback), Step 5 (Fully automatic). See §3.8.
- SQ9 (W4 risk without gate) — Resolved 2026-04-21 per STAKEHOLDER-ANSWERS-2026-04-21.md §1. Step 4's scope is defined as "L1–L4 passing students only" — the scope filter (students with
final_status = 'pass') enforces promotion-before-billing ordering without requiring a UI gate. Manual per-student fallback is also scope-filtered. - SQ10 (End Checklist audit trail) : V1 gate overrides were logged to Reporting > Logs with admin name, reason, timestamp. What audit trail equivalent (if any) does the End Checklist need? Candidate: log every manual Set Pass/Fail, every manual Send Now, every manual Set Up Payment, every custom item creation.
- SQ11 (NEW — Onboarding Support access control for group links) : The spec lists four access-scope options for group chat links (All / By role / By level / Per student). Stakeholder to confirm which are actually needed and whether a simpler single model (e.g., By level only) is sufficient for launch.
- SQ12 (NEW — Welcome videos scope) : Are welcome videos general tutorials (e.g., "How to use the app") reused across semesters, or semester-specific welcome content? If general, they should live at the system level; if semester-specific, this tab is the right home. Spec assumes semester-specific.
- SQ13 (NEW — Countdown target default) : Should the countdown target default to the semester
start_dateat midnight local time (current spec), at the student's local time, or at EST? Timezone handling TBD. - SQ14 (Registration preset visibility / scope) — Resolved 2026-04-21 per STAKEHOLDER-ANSWERS-2026-04-21.md §2 (defaults #11–12). The Registration preset shows all students enrolling in the semester (both new first-time enrollees and returning students re-enrolling), with a sub-filter toggle ("New This Semester Only") for first-time Level 0 students. Available year-round whenever Level 0 exists. See §3.7.
- SQ15 (Level 0 promote target) — Resolved 2026-04-21 per STAKEHOLDER-ANSWERS-2026-04-21.md — Level 2 confirmed by stakeholder. Lejla: "Level 0 is a placeholder for students whose level hasn't been assessed yet, and our default has always been to place them at Level 2." See §3.7 Bulk-Promote Level 0 action.
- SQ16 (NEW — One-to-One Schedules) : Stakeholder requested a "One-to-One Schedules" Setup Checklist item distinct from TA Schedules. Spec does not yet include a separate item. Needs clarification: is this the same as TA Schedules, or distinct (e.g., 1:1 appointment slots vs. class-level availability)?
- SQ17 (NEW — Submission Close Date field) : Stakeholder mentioned a "Submission Close Date" field in semester setup. Spec currently has Start Date / End Date / Registration Start / Content Availability Date, but no Submission Close Date. Needs clarification: is this a new semester-level date field, per-level, per-assessment, or deprecated?
10. Framework v2 Change Summary
| Section | v1 | v2 | Reference |
|---|---|---|---|
| §1 Sidebar | Email Management listed; 5 Operations cards | Email Management removed (moved to Communication); 4 Operations cards | ADR-003, ADR-005 |
| §2 Semesters List | Create + Delete only | + Edit action, + prominent Auto-Transition dialog, + auto-clone on Create | Framework v2 §3.2 Cat A |
| §3.3 Entity Header | (no clone button) | + "Clone from Previous" header button (manual retry) | Decision #1 |
| §3.4 Tab Structure | Overview / Setup Checklist / Enrollment / (4th tab — v1 gated workflow, see ADR-001) (4 tabs) | Overview / Setup Checklist / Enrollment / End Checklist / Onboarding Support (5 tabs) | ADR-001, Framework v2 §3.2 |
| §3.6 Setup Checklist | Mark N/A, Add Note (spec'd but missing in code), per-group clone | + Add Custom Item; Add Note called out as must-build | Framework v2 §3.2 |
| §3.7 Enrollment | Level/TA/Status/Subscription filters | + Registration preset, + "new this semester" count, + Bulk-Promote Level 0 toolbar action | ADR-005 |
| §3.8 (v1 gated close workflow, see ADR-001) | Gated 5-step stepper with lock icons, gate overrides, audit log | Flat 5-step End Checklist (All Submissions Reviewed / Pass/Fail / Send Pass/Fail Emails / Set Up Automatic Payments / Semester Close) per STAKEHOLDER-ANSWERS-2026-04-21 §1; each step has defined scope + auto-complete trigger + manual fallback; custom items + return banner | ADR-001, STAKEHOLDER-ANSWERS-2026-04-21 |
| §3.9 Onboarding Support | (did not exist) | New tab: group chat links, welcome videos ([backend]), countdown timer |
Framework v2 §3.2 |
| §5 Email Management | Full screen spec | Redirect note pointing to Communication > Automation Emails | ADR-003 |
| §7 Operations | 5 cards including Level 0 Promotion | 4 cards; Level 0 Promotion moved to §3.7 Enrollment tab toolbar | ADR-005 |
| §8 Cross-Domain Integration | References to the v1 gated close workflow throughout | End Checklist references; + §8.7 Communication integration | ADR-001, ADR-003 |
| §9 Open Questions | OQ5, OQ7, SQ1-SQ5 | OQ5, OQ7, SQ1, SQ3, SQ4 + new SQ6-SQ17 | ADR-001, ADR-005, Framework v2 §3.2 |