# Littlereach mock — traceability matrix

Companion to `mock/index.html`. This is the calibration artifact's manifest: what the mock covers, what it does not, and every inference it had to make.

**Principle:** if the mock had to fill in content that the PRD or spec did not specify, it is listed below under **Inferences**. Nothing in the mock is invented quietly.

---

## 1. Spec §3 behaviors → mock page(s)

| Behavior | Mock page | Notable elements reflecting ACs / invariants |
|---|---|---|
| §3.1 B1 — Access code redemption | `b1-daycare-access-code.html` | Pre-account code validation (step 1); founding-member welcome moment as static content (AC3); founding_tier locked-in at redemption (AC4); hand-off into B2 without re-auth (step 4) |
| §3.2 B2 — Director setup | `b2-director-setup.html` | 7-step wizard, each step resumable (AC2); `≥1 classroom` = go-live threshold (AC5); three first-class child-enrollment paths (step 4); gentle pending-items surfacing (postcondition) |
| §3.2.1 B2.1 — Teacher-initiated enrollment | `b2-1-teacher-enrollment.html` | `Child.enrolled_by_user_id` distinguishes teacher vs. director (B2.1-AC3); default consent = `all` (step 2); admin-review surfaced, not gating (B2.1-AC2); cross-classroom enrollment rejected (error case) |
| §3.3 B3 — Director adds teacher | `b3-director-adds-teacher.html` | Name + email-or-phone + classroom assignment form; magic-link invite dispatch; cross-role identity picker (I-CrossRoleIdentity, AC2); revoke / reassign / rename actions; revocation within 24h (AC3) |
| §3.4 B4 — Teacher first login | `b4-teacher-first-login.html` | Magic-link land → classroom picker (if multi-classroom) → classroom view; skippable orientation as first-class button (step 4); expired-link re-request without dead-end (AC3); already-used link → login affordance |
| §3.5 B5 — Teacher sends photo | `b5-teacher-sends-photo.html` | Capture/select → tag (classroom-scoped roster) → consent check → queue → background upload; offline-tolerant queue; **AC7: per-photo upload-status indicator always visible with distinct badge state for each of `queued/uploading/delivered/failed_retrying/failed_permanent`, no silent background progress**; **AC8: iOS-Safari-specific "keep tab open" note, visible whenever ≥1 photo in `queued/uploading/failed_retrying`**; revised AC2 bounded to "next teacher app open after connectivity returns" (Q2 Amendment 2026-04-24, spike tot-8ba); per-tag consent audit stamp (I-ConsentAudit) |
| §3.6 B6 — Parent receives photo | `b6-parent-receives-photo.html` | Notification (real-time / daily-digest 6:00pm); zero-intermediate-step tap-to-view (AC2); timeline / gallery toggle remembered across sessions; original-resolution download; 90-day retention countdown badge (I-Retention); Midday Heartbeat 2:00pm, at-most-once-per-child-per-day (AC3) |
| §3.7 B7 — Parent subscribes | `b7-parent-subscribes.html` | Invite tap → account setup → Q5 tier prompt (USD/CAD, family cap) → Stripe stub → immediate access; no currency selector (AC4); family-cap math shown for 2-child case (AC2); multi-guardian entitlement without duplicate charge (AC3); soft cap of 4 guardians (Appendix A item 2) |
| §3.8 B8 — Admin dashboard | `b8-admin-dashboard.html` | Not landing screen (step 1); quiet-child threshold 7 days, no teacher attribution (AC2); read-only view (postcondition); embedded monthly payout breakdown (B-Remittance); 80/20 split per I-MarketplaceSplit |
| §3.9 B9 — Daycare offboarding | `b9-daycare-offboarding.html` | 30-day notice minimum; immediate family notifications within 1h (AC1); T-14/T-7/T-1 reminders (AC2); 30-day exportable bundle (AC3); last-day subscription cancel + teacher deactivation + admin read-only 30-day grace; hard-delete at 60 days from notice (AC4, I-ChildDataDeletion); cancel-within-notice allowed without user trace (AC5) |
| §3.10 B-Consent | **embedded in `b5`** | Solo_only + ≥2 children warning modal (AC2); `none` hard-block (I-Consent-Block, AC1); evaluation at send time (I-Consent-AtSend); consent audit stamp table (I-ConsentAudit, AC3) |
| §3.11 B-Retention | **embedded in `b6` and `b9`** | 90-day countdown badge (b6); retention-job narrative (b6); 7-day deletion grace for offboarded children (b9); daycare hard-delete past offboarding grace (b9); I-Retention zero-tolerance (all) |
| §3.12 B-Remittance | **embedded in `b8`** | Monthly payout on 5th; per-family breakdown table with charge / Stripe fee / daycare split / Littlereach split; 80/20 at launch rate; founding-tier override acknowledgment; refund claw-back netted against future payouts, never from daycare bank (AC4) |
| §3.13 B10 — Director preview | `b10-director-preview.html` | Dual entry (post-welcome + admin menu); synthetic Sample Child; sandboxed session, zero real mutation (AC2); persistent Preview banner (AC5); Midday Heartbeat preview with fixed library message (AC6); subscription prompt as read-only walkthrough (no checkout); notification-pref changes discarded on exit (error case 3) |
| §3.14 B-ChildOffboard | **embedded in `b9`** | `Child.left_daycare_at` marker; classroom-roster removal; tier recalculates on next billing cycle (AC1); 7-day photo-deletion grace (AC2); re-enrollment within grace restores data (AC3); solo-child-in-family edge case auto-cancels subscription |

**Coverage summary:** all 14 behaviors in spec §3 are represented. 11 standalone pages + 3 embeddings (B-Consent in B5; B-Retention in B6 and B9; B-Remittance in B8; B-ChildOffboard in B9).

---

## 2. PRD §5 Journeys → mock page(s)

| Journey | Mock page |
|---|---|
| J1 — Daycare redeems access code and joins | `b1-daycare-access-code.html` |
| J1a — Director previews parent experience | `b10-director-preview.html` |
| J2 — Director sets up the center | `b2-director-setup.html` (+ `b2-1-teacher-enrollment.html` as spec-side elaboration — no direct J* entry) |
| J3 — Director adds a teacher account | `b3-director-adds-teacher.html` |
| J4 — Teacher logs in for the first time | `b4-teacher-first-login.html` |
| J5 — Teacher sends a photo | `b5-teacher-sends-photo.html` |
| J6 — Parent receives a photo | `b6-parent-receives-photo.html` |
| J7 — Parent onboards and subscribes | `b7-parent-subscribes.html` |
| J8 — Admin checks the activity dashboard | `b8-admin-dashboard.html` |
| J9 — Daycare offboarding | `b9-daycare-offboarding.html` |

**Coverage summary:** all 10 PRD journeys (9 numbered + 1a) are represented.

---

## 3. §5 Invariants → mock element(s)

| Invariant | Reflected in |
|---|---|
| I-Consent-AtSend (§5.1) | B5 consent-check step (evaluated at send, not capture) + consent-audit table |
| I-Consent-Block (§5.1) | B5 block-case screen for `none` tagged child (send blocked entirely) |
| I-ConsentAudit (§5.1) | B5 audit-stamp table at bottom of page |
| I-Retention (§5.1, §3.11) | B6 per-photo retention-badge ("N days until expiry"); B9 B-Retention section (daily 3am UTC job, 7-day child grace, daycare-offboard override) |
| I-ChildDataDeletion (§5.1) | B9 grace-period-expiry step (60 days after notice): all PII and photo data hard-deleted, marketplace shell preserved |
| I-AccessWindow (§5.1) | B6 soft-paywall screen for lapsed subscription; B7 "cancellation preserves access through end of billing period" note |
| I-CrossRoleIdentity (§5.1) | B3 cross-role identity path with role-context picker (one User, multiple `(daycare, role)` pairs) |
| I-MarketplaceSplit (§5.1) | B8 monthly-payout table (80/20 at launch); B8 "never debit daycare's bank" refund-handling note |
| Admin-not-technical (§5.2) | B2 no free-text config fields in wizard; plain-English step labels |
| Forgiving-and-resumable (§5.2) | B2 step-status table showing mix of done/skipped/pending with resume-any-time; B9 cancel-offboarding-within-notice path |
| Gentle-over-strict (§5.2) | B8 quiet-child surfacing (no teacher named, no red badges); B9 reminder copy slots marked "must be gentle" |
| Teacher-flow-critical-path (§5.2) | B5 AC1 call-out (30-sec median open-to-sent) + immediate-return-to-teacher on queue (step 4) |
| Parents-are-busy (§5.2) | B6 zero-intermediate-step tap-to-view; AC4 call-out ("under 30 seconds open-to-close") |
| No-dark-patterns (§5.2) | B6 soft-paywall design (no blur, no urgency); B7 subscription-prompt framing; B10 read-only subscription prompt |

**Coverage summary:** all 8 zero-tolerance invariants from §5.1 + all 6 design-principle-derived constraints from §5.2 are reflected in at least one mock element.

---

## 4. Inference list — gaps the mock had to fill

These are the most important calibration signals. Each entry is something the mock could not source from PRD or spec and had to either render as a visible placeholder or fill with an explicitly-flagged inference. Where the PRD/spec is deliberately parametric (e.g. Q6), it is listed here too so Nelson and Allan can see what is still open.

### Visual / layout inferences (mock had to pick a shape)

1. **B1** — visual representation of "founding tier locked in" at redemption. Spec AC4 requires persistence + immutability; surfacing style not specified.
2. **B1** — identity-input ordering at redemption (before welcome moment? after? deferred entirely to B2?). Spec lists director identity as a B1 input but does not pin when it's collected.
3. **B2** — wizard navigation UI (sidebar vs. tabs vs. tiles). Spec names 7 steps and the save/skip/resume behavior but not the navigation pattern.
4. **B2** — QR code visual for step 7.
5. **B2.1** — entry-point affordance from classroom view (button placement, label).
6. **B2.1** — admin-dashboard "new enrollment" surfacing style (banner vs. inline card vs. separate tab).
7. **B3** — form layout for the add-teacher surface.
8. **B3** — visual of the multi-role context picker (drawer, banner, explicit picker). Spec requires it, does not specify.
9. **B3** — revocation confirmation UI.
10. **B4** — visual of the classroom-picker when a teacher is in multiple classrooms.
11. **B5** — photo thumbnails (rendered as placeholder boxes; spec does not specify; ugly-on-purpose is the right aesthetic per the bead).
12. **B5** — Midday Heartbeat message entry UI in the send flow. Q6 open parameter — see inferences §5.4 below.
13. **B6** — exact placement and wording of the 90-day retention countdown badge.
14. **B7** — Stripe checkout UI (shown as stub; real Stripe would supply the surface).
15. **B7** — country-resolution UI (explicit select vs. IP-inferred vs. account-derived).
16. **B8** — quiet-child surfacing layout.
17. **B8** — per-payout breakdown visual.
18. **B9** — export-bundle download UI for the director.
19. **B9** — "cancel offboarding" surfacing inside the 30-day window.
20. **B10** — exact visual of the persistent "Preview" indicator (AC5).
21. **B10** — stock imagery source (placeholder boxes used; spec says "stock imagery hosted by Littlereach").

### Copy / microcopy gaps (mock must not invent text)

These are screens where the spec specifies the behavior or intent but not the exact text. The mock shows them as grey `[not specified in spec]` placeholders — not filler content.

22. **B1** — founding-member welcome moment copy. PRD J1 step 3 gives the intent ("warm, brief, acknowledges founding terms locked in"), not the words.
23. **B1** — "code already redeemed by this identity — resume existing setup" path wording.
24. **B2** — user-facing labels for consent enum values `all` / `solo_only` / `none`.
25. **B2.1** — admin-dashboard new-enrollment surfacing text.
26. **B2.1** — cross-classroom rejection error message.
27. **B3** — magic-link invite body (SMS + email).
28. **B3** — role-context picker copy.
29. **B4** — orientation slide content (spec says 1–2 screens, skip is first-class, content TBD).
30. **B4** — expired-link re-request flow copy.
31. **B5** — exact warning copy on solo_only + ≥2-tagged-children (three-option modal).
32. **B5** — queued/uploading/sent/failed microcopy on photo status chips.
33. **B5** — blocked-send copy when a `none`-consent child is tagged, including whether to name the child or anonymize. Spec §3.10 step 1 says "without disclosing other children's consent details unnecessarily" — the mock names the blocking child since the teacher needs to act on them; calibration signal.
34. **B6** — push-notification copy (real-time + daily-digest).
35. **B6** — soft-paywall copy for lapsed subscription outside grace.
36. **B7** — pricing-summary copy beyond the amounts.
37. **B7** — multi-guardian-add flow UI and copy.
38. **B8** — "0 photos today" presentation copy (must stay non-blaming).
39. **B8** — gentle-surfacing copy for quiet children.
40. **B9** — family-notification body (paraphrase given in spec; unclear if verbatim final).
41. **B9** — T-14 / T-7 / T-1 reminder body.
42. **B9** — cancellation confirmation copy (spec §5.2 requires clearly-labeled confirmation before irreversible).
43. **B9** — cancelled-offboarding follow-up notification copy (AC5).
44. **B10** — "this is a sample" badge copy on the download affordance.
45. **B10** — "this was a preview — your real settings have not changed" first-visit exit message.
46. **B10** — fixed library message used for the Midday Heartbeat demo (AC6 requires stability across Q6).

### Open product parameters (mock cannot fill these because PM hasn't decided)

47. **Q6 — Midday Heartbeat message source.** Open parameter per §5.4; domain is `{teacher_typed, library_picked, ai_generated, ai_assisted, none}`. Affects B5 teacher-side message-entry UI and B6 Heartbeat dispatch.
48. **Appendix A item 3 — Heartbeat photo auto-selection** absent a teacher flag. Options listed in spec (§3.6): first of day, most-tagged of day, random of day, or require teacher flag. Tied to Q6 resolution. Flagged to Nelson.
49. **B-Remittance founding-tier rate.** Spec §5.3 Q2 notes founding-tier daycares MAY have 85% share (vs. 80% default). Configured per-access-code; exact rate and surfacing to the director not specified.
50. **AC8 iOS-Safari banner exact copy.** Spec §3.5 AC8 (added 2026-04-24) fixes the mechanic ("keep this tab open until uploads finish" note, visible whenever ≥1 photo is in-flight) and explicitly marks the exact text as a product parameter. Mock shows a placeholder with the parameter flag.
51. **AC8 banner is mocked visible unconditionally.** Static HTML cannot user-agent-sniff for iOS Safari. The mock renders the banner in a dedicated screen with an explicit "Visible only on iOS Safari when ≥1 photo is in-flight" label; a real implementation would conditionalize on UA + photo status.

### Calibration signal — structural observation

50. **B2.1 has no corresponding PRD §5 journey.** The behavior is introduced only in the spec to distribute child-enrollment work. The director-facing dashboard surfacing implied here is not explicitly drawn in PRD J2 (setup) or J8 (dashboard). Calibration signal for Nelson/Allan: does B2.1 warrant a PRD journey entry, or is it acceptable as a spec-only sub-behavior?

---

## 5. What the mock does NOT include, and why

The following are in scope for the product but deliberately out of scope for this mock:

| Excluded | Why |
|---|---|
| Real images | Per bead instructions: placeholder boxes labeled "photo" keep the mock clearly throwaway and avoid sourcing fake imagery. |
| Live interaction (JS click-throughs beyond `<a>` navigation) | Bead requires static HTML, no JS, no frameworks, no build step. |
| Multi-guardian-add flow as a dedicated screen | Spec §3.7 specifies the entitlement outcome but not a UI; adding a speculative screen would defeat the "no invented content" discipline. Mentioned in B7's error-case block. |
| Teacher photo prompts / parent reactions / quality flags | Listed in PRD §7.2 as post-MVP; not spec §3 behaviors. |
| Native iOS/Android surfaces | PRD §4 non-goal at launch; mobile-web is the v1 surface. |
| Stripe checkout UI detail | Spec §3.7 uses "Stripe-hosted checkout"; reproducing Stripe's UI would be invented content. Rendered as a stub. |
| Admin "manage all subscriptions" view | Not a named B1–B10 behavior. Subscription management is implicit in B7 (parent-side) and B9 (last-day cancellation); no standalone admin surface is specified. |
| Multi-daycare cross-site owner dashboard | PRD §2.2 names multi-site as a secondary future user; explicitly post-MVP. |
| Push-notification OS-level permission prompts | Platform-owned, not product-owned; not in spec. |
| Authorization policy implementation (Cedar) | §5.5 names Cedar as the authorization engine but this is internal architecture, not a user-facing surface. Systemdesign territory. |

---

## 6. Where the spec and the PRD disagree (none material)

Per the bead's edge-case rule, spec wins on disagreement and the disagreement is noted here. No material disagreements were identified during this pass. Notable alignments:

- PRD J2 describes setup as a linear wizard reaching a "complete" state; spec §3.2 clarifies that go-live requires only center name + 1 classroom (AC5), and that every other step is post-live-friendly. The mock renders spec's stance.
- PRD J6 describes the parent viewing sequence; spec §3.6 adds the Midday Heartbeat sub-behavior with its own preconditions and AC3 (at-most-once-per-child-per-day). The mock renders both.
- PRD J9 step 4 ("no one is charged for a service they can no longer access") was ambiguous; resolved 2026-04-21 by Nelson (Appendix A item 1) to access-through-end-of-billing-period + no pro-rata refund. The mock renders the resolved position.

---

## 7. Meta

- **Bead:** `tot-a99`
- **Scope:** half-day first pass; if the artifact surfaces widely-different calibration signals, a second pass may be worth doing after Nelson + Allan review.
- **Deploy target:** `littlereach-mock.pages.dev` (separate Pages project from the production `littlereach`).
- **Commit:** see git log on `main`.
