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).
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.
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.
/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
.git, no history, no remote, no branches.package.json, requirements.txt, go.mod, or equivalent. No stack has been chosen in the repo..env, .env.example, CI config, lockfile, linter, or formatter.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."
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. |
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.
| 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.
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.)
These are hard product constraints, not marketing copy. They must be enforced in the UI, in content, and in the safeguarding flow.
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.
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.
| 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.
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.
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:
| 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) | ❌ | ❌ |
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.
| # | 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.
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.
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 |
All modules share the following baseline requirements unless overridden:
daily_checkin record stamped with module id and timestamp. Point count (5 vs 10) is deliberately undecided — OPEN-26; the sources specify 1–10, and every threshold in §7.3 and §8.3 is defined against that scale.module_completion event and offer navigation to Home and (per module) a secondary destination.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). |
Goal: recognise personal early stress signals in order to respond earlier.
reflection_text_optional. Note: this prompt is identical to Module 1's; confirm with Minni whether that is intentional repetition or a copy-paste artefact (OPEN-16).Goal: understand workload vs. capacity and reduce overload.
priority_task; (b) one task that can wait, be simplified, or be postponed → deferrable_task.Goal: recognise automatic stress thoughts without reacting to them.
noticed_thought.Goal: learn that small recovery moments during the day reduce stress.
Goal: reframe automatic stress thoughts into balanced perspectives.
stress_thought (placeholder e.g. "I can't do anything right") and balanced_thought (placeholder e.g. "I'm capable of many things, but I'm feeling defeated right now") — with the three guiding questions displayed alongside: "Is this 100% true?", "Is there another way to see this?", "What would I say to a friend?".stress_thought with the user's noticed_thought from Module 4 as an editable suggestion. (Not specified in source; strongly recommended for continuity — needs Minni's confirmation.)Goal: recognise personal distractions and protect attention via a focused work session. First multi-part exercise module.
EX_MULTI with options: notifications, email, other people, own thoughts, task-switching, social media/phone, "don't know where to start", Other (free text). → distractions[].EX_MULTI: turn off notifications, close tabs, phone out of reach, single-task before checking messages, write down distractions, tell others you need uninterrupted time. → focus_strategies[].focus_task) and selects a duration from 10 / 15 / 20 (recommended) / 25 minutes (focus_duration); buttons "Start Focus Window" and "Maybe later".focus_outcome, plus optional free text.Goal: practise setting clear, respectful boundaries.
boundary_request), your boundary (boundary_statement), optional compromise (boundary_alternative). Only the second is meaningfully required; all shall be skippable.boundary_statement.Goal: notice emotions early and respond intentionally rather than react.
identified_emotion.chosen_response.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.
EX_MULTI listing all previously practised exercises: Box Breathing, Body Scan, Notice stress thoughts, Reframe a thought, Micro-break, Focus Window, Set a boundary, Pause–Identify–Choose, Prioritise a task. Plus two free-text custom-tool fields. → toolkit_items[], custom_tools[].EX_MULTI: body tense, racing thoughts, lose focus, irritable, overwhelmed, rushing, procrastinate/avoid, other → warning_signs[].EX_MAP. For each selected warning sign, the user selects a tool from a dropdown dynamically populated from the user's own selections in part (a), including their custom tools. The result is stored as ordered (warning_sign → tool) pairs → action_plan[].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.
body_reset_choice.| 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).
need_met), (b) how the body feels now (body_state), (c) optional free text.branch node with n sub-flows), so additional body resets can be added without code changes.🚫 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.
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 both → helpful_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.
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.
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.
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).
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
future_stress_plan.built_in_exercise (links to a runnable exercise), custom_tool (user free text), reminder_note (free text), recovery_action (free text), action_plan_entry (warning-sign → tool pair), future_plan (long text), supportive_statement (from M12).built_in_exercise items shall be directly runnable from the Toolkit — tapping "Box Breathing" plays the exercise standalone, without re-entering any module. (v4: a "runnable exercise" is a reference into the exercise library, executed by the single shared exercise runtime — FR-CORE-06.)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.
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
≥ 7and PR-02's≤ 4are 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.
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).
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
screen_responses uses a generic field-name/value shape deliberately: the 15 modules write ~35 heterogeneous fields and future programmes will add more. Do not create one column per prompt.value_text, optional_text, reflection_letter) is special-category health-adjacent data. It shall be encrypted at rest with a separate key, shall be excluded from analytics pipelines by default, and shall never be exported to organisational reporting.search_queries table, and none shall be added: search executes client-side and queries are never transmitted or persisted (§7.8, FR-SRCH-05, NFR-SEC-06). right_now_events stores the chosen route only — never free text — and is excluded from organisational reporting.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.
boundary_statement) — but such notifications shall not display sensitive user text on a locked screen unless the user opts in. Default: generic body.session_states.draft_answers).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.
right_now_events store the chosen route only, are excluded from organisational reporting in any form, and shall not feed §7.3 or §8.3 rules in v1.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.
copy_status = final, locale-appropriate content only — no placeholder or wrong-locale leakage via search.safeguarding_event with rule id only; the query text is never logged. Transparency: the privacy notice shall disclose that a local, non-transmitted term list exists solely to surface help resources. This is independent of the NFR-SAFE-04 decision — routing on an explicit query is answering what the user asked, not scanning what they wrote — so it remains valid even if Minni chooses NFR-SAFE-04 option 1 (no scanning).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.
The target market includes Finland/EU and the data is mental-health-related. Treat this as special category data under GDPR Art. 9.
programme_feedback — quote-level feedback shall only be shared with the employer if separately and explicitly consented.)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.
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):
stress_rating ≥ 9 on 3 of the last 5 check-ins, OR any check-in at 10. The prompt shall be supportive, non-alarming, non-blocking, dismissible, and shall offer both an Emergency Tool and the signposting resources. Written by Minni, not by engineering. v4 amendments: (a) the rule shall evaluate check-ins over distinct calendar days, not consecutive submissions — v4 removes the daily cap (FR-CORE-04), so several modules completed in one sitting must count as one day's signal or the "3 of the last 5" pattern becomes meaningless; (b) the numeric thresholds are defined against the 1–10 scale — if OPEN-26 changes the granularity they must be re-derived with clinical sign-off, never rescaled arithmetically by engineering (the 10-point option leaves them untouched).safeguarding_events) in de-identified form for product-safety review only.final while its Finnish translation is placeholder.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.
┌──────────────────────────────────────────────────────────┐
│ 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 │
└───────────────────────────────────────┘
| 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 |
screen_responses (§7.4) rather than per-module tables.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. |
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).
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.
git init the repo; establish the remote; commit this PRD (v4) and its predecessor (v2) as the first artefacts.minimente-prototype.jsx, minimente-prototype.html, the briefing deck, and the source-material zip exist only in ~/Desktop/Misc/MiNNi/ with no backup and no history. Commit them to a reference/ directory — explicitly as reference material, not as the application (see Risk 6). Source C (.docx) is not in the zip and should be exported from Drive and committed alongside them, since it is the canonical content source and currently exists only in Google Drive and in this PRD's summary of it..env.example. No application logic.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).right_now_events).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. |
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.)