Minimente — Product Requirements Document

Product: Minimente — Digital Mental Wellbeing Platform for Workplaces Programme in scope: Stress Management (Programme #1) Document version: v4.0 — DRAFT FOR REVIEW (v2.0 amended per the v3 design review and the product owner's written response; provisional product decisions pending Minni's sign-off) Author: Synthesised from founder source material; reconciled against repo state; amended per the v3 review cycle Date: 2026-07-27 Owner / approver: Minni (founder, content author) Intended audience: Implementing engineering team (incl. coding agents), design, and the founder for content sign-off

Changes in v2.0. v1.0 was written from source documents alone, without reference to the codebase. v2.0 adds §1A (repo state), incorporates a previously unaccounted-for fourth source document (the March 2026 developer briefing deck, "Source D") and two prototype artefacts, updates §9 and §10 with what that material settles and fails to settle, and rewrites §11's phasing against verified reality. The headline finding is negative: no application code exists. No open question in §10 is closed by the repository. Four are better characterised, two are new. Section numbering from v1.0 is preserved throughout; §1A is inserted rather than renumbering.

Changes in v4.0 — changelog and decision trail. "v3" was not a document revision: it was an external product/design review of v2.0 (commissioned as "think 2027, not 2015 — do not rubber-stamp a historic user experience"), to which the product owner responded in writing, adopting most of it with amendments. v4.0 synthesises both. Section numbering is again preserved; new subsections are inserted, never renumbered; new requirement IDs extend their series rather than reusing numbers. The full item-by-item disposition log is Appendix A.1. What changed and why:

# Change Where recorded Status
1 Calendar day-lock replaced by sequence-lock: completing module N unlocks N+1 immediately; no daily cap; breaks suggested, never enforced; "Recommended", never "Locked" FR-CORE-04, UX-08, OPEN-13 Provisional — Minni's sign-off
2 Programme restructured as 10-module Core + on-demand Extensions (former Days 11–15); dissolves the 14-vs-15 conflict; converts most missing copy from launch blocker to content pipeline §2.1, §5.1, §6.1, OPEN-18, OPEN-01 Provisional — Minni's sign-off
3 Toolkit accrues from Day 1; Module 10 becomes curation; framing corrected per the owner: the product builds lifelong skills, the Toolkit is the persistent interface to them §2.2, §7.1, FR-CORE-07, FR-STD-07, M10 Adopted
4 "Right now" moment-of-need entry on Home §7.7 (new), FR-NOW-01…06 Adopted
5 Daily Action ending taxonomy replaces reminder-by-default FR-CORE-08, §7.5, OPEN-28 Adopted (per-module assignment: Minni)
6 Org dashboard + adoption kit specified now, built Phase 3; temporal k-anonymity added; trust-framed threshold state §8.2A (new), NFR-PRIV-10, OPEN-22 Adopted
7 Post-programme steady state defined ("courses end; products don't") §7.9 (new), OPEN-14 Provisional — Minni's sign-off
8 Every captured exercise output gets a destination FR-CORE-09, OPEN-17 Adopted
9 NEW capability: search/retrieval — deliberately non-AI, fully client-side, crisis-term routed §7.8 (new), AD-09, NFR-SAFE-07, OPEN-27 Adopted
10 NEW architecture: exercise as a first-class reusable object — one exercise library and runtime referenced by modules, Toolkit, Emergency Tools, "Right now", search, extensions FR-CORE-06, AD-08, FR-ET-08, §7.4 schema Adopted
11 Check-in control becomes a tappable discrete scale (drag sliders retired); granularity (5 vs 10 points) deliberately NOT decided — user testing, with the safeguarding-threshold coupling recorded NFR-A11Y-02, FR-STD-02, OPEN-26 Control adopted; granularity open
12 Explicit binding anti-requirements: no streaks/badges/gamification; no wearables/passive monitoring; AI-chat and diagnostic exclusions reaffirmed with the accepted reasoning §2.3, UX-09, §9.4 Adopted

Rejected or amended from the v3 review, per the product owner: committing to a 5-point scale (test both instead — #11); any hard cap on modules per day (removed entirely — #1); "the Toolkit is the product" (reframed — the product is the skills; #3).

Items 1, 2, 5 and 7 reshape the programme Minni authored. They are recorded as recommended and provisionally adopted, pending Minni's sign-off, with reasoning left visible in the affected sections and OPEN rows so she can overturn any of them (Phase 0 item 1). Nothing in v4 closes the genuinely open questions — OPEN-02, OPEN-03, OPEN-05, OPEN-06, OPEN-10, OPEN-24 and the rest stand. The hard constraints are unchanged and non-negotiable: safeguarding is P0 (§8.3); no conversational AI, avatar, or chat (§4.3, §9.4); no diagnostic instruments (§2.3, §4.4); employer-anonymity is the central promise (NFR-PRIV-04); silent, desk-friendly, discreet (NFR-PLAT-02/05); WCAG 2.1 AA (§8.4).


1. Summary & Document Status

Minimente is a B2B digital mental-wellbeing product delivered as a mobile and web application. Its first (and currently only) programme is a guided, iCBT-informed stress-management course delivered as a sequence of short daily sessions (5–12 minutes) designed to be completed during a working day rather than in a therapy setting. Each daily session follows a fixed five-part rhythm — check-in, micro-lesson, guided exercise, reflection, daily takeaway — and from Day 1 the programme accumulates into a persistent, user-owned Personal Stress Toolkit. v4 framing (adopted): the product's purpose is building lifelong stress-regulation skills; the course creates that capability and the Toolkit is the persistent interface to it — the surface the user keeps when the course is over. v4 structure (provisional, pending Minni): the programme is a 10-module Core plus on-demand Extension modules (the former Days 11–15), unlocked in sequence but never calendar-locked (OPEN-18, FR-CORE-04). A set of Always-Available Emergency Tools sits outside the programme flow for acute stress moments. Organisations buy seats for employees; individual data stays private to the employee while organisations receive anonymised aggregate insight.

Document status and provenance. This PRD synthesises four founder/team-authored source documents and two prototype artefacts. Sources A–C were the basis of v1.0; Source D and the prototypes were discovered during the v2.0 repo reconciliation and were not available to v1.0.

Source File Last modified Role in this PRD
A Minimente_presentation.pptx 2026-03-04 Business model, positioning, pricing, tiers, roadmap, technical wishlist
B Minimente_Stress_Program_Content_EN.pptx 2026-02-06 Programme framework: session structure, emergency tools, personalisation rules, data collected, UX principles, original module list
C Minimente Stress Management content.docx 2026-07-27 Canonical screen-by-screen module content
D Minimente_Dev_Briefing.pptx (9 slides) 2026-03-11 NEW in v2.0. Co-founder & dev team briefing. Contains the only concrete technology stack proposal, an alternative MVP phasing, an explicit Core/Extension module split, and a tier definition that contradicts Source A.
E1 minimente-prototype.jsx (1,342 lines) 2026-03-11 NEW in v2.0. Working React prototype of the Day 1 session flow.
E2 minimente-prototype.html (28 KB) 2026-03-11 NEW in v2.0. Standalone phone-frame mockup, "Minimente – Day 1 Prototype".

Sources A, B and D all date from Feb–Mar 2026 and form a coherent March-2026 position. Source C (July 2026) is four months newer and revises that position — most importantly by renaming and re-scoping Modules 12–15 and by presenting all 15 modules as a linear sequence. Several conflicts that v1.0 read as internal inconsistencies within Source C are, in fact, Source C diverging from the March-2026 position (see OPEN-04, OPEN-18).

Where A/B/D and C disagree on module content, Source C wins. Where C is silent on framework-level concerns (emergency tools, personalisation rules, data collection, UX principles), Source B is retained. Business/commercial content is taken from A. Source D is treated as a proposal, not a decision — nothing in it was ever ratified or implemented (§1A).

v4.0 additionally incorporates two non-file inputs: the v3 external design review (2026-07-27) and the product owner's written response adopting most of it with amendments. Neither is a founder source: wherever they change the shape of the programme Minni authored, the change is recorded as provisional pending her sign-off, never as settled. Disposition log: Appendix A.1.

⚠️ This is a v4 draft pending Minni's review. It is not yet fully implementable, and no part of it has been built. Source C — the "just finished" content document — is materially incomplete: 4 of 15 modules (12, 13, 14, 15) contain screen structure only, with body copy replaced by editorial placeholders, and Module 11's psychoeducation and per-branch exercise scripts are likewise placeholders. Several module titles contradict the March-2026 outline. There is no crisis-safety design anywhere in the source material, which is a P0 blocker for a mental-health product — and the one artefact that was built (the prototype) contains no crisis flow, no disclaimer, and no privacy messaging either, confirming the gap is real rather than an artefact of documentation. Engineering can begin on architecture, the content-rendering engine, and Modules 1–10 immediately; Modules 11–15 can be built structurally but cannot ship user-facing text until Minni supplies it. Additionally, v4 provisionally adopts several product-shape decisions (sequence-lock, Core+Extensions, Daily-Action taxonomy, post-programme state) that only Minni can ratify — see the v4 changelog and Phase 0 item 1. See §10.


1A. Repo State as of 27 July 2026

Summary: the repository is empty. No application code exists. Nothing in §10 is resolved by the codebase, because there is no codebase.

v4.0 note. This section remains accurate: no application code exists as of 27 July 2026. This document (v4) supersedes PRD_v2.md. "v3" was a review-and-response cycle, not a document revision (see §1 provenance), and produced no code either — the only change to the repo between v2 and v4 is this file.

1A.1 What is actually in the repo

/Users/domward/Code/Minimente — verified by full recursive listing:

Minimente/
├── PRD_v2.md          ← v2.0 (superseded)
├── PRD_v4.md          ← this document
└── logs/
    ├── combined.log   0 bytes, created 13 May 2026, never written
    └── error.log      0 bytes, created 13 May 2026, never written

The March 2026 briefing (Source D, slide 9) listed as step 03: "Set up project repo, CI/CD, and design system." That step was never performed. This directory is its unstarted placeholder. An independent corroboration exists in the founder's own project tracker (mission-control), which describes Minimente as "In-development personal app (local only). Scope TBD." with next steps "Define scope and reach initial working state; add git remote once shape is clear."

1A.2 What exists outside the repo

Four artefacts sit in ~/Desktop/Misc/MiNNi/, untouched since 11 March 2026. None is under version control.

Artefact State
minimente-prototype.jsx 1,342-line React prototype, Day 1 only. Runs.
minimente-prototype.html Self-contained phone-frame mockup of the same flow.
Minimente_Dev_Briefing.pptx Source D (see §1.provenance).
Minimente material-*.zip Contains Sources A and B verbatim. Source C is not in it.

1A.3 What the prototype implements — and what it proves

The prototype (E1) is a single-file React component with no persistence layer whatsoever: useState only, no localStorage, no fetch, no backend. All state is lost on reload. It implements Day 1 and nothing else.

Confirms (useful): - The 7-screen session structure is real and was independently implemented. SCREENS = ["welcome", "checkin", "lesson", "breathing", "reflection", "takeaway", "complete"] — matching §5.2's mapping of Source B's 5 parts onto Source C's 7 screens. Three sources now agree on this shape; it is the safest structural commitment in the document. - A visual language already exists — a defined palette ("Sage Calm meets clinical trust": #4A9B7F primary on #F7FAF8), slider, progress bar, and button components, and an animated BreathingSquare implementing the 4-4-4-4 box-breathing pacer of FR-M1-04. §11 Phase 1 item 9 should treat design as having a starting point, not a blank page. - The 5–12 min session claim and Day-1 copy are testable today — the prototype is runnable and could be timed with real users this week, ahead of any build.

Contradicts or fails to support (important): - Content is hardcoded as JSX, not data. Module 1's copy is inline in the component tree. This is the exact inverse of AD-01 ("content as data, not code"), the PRD's single most important architectural decision. The prototype must therefore be treated as a throwaway visual reference, not a foundation — building forward from it would bake in the coupling AD-01 exists to prevent. This is the most consequential repo-derived finding in v2.0. - "Over the next 14 days" is hardcoded in the welcome copy, and the home screen renders a 14 days badge and a 0 / 14 days progress bar. The prototype does not resolve OPEN-01; it is a fourth restatement of the unresolved 14 figure. - The Emergency Tools drawer is non-functional. It renders six tools as cards with cursor: pointer but no click handler — there is no tool content behind any of them. This is dead UI, and it independently confirms OPEN-06: the tools have never had scripts, in any source or artefact. - Zero crisis-safety content. No disclaimer, no "Need urgent help?" affordance, no helpline, no signposting, no escalation — the strings do not appear anywhere in the file. OPEN-10 is confirmed unaddressed in implementation as well as in documentation. - Zero privacy or anonymity messaging. No onboarding, no consent, no "your employer cannot see this" statement (NFR-PRIV-04) — indeed no auth or account concept at all. The product's central adoption promise has never been expressed in any built artefact.

1A.4 Reconciliation verdict

v1.0 assumption about prior progress Reality
Repo may have settled the stack ❌ No repo content. Source D proposes a stack; never ratified (OPEN-24).
Repo may have settled 14 vs 15 days ❌ Not settled. Prototype hardcodes 14; evidence for the conflict is now stronger (OPEN-01).
Repo may have settled the content data model ❌ Not settled. The only artefact does the opposite of AD-01.
Modules 12–15 copy may since have landed ❌ No. No module copy exists anywhere outside Source C.
Phasing §11 may be partly complete ❌ Phase 0 and Phase 1 are both entirely unstarted.

Net effect on §11: the plan does not move forward. It gains a preceding step — repo initialisation — that v1.0 assumed had already happened.


2. Product Overview & Positioning

2.1 Elevator pitch

A 10-day core programme of 5–12 minute daily sessions that teaches practical stress-regulation skills at your desk — building a personal Stress Toolkit you keep, with on-demand extension modules and always-available quick tools. Designed for real working days, not therapy sessions.

(v4 provisional wording under the Core+Extensions decision — OPEN-18/OPEN-01, pending Minni. The v2 pitch read "a 14-day … programme" against 15 delivered modules; the Core+Extensions structure retires both numbers at once. If Minni retains the linear model instead, revert to the v2 wording and resolve 14 vs 15.)

2.2 What Minimente is

2.3 What Minimente is explicitly NOT

These are hard product constraints, not marketing copy. They must be enforced in the UI, in content, and in the safeguarding flow.

2.4 Why it exists (problem statement)

Work-related stress and burnout are rising; traditional therapy does not reach everyone; companies want measurable wellbeing solutions; early support prevents escalation, improves commitment, and reduces the productivity loss and sick leave associated with stress and burnout.


3. Target Users & Business Model

3.1 Market

3.2 Personas

P1 — "Hanna", HR / People Ops decision-maker (buyer, not primary user) - Needs: a defensible, low-risk wellbeing benefit; evidence it works; proof it is being used; something that does not create legal/privacy exposure; measurable data for leadership. - Interacts with: purchase/contract, seat provisioning, an anonymised organisational dashboard. - Fears: employees not using it; being seen to surveil employees; a wellbeing tool mishandling a distressed employee. - v1 implication: she needs aggregate usage and outcome reporting and seat management, and she must be structurally unable to see individual data.

P2 — "Jussi", employee end-user (primary user) - Context: busy working day, open-plan office or home desk, low motivation to start anything that looks like therapy, possibly worried his employer will find out he used it. - Needs: something that takes under 10 minutes, works silently, gives him something usable today, and is private. - v1 implication: anonymity guarantees must be explicit and visible at signup; sessions must be interruptible and resumable; audio must never be required.

P3 — Therapist / professional (Tier 2 & 3 only — POST-MVP) - Reads module-related data shared by the user, sends periodic messages, takes bookings. Not built in v1.

3.3 Pricing tiers (from Source A — unvalidated, see OPEN-12)

Tier Name Contents Price
1 Self-guided access Digital programmes & tools €4–8 / user / month
2 Guided self-help Digital programmes + weekly professional message €15–30 / user / month
3 Hybrid care Digital programmes + live therapist sessions €120–300 / user / month

All tiers include: secure platform, progress tracking, anonymised company insights.

This maps to the three levels of professional support: (1) module library / self-help materials, (2) message a therapist, (3) book a therapist appointment.

⚠️ CONFLICT INTRODUCED BY SOURCE D (new in v2.0). The developer briefing (slide 7) defines the three levels differently: L1 self-guided digital program · L2 AI-enhanced personalization · L3 professional therapist referral. That is not a rewording — it replaces the entire Tier 2 product. Under Source A, Tier 2 is a human service (a therapist message) requiring clinical supply and governance; under Source D it is an algorithmic feature requiring none. Tier 3 likewise shifts from "book a live session" to "referral". The two readings imply different cost structures, different regulatory exposure, and different reasons a customer would pay 3–4× more. §4.1's recommendation to ship Tier 1 only is unaffected — Tier 1 is identical under both readings — but the tier ladder must be settled before any pricing is quoted to a pilot customer. See OPEN-25.

3.4 Programme roadmap (content, not v1)

Beyond Stress Management: Sleeplessness, Burn-out Prevention, Burn-out Recovery, Public Speaking, Interaction Skills, Self-Management Skills, Concentration Skills, Executive-level programmes. v1 must therefore treat "programme" as a first-class, multi-instance content entity — not hardcode a single stress course.


4. MVP Scope Recommendation

4.1 Recommendation: ship Tier 1 only

The MVP is Tier 1 (self-guided access): the Stress Management programme, the Emergency Tools, the Personal Stress Toolkit, progress tracking, reminders, and an anonymised org dashboard. Nothing else.

Rationale:

  1. It is the only tier that is fully in Minimente's control. Tiers 2 and 3 require a supply of licensed therapists, professional liability arrangements, clinical governance, scheduling/calendar infrastructure, and a secure clinical messaging channel with retention and record-keeping obligations. None of this exists, and none of it is described in any source document. Building it would multiply both engineering scope and regulatory exposure.
  2. Tier 1 is the substrate for Tiers 2 and 3 anyway. Both higher tiers are defined in Source A as "digital programmes plus X". Building the digital programme first is strictly on the critical path.
  3. It is what the founder's own plan says. Source A: "Define MVP structure, starting with e.g. the Stress program."
  4. It is pilotable. A pilot with one company client — the stated next step — needs a working self-guided programme, not a care marketplace.
  5. Content readiness is the binding constraint, not tier features. With 4.5 of 15 modules missing copy, adding therapist workflows would be building around an unfinished core.

4.2 Scope table

Capability v1 (MVP) Phase 2 Phase 3+
Stress Management Core programme, Modules 1–10 (fully authored)
Extension modules (former Days 11–15) as an on-demand library (provisional — OPEN-18) structure built; each ships when its copy lands
Always-Available Emergency Tools ✅ (content must be written — see OPEN-06)
Personal Stress Toolkit (persistent object)
Daily check-in (stress/energy), progress tracking, resume-later
Reminders & notifications (in-app + push/email)
3-rule personalisation
Exercise library — exercises as first-class reusable objects (FR-CORE-06) (new in v4; architectural foundation)
"Right now" moment-of-need entry (§7.7) (new in v4; gated on Emergency Tool content)
Search / retrieval — non-AI, client-side (§7.8) (new in v4; gated on OPEN-27 vocabularies)
Post-programme steady state (§7.9) (new in v4)
Crisis-safety / disclaimer / signposting flow P0
Anonymised organisational dashboard + adoption kit (§8.2A) ✅ (specified in v4; built Phase 3) Richer segmentation, cross-org benchmarking
Org seat provisioning & invite flow SSO / SCIM
Web + mobile ✅ (responsive PWA); native wrappers acceptable Full native apps
Localisation (EN + FI) i18n-ready, EN first FI content
Tier 2: message a therapist
Tier 3: book therapist appointment
Additional programmes (sleep, burnout, etc.) ✅ (engine must support)
AI therapist / therapist avatar video / AI chat explicitly out Research only
AI-based personalisation / real recommendation engine Evaluate
Microsoft Teams integration ❌ (unconfirmed) Evaluate
B2C consumer version
Gamification: streaks, badges, points explicitly out — binding (§2.3, UX-09)
Wearables / passive monitoring explicitly out — binding (§2.3, §9.4)

4.3 Explicitly deferred, with reasons

4.4 v1 success metrics

Grounded in the stated goal of "measurable data for organizations":

Metric Definition Target for pilot
Activation % of provisioned seats that complete Day 1 ≥50%
Core completion % of activated users completing the Core programme (Module 10) (v4 — re-baselined, see note) ≥30%
Extension engagement Extension modules started per core-completer (v4) Track only
Daily session completion time Median wall-clock time per session 5–12 min
Stress delta Mean stress_rating, first 3 vs. last 3 core check-ins, per user (v4 — window re-based to the core) Directional decrease
Confidence delta stress_management_confidence (closure module, former Day 15) vs. baseline ≥+2 points
Toolkit adoption % of core-completers with ≥3 toolkit items (v4: with Day-1 accrual (FR-CORE-07) this should approach 100% — a lower figure now signals declined offers, itself a useful signal) ≥70%
NPS recommendation_score (closure module) ≥30
Emergency tool usage Sessions/user/week outside programme flow Track only (no target)

v4 note on comparability. "Core completion" (10 modules) is an easier bar than v2's "Day 14/15 completion" (15 modules). The ≥30% target is re-baselined, not achieved — pilot reporting must never present core-completion numbers as comparable to full-programme figures from earlier drafts or competitor claims. The stress-delta window likewise now spans only the core, giving the effect less time to show; treat the pilot delta as directional only (it already was).

Note the tension: the org buyer wants outcome measurement, but the product explicitly refuses diagnostic instruments. Recommendation: rely on the product's own non-clinical self-ratings (stress, energy, recovery, confidence) plus the Day-15 feedback screen. Do not add PHQ-9/GAD-7-style instruments in v1 — that would contradict §2.3 and change the regulatory posture.


5. Core User Journey & Daily Session Structure

5.1 End-to-end journey

  1. Provisioning — Employer purchases seats; employees receive an invite (org invite code or verified work-email domain).
  2. Onboarding — Account creation (pseudonymous), privacy explanation ("your employer cannot see your individual data"), not-a-crisis-service disclaimer with signposting, optional reminder-time setup.
  3. Home screen (v4) — Today's session (primary CTA), "Right now" moment-of-need entry (§7.7), My Stress Toolkit (co-primary from Day 1 — FR-TK-09), Emergency Tools (always visible), search (§7.8), progress indicator.
  4. Daily session (v4) — one module per day recommended; modules unlock in sequence on completion, never by calendar (FR-CORE-04). Core = Modules 1→10 (provisional — OPEN-18). Fixed five-part structure below; every session offers its practised exercise into the Toolkit (FR-CORE-07).
  5. Between sessions — "Right now" and Emergency Tools available anytime; reminders fire per user configuration; Toolkit is browsable, editable, and its exercises directly runnable.
  6. Core completion (Module 10) (v4) — the accrued Toolkit is curated into warning signs + action plan; the closure module (reflection letter, forward plan, programme feedback — M15 content) follows the core, its exact position folded into the OPEN-18 decision; the extension library is then offered on demand.
  7. Post-programme (v4) — Home reconfigures to the Toolkit-primary steady state (§7.9): Toolkit + "Right now" + Emergency Tools + optional light check-ins + extensions. (Provisionally resolves OPEN-14.)

5.2 The five-part daily session (Source B, confirmed by Source C's screen structures)

# Part Duration Purpose Data written
1 Check-in ~1 min Stress & energy rating (+ module-specific question) stress_rating, energy_rating, module-specific
2 Micro-lesson (psychoeducation) 2–4 min One key concept, no more none
3 Guided exercise 3–6 min The active skill practice varies by module
4 Reflection prompt 1–2 min Consolidation free text / choice, usually optional
5 Daily takeaway + reminder option <1 min Reinforcement + a concrete carry-forward action reminder / toolkit boolean

In Source C this is realised as 7 screens: Welcome & Context → Check-in → Psychoeducation → Guided Exercise (1–n screens) → Reflection → Daily Action → Completion. Module 15 inserts an eighth screen type (Programme Feedback) before Completion.

5.3 UX principles (binding — from Source B)


6. Functional Requirements by Module

6.0 Foundational requirement: content-driven rendering

FR-CORE-01 — The system shall render all module content from a versioned, server-delivered content document (JSON), not from hardcoded client screens. Modules, screens, screen types, copy, options, placeholders, button labels, and stored-field names are all content data.

FR-CORE-02 — The client shall implement a fixed library of screen component types and support any module composed from them. This is what makes Modules 12–15 buildable now and fillable later, and what makes future programmes (sleep, burnout) additive content rather than new code.

Type ID Behaviour Data
Welcome & Context WELCOME Title + body + primary CTA none
Check-in CHECKIN 1–n discrete rating scales rendered as tappable segmented controls with labelled endpoints — not drag sliders (v4; NFR-A11Y-02; point count per OPEN-26), 0–1 single-choice, 0–1 optional free text numeric + enum + text
Psychoeducation PSYCHOED Title + chunked body, optional bullet list, Continue none
Audio-guided exercise EX_AUDIO Audio player + always-visible full transcript + optional paced timer none (or completion flag)
Free-text exercise EX_TEXT 1–n labelled text inputs with placeholder examples text[]
Multi-select exercise EX_MULTI Checkbox list + optional "Other" free text string[] + text
Single-select exercise EX_SINGLE Radio list enum
Timer exercise EX_TIMER Named task + duration choice + start/stop countdown, background-safe task text, duration, outcome
Branch menu EX_BRANCH Card menu; routes to a named sub-flow; returns to shared flow after branch id
Category wheel EX_WHEEL 8 expandable categories with icon, label, example activities none (display)
Dynamic mapping EX_MAP Dropdown(s) whose options are populated from this user's prior selections pairs
Reflection REFLECT Free text and/or single-choice, skippable text / enum
Daily Action ACTION Title + body + primary action drawn from the v4 ending taxonomy (FR-CORE-08: do-now / save-to-toolkit / implementation intention / reminder / insight-only) + secondary dismiss boolean + payload
Programme Feedback FEEDBACK Star rating, 0–10 NPS, dropdown, free text mixed
Completion COMPLETE Title + body + 1–2 navigation buttons completion event

(v4) All EX_* guided-exercise screens render exercises by reference to the exercise library (FR-CORE-06): scripts, transcripts, audio assets, pacers, and default durations belong to the exercise object, not to the screen or module. A referencing screen may supply presentation context — duration preset, framing copy, follow-up reflection options (cf. Module 11's per-branch mini-reflections) — without duplicating exercise content.

FR-CORE-03 — Every module shall be gated by a copy_status flag (final | placeholder). A module with copy_status = placeholder shall not be released to production users. This lets Modules 11–15 be merged, tested, and reviewed without risk of shipping Finnish editorial placeholders to an employee.

FR-CORE-04 (amended in v4) — Modules shall unlock in sequence: completing module N immediately unlocks module N+1. There shall be no calendar gate and no daily cap — a motivated user may complete several modules in one sitting. After a completion the UI should suggest, and never enforce, spacing (e.g. "skills settle best with a break between sessions"), dismissible per UX-08. After a same-day completion the next module is labelled "Recommended for tomorrow"; the word "Locked" shall not be used for anything gated only by pacing. A missed day shall not penalise, reset, or lock the user out; catch-up is trivial by construction (unchanged from v2). Rationale: the iCBT evidence supports ordered content, not time-gated content — v2's calendar-lock was a proposed default, not a sourced requirement, and it punished exactly the motivated-user moments the product needs. Provisionally adopted pending Minni's sign-off — OPEN-13. Safeguarding coupling: see the NFR-SAFE-03 distinct-days amendment in §8.3.

FR-CORE-05 — Every screen transition shall persist state server-side so a session can be resumed on a different device.

FR-CORE-06 (new in v4) — Exercise as a first-class reusable object. Guided exercises shall be modelled as standalone, versioned content objects in an exercise library (exercises, §7.4): slug, title, type, full script, transcript, optional audio asset, default duration, adaptation copy (NFR-A11Y-04), locale variants, own copy_status. Modules, the Toolkit, Emergency Tools, the "Right now" entry (§7.7), search results (§7.8), and extension modules all hold references to exercises, and the client implements exactly one exercise runtime regardless of entry point. Referencing contexts may supply presentation overrides but never fork exercise content. Consequence: an exercise's script/audio/transcript is authored, versioned, and translated once — "Box Breathing" in Module 1, in the Emergency Tools drawer, and in a user's Toolkit is one object. (Generalises v2's FR-TK-05 and the breathing-reset ≈ Module-1 overlap; see AD-08.)

FR-CORE-07 (new in v4) — Toolkit accrual from Day 1. Every module shall declare the exercise(s) it teaches (modules.taught_exercise_id, §7.4 — v2's toolkit_tool_key made a real reference), and every module's Completion or Daily Action shall offer "Add today's tool to my Toolkit" — generalising v2's FR-M11-06 to all modules, idempotent per FR-TK-06, declinable per FR-STD-05. Module 10 thereby becomes curation of an already-populated Toolkit, not its creation (§6.2 M10 amendment, §7.1).

FR-CORE-08 (new in v4) — Daily Action ending taxonomy. The ACTION screen shall support five ending types, declared in content data: do_now (a micro-action completed in-screen — e.g. M5's micro-pause, done right there in 30 seconds), save_to_toolkit, implementation_intention ("when I notice X, I'll Y" — persisted and surfaced in the Toolkit; M10's action plan is this pattern), set_reminder (§7.5), and insight_only (text, no boolean — v2's FR-M4-04 variant). Reminders are the minority ending, used only where a time-anchored prompt genuinely fits (e.g. M8's boundary statement). Which ending each module uses is a content decision — OPEN-28, Minni; the v2 per-module actions stand until she reassigns them. Rationale: eight of ten core modules ended in "set a reminder" — 2015's answer to transfer-of-training, and a notification-fatigue machine. Do-not-modernise note: work-calendar integration is not an acceptable substitute — an employer-visible calendar event leaks participation (NFR-PRIV-04, NFR-PLAT-05).

FR-CORE-09 (new in v4) — Every captured output has a destination. Adopts OPEN-17's proposed resolution as a requirement: same-day operational items (M3 priority_task/deferrable_task, M9 chosen_response) shall surface on Home for the remainder of that day; durable personal artefacts (M4 noticed_thought, M6 balanced_thought, M8 boundary_statement, M12 supportive_statement, M15 future_stress_plan) shall be routed or offerable to the Toolkit. Nothing a user writes may be captured without a surface where they ever see it again.

6.1 Module matrix

v4 note. Under the provisionally adopted Core+Extensions structure (OPEN-18), Days 1–10 are the Core and Days 11–15 are Extension modules offered as an on-demand, any-order library after core completion. The "Day" column is retained for traceability to Source C; extension "days" are catalogue positions, not calendar days. Recommended handling of the closure module (M15): it becomes the core finale or fires on completion — folded into the OPEN-18 sign-off. Note the alignment this creates: all missing copy (11–15) now sits in the extension library, so the fully authored core is shippable while extensions land as a content pipeline (see Top Risk 1).

Day Module theme (Source C, canonical) Outline name (Source C header / Source B) Duration Exercise pattern Copy status New data fields
1 Understanding Stress (same) 5–7 EX_AUDIO (Box Breathing) ✅ Final
2 Recognising Stress Signals (same) 5–7 EX_AUDIO (Body Scan) ✅ Final
3 Workload vs. Capacity (same) 5–7 EX_TEXT ×2 ✅ Final priority_task, deferrable_task
4 Automatic Stress Thoughts (same) 5–7 EX_TEXT ×1 ✅ Final noticed_thought
5 Micro-Recovery During the Workday (same) 5–7 EX_AUDIO ✅ Final
6 Thought Reframing (same) 5–7 EX_TEXT ×2 ✅ Final stress_thought, balanced_thought
7 Focus & Interruptions (same) 7–10 EX_MULTI ×2 + EX_TIMER ✅ Final distractions[], focus_strategies[], focus_task, focus_duration, focus_outcome
8 Boundary Setting (same) 7–10 EX_TEXT ×3 ✅ Final boundary_request, boundary_statement, boundary_alternative
9 Emotion Regulation at Work (same) 5–7 EX_SINGLE + EX_TEXT ✅ Final identified_emotion, chosen_response
10 Personal Stress Toolkit (same) 7–10 EX_MULTI ×2 + EX_MAP ✅ Final toolkit_items[], custom_tools[], warning_signs[], action_plan[]
11 Body-Based Stress Release (same) 8–12 EX_BRANCH → 4× (intro + EX_AUDIO + REFLECT) ⚠️ Partial — psychoeducation and per-branch scripts are placeholders body_reset_choice, branch_effect, need_met, body_state
12 Self-Compassion Under Stress Self-Compassion at Work 7–10 EX_TEXT ×2 Structure only self_talk_style, inner_critic_text, supportive_voice_text, helpful_voice, supportive_statement_saved
13 Understanding Your Emotional Needs Meaning & Motivation 7–10 EX_SINGLE + EX_TEXT Structure only emotional_needs_awareness, primary_need, need_response_action, recurring_need, insight_saved
14 Balance Your Battery Sustainable Habits 8–10 EX_WHEEL + EX_MULTI ×2 + EX_TEXT Structure only; icons corrupted recovery_rating, current_recovery_sources[], selected_recovery_focus[], recovery_action
15 Moving Forward Reflection & Long-Term Plan ❌ 8–10 EX_TEXT (letter) + FEEDBACK Structure only; emoji corrupted stress_management_confidence, reflection_letter, future_stress_plan, programme_rating, recommendation_score, favourite_module, programme_feedback

6.2 Modules 1–11 — Functional requirements

All modules share the following baseline requirements unless overridden:


Module 1 — Understanding Stress (Day 1) · 5–7 min

Goal: understand stress and the bodily responses related to it.

Screen Type Requirements
1 Welcome & Context WELCOME Shall present the programme intro; primary button label "Start today's session". FR-M1-01 (amended in v4): the intro copy currently says "14-day programme" — must be reconciled with the adopted programme structure before release (OPEN-01/OPEN-18: provisionally a 10-module core + extensions, retiring both "14" and "15").
2 Check-in CHECKIN FR-M1-02: stress slider 1–10, energy slider 1–10, optional free text "What is causing stress today?". Writes stress_rating, energy_rating, optional_text.
3 Psychoeducation PSYCHOED FR-M1-03: "Stress is a normal body response" — nervous-system activation, useful in short bursts, problematic when chronic. No data.
4 Guided Exercise EX_AUDIO FR-M1-04: "Breathing Reset (4-4-4-4 Box Breathing)". Shall render the full script as text and (when available) audio; shall provide an optional visual/haptic 4-count pacer for inhale / hold / exhale / pause; shall end with a body-awareness noticing step. No data stored. Audio shall not autoplay.
5 Reflection REFLECT FR-M1-05: free text "Where did you notice stress in your body today?"reflection_text_optional. Optional.
6 Daily Action ACTION FR-M1-06: primary "Set a reminder to use the breathing reset today" shall create a user-scheduled reminder (§7.5); secondary "No thanks"/"Continue".
7 Completion COMPLETE FR-M1-07: "Day 1 complete ✓"; buttons "Go to Home" and "Try an Emergency Tool" (deep-links to the Emergency Tools list).

Module 2 — Recognising Stress Signals (Day 2) · 5–7 min

Goal: recognise personal early stress signals in order to respond earlier.


Module 3 — Workload vs. Capacity (Day 3) · 5–7 min

Goal: understand workload vs. capacity and reduce overload.


Module 4 — Automatic Stress Thoughts (Day 4) · 5–7 min

Goal: recognise automatic stress thoughts without reacting to them.


Module 5 — Micro-Recovery During the Workday (Day 5) · 5–7 min

Goal: learn that small recovery moments during the day reduce stress.


Module 6 — Thought Reframing (Day 6) · 5–7 min

Goal: reframe automatic stress thoughts into balanced perspectives.


Module 7 — Focus & Interruptions (Day 7) · 7–10 min

Goal: recognise personal distractions and protect attention via a focused work session. First multi-part exercise module.


Module 8 — Boundary Setting (Day 8) · 7–10 min

Goal: practise setting clear, respectful boundaries.


Module 9 — Emotion Regulation at Work (Day 9) · 5–7 min

Goal: notice emotions early and respond intentionally rather than react.


Module 10 — Personal Stress Toolkit (Day 10) · 7–10 min

Goal: curate the personal collection of stress strategies accrued since Day 1, and build a simple action plan. v4: this module curates the persistent Toolkit object (§7.1), which accrues from Day 1 (FR-CORE-07) — it no longer creates it.

v4 amendment. With Toolkit accrual from Day 1, this module's job shifts from creating the Toolkit to curating it — which is what parts (b) and (c) were always uniquely good at. FR-M10-02 (amended): part (a)'s option list shall arrive pre-checked with the items already in the user's Toolkit; the screen's purpose is review, pruning, and additions (including the two custom-tool fields), not first assembly. FR-M10-03…08 stand unchanged. Framing copy needs a light edit from Minni ("review your toolkit", not "build your toolkit") — flagged under OPEN-28's content pass.


Module 11 — Body-Based Stress Release (Day 11) · 8–12 min (variable)

Goal: recognise what the body needs and practise an appropriate body-based regulation strategy. First branching module.

⚠️ COPY GAP. Source C marks Module 11's psychoeducation body as "(Keep your existing text)" and does not spell out the four per-branch audio scripts. Module 11 is therefore NOT implementation-ready as user-facing content, despite being in the "complete" block. Structure below is buildable; text is not.

Branch Mini-reflection axis Options (as documented)
A Calm Breathing Calm much calmer / slightly calmer / about the same / still activated
B Stretch & Release Softness (scale on softness — exact options ❌ missing)
C Shake Out Tension Lightness/restlessness (exact options ❌ missing)
D Gentle Movement Energy/focus (exact options ❌ missing)

branch_effect (branch-scoped enum).


6.3 Modules 12–15 — STRUCTURE ONLY (body copy NOT implementable)

🚫 BLOCKING NOTICE FOR THE IMPLEMENTING TEAM. In Source C, Modules 12–15 contain screen names, screen purposes, screen types, button labels, option lists, and stored-field names — but the actual prose (welcome text, psychoeducation body, exercise framing copy) is replaced with editorial placeholders: "(Keep your current text unchanged)" and the Finnish "(Pidä nykyinen tekstisi sellaisenaan)" ("keep your current text as is"). This indicates the author was editing an existing draft that did not survive into the exported copy.

These four modules may be built structurally and merged behind copy_status = placeholder, but MUST NOT be released to users until Minni supplies real copy. No copy may be invented by the implementing team — this is clinical-adjacent content and must come from the author.


Module 12 — Self-Compassion Under Stress (Day 12) · 7–10 min

Goal: recognise the inner critic, strengthen the supportive inner voice, practise self-compassion. ⚠️ Title mismatch: the outline at the top of Source C calls this "Self-Compassion at Work" (OPEN-04).

Screen Type Defined Missing
Welcome & Context WELCOME screen exists ❌ all body copy
Check-in CHECKIN stress slider, energy slider, + single-choice "When you're feeling stressed, how do you usually speak to yourself?" → options: mostly kindly / a mix of kindness and criticism / mostly critically / not sure. Stores self_talk_style. — (fully specified)
Psychoeducation PSYCHOED Title: "Your brain listens to the voice you practise most" ❌ body copy
Guided Reflection EX_TEXT Title: "Meet your inner voices". Two text inputs: "What does your inner critic usually say?" (placeholder e.g. "You'll never get this right") → inner_critic_text; "What might your supportive voice say instead?" (placeholder e.g. "This is difficult, but you're doing your best") → supportive_voice_text ❌ framing/instruction copy
Reflection REFLECT "Which voice helps you move forward?" single-choice: inner critic / supportive voice / a little of bothhelpful_voice; + optional text on giving the supportive voice more space this week
Daily Action ACTION Title: "The voice you practise becomes easier to hear". Primary: "Save my supportive statement" → boolean supportive_statement_saved; saved statement is supportive_voice_text ❌ body copy
Completion COMPLETE "Day 12 complete"; buttons Go to Home / Continue tomorrow

Missing for M12: Welcome body, psychoeducation body, guided-reflection framing copy, daily-action body. Title of record must be confirmed.


Module 13 — Understanding Your Emotional Needs (Day 13) · 7–10 min

Goal: recognise emotional needs, understand how unmet needs contribute to stress, identify a realistic self-care response. ⚠️ Title mismatch: outline calls this "Meaning & Motivation" — a substantively different topic, not just a rename (OPEN-04).

Screen Type Defined Missing
Welcome & Context WELCOME screen exists ❌ all body copy
Check-in CHECKIN stress + energy sliders, + single-choice "Which statement feels closest to how you've been feeling recently?"I've been ignoring my own needs / I notice my needs but struggle to respond / I'm getting better at listening to myself / I'm not sure what I need. Stores emotional_needs_awareness.
Psychoeducation PSYCHOED Title: "Emotions often point towards unmet needs" ❌ body copy
Guided Reflection EX_SINGLE + EX_TEXT Title: "What might you need today?". Single-choice "Which need feels most important right now?" → Rest, Connection, Safety, Understanding, Space, Encouragement, A sense of control, Something else → primary_need. Then free text "How could you respond to that need in one small realistic way today?" (placeholders: take a proper lunch break, call a friend, ask for help, spend 10 quiet minutes alone) → need_response_action ❌ framing copy
Reflection REFLECT Title: "Needs aren't weaknesses". Optional text: a recurring overlooked need + one small thing to do this week → recurring_need ❌ body copy
Daily Action ACTION Title: "Listening to your needs is a skill". Primary "Save today's insight"insight_saved; Secondary "Add this reminder to my Stress Toolkit" → appends to Toolkit ❌ body copy
Completion COMPLETE "Day 13 complete"; Go to Home / Continue tomorrow

Missing for M13: Welcome body, psychoeducation body, guided-reflection framing, reflection body, daily-action body. Topic of record must be confirmed (emotional needs vs. meaning & motivation) — this is a content-design decision, not a copy edit.


Module 14 — Balance Your Battery (Day 14) · 8–10 min

Goal: recognise different sources of recovery, reflect on current recovery balance, choose one action to strengthen wellbeing. ⚠️ Title mismatch: outline calls this "Sustainable Habits" (OPEN-04). ⚠️ Icon corruption: the eight Recovery Wheel category icons came through as mojibake in the export (OPEN-05).

Screen Type Defined Missing
Welcome & Context WELCOME Title: "Build Your Recovery Balance" ❌ body copy
Check-in CHECKIN Single slider only: "How well recovered do you feel today?" 1 (completely drained) – 10 (fully recharged) → recovery_rating. Note: this module does NOT collect stress/energy — the CHECKIN component must support a variable slider set.
Psychoeducation PSYCHOED Title: "Recovery is more than resting" ❌ body copy
Recovery Wheel EX_WHEEL Interactive wheel/menu of 8 categories, each expanding to show example activities: Rest, Connection, Movement, Nature, Creativity, Learning, Joy & Play, Purpose ❌ icons (see below); ❌ per-category example-activity lists
Reflection REFLECT (multi) Title: "What does your Recovery Balance look like?" Two multi-selects over the same 8 categories: (a) which already help recharge you → current_recovery_sources[]; (b) which would you like to strengthen → selected_recovery_focus[]
Daily Action ACTION Title: "One small step is enough". Free text "What's one small thing you could add to support your recovery?" (placeholders: short walk, reading 10 min, calling a friend, baking, music, time in nature) → recovery_action. Primary "Add to my Stress Toolkit" ❌ body copy
Completion COMPLETE "Day 14 complete"; Go to Home / Continue to Day 15

Recovery Wheel icons — RECONSTRUCTION, NEEDS CONFIRMATION. The following are best-guess replacements for the corrupted glyphs and must be confirmed or replaced by Minni/design before implementation:

Category Provisional icon
Rest 🌿
Connection 🤝
Movement 🏃
Nature 🌳
Creativity 🎨
Learning 🧠
Joy & Play 🎲
Purpose

Recommendation: do not use raw emoji for these at all. Emoji render inconsistently across platforms and are poor for accessibility. Use a proper icon set with alt text equal to the category name; treat the emoji list above only as semantic intent.

Missing for M14: Welcome body, psychoeducation body, all eight categories' example-activity lists, daily-action body, final icon set.


Module 15 — Moving Forward (Day 15) · 8–10 min

Goal: reflect on progress, consolidate learning, create a plan for future stress, and collect programme feedback. ⚠️ Title mismatch: outline calls this "Reflection & Long-Term Plan". Celebration emoji on the Completion screen came through corrupted (OPEN-05).

Screen Type Defined Missing
Welcome & Context WELCOME Title: "Moving Forward" ❌ body copy
Check-in CHECKIN Single slider: "How confident do you currently feel in managing your stress?" 1–10 → stress_management_confidence
Psychoeducation PSYCHOED Title: "Progress, not perfection" ❌ body copy
Guided Reflection EX_TEXT Title: "Looking back with kinder eyes". A "Dear me…" letter-writing exercise with optional prompt chips: "I understand now that…", "I wish I had remembered…", "One thing that would have helped me then…"reflection_letter (long-form text; must support multi-paragraph input and autosave) ❌ framing copy
Daily Action ACTION Title: "The next stressful day". Free text: "The next time I notice stress building up, I will…" with optional prompts (a sign I'll try to notice earlier / one thing that usually helps me / one reminder I'd like to give myself). Primary "Save my plan"future_stress_plan. Plan shall be written into the Toolkit. ❌ body copy
Programme Feedback FEEDBACK Title: "Looking back on your journey". Q1 star rating 1–5, "How helpful was this programme overall?"programme_rating. Q2 0–10 NPS, "How likely are you to recommend this?"recommendation_score. Q3 dropdown, "Which part was most helpful?", listing the module themes → favourite_module. Q4 optional free text, "Anything that could make this programme even better?"programme_feedback. All questions skippable. ⚠️ Q3 is documented as listing 14 module themes — confirm whether it lists Days 1–14 (excluding Day 15 itself) or all 15 (OPEN-01/OPEN-02)
Completion COMPLETE Congratulations message; shall explicitly state that the Stress Toolkit persists after the programme ends; buttons Go to Home / Open my Stress Toolkit ❌ congratulations copy; ❌ celebration emoji/illustration (corrupted in export)

Missing for M15: Welcome body, psychoeducation body, letter-exercise framing, daily-action body, congratulations copy, celebration asset, Q3 option-list length decision.

FR-M15-01 The programme-feedback responses shall be stored separately from therapeutic content and shall be included in organisational aggregate reporting (as aggregates only, with the free-text field excluded from any org-visible report by default — see §8.2).


7. Cross-Cutting Systems

7.1 Personal Stress Toolkit (persistent, stateful, cross-module)

v4 framing (adopted, with the product owner's correction). The product's purpose is building lifelong stress-regulation skills; the Toolkit is the persistent interface to those skills — the course creates capability, the Toolkit reinforces it. The goal state is "I've learnt to regulate stress", never "I've collected ten tools": Toolkit copy and UI shall reflect skills practised, not items owned, with no collection mechanics (UX-09).

Mechanically, the Toolkit is not an exercise output — it is a first-class, persistent, user-owned in-app object with its own destination screen, reachable from Home (co-primary with Today's Session — FR-TK-09) and from module completion screens, accruing from Day 1 (FR-CORE-07) and becoming the primary surface after the programme (§7.9).

Requirements

7.2 Always-Available Emergency Tools

FR-ET-01 A set of short self-regulation tools shall be reachable from the home screen at all times, regardless of programme progress, day, or completion state — including before Day 1 and after Day 15.

FR-ET-02 Emergency Tools shall be usable without a check-in, without unlocking, and without affecting programme progress.

FR-ET-03 Initial tool set (Source B, marked non-exhaustive):

Tool Duration
Breathing reset 2 min
Grounding exercise 90 sec
Quick thought-dump journal ~2 min
Body scan 3 min
Desk-based stretch routine ~3 min
Safe place exercise 5 min
Progressive relaxation 2 min

FR-ET-04 Each use shall write an emergency_tool_event (tool id, started_at, completed bool, entry point).

FR-ET-05 The quick thought-dump journal shall store free text privately to the user; it shall be deletable by the user.

FR-ET-06 Emergency Tools shall be available offline once cached.

CONTENT GAP: No scripts exist for any Emergency Tool in any source document. Some overlap with module exercises (breathing reset ≈ Module 1; body scan ≈ Module 2), but grounding, thought-dump, desk stretch, safe place, and progressive relaxation have no authored content. See OPEN-06. This is a v1 blocker because Emergency Tools are the product's only acute-moment offering and are advertised on the home screen from Day 0.

v2.0 update — confirmed empirically, and a headcount discrepancy. The prototype (E1) renders an Emergency Tools drawer whose six cards have no click handlers and no content behind them. The gap is therefore not a documentation oversight: these tools have never existed as anything but a list of names. Separately, Source B lists seven tools; Source D (slide 6) and the prototype both list six — omitting Progressive relaxation. The table above retains Source B's seven per the §1 precedence rule. Minni should confirm whether progressive relaxation is in or out, since it changes the authoring count in OPEN-06 from five scripts to four.

FR-ET-07 The Emergency Tools surface shall also host the "Need urgent help?" crisis signposting entry point (§8.3). Emergency Tools are not a crisis service and the distinction must be visually and textually explicit.

FR-ET-08 (new in v4) Emergency Tools are a curated view over exercise-library objects (FR-CORE-06), not a parallel implementation: each tool references an exercise, runs in the shared exercise runtime, and where a tool and a module exercise share a script (breathing reset ≈ Module 1's Box Breathing; body scan ≈ Module 2's), they are literally the same object with an emergency-context duration preset. This removes the duplicate-authoring burden for the two overlapping tools — but the remaining tools still need scripts, and v4's "Right now" entry (§7.7) and search (§7.8) both increase Day-0 dependence on them: OPEN-06 is more critical in v4, not less.

7.3 Personalisation / recommendation logic

This is three deterministic rules, not a recommendation algorithm. Source A lists "recommendation algorithm for content" as an open question; Source B provides the following rules. For v1, the three rules are sufficient — implement them as declarative, config-editable rules and do not build ML.

Rule Trigger Action
PR-01 stress_rating ≥ 7 on today's check-in Suggest an Emergency Tool (non-blocking card, dismissible)
PR-02 energy_rating ≤ 4 on today's check-in Suggest a body-based exercise
PR-03 Repeated high stress (threshold undefined — see OPEN-07) Suggest a professional-support link

FR-PR-01 Rules shall be evaluated immediately after check-in submission and shall never block progression through the session. FR-PR-02 Rules shall be expressed as data (condition + action + copy key), editable without a release. FR-PR-03 Rule firings shall be logged (rule_id, fired_at, accepted bool) so that rule usefulness can be measured during the pilot.

v4 scale coupling. PR-01's ≥ 7 and PR-02's ≤ 4 are defined against the historical 1–10 scale. If OPEN-26 lands on a different granularity, these cutoffs — and NFR-SAFE-03's — must be re-derived and re-signed-off by Minni/clinical, never rescaled arithmetically by engineering. The 10-point option leaves every threshold untouched.

⚠️ CONTRADICTION: PR-03 suggests a "professional support link", but Tier 1 (the MVP) has no professional support. This must be resolved. Recommended v1 behaviour: PR-03 surfaces a tier-aware destination — for Tier 1, a signposting card pointing to the employer's occupational-health provider and/or public services, configured per organisation at contract time; for Tiers 2/3 (later), the therapist message/booking flow. This overlaps heavily with the crisis-safety gap (§8.3) and should be designed together.

7.4 Data collection & candidate schema

Product-wide data collected (Source B): daily stress and energy ratings; module completion data; emergency tool usage; module-related additional data for therapists; general feedback. Source A additionally names mood as a daily metric — no module collects mood (OPEN-08).

Candidate schema

organizations
  id, name, country, locale_default, tier (1|2|3),
  crisis_resources_config (jsonb), created_at

org_seats
  id, org_id, invite_code, claimed_by_user_id NULL, claimed_at, revoked_at

users                                  -- pseudonymous
  id (uuid), org_id, auth_identifier_hash, display_name NULL,
  locale, timezone, created_at, deleted_at
  -- NOTE: no employee name/number required; see §8.2

programmes                             -- content, versioned
  id, slug ('stress-management'), title, day_count, version, published_at
                                       -- v4: day_count = core length under OPEN-18

exercises                              -- NEW in v4; first-class, reusable (FR-CORE-06, AD-08)
  id, slug ('box-breathing'), title, exercise_type,
  script_key, transcript_key, audio_asset_url NULL,
  default_duration_s, adaptation_copy_key NULL,
  locale, version, copy_status ('final'|'placeholder'), published_at

modules
  id, programme_id, day_index, theme, goal,
  duration_min, duration_max, copy_status ('final'|'placeholder'),
  is_extension BOOL,                   -- v4: Core vs Extension (provisional, OPEN-18)
  taught_exercise_id NULL              -- v4: FK exercises — what this module teaches and
                                       -- offers to the Toolkit (was toolkit_tool_key)

screens
  id, module_id, order_index, screen_type, title_key,
  body_key, config (jsonb),            -- options, placeholders, button labels, field names
  exercise_id NULL                     -- v4: EX_* screens reference the exercise library;
                                       -- config may carry per-context overrides (FR-CORE-06)

enrollments
  id, user_id, programme_id, started_at, current_day,
  completed_at NULL, last_active_at

session_states                          -- resume-later
  id, enrollment_id, module_id, current_screen_id,
  draft_answers (jsonb), updated_at

daily_checkins
  id, user_id, enrollment_id, module_id, occurred_at,
  stress_rating INT NULL, energy_rating INT NULL,
  recovery_rating INT NULL,             -- M14
  confidence_rating INT NULL,           -- M15
  optional_text TEXT NULL,
  extra (jsonb)                         -- self_talk_style, emotional_needs_awareness

screen_responses                        -- generic, heterogeneous by design
  id, user_id, enrollment_id, module_id, screen_id,
  field_name TEXT,                      -- e.g. 'balanced_thought', 'distractions'
  value_text TEXT NULL, value_num NUMERIC NULL,
  value_bool BOOL NULL, value_json JSONB NULL,
  is_sensitive BOOL DEFAULT TRUE, created_at

module_completions
  id, user_id, enrollment_id, module_id, completed_at,
  elapsed_seconds, branch_taken NULL     -- M11

toolkit_items
  id, user_id, item_type, exercise_id NULL, label TEXT,  -- v4: FK exercises (was tool_key)
  payload (jsonb), source_module_id, created_at,
  archived_at NULL, sort_order

action_plan_entries
  id, user_id, warning_sign TEXT, toolkit_item_id, created_at

emergency_tool_events
  id, user_id, exercise_id, entry_point, started_at,   -- v4: tools are exercises (FR-ET-08)
  completed BOOL, duration_seconds

right_now_events                        -- NEW in v4 (§7.7); routing signal only, never scored
  id, user_id, entry_state, routed_to, occurred_at
  -- excluded from org reporting in any form; no free text

reminders
  id, user_id, source_module_id NULL, kind, body_key,
  body_override TEXT NULL, scheduled_for, recurrence NULL,
  channel ('push'|'email'|'inapp'), status, fired_at NULL

personalisation_events
  id, user_id, rule_id, fired_at, context (jsonb), accepted BOOL NULL

programme_feedback
  id, user_id, enrollment_id, programme_rating INT,
  recommendation_score INT, favourite_module_id NULL,
  feedback_text TEXT NULL, submitted_at

safeguarding_events                     -- NEW; see §8.3
  id, user_id, trigger_rule, triggered_at,
  surfaced BOOL, user_response NULL

Design notes

7.5 Notifications & reminders

v4: under FR-CORE-08, "set a reminder" is one of five Daily-Action endings and the minority case — most modules should end in do-now actions or Toolkit saves (assignment: OPEN-28). A real notification subsystem (not a client-local timer) is still required for the reminders that remain, the opt-in daily programme nudge, and the Focus Window.

7.6 Progress tracking & resume-later

7.7 "Right now" moment-of-need entry (NEW in v4)

A stressed employee opens this app because they are stressed now, not because it is Day 6. v2's only now-shaped surface was the Emergency Tools drawer — which has no content behind it (OPEN-06). This section makes moment-of-need entry first-class, assembled almost entirely from parts the PRD already had: the routing-rule machinery (§7.3), the exercise library (FR-CORE-06), Emergency Tools, and the Toolkit. New authored content required: a handful of state labels and one routing table.

7.8 Search & retrieval (NEW in v4 — deliberately non-AI)

By 2027, retrieval is table stakes in any knowledge product. A user should be able to type "catastrophising" and land on Module 6, the thought-reframing exercise, and any related extension — with no AI: no LLM, no chat, no generated answers. Deterministic retrieval sits entirely inside the §4.3/§9.4 exclusions, and the architecture (AD-01, FR-CORE-06) already supports it.

7.9 Post-programme steady state (NEW in v4 — provisionally resolves OPEN-14)

Courses end; products don't. The steady state is the renewal story the org buyer ultimately pays for, and under the v4 framing it is simply the product with the scaffolding removed: the skills interface, kept.


8. Non-Functional Requirements

8.1 Security

8.2 Privacy, GDPR & organisational reporting

The target market includes Finland/EU and the data is mental-health-related. Treat this as special category data under GDPR Art. 9.

8.2A Organisational dashboard & adoption kit — minimum specification (NEW in v4)

The buyer's surface was the least-specified thing in v2 (OPEN-22, filed P3) while being what the buyer actually pays for. v4 specifies it now; it is still built in Phase 3 (§11 item 16). Design principle, per the product owner: the employer isn't buying therapy, they're buying confidence — and the dashboard is also where the anonymity promise becomes visible and credible to both sides.

Remaining open under OPEN-22: visual design; the per-org configuration UI (crisis resources and occupational-health contact — cf. §7.3 PR-03, NFR-SAFE-02); pilot-report format.

8.3 🚨 Safeguarding / crisis-safety flow — P0 GAP

None of the three source documents specify what happens when a user is in distress. The deck says the product is "not suitable for psychological emergency or crisis situations" — but says nothing about how the product detects, responds to, or routes such situations. For a mental-health product sold into workplaces, this is the most serious gap in the material and is a launch blocker, not a nice-to-have.

Minimum required design (proposed — requires Minni's and legal/clinical sign-off):

8.4 Accessibility

8.5 Platform parity, offline, and office-friendliness

8.6 Internationalisation


9. Technical Architecture Recommendation

Deliberately vendor-neutral; shapes and responsibilities, not brand names.

v2.0 update — a concrete stack was proposed in March 2026 and never ratified. Source D (slide 8) proposes: React Native (or PWA) | Node.js / Supabase | PostgreSQL | Vercel / Railway | Lottie (animations), with the guidance "Start with PWA for fastest time-to-market, migrate to native if needed." Slide 9 then lists "Decide tech stack: PWA vs React Native" as an open next step — so the deck proposes and defers in the same breath, and the repo contains no evidence any decision followed (§1A.1: no package manifest of any kind).

This is worth recording because Source D and this PRD converge independently: "start with PWA" matches AD-02, and "PostgreSQL" matches §9.1's Postgres-shaped primary DB with RLS (AD-04). Supabase in particular would satisfy AD-04 directly, since row-level security is native to it. That convergence is supporting evidence, not a decision. The stack remains formally open — see OPEN-24 — and one caution applies: the Lottie/React Native pairing in the deck was chosen with the breathing animation in mind, but the prototype already implements that pacer in plain React with CSS transitions, so animation tooling should not drive the platform choice.

v4 update — two additions to the shape below. (1) The Content Service additionally owns the exercise library (FR-CORE-06) and builds the client-side search index at content-publish time (§7.8); the client gains a single exercise runtime shared by modules, Toolkit, Emergency Tools, "Right now", and search results. (2) There is deliberately no server-side search endpoint in v1 — search ships as an index inside the content bundle and runs locally (AD-09). The diagram is otherwise unchanged from v2.

9.1 Shape

┌──────────────────────────────────────────────────────────┐
│ CLIENTS                                                   │
│  Responsive web app (PWA) — primary                       │
│  Mobile: same codebase wrapped, or thin native shells      │
│  ── Screen-component library (types: §6.0)                 │
│  ── Local content cache + offline write queue              │
│  ── Timer/pacer engine (box breathing, Focus Window)       │
└────────────────────────┬─────────────────────────────────┘
                         │ HTTPS / JSON
┌────────────────────────▼─────────────────────────────────┐
│ API GATEWAY  (authn/authz, rate limiting, tier gating)    │
└──┬──────────┬────────────┬──────────┬────────────┬───────┘
   │          │            │          │            │
┌──▼───┐ ┌───▼──────┐ ┌───▼─────┐ ┌──▼───────┐ ┌──▼─────────┐
│Ident.│ │ Content  │ │Programme│ │Notific-  │ │ Reporting  │
│& Org │ │ Service  │ │& Response│ │ation Svc │ │ & Aggreg.  │
│ Svc  │ │(versioned│ │  Service │ │(push/    │ │(k-anon     │
│      │ │ modules) │ │+ Toolkit │ │ email/   │ │ rollups)   │
└──┬───┘ └───┬──────┘ └───┬─────┘ │ schedule)│ └──┬─────────┘
   │         │            │       └──┬───────┘    │
┌──▼─────────▼────────────▼──────────▼────────────▼────────┐
│ PRIMARY DB (Postgres-shaped, EU region, RLS enabled)      │
│  + separate encrypted store/keyset for free-text content   │
│ OBJECT STORE: audio files, illustrations, icons            │
│ EVENT STORE: completions, tool usage, rule firings         │
└───────────────────────────────────────────────────────────┘
        ┌───────────────────────────────────────┐
        │ POST-MVP (tier-gated, not v1):        │
        │  Therapist Messaging Service (T2)     │
        │  Booking / Scheduling Service (T3)    │
        │  Clinician console                    │
        └───────────────────────────────────────┘

9.2 Component responsibilities

Component Responsibility v1?
Client Renders any module from content JSON via the screen types; single exercise runtime (v4); local search over the shipped index and cached user content (v4); offline cache; timers; autosave
Identity & Org Pseudonymous accounts, magic-link auth, org seat provisioning via invite code / verified domain, tier entitlement, RLS claims
Content Service Serves versioned, locale-scoped programme/module/screen documents and the exercise library (v4); enforces copy_status gating (per exercise too); builds the search index at publish time, over released content only (v4); content publishing workflow
Programme & Response Service Enrolment, day unlocking, session state/resume, check-ins, screen responses, module completions, Toolkit CRUD, action plan, personalisation rule evaluation, safeguarding rule evaluation
Notification Service Scheduled reminders, quiet hours, timezone handling, channel fallback, Focus Window completion
Reporting & Aggregation Nightly rollups to org-level aggregates with the ≥10 k-anonymity gate; free text never enters this path
Therapist Messaging / Booking Tier 2/3 ❌ Post-MVP

9.3 Key architectural decisions

9.4 Explicitly speculative — do not build in v1


10. Open Questions & Risks

Ordered by severity. P0 = blocks launch. P1 = blocks build of the affected area. P2 = needs a decision before pilot.

ID Priority Issue Detail Owner Proposed resolution
OPEN-03 P0 Body copy missing for Modules 12–15 All four modules contain only screen structure; prose replaced by "(Keep your current text unchanged)" / "(Pidä nykyinen tekstisi sellaisenaan)". Missing: welcome bodies, psychoeducation bodies, exercise framing, daily-action bodies, M15 congratulations copy, M14 category example-activity lists. Minni Source original draft from Minni's working files, or re-author. Build structurally behind copy_status gate meanwhile.
OPEN-10 P0 No crisis-safety flow exists anywhere The product declares itself unsuitable for crises but defines no detection, no signposting, no escalation, no disclaimer flow. Highest-consequence gap in the material. v2.0: confirmed in implementation as well as documentation — the prototype contains no disclaimer, no crisis affordance, and no privacy/anonymity messaging (§1A.3). Four sources and one build, none of which address it. Minni + legal/clinical Unchanged. Adopt §8.3 (NFR-SAFE-01…06); decide the free-text scanning option explicitly.
OPEN-06 P0 Emergency Tool content does not exist Seven tools are named in Source B; none have scripts. Two overlap with module exercises; five (grounding, thought-dump, desk stretch, safe place, progressive relaxation) are unwritten. These are home-screen-visible from Day 0. v2.0: confirmed — the prototype's tools drawer is non-functional (six cards, no handlers, no content). New sub-question: Source B lists 7 tools, Source D and the prototype list 6, omitting progressive relaxation. Minni Author the missing scripts (5 if the tool set is 7; 4 if 6), or reduce the v1 set to those that exist. Confirm the tool count first.
OPEN-02 P1 Module 11's copy is also incomplete Despite sitting in the "fully authored" block, M11's psychoeducation is a placeholder and all four branch audio scripts are unspecified. The "content is done" assumption is wrong by 4.5 modules, not 4. Minni Same as OPEN-03.
OPEN-01 P1 14 days vs. 15 days Positioning line, Module 1's welcome copy, and Source B all say "14-day". Source C delivers 15 modules across Days 1–15, and M14's completion button reads "Continue to Day 15". M15's feedback dropdown is documented as listing "all 14 module themes". v2.0: two further restatements of "14", and the conflict is older than v1.0 assumed. Source D's content slide is headed "14-Day Stress Management" while listing 15 numbered modules on the same slide — so the number contradicted the content four months before Source C existed. The prototype hardcodes 14 days and 0 / 14 days. Still unresolved — no source or artefact reconciles it; five now restate it. v4: the provisionally adopted Core+Extensions structure (OPEN-18) retires both numbers at once — the product becomes a 10-module core plus 5 extensions, and neither "14" nor "15" survives in copy or marketing. If Minni rejects that structure, this conflict returns in full. Minni v4: fold into the OPEN-18 sign-off. If Core+Extensions is ratified, update Source-A-derived marketing ("14-day") and M1's welcome copy accordingly (FR-M1-01); if the linear model is retained, decide 14 vs 15 as before. Note the likely origin: "14" appears to be a marketing figure that was never revised when the module list reached 15.
OPEN-18 P1 Core vs. optional module structure contradiction Source B scopes Modules 1–10 as Core and 11–15 as Optional Extension Modules. Source C delivers all 15 as a linear day-by-day sequence with sequential "Day N complete" screens and a "Continue to Day 15" button. These are different products: a 10-day programme with an optional library, vs. a 15-day linear course. v2.0: the evidence is now 2-against-1, not 1-against-1. Source D (slide 6) independently states the same split — "Core Modules (Days 1-10)" and "Extension Modules (Days 11-15)" — so the core+optional model was the settled March-2026 position across two documents, and Source C's linear framing is the newer, single-source departure. Minni v4: provisionally resolved in favour of Core (1–10) + on-demand Extensions — the March-2026 position (B+D), endorsed by the v3 review and the product owner. It simultaneously de-risks launch (all missing copy sits in the extensions), retires the 14-vs-15 conflict (OPEN-01), and gives the post-programme state its content library (§7.9). Requires Minni's explicit sign-off, including where the closure module (M15) sits (core finale vs on-completion). The direct question stands: was dropping the Core/Extension split in Source C intentional? If she says yes-linear, v4's provisional structure reverts.
OPEN-04 P1 Module naming/theme mismatches ~~Within Source C: its own outline vs. its own module bodies.~~ v2.0 reframes this. The "outline" names are not a stray inconsistency inside Source C — they are the March-2026 canonical names, corroborated by Sources B and D (slide 6: Self-Compassion at Work · Meaning & Motivation · Sustainable Habits · Reflection & Long-Term Plan). Source C renamed all four in July. So this is four months of content evolution, not a copy-paste error: M12 →"Self-Compassion Under Stress" (cosmetic); M13 "Meaning & Motivation" → "Understanding Your Emotional Needs" (a genuine change of topic); M14 "Sustainable Habits" → "Balance Your Battery" (reframing); M15 → "Moving Forward" (cosmetic). Minni Establish one canonical title + theme per module. M13 is the one that matters: meaning/motivation and emotional-needs are different therapeutic content, and since M13's body copy is missing anyway (OPEN-03), Minni is effectively choosing which module to write, not which title to keep. Resolve OPEN-04 for M13 before authoring against OPEN-03.
OPEN-05 P1 Corrupted unicode (mojibake) in the export M14's eight Recovery Wheel category icons and M15's celebration emoji rendered as garbage. §6.3 contains best-guess reconstructions that have not been confirmed. Minni + design Confirm or replace. Recommendation: use a proper icon set rather than emoji (accessibility + cross-platform rendering).
OPEN-07 P1 Personalisation rule PR-03 is undefined and contradicts the MVP "Repeated high stress" has no threshold. And it recommends "professional support" — which Tier 1, the MVP, does not include. Minni Define the threshold; make the destination tier-aware and org-configurable (§7.3). Design jointly with OPEN-10.
OPEN-11 P1 Controller/processor and anonymity model unresolved The product promises anonymity to employees while the employer funds and provisions seats. Whether Minimente or the employer is GDPR controller determines whether the employee's promise is legally sound. Legal Recommendation: Minimente as controller for employee wellbeing data. Complete a DPIA before pilot.
OPEN-19 P1 Anonymity vs. seat management tension "Low-threshold anonymous service" vs. B2B per-seat licensing and per-org reporting. These pull in opposite directions and the sources never reconcile them. Minni + eng Proposed: invite-code or verified-domain enrolment producing a pseudonymous account with no name required; org sees seat counts and aggregates only.
OPEN-24 P1 Technology stack never ratified (NEW in v2.0) Source D proposes React Native (or PWA) / Node.js / Supabase / PostgreSQL / Vercel or Railway / Lottie, and recommends "start with PWA" — then lists "Decide tech stack: PWA vs React Native" as an open step on the very next slide. The repo contains no package manifest, so no decision was ever made or recorded (§1A.1). Blocks Phase 1 item 7 (the content schema and renderer), which cannot be specified against an unknown client platform. Minni + eng Decide and record it in-repo. The proposal converges with AD-02 (PWA-first) and AD-04 (Postgres + RLS), so ratifying Source D's stack is the low-friction path — but it should be an explicit decision with the RLS and EU-residency requirements (NFR-PRIV-08) checked against the chosen host, not an inheritance.
OPEN-26 P1 Check-in scale granularity: 5-point vs 10-point (NEW in v4) The tappable discrete control is decided (NFR-A11Y-02); the point count is not. 5-point is simpler and faster; 10-point preserves trend resolution and leaves every existing threshold untouched — NFR-SAFE-03, PR-01, and PR-02 are all specified against 1–10. Any change of scale requires clinical re-derivation of those thresholds; an arithmetic rescale by engineering is prohibited. The product owner explicitly declined to commit without testing. Minni + design + clinical Prototype both variants in the Phase 2 internal test (item 13); decide before pilot. Default if untested: 10-point (zero threshold churn).
OPEN-25 P2 The three support tiers are defined two different ways (NEW in v2.0) Source A: L1 self-help / L2 message a therapist / L3 book an appointment. Source D (slide 7): L1 self-guided / L2 AI-enhanced personalization / L3 therapist referral. Tier 2 is a human service in one and an algorithmic feature in the other — different cost base, different regulatory exposure, different value story. §3.3's prices (€15–30 for T2) were set against Source A's reading. Minni Settle the ladder before quoting any customer. Does not block v1 — Tier 1 is identical under both readings and is the entire MVP (§4.1). Note that Source D's "L2 = AI personalisation" reading sits awkwardly with §4.3, which defers AI personalisation to Phase 3.
OPEN-27 P2 Search vocabulary & crisis-term list (NEW in v4) §7.8 needs two authored artefacts: (a) a curated synonym/tag vocabulary mapping everyday language ("catastrophising", "can't switch off") to modules and exercises (FR-SRCH-02); (b) a clinically reviewed crisis-term list for FR-SRCH-06 / NFR-SAFE-07. Both are content data. Blocks shipping search, not building it. Minni + clinical Author alongside Phase 0 items 3 and 5; ship search dark until both exist (item 15a).
OPEN-28 P2 Per-module Daily-Action endings (NEW in v4) FR-CORE-08 defines five ending types; which one each module uses — and the small copy edits implied (incl. M10's build→curate reframe) — is a content decision. v2's per-module actions stand until reassigned. Minni One working session over the module list; fold into the Phase 0 item-1 sign-off.
OPEN-08 P2 "Mood" is promised but never collected Source A's data layer names daily metrics as energy, stress, mood. No module collects mood; all check-ins collect stress and energy only. Minni Either add a mood item to the standard check-in, or remove "mood" from the pitch deck.
OPEN-09 P2 Finnish vs. English market undecided Source A leaves this open. All content exists in English; Finnish appears only as leaked editorial placeholders. Affects crisis-resource configuration, legal review, and content production cost. Minni Decide before pilot outreach; build i18n-ready regardless (NFR-I18N-01).
OPEN-12 P2 Pricing tiers unvalidated €4–8 / €15–30 / €120–300 per user/month were never tested with a customer. Tier 3's ceiling is 40× Tier 1 and implies a therapist supply chain that does not exist. Minni Validate Tier 1 pricing in the pilot; treat Tiers 2/3 pricing as indicative only.
OPEN-13 P2 Missed-day / streak / re-entry behaviour No source specifies what happens if a user skips days, does several modules in one day, or returns after weeks. Minni + eng v4: provisionally resolved by FR-CORE-04 (amended) — sequence unlock, no calendar gate, no daily cap, breaks suggested never enforced, "Recommended" never "Locked" (UX-08), streaks prohibited (UX-09). Pending Minni's sign-off.
OPEN-14 P2 Post-programme state After the programme, only "the Toolkit persists" was specified in the sources. This is the org's renewal story. Minni v4: provisionally resolved by §7.9 — Toolkit-primary home, optional light check-ins, extension library, exercises re-runnable forever, "sustained use" aggregate for renewal. Remaining detail: core-module revisit/re-run behaviour (FR-POST-04). Pending Minni's sign-off.
OPEN-15 P2 Audio production not planned Four modules plus most Emergency Tools are "audio-guided". No voice talent, recording plan, language plan, or budget exists. Minni Decide whether v1 ships text-only (fully viable given the silent-office requirement) with audio added later.
OPEN-16 P2 Duplicate reflection prompt Modules 1 and 2 use the identical prompt "Where did you notice stress in your body today?". Minni Confirm intentional or fix.
OPEN-17 Adopted (v4) Several exercise outputs had no destination M3's priority_task/deferrable_task, M4's noticed_thought, M8's boundary statement, M9's chosen_response were captured with nowhere the user ever saw them again. Minni + design v4: adopted as FR-CORE-09 — same-day items on Home, durable items to Toolkit. Subject to Minni's ratification of v4 as a whole; row retained for traceability.
OPEN-20 P2 Outcome measurement vs. "no diagnostic tools" Buyers want measurable outcomes; the product forbids diagnostic instruments. Minni §4.4 recommendation: use only the product's own non-clinical ratings. Do not add PHQ-9/GAD-7 in v1.
OPEN-21 P3 Teams integration has no defined use case Written as "Teams?" in Source A. Product Discovery item with pilot customer.
OPEN-22 P2 (raised from P3 in v4) Org dashboard was entirely unspecified "Anonymized company insights" is sold in all three pricing tiers but v2 defined no screen, metric, or report — the least-specified thing the buyer actually pays for, filed at the lowest priority. Minni + design v4: minimum dashboard, trust-framed k-anonymity state, anonymity wall, leadership one-pager, and adoption kit now specified in §8.2A (with NFR-PRIV-10). Remaining open: visual design, per-org configuration UI, pilot-report format. Build stays Phase 3; on the sales critical path before that.
OPEN-23 P3 Source A's "Next Steps" are stale Dated March 2026; content has since advanced. Superseded by §11.

Top risks

  1. Content risk (highest). The project's premise — "the content is done" — is not true. Roughly 30% of the programme has no user-facing text, and the missing part is exactly the emotionally hardest content (self-compassion, emotional needs, closure). This is on the critical path and only Minni can clear it. v4 mitigation: under the provisionally adopted Core+Extensions structure, the missing module copy (11–15) no longer blocks launch — the core is fully authored — but it still gates the extension library and the closure module, and the Emergency-Tool scripts (OPEN-06) remain a hard launch blocker either way.
  2. Safeguarding risk. Shipping a workplace mental-health product with no crisis flow is an unacceptable exposure for both Minimente and the pilot customer, and is likely to fail HR procurement review regardless. v4 note: the "Right now" entry (§7.7) and search (§7.8) both raise the prominence of acute-moment use — OPEN-10 and OPEN-06 are more critical in v4, not less, and both new surfaces are explicitly gated on that content existing (FR-NOW-06, OPEN-27).
  3. Adoption risk. Employer-funded wellbeing tools commonly see single-digit activation. The anonymity promise is the primary mitigation and must be prominent, credible, and technically true.
  4. Scope risk. Tiers 2 and 3 look like features but are operating models. Attempting them before Tier 1 is validated would stall the project again.
  5. Trust/compliance risk. EU special-category data plus an employer relationship means a DPIA and clear controller assignment are prerequisites to a signed pilot, not follow-ups.
  6. Prototype-as-foundation risk (new in v2.0). A runnable Day-1 prototype exists and looks convincing. It hardcodes content as JSX, has no persistence, and no auth — it is the direct opposite of AD-01. The risk is that its apparent completeness invites building forward from it, which would bake in the content/code coupling the architecture exists to avoid. Treat it as a visual and interaction reference to be reimplemented, never as a starting branch. Its palette, breathing pacer, and screen sequence are worth keeping; none of its data handling is.
  7. Stalled-restart risk (new in v2.0). The March 2026 plan (Source D) proposed a 4–6 week MVP and produced a prototype, a briefing, and then nothing — the repo was never even initialised, and four months passed. The binding constraint on the restart is content and decisions from Minni (OPEN-03, OPEN-01, OPEN-18, OPEN-04, OPEN-10), not engineering capacity. Starting engineering without clearing Phase 0 would reproduce the same stall with more code to maintain.
  8. Provisional-decision risk (new in v4). v4 provisionally adopts four decisions that reshape the programme Minni authored — sequence-lock (FR-CORE-04), Core+Extensions (OPEN-18/01), the Daily-Action taxonomy (OPEN-28), and the post-programme state (§7.9). They are recorded with their reasoning precisely so she can overturn any of them — but building against them before her sign-off (Phase 0 item 1) would reproduce the source-drift this document exists to prevent, with running code this time. Conversely, note the sign-off is one working session, not a project: the decisions are already argued and specified.

11. Suggested Next Steps & Phasing

Updated from Source A's Define → Design → Prototype → Pilot, reflecting that content is mostly — not fully — complete.

v2.0 status against reality (§1A). Nothing in this plan has been started. Phase 0: 0 of 5 items complete. Phase 1: 0 of 5. Phase 2: 0 of 5. Phase 3: 0 of 4. Phase 4: 0 of 4. The plan is not revised downward — it is revised to add a preceding step that v1.0 assumed already existed, and to record what the March-2026 prototype legitimately saves.

Two items get cheaper than v1.0 assumed: Phase 1 item 9 (design system) starts from an existing palette and component set rather than a blank page, and Phase 2 item 13 (internal timing test of the 5–12 min claim) can be run this week on the existing prototype, before any build — it needs no engineering at all and would de-risk the core session-length premise early. Everything else stands unchanged.

One item gets harder: Source D proposed a 4–6 week MVP covering Days 1–4. That estimate predates the discovery that ~30% of the programme has no copy and that no crisis-safety design exists. It should not be quoted to anyone.

v4 delta. The adopted changes are mostly requirement refinements sitting on the architecture already designed, but two are genuinely new build items — the exercise library + runtime (implicitly needed anyway: FR-TK-05 always required standalone-runnable exercises) and the client-side search index. Budget roughly one extra week in Phase 2; the owner's claim of "no material engineering increase" is approximately true, not exactly. One new gate is added to Phase 0: Minni's sign-off on the v4 provisional decisions (item 1). Two new authored artefacts join Phase 0: the "Right now" labels/routing table and the search vocabularies (item 5a).

Phase −1 — Initialise (days, not weeks) · owner: eng · NEW in v2.0 — prerequisite to everything

This is Source D's step 03 ("Set up project repo, CI/CD, and design system"), never performed. It is small, but it is genuinely blocking: there is currently nowhere to put code.

Phase 0 — Unblock (weeks 1–2) · owner: Minni, in parallel with engineering setup

  1. Resolve the structural decisions — canonical module titles/themes (OPEN-04); 14 vs. 15 days (OPEN-01); linear vs. core+optional (OPEN-18). v2.0 — promoted ahead of the authoring task, deliberately. OPEN-04 is not a naming cleanup: Module 13 is either "Meaning & Motivation" (March) or "Understanding Your Emotional Needs" (July), and since its body copy is missing either way, this decides which module gets written. Authoring before deciding risks writing the wrong module. v4: this same session now also ratifies (or overturns) the provisional decisions — sequence-lock (FR-CORE-04/OPEN-13), Core+Extensions incl. the closure module's position (OPEN-18/OPEN-01), Daily-Action endings (OPEN-28), the post-programme state (§7.9/OPEN-14), and the skills-first Toolkit framing (§7.1). One working session covers all of it; nothing in Phase 1+ that depends on these should start before it.
  2. Recover or re-author Modules 12–15 body copy and Module 11's psychoeducation + 4 branch scripts (OPEN-03, OPEN-02). Highest priority single authoring task in the project, and the longest pole overall. First check whether the pre-edit draft still exists in Minni's working files or Drive version history — Source C's placeholders ("keep your current text unchanged") imply a prior draft that did not survive export, so recovery may be far cheaper than re-authoring.
  3. Write the missing Emergency Tool scripts (OPEN-06) — four or five depending on the progressive-relaxation decision (§7.2).
  4. Confirm the Recovery Wheel icons and the completion celebration asset (OPEN-05).
  5. Decide the safeguarding model (OPEN-10) and draft its copy. - 5a. (v4) Author the "Right now" state labels and routing table (§7.7) and the search synonym + crisis-term vocabularies (OPEN-27) — small artefacts, produced alongside items 3 and 5 while Minni is already in the content.

Phase 1 — Define & Design (weeks 1–4) · engineering + design, in parallel

  1. Ratify this PRD with Minni; close all P0/P1 open questions.
  2. Specify the content JSON schema and the screen component types (§6.0) — this is the first engineering deliverable and everything else depends on it. v4: the schema now includes the exercise library (FR-CORE-06) as a top-level content entity, per-context exercise overrides, the Daily-Action ending taxonomy (FR-CORE-08), and the publish-time search-index build (AD-09, FR-SRCH-07).
  3. Finalise the data model (§7.4) and the privacy enforcement design (RLS, key separation, k-anonymity threshold).
  4. Design system: session shell, progress indicator, rating-control patterns, Toolkit, Emergency Tools surface, safeguarding card. v2.0: not a blank page — the prototype supplies a working palette, progress bar, button, and box-breathing pacer to extend or deliberately reject. Its 1–10 drag slider is now rejected by requirement (NFR-A11Y-02 as amended) and its category icons are raw emoji (§6.3 recommends against), so the existing components need reworking, not straight reuse. v4 additions: the Toolkit-first home (co-primary card, FR-TK-09), the "Right now" surface (§7.7), the tappable discrete rating control in both 5- and 10-point variants for the OPEN-26 test, and the §8.2A dashboard including its trust-framed threshold state (design now, build Phase 3).
  5. Start the DPIA and settle the controller/processor question (OPEN-11).

Phase 2 — Prototype (weeks 3–8)

  1. (v4 amended) Build the exercise runtime + exercise library first (FR-CORE-06 — everything references it), then the content renderer plus Modules 1–5 end-to-end, including check-in, personalisation rules, Toolkit accrual from Day 1 (FR-CORE-07/FR-STD-07), Daily-Action endings (FR-CORE-08), output destinations (FR-CORE-09), reminders, and resume-later.
  2. Build Emergency Tools and the safeguarding/signposting flow before any external testing.
  3. Internal test with friends/family (as Source A envisaged) on Modules 1–5, measuring the real per-session duration against the 5–12 minute claim. v2.0: a first pass at this is available immediately — the existing Day-1 prototype is runnable and its copy is final, so the session-length premise can be timed with real people during Phase 0/−1, months ahead of the built product. Cheapest available de-risking in the plan. v4: the same test also runs the OPEN-26 scale comparison (5- vs 10-point) — decide before pilot.
  4. Build the Personal Stress Toolkit views and Modules 6–10 (Module 10 is the most technically involved: dynamic option population from the user's own prior answers — and under v4 it is a curation pass over the already-accrued Toolkit, FR-M10-02 as amended).
  5. Build the extension modules (former 11–15) structurally behind copy_status = placeholder; wire copy in as Minni delivers it. - 15a. (v4) Build the "Right now" entry (§7.7) and client-side search (§7.8). Hold both dark until the Emergency Tool scripts (OPEN-06) and the OPEN-27 vocabularies exist — a moment-of-need surface with empty tools behind it is worse than none (FR-NOW-06).

Phase 3 — Pilot-ready (weeks 8–14)

  1. Org provisioning, invite flow, and the organisational dashboard + adoption kit to the §8.2A specification (OPEN-22), including NFR-PRIV-10's weekly-or-coarser aggregation.
  2. Accessibility audit (WCAG 2.1 AA) and a security review.
  3. Full content QA pass: no placeholder text, no mojibake, no Finnish leakage in any released module. This should be an automated check in CI against the content documents, not a manual read-through.
  4. Complete the DPIA; prepare the DPA template and privacy notice for the pilot customer.

Phase 4 — Pilot (weeks 14+)

  1. Resume Minni's leads list and HR outreach with a working Tier 1 product.
  2. Run one company pilot; instrument against §4.4's metrics.
  3. Use pilot data to answer: pricing validation (OPEN-12), whether personalisation needs to be smarter than three rules, whether Teams integration matters (OPEN-21), post-programme sustained use (§7.9, FR-POST-05), Toolkit-offer acceptance rates (FR-STD-07 declines are a signal), and "Right now" routing usefulness (right_now_events).
  4. Only then scope Tier 2 (therapist messaging).

Appendix A — Source reconciliation log

Extended in v2.0 with Source D (dev briefing, Mar 2026) and E (the prototypes). Where D and the prototype agree with B against C, the disagreement is a four-month content evolution, not an internal inconsistency — this reframes OPEN-04 and OPEN-18. v4.0 adds Appendix A.1, the disposition log for the v3 review-and-response cycle.

Topic Source A Source B Source C Source D / prototype Resolution in this PRD
Programme length "14-day", "14-15 day" 14-day 15 modules/days D: slide headed "14-Day" while listing 15 modules. Prototype: hardcodes 14 days. Unresolved — OPEN-01. Five restatements of "14" against a 15-module body. Conflict predates Source C.
Module 11–15 status not covered "Optional Extension Modules" sequential Days 11–15 D: "Core Modules (Days 1-10)" / "Extension Modules (Days 11-15)" — explicit. Unresolved — OPEN-18, but evidence is now 2-against-1 in favour of core+optional.
Module titles not covered Core/optional list outline vs. body disagree D: matches the outline names (Self-Compassion at Work, Meaning & Motivation, Sustainable Habits, Reflection & Long-Term Plan). Unresolved — OPEN-04, reframed. The outline names are the March canon; Source C renamed them in July. M13 is a topic change, not a rename.
Session structure "Daily 5–10 min modules" 5-part structure 7-screen realisation D: 5-step structure. Prototype: implements exactly the 7 screens. Agreed across four sources and one build — the safest structural commitment in the PRD (§5.2).
Daily metrics energy, stress, mood stress, energy stress, energy (+ module-specific) D: "daily stress & energy ratings". Prototype: stress + energy sliders. Mood dropped — OPEN-08. Source A is now the only source naming mood.
Emergency tools not covered 7 tools, non-exhaustive not covered D and prototype: 6 tools (no progressive relaxation). Prototype cards are non-functional. Source B's 7 retained; no content exists — OPEN-06, now confirmed empirically. Tool count itself in question.
Personalisation "recommendation algorithm (open question)" 3 explicit rules not covered D: the same 3 rules, stated as IF/THEN logic. Source B's 3 rules adopted for v1 (§7.3). Corroborated.
Professional support 3 levels, Tiers 2/3 rule PR-03 references it not covered D: L2 = AI personalisation, not therapist messaging — contradicts A. Deferred post-MVP; tier ladder itself now disputed — OPEN-25 (new).
Technology stack "technical wishlist" not covered not covered D: React Native (or PWA) / Node / Supabase / Postgres / Vercel-Railway / Lottie, "start with PWA" — then lists the choice as still open. Unresolved — OPEN-24 (new). Converges with AD-02/AD-04 but was never ratified; repo has no manifest.
Content architecture not covered not covered not covered Prototype: content hardcoded in JSX. Contradicts AD-01. Prototype is reference-only; see Risk 6.
Crisis handling "not suitable for emergencies" not covered not covered D: not covered. Prototype: no disclaimer, no signposting, no privacy messaging. Gap — §8.3, OPEN-10. Confirmed across all four sources and the one build.
Privacy / anonymity promise anonymised org insight not covered not covered Prototype: no auth, no account, no consent, no privacy copy. Central adoption promise (NFR-PRIV-04) has never been expressed in any artefact.

Appendix A.1 — v3 review / v4 adoption log (NEW in v4)

Disposition of every item in the v3 design review and the product owner's response. "Provisional" = adopted in this document but requiring Minni's sign-off (Phase 0 item 1) because it reshapes the programme she authored.

v3 review item Product owner's response v4 disposition Recorded at
A1 — Sequence-lock, not calendar-lock Adopt; remove any daily cap entirely; "Recommended" language, "suggest waiting → allow continue" Adopted as amended: no cap, breaks suggested never enforced FR-CORE-04, UX-08, OPEN-13
A2 — Core 10 + on-demand Extensions "Highest-leverage recommendation in the review"; would almost certainly adopt Provisional — Minni's sign-off (it restructures her programme; incl. closure-module position) §2.1, §5.1, §6.1, OPEN-18, OPEN-01
A3 — Toolkit accrues from Day 1 Adopt ("probably my favourite recommendation") Adopted; Module 10 becomes curation FR-CORE-07, FR-STD-07, §7.1, M10
A4 — "Right now" moment-of-need entry Adopt; non-diagnostic state labels praised Adopted; gated on Emergency Tool content §7.7, FR-NOW-01…06
A5 — Replace 1–10 sliders with 5-point buttons Control: yes. Granularity: not automatically — prototype both Tappable discrete control adopted; 5-vs-10 left open with threshold-coupling warning carried NFR-A11Y-02, FR-STD-02, OPEN-26
A6 — Retire reminder-by-default Adopt: "Do it now. Save it. Use it." Adopted as a five-type ending taxonomy; per-module assignment is Minni's FR-CORE-08, §7.5, OPEN-28
A7 — Specify the employer dashboard early; trust-framed k-anonymity state Adopt; "the employer is buying confidence" Adopted; plus temporal k-anonymity and adoption kit §8.2A, NFR-PRIV-10, OPEN-22
A8 — Define the post-programme steady state Adopt ("courses end; products don't") Provisional — Minni's sign-off §7.9, OPEN-14
A9 — Give exercise outputs destinations Adopt Adopted FR-CORE-09, OPEN-17
Review framing: "the Toolkit is the product" Corrected: the product is building lifelong skills; the Toolkit is the persistent interface; the course creates capability, the Toolkit reinforces it Correction adopted throughout §1, §2.2, §7.1
Review proposal: cap 2 modules/day Rejected — arbitrary; suggest breaks, never enforce Cap removed entirely FR-CORE-04
Owner addition: search (owner-originated) Specified: non-AI, fully client-side, crisis-term routed, private-content opt-in §7.8, AD-09, NFR-SAFE-07, FR-DATA-05, OPEN-27
Owner addition: exercise as reusable object (owner-originated) Specified: one library, one runtime, references everywhere; content belongs to the exercise FR-CORE-06, AD-08, FR-ET-08, §7.4
Review section C: keep the AI exclusion, no diagnostics, free text in CBT exercises, PWA-first, 3 rules, 7-screen shape; make no-gamification and no-wearables explicit Accepted Carried in as binding anti-requirements and reaffirmed reasoning §2.3, UX-09, §4.3, §9.4

End of PRD v4.0 draft. (v2.0 closed with a stale "End of PRD v1.0 draft." footer; corrected here.)