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:

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

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


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

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:

"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

Step 2 — Pass/Fail

Step 3 — Send Pass/Fail Emails

Step 4 — Set Up Automatic Payments

Step 5 — Semester Close

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):

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:

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

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


5. Screen: Email Management (MOVED)

Email Management has moved to Communication > Automation Emails. See 11-communication.md for 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.md for cross-reference traceability only. All Email Management functionality, entry points, and data responsibilities now live under the Communication domain.

Impact on this domain:


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

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


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

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


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 on final_status being 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):


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