Phase 4 — Schedule Screen Amendments

Phase 4 — Schedule Screen Spec Amendments

Version: 1.0 Date: February 26, 2026 Input: Phase 1 Problem Brief, Phase 2 Design Principles, Phase 3 Learnings, Phase 4 Architecture, Phase 4 Learn Screen Amendments, WWDC25 Field Guide, User Capability Map, Today Screen Mockup Implementation Status: Draft — Proposed for integration into Phase 4 Architecture v1.3


Why These Amendments Are Needed

Phase 3 identified the Schedule screen as "the strongest screen in the mockup and the strongest section of the Proposal A spec" with 95% alignment and zero missing elements. That assessment was correct — structurally. The Schedule screen's structural design (what elements exist, how they relate, what states they represent) is sound and should be preserved.

However, the Learn screen amendments revealed a category of spec failure that Phase 3 did not test for: visual treatment guidance. The Learn screen was also structurally correct, yet three rounds of mockup implementation produced flat, generic-looking results because the spec described what to show without describing how it should look — typography sizes, visual weights, dominant elements, state-dependent treatments. Every Learn screen amendment addressed this same root cause.

The Schedule screen spec has the same gap. It describes components (session cards, day strip, filters, deadline cards) but provides no guidance on:

Without these amendments, the Schedule screen will face the same implementation problems the Learn screen faced: structurally correct but visually undifferentiated, requiring multiple rounds of revision.

A note on what these amendments preserve: Phase 3's positive assessment was about structure. Every structural decision — the segmented control, session type filters, calendar day strip, deadline cards, recordings toggle, session detail modals — is preserved. These amendments add the visual layer that turns correct structure into a well-designed screen.


Amendment 1: Define Visual Hierarchy and Squint Test Target

Current spec:

The Schedule screen (lines 541-630) lists structural elements but provides no visual hierarchy guidance. There is no typography table, no dominant element designation, and no squint test target.

Compare to the Today screen spec (lines 158-164): "Week Header (dominant visual element)... Line 1 (Large Title size, bold): 'Week 8 of 15'... This header is the visual anchor of the screen. It is the largest text element."

Compare to the Learn screen (post-amendment): Full visual hierarchy table with 7 rows specifying element, treatment, and purpose.

The Schedule screen has neither.

Why this matters:

The Schedule screen serves a fundamentally different purpose from Today and Learn. Today answers "Where am I in the semester?" Learn answers "What am I working on this week?" Schedule answers a time-bound question: "When is my next session, and how do I join it?"

This means the Schedule screen's visual hierarchy should optimize for scanning speed, not emotional anchoring. Students come to Schedule with a specific temporal question and need to find the answer fast. The dominant elements should be: time of day, session type, and the action button — not a week number.

I considered three options for the visual anchor:

Option A: Week number as anchor (matching Today/Learn). This would mean a 58pt "Week 8" header on Schedule. I rejected this because the week number is navigational context on Schedule, not the answer to the student's question. A student opening Schedule at 6:45 PM doesn't need "Week 8" at 58pt — they need to see "QRC — 7:00 PM EST — Join" immediately. Forcing the Today/Learn hero pattern onto Schedule would push session cards further below the fold and privilege the wrong information.

Option B: Today's date as anchor (matching iOS Calendar). Apple Calendar uses the date number as the dominant visual element. This has precedent but the same problem: the date isn't the student's question. QuranFlow students check Schedule to find sessions, not to confirm what day it is.

Option C: The first visible session card as the anchor. The student's question is "what's happening next?" The answer is the next session card. Making session cards the visually dominant content — with prominent time display, color-coded type badges, and clear action buttons — answers the question directly.

I selected Option C because it follows Phase 2's Priority Stack #1 (temporal orientation first) at the right granularity. On Today, temporal orientation means the week. On Schedule, temporal orientation means the session time. The screen's visual weight should flow toward the content, not the navigation chrome above it.

Amendment — Add to spec:

Visual Hierarchy (Schedule — Upcoming View):

Element Treatment Purpose
Navigation bar title "Schedule" — standard nav bar title (17pt, semibold) Screen identification
Timezone indicator 13pt, semibold, primary color, right-aligned in nav bar Always-visible timezone context (C4)
Segmented control Standard iOS segmented control, compact Mode switching (Upcoming / Recordings)
Week + day strip Combined row (see Amendment 2) Temporal context and day selection
Session type filters 12pt, semibold, pill buttons, horizontally scrollable Content filtering
Session time 15pt, bold, tabular figures, high contrast The most scannable element — answers "when?"
Session type badge Status Badge Pattern (10pt, semibold, uppercase, color-coded) Quick categorization
Session title 13pt, semibold, foreground Session identification
Join button (live) 13pt, bold, green fill, prominent Highest-urgency interactive element
Join countdown (upcoming) 12pt, muted, right-aligned Expectation setting
Deadline cards 13pt, semibold, dashed border, muted background Distinct from session cards

Squint Test target (Phase 2, C2): When the screen blurs, the student should identify a vertical rhythm of session cards with colored type badges on the left edge and time values standing out. On a day with a live session, the green "Join" button should be the single most identifiable element. On a normal day, the time column and type badges create the visual structure.

Above-the-fold rule: On first load (current week, current day selected), the student must see at least 2 session cards without scrolling. If no sessions exist today, the "no sessions" message and the next session preview must be visible without scrolling.

Squint Test comparison across tabs:

Tab Squint Test Anchor Why
Today "Week 8" at 58pt Semester orientation
Learn "Week 8" at 58pt Learning workspace orientation
Schedule Session card stack with colored badges Session scanning and time-finding
Profile Profile card with avatar Identity

The Schedule screen is intentionally different from Today and Learn. It does not use the 58pt hero typography pattern because its purpose is scanning, not anchoring. The session cards themselves are the content, and the visual design should get the student to them as fast as possible.


Amendment 2: Merge Week Navigator and Day Strip to Reduce Chrome

Current spec (lines 561-568):

Two separate navigation elements stacked vertically:

  1. Week Navigator: "< Week 8 >" with left/right arrows (~44pt height)
  2. Calendar Day Strip: Horizontal row of 7 day circles (~56pt height)

Problem:

Five layers of navigation chrome appear between the navigation bar and the first session card:

Navigation Bar                     ~44pt
Segmented Control                  ~36pt
Week Navigator                     ~44pt
Calendar Day Strip                 ~56pt
Session Type Filters               ~40pt
────────────────────────────────────────
Total chrome above first card:    ~220pt

On the 390x844pt iPhone 15 viewport (minus 54pt status bar, minus 83pt tab bar = 707pt usable), this chrome consumes 31% of usable screen height before a single session card appears. On an iPhone SE (667pt total, ~530pt usable), it consumes 42%.

The Learn screen amendments removed the journey map from "This Week" view specifically because it pushed the video list below the fold. The same principle applies here: navigation controls should not displace the content they're navigating to.

I considered four approaches:

Option A: Remove the calendar day strip entirely. Sessions are listed below with day information on each card, so the strip is technically redundant. But the day strip serves an important function: it shows which days have sessions (dot indicators) without scrolling. On a week where sessions cluster on Tuesday and Thursday, the strip communicates this pattern instantly. I rejected full removal because this visual summary has legitimate value.

Option B: Remove the week navigator, keep the day strip. The day strip already represents a specific week's days. Swiping the strip left/right to change weeks is a standard iOS calendar gesture. The week context could be shown as a small label integrated into the strip. This saves one full layer (~44pt). However, it relies on gesture discovery — the arrows in the week navigator make week-changing obvious. I considered this but worried about accessibility for QuranFlow's older user demographic who may not discover swipe gestures.

Option C: Combine week navigator and day strip into a single visual row. The week label ("Week 8") sits at the left edge, the day circles fill the remaining width, and small arrow buttons at the outer edges handle week navigation. This preserves discoverability while saving ~30-40pt of vertical space.

Option D: Keep everything but make the day strip and filters more compact. Reduce padding, use smaller touch targets. This risks violating the 44pt minimum (Phase 2, standard platform patterns; WWDC25 Field Guide Part 2).

I selected Option C because it preserves all functionality, saves meaningful vertical space, keeps the week-navigation arrows visible for accessibility, and follows standard iOS calendar patterns (Apple Calendar uses a similar combined week/day header).

Amendment — Replace week navigator and calendar day strip specs with:

Week + Day Header (combined single row):

A single row combining week context and day selection:

Rationale: This saves approximately 40pt of vertical space compared to two separate rows. More importantly, it makes the day strip the primary temporal navigation element (which it functionally is — students select days, not weeks) while keeping week context visible.

What this changes in the spec:


Amendment 3: Session Type Filters — Progressive Disclosure

Current spec (lines 570-572):

"Horizontal pill buttons: All | Level Classes | QRCs | Office Hours. 'All' selected by default."

Problem:

On a typical QuranFlow day, a student has 1-3 sessions. Session type filters for a list of 1-3 items provide no filtering value — the student can see all sessions at a glance. The filters consume a full row of screen real estate (~40pt) that could instead show more of the session cards.

The spec already addresses dense days separately (lines 588): "If more than 7 sessions are displayed for a single day, sessions are grouped by type." This grouping mechanism handles the dense-day case without requiring persistent filters.

Phase 2 Content Principle 1 (Progressive Disclosure): "No screen shows more than 7 items without disclosure mechanism." The filters exist for the 7+ case, which has its own handling.

I considered three options:

Option A: Remove filters entirely. Dense-day grouping handles large lists. For 1-3 sessions, no filter is needed. Simple, saves space. But a student who wants to see "all QRCs this week" (across multiple days) loses that ability. This is a real use case — a student deciding which QRC to attend might want to see all QRC options for the week.

Option B: Keep filters always visible. This is the current spec. Wastes space on normal days (1-3 sessions) but is always discoverable. Consistent, but contributes to the chrome problem.

Option C: Show filters contextually. Filters appear when the visible session list has 4+ items, or are accessible via a filter icon in the navigation bar. On days with 1-3 sessions, the full space goes to session cards.

I selected a modified Option B — keep the filters visible, but with reduced visual weight. Here's my reasoning: QuranFlow's students are "busy adults, many older" who "don't read emails/manuals" (Phase 1). Progressive disclosure that hides filters behind an icon risks the same discoverability problem that plagued the original app's hamburger menu. For an audience that may not discover gestures or hidden UI, visible-but-subtle beats hidden-but-tidy.

Amendment:

Session Type Filters:

Horizontal pill buttons remain visible below the Week + Day Header. Treatment:

Net effect on chrome height:

Layer Before After
Navigation bar 44pt 44pt (unchanged)
Segmented control 36pt 36pt (unchanged)
Week navigator 44pt 0pt (merged into day strip)
Calendar day strip 56pt 56pt (now "Week + Day Header")
Session type filters 40pt 32pt (reduced padding)
Total 220pt 168pt

This saves 52pt — enough for approximately one additional session card to appear above the fold.


Amendment 4: Session Card Visual Treatment (State-Dependent)

Current spec (lines 574-587):

The spec lists what each session card contains (type badge, time, title, coach name, gender indicator, status indicator, action buttons) but provides no visual treatment guidance.

Problem:

Session cards are to the Schedule screen what the submission CTA is to the Learn screen and the Primary Action Card is to the Today screen: the core interactive content element. The Learn screen amendments (Amendment 8) added explicit state-dependent visual treatment for the submission CTA because without it, every state looked the same. The Schedule screen has the same gap.

The Today screen mockup already implements a session card component (today.tsx lines 161-234) with specific visual decisions: a time column with divider, color-coded type badges, and a "Live Now" state with green pulsing dot and "Join" button. This implementation should be codified in the spec so the Schedule screen extends it consistently.

Amendment — Add session card visual treatment:

Session Card Pattern:

Session cards follow the Card Pattern from Section 4.3.5 (bg-card, rounded-xl, border border-border/60) with the following internal structure:

┌─────────────────────────────────────────────┐
│  TIME     │  [TYPE BADGE]                   │
│  7:00 PM  │  Sisters' QRC with Ust. Radwa   │
│  EST      │  Brothers · 12 attending   [>]  │
└─────────────────────────────────────────────┘

Internal layout:

Type badge colors (matching Today screen mockup):

Type Background Text
Level Class oklch(0.92 0.04 285) oklch(0.40 0.15 285) — purple
QRC oklch(0.92 0.04 160) oklch(0.40 0.10 160) — teal/green
Office Hours oklch(0.92 0.06 75) oklch(0.45 0.12 75) — amber/warm

These are the established colors from the Today screen mockup. Codifying them here ensures the Schedule screen matches.

Session card grouping decision:

I considered two approaches:

Option A: Individual cards (one card per session). This is what the Today screen uses for its 1-3 session preview. Each card has its own rounded corners and border. Visually distinct, easy to tap, familiar from the Today screen.

Option B: Grouped card (all sessions in one card with dividers). This is the pattern used for video lists in the Learn screen and week rows in "All Weeks." More compact, creates a cohesive unit.

I selected Option A (individual cards) for the Upcoming view because:

  1. It matches the session card pattern already established on the Today screen (visual consistency).
  2. Individual cards make each session a distinct tappable unit, important for the "Join" action.
  3. The spacing between cards (8pt gap) creates breathing room that aids scanning.
  4. Grouped cards work best for homogeneous rows (video list, week list). Session cards are heterogeneous — different types, different action states, interspersed deadline cards.

For the Recordings view, I recommend Option B (grouped card) because recordings are a review list (homogeneous, no urgent actions, compact scanning), matching the Learn screen's "All Weeks" week-list pattern.

Touch interaction: active:scale-[0.99] on press (slightly less than the standard 0.97 because session cards are wide — aggressive scaling on wide elements looks jumpy), 150ms ease-out transition, touch-manipulation.


Amendment 5: "Live Now" State — Full Visual Treatment

Current spec (line 614):

"Session card shows 'Live Now' with pulsing indicator"

Problem:

The "Live Now" state is the most time-critical state in the entire QuranFlow app. A student seeing this state needs to join their session right now — every second of delay matters. This is more urgent than any other state on any screen: more urgent than "Feedback Ready" (which can wait hours), more urgent than "Submission Due" (which can wait days).

Yet the spec gives it a single line. This is the same pattern that caused the Learn screen's Quranic text treatment to be consistently underimplemented — the most important element getting the least specification.

The Today screen mockup (today.tsx lines 189-203) already implements a "Live Now" treatment: pulsing green dot, "Live" label, green "Join" button. This establishes the pattern but the Schedule screen needs to amplify it because Schedule is where the student goes specifically to join sessions.

Amendment — Replace "Live Now" spec with:

"Live Now" Session Card — Elevated Treatment:

When a session is currently live (within its scheduled time window), its card receives elevated visual treatment to command immediate attention:

"Starting Soon" State (within 15 minutes of session start):

This transitional state bridges "Upcoming" and "Live Now":

The transition from "Starting Soon" to "Live Now" should be seamless — the card gains its green border and the time column switches to the pulsing "LIVE" indicator.

"Ended" State:

Visual priority stack for session states:

Live Now          ████████████████  (green border, pulsing dot, Join button)
Starting Soon     ███████████       (Join button appears, countdown text)
Upcoming          ████████          (standard card, chevron)
Ended             ████              (60% opacity, no action)

The student's eye should be drawn first to any "Live Now" card, then to "Starting Soon" cards, then to upcoming cards. Ended cards recede.


Amendment 6: Deadline Card Visual Treatment and Urgency States

Current spec (lines 590-592):

"Submission Deadline -- Friday 11:59 PM EST. Styled differently from session cards (dashed border, muted background)."

Problem:

Deadline cards are mentioned but underspecified. "Dashed border, muted background" is better than nothing, but:

Phase 2 Content Principle 2 (Grouping by Time and Progress) establishes that temporal items should reflect their urgency through position and visual treatment.

Amendment:

Deadline cards are interspersed with session cards at their chronological position (e.g., a Friday 11:59 PM deadline appears after Friday's last session). They use a distinct visual treatment to prevent confusion with session cards:

Base treatment (deadline > 24 hours away):

Approaching treatment (deadline within 24 hours):

Imminent treatment (deadline within 3 hours):

Passed treatment (deadline has passed):

What about students who already submitted? If the current week's submission is already sent, the deadline card shows a subtle "Submitted" checkmark and uses the base (muted) treatment regardless of time proximity. The urgency states only apply when the submission is still pending.


Amendment 7: Recordings View — From Underspecified to Implementable

Current spec (lines 594-607):

The Recordings view receives approximately 10 lines of specification. It lists what recording cards contain but provides no visual treatment, grouping strategy, or progressive disclosure approach.

Problem:

The User Capability Map identifies recordings as a previously hidden feature (buried in the hamburger menu, Task 3E.1). Phase 4 correctly surfaces recordings in the Schedule tab, but an underspecified recordings view risks reproducing the "tedious filter system" the current app has. The PM Discussion notes: "Filter system frustrating — year, month selection... memory-dependent... up to 20 sessions per week to sift through."

The recordings view needs enough specification to prevent the same filtration problems from recurring.

Amendment — Replace recordings view spec with:

Recordings View:

The Recordings view uses the same Week + Day Header as the Upcoming view (shared navigation element). Below the header, recordings are presented in a grouped card with dividers (matching the Learn screen's "All Weeks" week-list pattern), grouped by day within the selected week.

Day group header: Within the grouped card, each day that has recordings gets a header row:

Recording row layout:

Why grouped card instead of individual cards: Recordings are a review activity, not an urgent action. The grouped card creates a compact, scannable list (matching the video list pattern in Learn and the week list in "All Weeks"). Individual cards would create excessive visual weight for a secondary feature.

Session type filters: The same filter pills from the Upcoming view carry over to the Recordings view. "All" is selected by default. This directly addresses Capability Map Task 3E.2 ("Filter by type").

Empty state: "No recordings for this week yet. Recordings appear here after live sessions end." Displayed as a muted centered text block (13pt, muted foreground) within a single card container.

Progressive disclosure for dense weeks: If a week has more than 10 recordings, the grouped card shows the first 7 rows with a "Show all [N] recordings" footer link. This follows Phase 2 Content Principle 1 (7-item rule).


Amendment 8: Session Type Explanation for New Students

Current spec:

Session type badges show "Level Class" (blue), "QRC" (green), and "Office Hours" (purple). No mechanism exists for a new student to understand what these types mean.

Problem:

The Capability Map (Task 3D.2) explicitly identifies this gap:

"New students don't understand differences [between session types]... No explanation of what each type offers"

The onboarding flow (Step 5) mentions "Attend live sessions for practice and Q&A" generically but doesn't distinguish the three types. A Week 1 student seeing "QRC — Sisters Reading Circle" has no context for what "QRC" means, what to expect, or whether they should attend.

I considered three approaches:

Option A: Add explanations to the onboarding flow (Step 5). The semester overview step could list each session type with a one-line description. This front-loads the information. But Phase 1 established that QuranFlow students "don't read emails/manuals" — front-loaded information may not be retained.

Option B: Add a first-time tooltip on the Schedule screen. The first time a student visits the Schedule tab, a brief overlay explains the three types. This is in-context and just-in-time. But tooltips are easily dismissed and forgotten, and adding custom tooltip UI adds implementation complexity without clear reuse.

Option C: Add type explanations to the Session Detail modal. When a student taps a session card and sees the modal, include a one-line description of the session type. This is the most natural in-context learning — the student is already curious about the session when they tap it. It requires no custom UI (just a text line in the modal).

I selected Option C because it follows the principle of just-in-time information: the explanation appears at the moment the student is engaging with a specific session, not before. This is also the most maintainable — a single text line in an existing modal.

Amendment — Add to Session Detail modal spec (line 620):

Session Detail Modal includes a one-line type explanation below the type badge:

Session Type Explanation
Level Class "Your weekly class with all Level [X] students. Covers this week's lesson material."
QRC "Quran Reading Circle — small group practice session. Read aloud and get real-time coaching."
Office Hours "Drop-in session for questions, extra practice, or catch-up help with your coach."

This explanation appears in 13pt body text, muted foreground, directly below the session type badge in the modal header. After the student's third visit to Schedule (tracked locally), the explanation collapses to show only on tap of a small (i) icon next to the type badge — progressive disclosure that serves Week 1 students without patronizing Week 8 students.


Amendment 9: Define Shared Pattern References

Problem:

Section 4.3.5 (Visual Design Language) defines shared patterns: Card Pattern, Section Header Pattern, Status Badge Pattern, Gradient CTA Pattern, Touch Interaction Pattern. The Schedule screen spec doesn't reference these patterns, leaving the implementer to guess which patterns apply where.

The Learn screen amendments exposed this problem: when patterns aren't explicitly referenced, implementations diverge from the established visual language.

Amendment — Add pattern references to the Schedule screen spec:

Pattern application in the Schedule screen:

Element Pattern Specification Reference
Session cards Card Pattern (standard) Section 4.3.5 — bg-card, rounded-xl, border border-border/60
Recording rows Card Pattern (grouped) Section 4.3.5 — Single card with dividers (border-border/40)
Session type badges Status Badge Pattern Section 4.3.5 — Rounded pill, 10-11pt semibold uppercase
Section labels Section Header Pattern Section 4.3.5 — 11pt bold uppercase tracked muted
"Join" button (live) Not Gradient CTA Custom green action (see Amendment 5). Gradient CTA is reserved for max one per screen and serves a different purpose (primary weekly action). The Join button is an urgent utility action, not a promotional CTA.
Session card tap Touch Interaction Pattern Section 4.3.5 — active:scale-[0.99], 150ms ease-out
Filter pills Custom Not covered by existing patterns. 12pt medium, rounded-full, primary tint when active.
Deadline cards Custom Not covered by existing patterns. Dashed border distinguishes from Card Pattern. See Amendment 6.

Why the "Join" button is NOT a Gradient CTA: The Gradient CTA Pattern (Section 4.3.5) specifies "maximum one gradient CTA per screen" and is used for the single most important weekly action (Today's Primary Action Card, Learn's Submission CTA). The Schedule screen's "Join" button is a utility action — it appears on individual session cards and there may be multiple live sessions at once. Using the Gradient CTA pattern would create multiple competing gradient cards, violating the one-per-screen rule. The green solid-fill treatment is appropriate for "Join" because green universally signals "go/proceed" and creates sufficient urgency without the promotional weight of a gradient card.


Summary of All Amendments

# What Changes Phase 2 Principle Enforced Learn Amendment Parallel
1 Add visual hierarchy table and squint test target Squint Test (C2); "Where am I?" Amendment 2
2 Merge week navigator + day strip into single row Above-the-fold rule; clarity over density Amendment 6
3 Session type filters — reduce height, keep visible Progressive disclosure (C1); clarity over density
4 Session card visual treatment with state variations Visual consistency with Today; design completeness Amendment 8
5 "Live Now" full visual treatment with urgency states Most important state gets most specification Amendment 4
6 Deadline card urgency states Temporal orientation (Priority Stack #1) Amendment 9
7 Recordings view — grouping, layout, progressive disclosure Hidden feature surfacing (S4); spec completeness Amendment 9
8 Session type explanation in Session Detail modal Capability Map 3D.2; just-in-time learning
9 Explicit Visual Design Language pattern references Consistency across screens Amendment 2 (broader gap)

What These Amendments Do NOT Change

The following Phase 4 decisions are preserved:

These amendments refine HOW the Schedule screen presents its content, not WHAT content it presents. The structural design praised in Phase 3 is fully preserved.


Open Questions for Discussion

Q1: Should the "Starting Soon" session be pinned to the top of the list?

The current spec shows sessions in chronological order. If a student opens the Schedule tab at 6:48 PM and their QRC starts at 7:00 PM, should the "Starting Soon" card remain in its chronological position (potentially below ended morning sessions) or be pinned to the top of the visible list?

Argument for pinning: The student opened Schedule to join their session. Scrolling past ended sessions to find the urgent one adds friction at the worst possible moment.

Argument against pinning: Reordering the list breaks the temporal mental model. The student expects sessions in time order. A pinned card appearing above earlier sessions could be confusing.

My recommendation: Pin "Live Now" and "Starting Soon" cards to the top of the list, with a subtle visual separator and "Happening Now" section header (using the Section Header Pattern) between the pinned cards and the chronological list below. This prioritizes the urgent action while maintaining temporal order for everything else. But this is a meaningful interaction design decision that deserves team input.

Q2: Should the Recordings view group by day or show a flat chronological list?

Amendment 7 specifies grouping by day within the selected week. An alternative is a flat reverse-chronological list (most recent first) with date labels but no explicit grouping. The grouped approach matches the Upcoming view's mental model (organized by day). The flat approach is simpler and may be sufficient given that the week navigator already scopes the time range.

My recommendation: Group by day, as specified in Amendment 7. It creates structural consistency between the two views and helps students find "the recording from Tuesday's class" without scanning every row. But if implementation complexity is a concern, a flat list with date labels is an acceptable simplification.


End of Phase 4 Schedule Screen Amendments