QuranFlow iOS App — Requirements Traceability Matrix
Part of the production handoff package, alongside FEEDBACK-SYNTHESIS.md
(the synthesized stakeholder asks) and handoff/PRODUCT-SPEC.md (the screen-by-screen
functional spec). This document's job is narrower and mechanical: prove that every
stakeholder ask landed somewhere — designed, deferred, or rejected — so nothing
silently fell through between the four feedback sources (Coaches' Questionnaire,
IT Revamp Discussion transcript, App Wishlist, Mock App Feedback) and the finalized
Sakīna mockup at ../mockup/.
Sources checked against: FEEDBACK-SYNTHESIS.md, ../mockup/REVIEW.md
(adjudicated design decisions), ../mockup/src/main.jsx (finalized screen
inventory — artboard labels are cited as design evidence below), spot-checked against
the individual ../mockup/src/sak-*.jsx files, and — where the synthesis
summarized rather than quoted — the raw source files in
/feedback for new app/ (the Coaches' Questionnaire responses, the App Wishlist,
the IT Revamp transcript, and the Mock App Feedback doc).
Jul 24 2026 product correction (Lejla) — what changed
Added Jul 26 2026. A product review with Lejla (PM) and Kamran on Jul 24 2026
corrected the Year-2 model and added a new-student entry flow. The affected asks are
re-dispositioned here; the specific matrix rows in §2 are annotated in place (not
renumbered). Source: the flow map, ../../explorations/flow-map/ (screens designed in the
shared Sakīna kit, Jul 26 2026). Working defaults await Lejla's confirmation — see
../../explorations/flow-map/QUESTIONS-FOR-LEJLA.md.
- Year 2 has no weekly submissions. Appointments replace them (up to 3/week, any coach on the team, included in tuition); feedback arrives as per-appointment teacher's notes. Earlier docs modelled Year 2 as "everything Year 1 has, plus a 1:1" — corrected across PRODUCT-SPEC and DATA-MODEL.
- Per-appointment, multi-coach booking supersedes the single-recurring-slot model for Year 2. The "Hybrid 1:1 booking" row (Schedule / time) is annotated below: recurring "lock all 15 weeks" is dropped pending Q13; Year-2 appointments book per week and need not be with the same coach. The "Two-coach model — rejected" row (Strategy items) still stands for Year-1 assigned-coach review routing but no longer constrains Year-2 booking — a shared coach pool is not a two-coach assignment.
- Appointment notes are now Designed. The "Notes + voice notes for one-to-one
appointments" row (Appointments) previously read Designed only via
SakCoachStudenttext, "no separate voice-note UI built." Jul 26 2026 added dedicated screens: Coach — appointment notes (record → transcribe → auto-summary → coach edit → send) and the student-facing Appointment — teacher's notes (AppointmentNoteentity, DATA-MODEL §2). That row is annotated below. - Entry / placement flow is now Designed. New: a web-registered student signs in via an emailed link, books a first assessment, waits for placement, and receives a level before ever seeing the Year-1 loop. Four new screens (Sign in, Book your first assessment, Waiting for placement, Placement result) in PRODUCT-SPEC Section E; the account/enrollment state machine is in DATA-MODEL §2. This was not an original stakeholder ask — it comes from the Jul 24 correction — so it has no prior matrix row; it is recorded here as Designed.
Jul 27 2026 product correction (Lejla) — what changed
Added Jul 27 2026. A screen-by-screen review with Lejla on Jul 27 2026 (decision
record: ../../reviews/App-Review-Jul27-Lejla.md, the binding source for this pass)
overturned five Jul-24 defaults and reshaped the entry lane. The five corrections are
tracked as answered questions in ../../explorations/flow-map/QUESTIONS-FOR-LEJLA.md (Q1,
Q2, Q4, Q5, Q8); the derived design changes are encoded across the walkthrough, the flow
map (v7), the ambient layer (v3), and the two handoff specs. This addendum maps each Jul-27
decision to the record section it comes from and the artifacts that encode it. It adds no
new stakeholder asks (those were dispositioned Jul 24) — it re-dispositions the
entry/placement and Year-2 rows already annotated in §2.
| Decision (Jul 27) | Record § | Encoded in |
|---|---|---|
| First assessment = recorded recitation (four graded stages: letters → words → familiar surah → technical ayah) to a pooled coach queue — not a booked 1:1 | §1.1, §4.1, §4.7 | Walkthrough ARRIVING act; flow map v7 screens 02–03; PRODUCT-SPEC §"Account status and entry flow" + Section E "Your first recitation" + Section C Placements-queue proposal; DATA-MODEL FirstAssessment + placement pool |
| Level 0 is a real status — full app minus lessons; student-paced wait (days–~3 weeks); never-submitters auto-placed to Level 2 | §1.2, §4.4 | Walkthrough Level-0 waiting screen; flow map v7; PRODUCT-SPEC Section E "Waiting for placement"; DATA-MODEL enrollment lifecycle (level_0, auto_placed) |
| Script-choice screen + font-picker settings feature both cut (one usable Madani-compatible web font) | §1.3 | PRODUCT-SPEC Section 05 step 3 + Section 02 font picker (both CUT); DATA-MODEL quran_font_preference retired; IMPLEMENTATION-PLAN Phase 1 |
| Sign-in = email + password (welcome-email credentials); no magic-link primary; enrollment pointer removed (App Store anti-steering); "Need help signing in?" affordance | §2 (entry & sign-in), §4.8 | PRODUCT-SPEC entry-flow block + Section E "Sign in"; DATA-MODEL top block; IMPLEMENTATION-PLAN Phase 1 auth |
| Two-to-three supportive screens between sign-in and the recitation (emotional design) | §2 (arriving flow) | Walkthrough ARRIVING act; flow map v7; PRODUCT-SPEC Section E "Your first recitation" |
| Onboarding: step 3 cut; "watch as a video" restored; availability step for ALL placed students; welcome/level/rhythm double as level-graduate re-entry | §2 (onboarding), §4.9 | PRODUCT-SPEC Section 05 role-gating block + Availability (F5); DATA-MODEL Availability entity; IMPLEMENTATION-PLAN Phase 1 |
| Appointment counts plan-based, bought at checkout (default 1; Tajweed Practice 2–3); UI states the student's own plan, never a universal cap | §1.4 | PRODUCT-SPEC Book your one-to-one + Today — Year 2 + Week at a glance; DATA-MODEL appointment_plan; ambient v3 (widgets never show a remaining count, Q14) |
| Year-2 lessons per-elective; Tajweed Practice has no lessons; feedback format is the only universal Y1→Y2 difference | §1.5 | PRODUCT-SPEC Year 2 orientation + Today — Year 2; DATA-MODEL Elective (has_lessons) |
| Year-2 arrival: L4 grads auto-enrolled → hype sequence; elective students via checkout, no hype + change-elective housekeeping | §2 (Year 2) | PRODUCT-SPEC Year 2 orientation; DATA-MODEL enrollment lifecycle; IMPLEMENTATION-PLAN Phase 4 |
| Auto-enrollment (level graduate → next level; L4 → Y2 mandatory semester, auto-billed) vs checkout (new / Y2 elective / repeat) | §2 (entry), §6 (Q9) | PRODUCT-SPEC entry-flow block; DATA-MODEL enrollment lifecycle |
| Pooled placement queue replaces today's shared-login first-assessment account (rotating coaches claim) | §4.7 | PRODUCT-SPEC Section C queue proposal; DATA-MODEL placement pool |
| Auto-placed placement-result variant (quieter tone) + placement expectation-setting | §4.5, §4.6 | PRODUCT-SPEC Section E "Placement result" |
| Deliverables: student/coach walkthroughs split; pronounced screen numbers on every screen | §2 (deliverables), §4.10 | Walkthrough build (student/coach split + visible screen numbers); not a spec/data-model change |
| Internal-only facts (pricing, program brand names; "Advanced Tajweed Rules" pending confirmation) never in student UI | §5 | PRODUCT-SPEC Overview Jul-27 block + Year 2 note; DATA-MODEL Elective.name note |
Open items from this pass (nothing "encodes" them yet — they need Lejla): Q15 the exact
name of the mandatory Year-2 semester (tentatively "Advanced Tajweed Rules", distinct from
the Tajweed Practice elective); Q16 the student-facing rename of the first assessment
("Your first recitation" proposed; coach side keeps "First assessment"). Both are recorded
in QUESTIONS-FOR-LEJLA.md.
Aug 5–6 2026 design review (Lejla + Sr. Yasmine) — what changed
Added Aug 10 2026. Lejla and Sr. Yasmine (coach and curriculum manager) reviewed the
redesign screen by screen against the flow map over two recorded sessions
(transcripts: ../../reviews/QF-App-Feedback-Yasmine-Lejla-session-1-Aug-5-2026.txt
and …session-2-Aug-6-2026.txt, the binding sources for this pass). The remarks
reconcile to a 119-item register (../../reviews/v12-review-response/unified-register.json,
U-001–U-119); the decisions were built into walkthrough v12 (decision record:
../walkthrough/DECISION-LOG.html §v12) and the flow map. The illustrated summary —
before/after captures per change — is ../../reviews/v12-review-response/index.html,
deployed at https://quranflow-redesign.pages.dev/changes/. The review covered
S01–S33 plus S37 and S42; S34–S51 and the coach lane (C01–C09) were not reviewed —
a third session was planned to resume at S33.
Screen numbering changed in this pass. Codes are now sticky (a retired number is
never reused; new screens append). The ledger at
../walkthrough/build-notes/screen-codes.md is the authority. Retired: S10, S11,
S20, S27, S28. New: S52–S59.
| Decision (Aug 5–6) | Register | Encoded in |
|---|---|---|
| S10 + S11 cut — the welcome folds into S08; a level-curriculum screen (S53) replaces them | U-042 | Walkthrough v12; flow map (cut frames kept, dimmed, for trace) |
| Returning students (level graduates) get a placement-result variant stating the level (S58); skipping the assessment gets its own waiting variant (S59) | U-038 | Walkthrough v12 entry lane |
| Year-2 onboarding rebuilt as the Year-1 mirror — welcome (S54), course, rhythm, availability last; L4 graduates get the full chain | U-060, U-062 | Walkthrough v12 Year-Two act; flow map Y2 band |
| Availability (S15) asks for anything live — circles and Year-2 one-to-ones — once the structure is clear | U-055 | Walkthrough v12 (S15 in both lanes) |
| Year 1 gains an Assignments tab; the submissions archive (S50) rebuilt as its hub | U-075, U-093 | Walkthrough v12 tab bar (new/Year-1 entrances) |
| Year 2 gains an Appointments tab — upcoming, past with teacher's notes, book another (S57) | U-106 | Walkthrough v12 tab bar (Year-2 entrance); AppointmentNote already in DATA-MODEL §2 |
| "View full semester syllabus" from Learn (S42) opens a week-by-week syllabus screen (S55) | U-082 | Walkthrough v12 |
| Flow-map wiring corrected — Y2 chain no longer runs into Year-1 screens, coach node detached, uncoded Y2 cards absorbed into S31 | U-061 | Flow map (../../explorations/flow-map/, v12) |
Spec sync pending: these decisions are encoded in the walkthrough build and the flow map; PRODUCT-SPEC and DATA-MODEL have not been re-cut for them yet. Wording on new and revised screens is directional pending Sr. Yasmine's screen-by-screen copy pass. Open policy questions from the review (booking limits and no-shows, passing criteria, the behind-students protocol, where student-coach messaging lives) are listed in the change document's open-questions section — they block spec rows, not the build. The Aug 6–11 section below extends this same list — the spec now trails two rounds, not one.
Aug 6–11 2026 — session 3, the coach review and the Aug 11 pass — what changed
Added Aug 11 2026. Four binding sources close the review of the whole app:
session 3 (Aug 6, Lejla + Sr. Yasmine, resuming the student walk at S33/S34 —
../../reviews/QF-App-Feedback-Yasmine-Lejla-session-3-Aug-6-2026.txt); the
coaches-app session 1 (Aug 6, the first review the coach lane C01–C09 has ever
had — …COACHES-APP-Yasmine-Lejla-session-1-Aug-6-2026.txt); Lejla's coach-side
audit written against the April 2026 coach survey of 11 responses, which is
evidence about how coaches work today rather than a reaction to the drawn screens
(U-244 — ../../reviews/QuranFlow-Coach-Side-Audit.md); and the Aug 11
Kamran + Lejla meeting walking the v12 change document screen by screen
(../../reviews/App-Review-Aug11-Lejla.md) — mobile part only, since that
meeting pivots to the admin portal about halfway through and the admin half is
excluded from this round and revised separately. The remarks reconcile to a
284-item register (../../reviews/v13-review-response/unified-register.json,
U-120–U-403, continuing the v12 numbering), adjudicated in
../../reviews/v13-review-response/adjudication-brief.md and built into
walkthrough v13 (decision record: ../walkthrough/DECISION-LOG.html §v13). The
illustrated before/after summary is the v13 change document at
https://quranflow-redesign.pages.dev/changes-v13/; v12's stays at
https://quranflow-redesign.pages.dev/changes/, because links already shared keep
showing what they showed when they were sent.
Coverage, honestly stated. With this round the whole app has been reviewed. The student side S01–S59 has now been seen twice — once against the flow map, once via the v12 change document — and the coach lane has been seen once: the coach session ended early and neither reviewer exhausted her list (U-242), and Sr. Yasmine owes a further document covering anything major in the coach feedback the app does not yet address (U-241). Sr. Yasmine's screen-by-screen copy pass still gates all wording (U-353); nothing in v13 is settled copy.
Sticky-code ledger delta. Codes remain sticky — a retired number is never
reissued, new screens append — and ../walkthrough/build-notes/screen-codes.md is
still the authority. Retired this round: S18 (pre-semester Today; now a
countdown bar on the ordinary Today with locked items greyed), S36 (teacher's
notes, folded into S35) and S40 (week at a glance, whose job moved to the month
calendars) — joining S10, S11, S20, S27 and S28. New student codes S60–S71:
S60 a submission that came back rejected · S61 resources with a home of their own ·
S62 the day's open booking times · S63 the conflict screen for a recurring booking ·
S64 the live month behind the Sessions calendar button · S65 the booked semester on
the Appointments calendar · S66 subscription and billing · S67 learning history as
previous enrollments · S68 previous levels inside the learning space · S69 the
Assignments tab before placement · S70 Learn before a level is set · S71 a past 1:1
and the notes that stay. New coach codes C10–C18: C10 the coach's day ahead of
the queue · C11 placement on its own screen · C12 a student's short reply to
feedback (proposal) · C13 the live-class surface (proposal) · C14 the curriculum and
resources · C15 her inbox · C16 hours · C17 every one-to-one, past and upcoming ·
C18 an announcement in her own name. C19 is reserved. (C12, C13 and C17 were
retired on Aug 18 2026 — see the Aug 18 section below.)
| Decision (Aug 6–11) | Register | Encoded in |
|---|---|---|
| Take-back stays available until the teacher opens the submission, replacing the ten-minute window; one state model student-side and admin-side alike, with rejected a first-class state that never counts against quota | U-120, U-341, U-342 | Walkthrough v13 — S25/S50 recut, new S60; coach side gained a "Return this recording instead" action so the rejection has an author |
| The weekly-attempts model is removed from every screen — the cap itself, not just the word | U-176 | Walkthrough v13 recording flow (S22–S25, S56); supersedes v12's "the word is gone, the cap is not" |
| Level 0 keeps every tab, with explanatory empty states rather than hidden tabs | U-358 | Walkthrough v13 — new S69 (Assignments) and S70 (Learn); reverses session 3's hide-until-placed instruction, Aug 11 being later and Kamran in the room |
| Booking recut calendar-first with progressive disclosure; recurring booking books what it can and resolves the clashes on its own screen | U-123, U-380, U-378 | Walkthrough v13 — S33 rebuilt, new S62 (the day's open times) and S63 (the conflict) |
| S36 folded into S35 so one appointment is one screen; S40's job moved to the month views | U-126, U-128, U-127, U-135 | Walkthrough v13 — S35 carries the notes, new S71 shows a past 1:1; new S64/S65 month calendars; S36 and S40 retired |
| The coach app gains an Appointments tab; Schedule reduces to live classes only | U-196, U-205 | Walkthrough v13 coach tab bar (Home · Queue · Students · Appointments · Schedule); new C17; C07 recut with the coach's own timezone and a semester filter. Superseded Aug 18 2026 (U-414/415): Appointments merges back into Schedule behind a Live classes / Appointments filter, C17 retires, and the freed tab goes to Messages |
| Notes become two decided tiers — student notes and coach notes — nothing is labelled private, and coach notes survive reassignment | U-253, U-193, U-194, U-258 | Walkthrough v13 C02/C03/C05; reverses the reconciliation board's "restore the audience toggle" verdict (../reconciliation/index.html) |
| Coach hours move in-app, retiring Time Clock Wizard: all three work types, correctable before a period closes, period total with approval state, finance export | U-221, U-281 | Walkthrough v13 — new C16, reachable from both C10 and C09 |
| A role-adaptive coach home sits ahead of the queue, because 3 of 11 coaches do no submission work | U-285 | Walkthrough v13 — new C10; the coach entrance boots there |
| First-assessment placement leaves the general queue for its own role-gated screen with a level control | U-252 | Walkthrough v13 — new C11 (placement produces a level, not feedback); C01 no longer absorbs placements |
| The student reply channel and the live-class coach surface are drawn as proposals, not decided | U-295, U-321 | Walkthrough v13 — C12 and C13, each carrying a visible "proposal — decision needed" status on the screen and in the rail; nothing else depends on them. Both answered Aug 18 2026: C13 rejected and cut (U-418); C12's channel accepted in tagged-thread form, so the separate screen retires with the decision (U-426) |
| Attendance is coach-marked; Hammad's 75%-Zoom auto-mark is not adopted | U-262, U-263 | Walkthrough v13 C08 — attendance and no-show control wired to the Q7 rule |
Aug 12 post-review pass (Kamran's review of the finished build; rulings in
reviews/v13-review-response/wiring/ORCHESTRATOR-RULINGS.md): the Today header
carries the bell alone — U-184's three-circle quick-access row (a suggestion,
built Aug 11) was overruled the next day as more toolbar than the field guide's
"context + local actions" allows; U-138 still holds through the bell-as-one-inbox
(U-172) and the foot-of-Today announcement preview (U-164). Resources' home-level
door is a row on Learn (both states, S42 and S70), pushing S61 — U-151's
disposition is unchanged, its door moved. The page ground stays the 3% plum wash
app-wide (U-179); a generation-split ground was rejected. The hub landing now
leads with "Open the app" as the closest to end usage.
Spec sync pending: PRODUCT-SPEC and DATA-MODEL now trail both rounds — the Aug 5–6 review above and this one. Wording across v13 stays directional until Sr. Yasmine's copy pass. The parked policy questions from this round (whether the reply channel and the live-class surface exist at all, where messaging lives, the late-cancellation and availability rules, passing criteria, the placement rubric, the finance-side half of hours) block spec rows, not the build; they are listed in the change document's open-questions section and in the adjudication brief's "Parked" list.
Aug 18 2026 — messaging, the coach tab bar, and the state model that was missed — what changed
Added Aug 18 2026. One binding source: the Aug 18 review meeting (Kamran,
Sr. Yasmine, Lejla — ../../reviews/App-Review-Aug18-Lejla-Yasmine.md), walking a
slide deck Sr. Yasmine had assembled from feedback forwarded by many teachers and
students. Deck items are therefore third-hand, and nearly every one of them was
adjudicated live by the three in the room. The remarks reconcile to a 43-item
register (../../reviews/v14-review-response/register.json, U-404–U-446,
continuing v13's numbering), adjudicated in
../../reviews/v14-review-response/adjudication-brief.md and built into
walkthrough v14 (decision record: ../walkthrough/DECISION-LOG.html §v14). The
illustrated before/after summary is the v14 change document at
https://quranflow-redesign.pages.dev/changes-v14/; v13's stays at /changes-v13/
and v12's at /changes/, because links already shared keep showing what they showed
when they were sent. A small, sharp round on a build people like — Sr. Yasmine, on
the record, reports "the bazillion messages of this is so cool" from the coaches.
The repeat item, stated plainly. U-341 ("one submission state model, student-
and admin-side alike") was decided Aug 11 and did not reach the v13 build: the
build guide translated it additively — the union gains rejected and revoked — so
nobody removed practiced and heard, which were still in the code on Aug 18
(submissions-archive.tsx:93, coach-student.tsx:101). Lejla caught it in the
meeting. U-435 is that same ask, shipped, and it shipped first: the model is
unsubmitted → awaiting review → in review (locked) → reviewed, with rejected
and revoked as exits, one vocabulary in both seats — Awaiting review / In review /
Feedback ready / Returned / Taken back to the student, Needs review / In review /
Feedback sent / Returned / Taken back to the coach. The two retired words are gone
from types, fixtures, chips, filters and copy, and a mechanical assertion on the
built HTML now fails the build if either reappears. The U-120/U-341/U-342 row above
is closed by this; the class of failure it belongs to is closed by the assertion.
Sticky-code ledger delta. No new codes this round; three retired, per the same
ledger rule, in ../walkthrough/build-notes/screen-codes.md. C12 (a student's
short reply to feedback) and C13 (the live-class surface) were v13's two
"proposal — decision needed" screens and are both now answered: C13 is rejected
outright — sessions run in Zoom and marking a 250-name roster is unworkable (U-418) —
and C12 is accepted in another form, the reply channel living as a week-tagged
thread in the coach's one inbox (U-426), so the separate surface retires rather than
being cut. C17 (every one-to-one) retires with the Appointments tab, its content
folded into C07 behind the Live classes / Appointments filter (U-414). They join S10,
S11, S18, S20, S27, S28, S36 and S40 as never-reissued.
| Decision (Aug 18) | Register | Encoded in |
|---|---|---|
| One submission state model, take two — unsubmitted / awaiting review / in review / reviewed, with rejected and revoked as exits; "practiced" and "heard" struck everywhere | U-435 (repeat of U-341) | Walkthrough v14 — S25, S50, S60, C01, C02, C05; SubStatusPill is the one vocabulary both seats read; the retired words are a failing build assertion |
| A student can message about a specific feedback; it lands in the coach's one inbox tagged with its week, never siloed inside the submission | U-426 | Walkthrough v14 — the action at the foot of S26, the tagged thread in C15; answers the C12 proposal and retires the screen |
| Messages carry voice or text both ways, presented in the format they were sent; transcription on demand, not by default | U-427 | Walkthrough v14 — S26 and C15 |
| 2x playback on every recorded-audio player | U-428 | Walkthrough v14 — submissions, feedback and voice messages, from the kit's one player |
| Coach tab bar becomes Home / Queue / Students / Schedule / Messages; Appointments merges into Schedule behind a Live classes / Appointments filter; Messages is C15 promoted, and carries the unread count the row it replaced used to show | U-414, U-415, U-417 | Walkthrough v14 coach tab bar; C07 rebuilt; C17 retired. Five stays the cap ("even five is a lot"); icon-only labels rejected |
| Coach schedule: cohort filters out and the cohort becomes a tag on the session row; My schedule / Full semester kept; reminders and add-to-calendar move behind a small settings affordance | U-411, U-412, U-413 | Walkthrough v14 — C07 |
| Waiting time reads "1 day 5 hrs" (hours alone under a day), counted from the student's submission moment, with no overdue coloring at two days | U-404, U-405, U-406 | Walkthrough v14 — C01. Weekend arithmetic was considered and rejected as unfair to display, so the raw number carries no alarm |
| Coach notes carry dates; a profile states previous-level completion and intake | U-408 | Walkthrough v14 — C05 |
| The coach app gets the notification bell and access to the announcement board | U-416 | Walkthrough v14 — C10 |
| The live-class roster screen is not needed | U-418 | Walkthrough v14 — C13 retired; flow map and journeys page follow |
| One app for every coach profile: sections irrelevant to a coach's role render blank, never gated | U-446 | Spec-level principle for the dev handoff; extends v13's role-adaptive C10 to the merged Schedule and the rest of the coach app |
| No per-event opt-in for live sessions: notifications default on, per-category control in settings — including at onboarding, where all-off toggles were the rejected position | U-420 | Walkthrough v14 — S37 and S16 |
| The time-zone selector becomes a real dropdown (tapping to cycle was the bug) | U-421 | Walkthrough v14 — S15 |
| "Add to calendar" triggers the device's native flow — live sessions and appointments only | U-424 | Walkthrough v14 — S39, S35; the real behavior is a dev-handoff spec line, the screens show the intent |
| You screen: Account, then Support carrying the two sanctioned channels (message your coach, contact the program); Display, the Announcements entry and the "All versions" dev link removed; Telegram kept | U-432, U-433 | Walkthrough v14 — S43. Support copy widens beyond troubleshooting in Sr. Yasmine's pass |
| Booking: "Your plan" demoted to a small note near the bottom; teacher selection becomes multi-select bubbles | U-438, U-439 | Walkthrough v14 — S33, matched on S62 so a multi-select cannot hit a single-select seam one screen later |
| Cancel asks first; a swap names the time it moves from and to, and confirms; the full date sits under Time | U-440, U-441, U-442 | Walkthrough v14 — S35, S71 |
| The month calendar carries the semester anchors — start, end, breaks, orientation — and the week number, from admin semester setup | U-436 | Walkthrough v14 — S64 |
Answered in the meeting, nothing to build: Resources' placement on Learn re-affirmed (U-422) · the week strip on S38 is fine and the month calendar already exists behind the calendar button (U-423) · "message your teacher" stays tucked in You, because friction there is a feature (U-425) · Today's announcements window as built (U-430) · messaging from an announcement rejected, since announcements come from admin and often concern another teacher (U-431) · "display settings don't work" is a mockup artifact and moot anyway, the section being removed by U-433 (U-429) · three uninterpretable deck items skipped (U-444).
Parked to the admin track (documented here, excluded from this round): U-407 an alarm when a submission passes about four days waiting — an admin-dashboard concern, not a coach-app surface, and Sr. Yasmine believes it may already exist; U-409 coach notes as their own tab in the admin portal, separate from admin notes (Kamran proposed one filtered list; Lejla held that academic content and account/billing content are "not even close", and he accepted the separation); U-410 coach pickers listing only active coaches, alphabetically, never the full historical roster; U-419 a join-click count per live session, associated with that session and reportable — the attendance and donor number that replaces self-reporting and Zoom-stat archaeology, and a data-model line for the dev handoff (a join-click event per student and session). The Kamran + Lejla backend review (~Aug 19) takes these four as its agenda seed.
Open and owed. U-437 — an exception in rescheduling, so a student can move to another time soon without being blocked by next week's booking — was read off the deck and never adjudicated: the conversation moved to the Mon–Sun booking window and did not return. It is Lejla's call and bundles with the end-to-end booking walkthrough she and Sr. Yasmine owe (U-443). Sr. Yasmine's screen-by-screen copy pass still gates all wording, and the vibe pass (U-445 — keep the craft, add warmth) is its own track, agreed with Kamran before any design work starts; nothing in this round depends on it.
Spec sync pending: PRODUCT-SPEC and DATA-MODEL now trail three rounds. Their
submission-status vocabulary in particular (in_review → reviewed → heard → practiced) is superseded by U-435's model above; the correction is annotated in place
in both files and in DESIGN-SYSTEM §5 rather than re-cut, so no reader takes the old
four states as current while the spec pass is outstanding.
1. How to read this document
Every ask gets exactly one status:
| Status | Meaning |
|---|---|
| Designed | Built into a mockup screen. The Design evidence column names the artboard label from main.jsx (or the specific component/line, when spot-checked). |
| Partially designed | Part of the ask is on-screen; the disposition note says what's missing and why. |
| Deferred — backlog | A valid ask, not in v1 scope. Restated with pickup context in §3. |
| Rejected | Considered and decided against. The note says why. |
| Ops/process | Not an app feature at all — routes to a business-process owner (Hammad's program-strategy items, coach compensation policy, etc.), not to engineering. |
"Designed" is a claim about the mockup, not about shipped code — the mockup is the design evidence; implementation fidelity is verified separately during build QA.
2. The matrix
Coach review workspace
| Ask | Source(s) | Status | Design evidence / disposition |
|---|---|---|---|
| Assignment text visible while reviewing audio (the single most damning current-app gap) | Wishlist "View Submission Assignment Text During Review"; Questionnaire 8/11 coaches' #1 workspace complaint; IT discussion | Designed | SakSubmissionFeedback combines assignment/passage text (SakPassageCard) with audio player and notes in one object (F1, sak-feedback.jsx); Coach side: "Coach — review a submission" (SakCoachReview, section C) |
| Unified workspace: assignment text + per-student notes/history + time tracking + feedback recorder on one screen | Questionnaire 8/11 coaches | Designed | "Coach — review queue" (SakCoachQueue), "Coach — review a submission" (SakCoachReview), "Coach — student record" (SakCoachStudent) — section C, sak-coach.jsx. Time tracking: see Attendance/data row below |
| Notes on submissions: private (coach-only) + student-facing, same place | Wishlist "Notes on Submissions"; Questionnaire | Designed | SakCoachReview — FbNoteRow timestamped notes plus the "For Sarah" / "Private — just me" audience split (sak-coach.jsx:184-200) |
| Cross-teacher shared notes, visible to every coach who has taught the student (Year 2 emphasis) | Wishlist "Year 2 Student Attendance Record & Shared Notes"; Questionnaire | Designed | SakCoachStudent — "Coach notes" section marked "visible to all coaches" (sak-coach.jsx:285-291); the Rania/Amina resolution (REVIEW.md A4) keeps one legitimate cross-coach note ("Ust. Rania · Week 6 · one-to-one") specifically to demonstrate this |
| Student list filtering (by submission count, alphabetical, level, oldest pending) | Wishlist "Student List Filtering" | Partially designed | "Coach — review queue" sorts oldest-pending-first by default (sak-coach.jsx:47, "the coaches' own filter ask"); the other filter axes (count, alphabetical, level) are not built as UI in the mockup — same screen, additional filter chips needed at implementation |
| Timestamps in feedback (mark a point in the recording) | Wishlist "Timestamps in Feedback"; Questionnaire | Designed | SakCoachReview FbNoteRow — notes carry a timestamp stamped at the playhead ("Marked at 0:41 while listening", sak-coach.jsx:179-180) |
| Coach access to all levels/mastery courses + lesson-breakdown preview, for prep reference | Wishlist "Access to All Levels & Curriculum Overview" | Deferred — backlog | Not represented on any Coach-app artboard in main.jsx section C; see §3 |
| Weekly assignments & lesson overviews surfaced for Year 2 appointment prep | Wishlist "Weekly Assignments & Lesson Overviews for Year 2 Content" | Deferred — backlog | Same gap as above — Year 2 appointment screens (F5) cover booking/attendance, not lesson-reference material; see §3 |
| First Assessment guideline surfaced before review | Wishlist "First Assessment Guideline" | Deferred — backlog | See "assessment rubrics" in §3 |
| End of Course Assessment (EOC) guideline surfaced before assessing | Wishlist "End of Course Assessment Guideline" | Deferred — backlog | See "assessment rubrics" in §3 |
| Pass/fail decision button per student | Wishlist "Pass / Fail Decision per Student" | Partially designed | The submission object's data model includes pass/fail (FEEDBACK-SYNTHESIS.md "Business rules"), but no Coach-app artboard shows the pass/fail control explicitly — closest is SakCoachReview/SakCoachStudent; needs an explicit control at implementation |
| Ready-made lesson asset banks (slides, games, exercises) for coach prep | Questionnaire (Radwa: "we could also potentially create some slides, games, etc for each lesson"); FEEDBACK-SYNTHESIS.md explicit backlog | Deferred — backlog | See §3 |
Feedback loop
| Ask | Source(s) | Status | Design evidence / disposition |
|---|---|---|---|
| Submissions and feedback tied into one integrated experience (not two separate places) | Wishlist "Submissions & Feedback Integrated in One Place"; convergent finding #1 | Designed | SakSubmissionFeedback / SakSubmissionPending (F1) — single object: assignment text, audio, annotations, notes, status |
| Visual/annotated feedback synced to audio: mark up submission text, comparison clips, makharij diagrams | Questionnaire 5/11 coaches; Wishlist "Annotation & Markup on Submission Text"; Yasmine (questionnaire): "visual plus comparison clip from their submission" | Designed | SakCoachReview/SakSubmissionFeedback — FbNoteRow text-span-anchored notes with tone (danger/warm) rendered against SakPassageCard; comparison-clip/makharij-diagram media types are not separately modeled — annotation anchoring is the built primitive, media type is a content decision at implementation |
| Coach can re-record a portion of the student's take within feedback, to demonstrate correct pronunciation | Wishlist "Record Student's Recitation Within Feedback (Year 1)" | Deferred — backlog | Not present on any F1/Coach artboard; see §3 |
| Correction–resubmission loop: re-record just the corrected portions, coach acknowledges | Questionnaire 5/11 coaches (two independently) | Designed | "Practice the corrections" (SakRecPractice) and "Practice — review take" (SakRecPracticeReview), F1. Practice takes don't burn attempts (sak-feedback.jsx:273,542); "Attach to feedback" CTA closes the loop back to the submission (REVIEW.md C3) |
| Voice replies instead of the text comment box, prompted right after feedback playback | Questionnaire 3/11 coaches (two independently) | Designed | SakSubmissionFeedback "Voice reply" affordance directly under the heard feedback (sak-feedback.jsx:277-295) |
| Comment box replaced with something more specific than free text ("Comment is very general") | Yasmine (questionnaire) | Partially designed | Voice reply (above) is the built alternative to the text comment box; the specific "notes-to-self" reflection prompt is a separate, distinct ask — see Student experience row below and self-reflection item in §3 |
| Comment-truncation bug (current text comments get cut off) | Mock App Feedback; FEEDBACK-SYNTHESIS.md convergent finding | Ops/process (launch-day bug class) | Not a design gap — the comment box itself is being de-emphasized in favor of voice reply, but truncation as a class of bug must be verified fixed wherever text input persists (note field, message thread). See §4 launch checklist |
| AI-generated feedback summary for teacher and student | Wishlist "AI-Generated Feedback Summary"; IT discussion "flagged as a priority even ahead of the app"; Yasmine (questionnaire) | Deferred — backlog | See §3 |
| Easy, prominent access to previous feedback, including past semesters | Wishlist "Easy Access to Previous Feedback"; convergent finding #6 | Designed | "Submissions archive" (SakSubmissions, section 02) — full multi-semester history per FEEDBACK-SYNTHESIS.md data model; "Submissions — empty archive" (SakSubmissionsEmpty, section 06) covers the empty state |
| Revoke submission without burning the weekly 2-submission limit (5–10 min window) | Wishlist "Revoke Submission Button"; data model | Designed | SakSubmissionPending — "Revoke window open" with live countdown, "won't count as one of your two weekly attempts" (sak-feedback.jsx:355-375). REVIEW.md A1 resolved a duplicate-countdown bug by making this screen the sole owner of revoke UI |
| 2 submissions/week limit, visualized | Wishlist data model; questionnaire | Designed | SakRecHeader attempts dots (sak-recording.jsx:4-20); "Recording — No attempts" state (SakRecNoAttempts, section 01) |
Schedule / time
| Ask | Source(s) | Status | Design evidence / disposition |
|---|---|---|---|
| Weekly live-class schedule, easy to view/access for all students | Wishlist "Weekly Live Class Schedule"; Wishlist "Live Session Schedule with Filters & Reminders" (teacher side) | Designed | "Sessions — Tuesday timeline" (SakSchedule, section 00); "Week at a glance" (SakWeekAtGlance, F2), reached via the Sessions tab's calendar icon (REVIEW.md B2) |
| All times must display in the student's local time; kill the "+7 hours in my head" math | IT discussion (live timezone bug: calendar shows 7 PM for an 8 PM class); Mock App Feedback ("local time, not hardcoded EST"); convergent finding #3 | Designed | F2's one-line zone banner ("All times shown in Toronto (EDT)") is the canonical treatment (REVIEW.md B3); every bare "EST"/"EDT" suffix elsewhere was swept out (sak-schedule.jsx, sak-profile.jsx, sak-states.jsx, sak-core.jsx) and replaced with local-time-only copy |
| DST misalignment across US/Europe/Turkey/Egypt must not silently break the schedule | IT discussion; convergent finding #3 | Ops/process (launch-day requirement) | The mockup fixes the display rule (always local time, one zone banner); DST-transition correctness is a backend/timezone-library implementation and QA concern, not a screen. See §4 |
| 15-min student / 30-min teacher session reminders, add-to-calendar | Wishlist "Appointment Reminder Notification", "Add Appointment to Calendar", "Live Session Schedule with Filters & Reminders" | Designed | Notification settings row "Session reminders — 15 min before a live session" (sak-settings.jsx:45-46); SakTodayCountdown "Add start date to calendar" CTA (F4); coach-side 30-min reminder referenced in SakCoachSchedule |
| Hybrid 1:1 booking: pre-book the same weekly slot for all 15 weeks, or book week-to-week | IT discussion decision; Wishlist "Fixed or Flexible One-to-One Appointment Booking" | Designed (revised) | "Book your one-to-one" (SakBookAppointment, F5) — "Book Tuesdays 9:20 AM · all 15 weeks" recurring CTA; SakCoachSchedule distinguishes "Recurring · Week 8" vs "This week only" per booking type (REVIEW.md D1). Revised Jul 26 2026 (Lejla, Jul 24): for Year 2 the recurring "all 15 weeks" mode is dropped (open — Q13); booking is now per week, across the coach team, with a weekly soft cap of 3. The revised F5 "Book your one-to-one" reflects the per-week, multi-coach model. Revised Jul 27 2026 (Lejla review): the weekly count is plan-based, bought at checkout (default 1/week; only Tajweed Practice sells 2–3) — the UI states the student's own plan, not a universal soft cap of 3 (Q5 answered). See DATA-MODEL appointment_plan |
| Student availability collected at onboarding; hybrid teacher-first/student-exception scheduling | IT discussion decision | Designed (revised) | SakOnbAvailability exists but is explicitly NOT part of first-run onboarding (REVIEW.md C5) — it's asked during Year-2 booking instead, relabeled "Availability — asked during Year-2 booking" (F5). Core 6-step onboarding does not collect availability; the underlying scheduling philosophy (student-first vs teacher-first) is unresolved — see student-centric QRC item in §3. Revised Jul 27 2026 (Lejla review): this reverses — availability is now an onboarding step for every placed student (Year 1 levels 1–4 and Year 2, not Level 0), collected once as general availability that drives circle/QRC/class/1:1 scheduling. New Availability entity (DATA-MODEL); PRODUCT-SPEC Section 05 + Availability (F5) |
| Eliminate the dedicated "Behind" screen; use a notification instead | Mock App Feedback | Designed | No "Behind" artboard exists in main.jsx; "multi-week-behind" is called out as needing explicit design — see §3 |
| Reveals coach line, what's covered, RSVP, and duration on session detail | Mock App Feedback; Wishlist attendance items | Designed | SakSessionDetail/SakSessionDetailQRC (sak-schedule.jsx:356-598), annotated as notification-tap deep-link destinations (REVIEW.md C4); RSVP affordance described in the in-code comment at sak-schedule.jsx:211 |
| Two "my week" surfaces (Sessions tab timeline vs. Week at a glance) reconciled | Internal mockup consistency finding | Designed | REVIEW.md B2 — kept both, Sessions tab calendar icon routes to Week at a glance; full merge explicitly out of scope for the mockup (documented in spec instead) |
Communication
| Ask | Source(s) | Status | Design evidence / disposition |
|---|---|---|---|
| Replace community board with announcement board (teacher-posted, audience-filtered by year/level) | IT discussion decision; Wishlist "Announcement Board (Replaces Community Board)" | Designed | "Announcements" (SakAnnouncements, F3) |
| Guarded 1:1 teacher–student messaging, spam guardrails (~800-char warning, weekly caps) | IT discussion decision | Designed | "Messages — Ustadha Amina" (SakMessageThread, F3); guardrail copy per IT transcript is a composer-level implementation detail (800-char warning pop-up), not a separate screen |
| "Message your coach" CTA consistency (3 different labels found) | Internal mockup consistency finding | Designed | Standardized to "Message" on SakCoach and Profile's coach panel (REVIEW.md B5), both routing to SakMessageThread |
| Announcements need an entry point (were orphaned) | Internal mockup consistency finding | Designed | SakNotifSheet header row "Announcements · 1 pinned" deep-links to the board (REVIEW.md C1); Settings support row renamed "Report an issue" in the same fix |
| Announcements toggle default | Internal mockup consistency finding (was OFF by default, inconsistent with expectation) | Designed | Settings → Notifications → "Announcements" toggle now defaults ON (sak-settings.jsx:51-52; REVIEW.md B4) |
| Peer community channel (students staying in touch, reminding each other, sharing gems) | Ibrahim (questionnaire): "creating a communication group where they would stay in touch with each other" | Deferred — backlog / Rejected-as-community-board | The 1:1-plus-announcements model explicitly replaces the open community board per the IT-call decision; a peer channel is a distinct, separate ask not covered by that replacement. See §3 |
Appointments
| Ask | Source(s) | Status | Design evidence / disposition |
|---|---|---|---|
| Year 2 appointment attendance marking, tied to auto-email escalation after 2 consecutive absences | Wishlist "Year 2 Appointment Attendance Marking"; data model | Designed | SakCoachStudent/SakCoachSchedule (attendance shown in student record); auto-escalation logic is a backend rule keyed off the same attendance field, not a distinct screen |
| Notes + voice notes for one-to-one appointments | Wishlist "Notes & Voice Notes for One-to-One Appointments (Year 2)" | Designed | SakCoachStudent "Coach notes" section (text); voice-note capture uses the same recorder primitive as async feedback — no separate voice-note UI built, flagged as an implementation detail, not a gap. Revised Jul 26 2026 (Lejla, Jul 24): now Designed with dedicated screens — Coach — appointment notes (record → transcribe → auto-summary → coach edit → send) and the student-facing Appointment — teacher's notes (AppointmentNote entity, DATA-MODEL §2). The "no separate voice-note UI built" note is superseded; this is Year 2's feedback object. See the addendum near the top |
| Appointment detail: recurring slot, coach, duration | Data model; IT discussion | Designed | "Appointment — recurring weekly" (SakAppointmentDetail, F5). Revised Jul 26 2026 (Lejla, Jul 24): with recurring dropped (Q13), this is now a single-week appointment detail, and the coach shown is the coach booked for that appointment; after the session its summary lands on Appointment — teacher's notes (Section Y2) |
| Cancel/reschedule without an email chain | IT discussion (anecdotes: midnight slot-camping, students skipping weeks) | Designed | SakAppointmentDetail (F5) carries explicit quiet-action rows: "Swap this week's time" (keeps the recurring slot for other weeks), "Can't make it? Cancel this week" ("Even a minute before is fine — it frees the slot") — the guilt-free cancel/swap the call asked for, no email chain |
| 20 appointment credits per semester (make-up sessions) | IT discussion / FEEDBACK-SYNTHESIS.md explicit backlog | Deferred — backlog | See §3 |
| Automated post-session survey (attended? why not?) with AI-aggregated trends | IT discussion decision — "flagged as a priority even ahead of the app" | Deferred — backlog | See §3 |
| Year 2 appointment reminder (15 min) + add to device calendar | Wishlist "Appointment Reminder Notification", "Add Appointment to Calendar" | Designed | Same mechanism as session reminders row above; applies to SakAppointmentDetail |
| "One-to-one" row surfaced on the Sessions tab (was an orphaned flow) | Internal mockup consistency finding | Designed | Sessions tab Tuesday timeline "One-to-one" row, tinted like Hours, drills to SakAppointmentDetail; annotated "Year 2 only — Year 1 accounts never see 1:1 rows" (REVIEW.md C2) |
Attendance / data
| Ask | Source(s) | Status | Design evidence / disposition |
|---|---|---|---|
| Attendance is a black hole — no RSVP, no in-app log, near-zero recording views, "100% assumptions" | Convergent finding #4 (multiple sources) | Partially designed | RSVP affordance noted on session detail (sak-schedule.jsx:211); Recordings section added with per-recording watched-progress (sak-schedule.jsx:686-821, "Sessions — Recordings" tab state, section 00a) directly answers "near-zero recording views" by making view status visible; a dedicated attendance-log/analytics view for coaches beyond the per-student record is not separately designed |
| Recordings organized in a calendar view, not a flat list | Wishlist "Easy Access to Session Recordings"; Mock App Feedback ("Add a Recordings section") | Designed | "Sessions — Recordings" (SakScheduleRecordings, section 00a) — grouped by session with date/time rows, watched-percentage indicator; a literal month-grid calendar view was not built — the timeline/list grouping is the shipped resolution, treated as satisfying the underlying need (discoverability), not the literal UI request |
| Attendance-trend visibility for students (shown how many hours attended out of possible hours, to create FOMO/motivation) | Questionnaire (coach: "shown how many hours they have attended out of how many possible hours... creates FOMO") | Designed | Profile stat tile "85% attendance" (sak-profile.jsx:54) |
| Absorb Time Clock Wizard into the app; auto-log coach hours/attendance from Zoom duration ≥75% | Questionnaire 4/11 coaches | Designed | SakCoachQueue/SakCoachSchedule — "Hours log themselves — Time Clock Wizard, retired" (sak-coach.jsx:226); "Attendance + hours log from Zoom automatically" (sak-coach.jsx:390) |
Support / launch
| Ask | Source(s) | Status | Design evidence / disposition |
|---|---|---|---|
| Report Issue button on every single screen, auto-capturing screen/app-version/account context | Wishlist "Report Issue Button"; convergent finding #5 | Designed (mechanism), Ops/process (coverage) | "Report an issue — sheet" (SakReportIssue, F4); Profile Support section renamed "Report an issue" (REVIEW.md C1). The sheet's design is proven on one entry point — universal per-screen coverage is an implementation/QA checklist item, not a per-screen design task. See §4 |
| Help center / resources | Existing app baseline (retained) | Designed | Profile Support section keeps "Help center" and "Resources" alongside "Report an issue" (REVIEW.md C1) |
| Semester start date + countdown timer on home screen pre-semester | Wishlist "Semester Start Date & Countdown Timer" | Designed | "Today — state: pre-semester" (SakTodayCountdown, F4) |
| Walkthrough/demo of an actual assignment (onboarding) | Yasmine (questionnaire) | Designed | Onboarding step "5 · The weekly rhythm" and "2 · Recite the āyah... Two attempts" chapter bullets walk through the recite→hear-back loop with a real example (sak-onboarding.jsx:268-269) |
Student experience
| Ask | Source(s) | Status | Design evidence / disposition |
|---|---|---|---|
| One-screen layouts; students miss anything below the fold | Mock App Feedback | Designed | Design constraint applied across all student screens per AUDIT.md rules; not a single artboard but a cross-cutting rule |
| Copy consistency ("2 of 3 remaining" vs "watched"; avoid "Behind", "Pre-Sem") | Mock App Feedback | Designed | Addressed via REVIEW.md's consolidation passes (B1 Today states, B4 announcement copy, B5 CTA labeling) and AUDIT.md's per-screen copy rules |
| Reduce color variety; single theme; accessibility (fine/light fonts hard to read) | Mock App Feedback | Designed | Sakīna's Tweaks panel offers a two-family palette (Plum/Ink) rather than screen-by-screen color variety (main.jsx SakTweaks); font-weight/contrast fixes are an AUDIT.md rule, applied across screens |
| Printable Ayat (for the assignment, when applicable) so students can mark up and take notes on paper | Yasmine (Coaches' Questionnaire, raw response row 34): "Printable of assignment Ayat (when applicable) for students to mark and take notes on?" | Rejected | No print/export affordance exists on SakPassageCard, SakLesson, or any submission screen. The mockup's direction is in-app annotation and the submission/feedback object as a single digital record (per convergent finding #1) — a parallel paper workflow works against that consolidation goal. If a real need surfaces (e.g., no-device access at prayer time), reconsider as a PDF-export utility, not a core screen |
| Self-reflection prompt box: "Today I learned that... I will apply this by..." | Yasmine (Coaches' Questionnaire, raw response row 34): "A box with prompts where they can type notes to self?" | Rejected | Distinct from the built "Voice reply" (which replies to the coach) and from the coach's private/shared notes (which are coach-authored). No student-authored reflection field exists on SakSubmissionFeedback or SakRecPracticeReview. Considered and set aside in favor of voice reply as the lower-friction mechanism for closing the loop; a private student journal was judged out of scope for v1, not a bug |
| Viewership stats (recording view counts, so coaches/program can see if sessions are actually being watched) | Convergent finding #4 ("near-zero recording views"); Questionnaire | Designed | Per-recording watched-percentage on SakScheduleRecordings (sak-schedule.jsx:783-821) surfaces this at the individual level; no aggregate/program-level analytics dashboard exists — that is an admin-side reporting concern, not a student-app screen |
| RSVP for live sessions | Convergent finding #4 | Designed | Session detail screens (SakSessionDetail/SakSessionDetailQRC) are annotated as revealing "RSVP" among coach line / what's-covered (sak-schedule.jsx:211); this is the design intent captured in-code, not a fully fleshed RSVP-flow artboard — treat as Designed at the intent level, verify the actual RSVP control at implementation |
| Previous-level content moved to a more intuitive, discoverable location (currently buried in a lessons tab) | Wishlist "Previous Level Content — More Intuitive Placement" | Deferred — backlog | No main.jsx artboard shows a redesigned previous-level content location; SakLearn (Learn — syllabus) is the current syllabus screen but the relocation itself isn't demonstrated. Note for the next design pass |
| Content access by level: teachers see all levels; students see up to their current level | Wishlist "Content access" data model | Designed | Data-model rule; enforced by role gating documented in PRODUCT-SPEC.md §"Roles" rather than a distinct screen |
Coach prep / compensation
| Ask | Source(s) | Status | Design evidence / disposition |
|---|---|---|---|
| Single place to check in and log hours for payment (replacing Time Clock Wizard) | Questionnaire (multiple coaches) | Designed | See Attendance/data row above — auto-logged from Zoom duration, sak-coach.jsx:226,390 |
| Dedicated desktop/laptop teachers' portal — larger screen, keyboard, structured workspace | Ibrahim Abou Arab (questionnaire): "A dedicated teachers' portal (desktop/laptop)... prefer working on a larger screen"; Questionnaire device split (5 mobile-only, 4 both, 1 desktop-only) | Deferred — backlog | The Coach app in the mockup (section C: SakCoachQueue, SakCoachReview, SakCoachStudent, SakCoachSchedule) is phone-first — all four artboards are 390×844 device frames, same as the student app. Ibrahim's desktop preference is unmet in v1. See §3 |
| Coach workflow needs one single place covering assignment text, feedback recording, notes, hour logging | Questionnaire (multiple coaches, both submission and appointment workflows) | Designed | Section C Coach app collectively covers this; see Coach review workspace row above |
| Lesson asset banks (slides, games, practice exercises) coaches can use per lesson, so prep isn't uncompensated extra time | Radwa (questionnaire): "time off the clock for the teacher... provide cool things for the coaches to pick from" | Deferred — backlog | See §3 |
Strategy items
| Ask | Source(s) | Status | Design evidence / disposition |
|---|---|---|---|
| Enrollment policy, email SLA, marketing decisions | Hammad (IT discussion) — FEEDBACK-SYNTHESIS.md explicit callout | Ops/process | "Route to program strategy, not app design" per FEEDBACK-SYNTHESIS.md's own framing. Not tracked further in this matrix |
| Student-centric vs. teacher-centric live-session scheduling philosophy | IT discussion (extended debate: shifting from teacher-availability-first to student-availability-first scheduling) | Deferred — backlog | See §3 — the cost/value tradeoff (more coaches at odd hours vs. student convenience) is unresolved, not merely undesigned |
| Two-coach model for Year 2 (backup coverage) | Internal mockup consistency question raised during review | Rejected | REVIEW.md "Out of scope": "Two-coach model for Year 2 — rejected for now; single assigned coach. Revisit if scheduling capacity demands it." Revised Jul 26 2026 (Lejla, Jul 24): still Rejected as an assignment model — no student is assigned two coaches, and this still governs Year-1 review routing. It no longer constrains Year-2 booking, which now draws appointments from a shared coach pool (a different mechanism; see the addendum near the top and the revised F5 screens) |
3. Backlog — deferred items restated for pickup
Each entry: what was asked, why it's valid, and what's unresolved so the next pass doesn't start from zero.
Student-centric QRC/live-session scheduling algorithm. The IT call surfaced a real tension: today's live-class schedule is built around teacher availability, then students adapt. The program lead proposed inverting this — collect student availability first, then shape the schedule (and staffing) around it. The unresolved question is cost vs. value: a student-first model may require recruiting additional coaches for odd-hour slots (e.g., late evening for one region, early morning for another) or accepting scheduling strain on existing coaches. No decision was made on whether the value (fewer missed sessions, less "student adapts to us" friction) justifies that staffing cost. Pick this up as a staffing/ops modeling exercise before it becomes a design task — the app can display whatever schedule results, but the policy has to be decided first.
20 appointment credits per semester (make-up sessions for Year 2). Raised in the IT discussion as a Year-2 lifecycle feature — a bank of credits a student can spend to book make-up 1:1s beyond their normal recurring slot. Not designed because the credit-consumption rules (what burns a credit, whether unused credits roll over, interaction with the recurring-vs-flex booking split already built in F5) weren't specified. Needs a small spec pass before it's a screen. Revised Jul 26 2026 (Lejla, Jul 24): the Year-2 model now includes appointments in tuition with a soft cap of 3/week and per-week booking (recurring dropped, Q13). A separate "make-up credits" bank may be redundant with the soft cap — revisit whether it is still wanted before designing it.
AI feedback summaries. An AI-generated summary of a coach's audio/text feedback, shown to both coach and student as a quick-reference overview. Flagged by Yasmine and others in the questionnaire and listed as an explicit backlog item in FEEDBACK-SYNTHESIS.md. Depends on production feedback-text/transcript data existing at volume; treat as a v2 layer on top of the already-built
SakSubmissionFeedbackobject, not a new screen.AI post-session survey analysis. The IT call decision was: automated post-session survey loop (did the student attend? if not, why?) with AI-aggregated trends — called out as "a priority even ahead of the app." The survey trigger and delivery is straightforward (push a short survey after a missed or attended session); the AI-aggregation/trend layer is the deferred part. Needs a decision on where aggregated trends surface (coach dashboard? program admin?) before designing that view.
Lesson asset banks for coaches (slides, games, practice exercises per lesson). Raised by Radwa specifically to address uncompensated prep time — "that would be time off the clock for the teacher." Not a student-facing screen; would live in the Coach app as a per-lesson resource shelf. Needs content production (someone has to build the actual assets) before it's a design problem.
Peer community channel revival. The IT call's messaging decision (1:1 + announcements) explicitly replaced the open community board, but Ibrahim separately wants students able to stay in touch with each other, remind one another what was covered, and share notes. This is a distinct ask from the rejected-and-replaced community board — it's peer-to-peer, not coach-broadcast-to-many. Revisit as a moderated peer channel (not a return to the unmoderated board) if student isolation becomes a retention problem.
Embedded Zoom. Multiple coaches (questionnaire) wanted Zoom launched/embedded from within the app rather than a separate login — "an online portal... Zoom embedded so I don't have to log in separately." Currently the mockup's live-class flow (
SakLiveClass, section 03) implies an "Open Zoom" action but does not embed the Zoom SDK. Real engineering lift (Zoom SDK integration, auth passthrough); scope as its own workstream.Desktop coach portal. Ibrahim Abou Arab explicitly asked for "a dedicated teachers' portal (desktop/laptop)... prefer working on a larger screen, with a keyboard and more structured workspace," and the questionnaire's device-split question shows 5 coaches mobile-only, 4 both, 1 (Ibrahim) desktop-only. The Coach app in this mockup is phone-first — all four Coach-app artboards (
SakCoachQueue,SakCoachReview,SakCoachStudent,SakCoachSchedule) are 390×844 device frames. Ibrahim's desktop preference is unmet in v1. This is not merely "make it responsive" — a desktop review workspace (keyboard shortcuts for note-taking, multi-pane layout for assignment text + audio + notes side by side) is a genuinely different information density than the phone screens, closer to what Radwa also described ("a website for text and pdf files for weekly lessons and submissions and level notes"). Scope as a real second surface, not a CSS breakpoint.Assessment rubrics in-app (First Assessment guideline, End of Course Assessment guideline), surfaced to the coach before they begin reviewing/assessing a student. Two distinct wishlist items (Wishlist "First Assessment Guideline", "End of Course Assessment Guideline"). Not designed — no Coach-app artboard shows a rubric reference screen. Needs the actual rubric content finalized by the program side before it's a design task.
Multi-week-behind state, designed explicitly. Mock App Feedback asked to eliminate the dedicated "Behind" screen in favor of a notification — done, no "Behind" artboard survives in
main.jsx. But the reviewer also asked to "design the multi-week-behind case explicitly" — i.e., what does Today/Learn look like for a student who is 2, 3, 4+ weeks behind, not just one week? That state is not represented among the section 06 "States" artboards (which cover rest day, first week, empty archive, all-caught-up, mic permission — but not multi-week-behind). Needs its own state design: likely a variant ofSakToday/SakLearnwith a catch-up plan rather than a simple "N weeks behind" label, to avoid the punitive tone the original "Behind" screen had.Coach access to all levels/mastery courses + lesson-breakdown preview, and the related Year 2 weekly assignments & lesson overviews for appointment prep (both from the Wishlist). Neither is represented on a Coach-app artboard. Bundle with item 9 (assessment rubrics) as a single "coach reference library" feature — all four are read-only content-access asks a coach needs while prepping or reviewing, and likely share one implementation (a coach-facing curriculum browser).
Coach re-recording a portion of the student's take within feedback, to demonstrate correct pronunciation (Wishlist, Year 1). Distinct from the built "Voice reply" (a new, separate reply) and from
SakRecPractice(the student re-recording). This is the coach recording a clip of the student's own audio, re-performed, attached inline to a specific note. Needs a small addition toFbNoteRow/SakCoachReview— a "record demonstration" action per note.
4. Known launch-day requirements checklist
These are cross-cutting requirements that don't belong to any single screen and must be verified as engineering/QA gates, not designed as artboards:
- Report Issue accessible from every screen — the sheet design
(
SakReportIssue, F4) is proven once; confirm the entry point (and auto-attached screen/app-version/account context) is wired on every screen in the shipped app, not just the ones shown on the canvas. - Timezone correctness through DST transitions — the mockup fixes the display rule (one local-time zone banner, no bare "EST"/"EDT" suffixes anywhere; REVIEW.md B3). Verify the underlying scheduling engine correctly recalculates local-time display across US/Europe/Turkey/Egypt when any region crosses a DST boundary — this was a live, recurring bug in the current app (calendar showing 7 PM for an 8 PM class) and must be tested explicitly at each region's DST transition date, not just at ship time.
- Announcement toggle default is ON — confirmed in the mockup
(
sak-settings.jsx:51-52); verify the same default ships in production notification-preference initialization for new accounts. - Comment-truncation class of bugs — the current app's text-comment field truncates content (multiple coach reports). The redesign de-emphasizes free text in favor of voice reply, but any remaining text-input surface (coach private/shared notes, the 1:1 message composer, the self-reflection field if later built) must be explicitly tested for truncation — this is a bug class, not a single screen's bug, and needs its own QA pass across every text field in the shipped app.