journeys walkthroughs 08 wellbeing - fahadahmed/jamaal-app GitHub Wiki
Journey 8 โ Wellbeing
Status: done โ gaps G-59 โฆ G-65 and G-67 raised, decided and applied (G-58 and G-66 withdrawn: mood removed) (see the gap log). The text below is the walkthrough as first written. Register flow F11; screens WB-01 โฆ WB-03 (WB-04 is v1.1) and the sparkline strip TD-02 on Today. Behaviour is in Rules engine โ module 5; this page tests it against the data the first seven journeys actually leave behind.
In one line: after a week or two of real use, the user opens the Wellbeing tab and gets a plain, unjudged read of how their days have been going, derived only from what they did, and โ when a pattern shows โ one gentle suggestion they can take or leave.
Preconditions: Journeys 1โ7 done. Example: three weeks of use; most days planned at night, a few skipped; the last three days overloaded; Morning run missed on its scheduled days.
TD-02 The sparkline on Today
- Sees: a slim strip near the slider: a sparkline of the score over recent days, or "Gathering data" with a count. Tapping opens
WB-01. - Reads: the derived score series (module 5). Writes: nothing.
- Assumes:
- "gathering data until seven days exist" is computable โ โ G-59 (seven days of what: the docs say
DayPlanhistory, but aDayPlanexists only for active days since G-55, and calendar days since install is a different number); - the series is computable per day โ โ G-62 (nothing defines the score, so nothing can be plotted).
- "gathering data until seven days exist" is computable โ โ G-59 (seven days of what: the docs say
WB-03 Gathering data
- Sees: "Jamaal needs about a week of days to say anything useful" and seven dots filled as days accumulate.
- Reads: the count of active days (G-59). Nothing else is shown.
- Assumes: โ once G-59 is defined; it never asks the user to do more than live normally.
WB-01 Steady
- Sees: the score (0โ100), its trend against the previous period, a plain read in Jamaal's voice ("Steady. Most days done, loads mostly light."), completion for the window, and heavy days (a count or small strip). No colours that scold.
- Reads:
DayPlans for the window, Anchor outcomes, (completionRate,loadScore,wasOverloaded),HabitEntrys,NightPlanningSession. - Assumes:
- the score has a recipe โ โ G-62 (the docs list inputs but no weights; design's X-04 asks "what makes 78 a 78");
completionRateis meaningful โ โ G-60 (tasks are re-dated when deferred, so "tasks due that day" can't be recounted afterwards; the denominator isn't defined);wasOverloadedexists for days that weren't planned โ โ G-61 (today it is written only when Night Planning closes a day, as a planned snapshot; a skipped night leaves aDayPlanwith zero load, and a planned load isn't the load the day actually had);
WB-02 Strained, and the suggested action
- Sees: as WB-01, with a calm card naming one pattern and one action ("The last three days were heavy. Lighten Saturday?" โ Lighten Saturday ยท Not now).
- Reads: the active pattern signals.
- Writes: the action's change (see below), and a
NudgeLog(wellbeing,subjectKey= the pattern) when shown, and again if dismissed. - Assumes:
- the patterns are computable โ โ G-63 (
heavyRunis clear;habitNeglectignores weekly-target and paused habits and avoid habits;completionCollapsehas no threshold;weekendOverplanhas no test;avoidanceโ a task deferred 4+ times โ duplicates the 3rd-deferral easing message and the 5th-deferral suggestion the task already has); - each pattern has an action that writes something definite โ โ G-64 (only "Lighten Saturday" is drawn; what it changes โ the weekday default, or one day's level โ isn't said, and nor is the action for any other pattern);
- "at most one wellbeing nudge a day" has a home and respects Not now โ โ G-65 (is the nudge a notification or a card? after Not now, would the same pattern be offered again tomorrow?).
- the patterns are computable โ โ G-63 (
WB-04 "What makes this score"
- v1.1 (register decision). The derivation in G-62 is written so this view can later read it straight off.
What the user sees over time
Week one: the strip says "Gathering data ยท 3 of 7". By the second week there is a number, a flat or gently moving line, and a plain read. After three heavy days the tab turns calm-strained: the read names it and offers one change. They tap Not now, and the same card doesn't come back for a week. Nothing ever scolds; a skipped night only lowers how much there is to say.
Data that exists afterwards (end-state check)
| Model | Change |
|---|---|
DayPlan |
one per active day, finalised at rollover with lived completion and load (G-60, G-61) |
NudgeLog |
+ 1 per wellbeing card shown, + dismissedAt on Not now (G-65) |
UserSettings |
weekdayLevels or mediumDayMinutes when an action is taken (G-64) |
No stored wellbeing model and no new fields: everything is derived, which keeps devices converging.
Rules and changes this journey implies
If the proposals are accepted:
- Active days (G-59): a logical day is active if it has a
DayPlan(G-55 gives one to every day with activity). Gathering data lasts until 7 active days fall inside the last 14 logical days; the dots count active days. A quiet stretch (travel, illness) simply lowers the count and the score pauses rather than falling. - Completion (G-60): at rollover,
completionRate= tasks completed that day รท (tasks completed that day + tasks the rollover auto-deferred or the user deferred or dropped that day). Days with neither are not counted in the window. - Lived load (G-61): finalising
DayPlan(D)at rollover also setsplannedTaskMinutes,loadScoreandwasOverloadedfrom the day as lived (module 7's definition for today: live-due plus completed, actual minutes, that day's level โDayPlan.capacityor the weekday default). The Night Planning snapshot still serves the plan preview and the closing screen, and is overwritten at rollover. - The score (G-62, X-04): a whole number 0โ100 over the last 14 logical days, from four parts, each 0โ100, averaged over active days: tasks 35% (mean
completionRate: tasks finished against those that had to move), Anchors 25% (attended รท (attended + missed); skipped and delegated are excluded, a late correction counts as attended, and a day with no decided Anchors is left out of this part), habits 20% (mean density of due windows, paused habits excluded, weekly-target habits by week), load 20% (share of active days that were not overloaded โ tasks against the budget and the free time the Anchors leave). If the user has no Anchors at all, the other three weights scale up to 100%. Nothing is self-reported. The sparkline plots the score at each of the last 14 days, each over its own trailing 14 days, shown only where at least 7 active days exist. Trend = this score minus the score 14 days earlier, shown as steadier / about the same / heavier, never as a number with a colour. The page is strained when any pattern is active, otherwise steady. - Patterns (G-63):
heavyRunโ 3 or more consecutive active days withwasOverloaded.habitNeglectโ a habit with 3 consecutive scheduled days missed; paused, archived, weekly-target and avoid habits are excluded.completionCollapseโ the meancompletionRateof the last 3 active days is below half of the mean over the prior 14 days, and below 40%.weekendOverplanโ a weekend day overloaded on 2 of the last 3 weekends.avoidanceis removed from module 5: a task deferred 4+ times is already handled where it lives (the 3rd-deferral easing message, the 5th-deferral removal suggestion).
- Actions (G-64): each pattern offers one change that writes a definite setting, always with Not now:
heavyRunโ "Make tomorrow a low day" โDayPlan(tomorrow).capacity = low.weekendOverplanโ "Lighten Saturday" (or Sunday) โ that weekday'sweekdayLevelsentry set tolow.completionCollapseโ "Lower your normal day to X" โmediumDayMinutesset to the recent average, rounded to 15 minutes (the same change as the normal-day suggestion, never made on its own).habitNeglectโ "Pause it, or make it smaller?" โ opens the habit's pause sheet (HB-06) or its edit form.
- Delivery and cooldown (G-65): a wellbeing nudge is an inline card, on the Wellbeing tab and, at most once a day, on Today โ never a notification in v1 (nothing nags; there is already a per-device switch for other reminders). At most one per day; after Not now the same pattern isn't offered again for 7 days (
NudgeLog.subjectKey= pattern, plus the habit or weekday where relevant). The Wellbeing nudges preference turns the cards off, leaving the score. - No self-reporting (owner decision): there is no mood line, note or any other self-reported input anywhere; removed from
NightPlanningSession, the Review step and the score.