docs(achievements): v1.4.18 expansion research with 20+ proposed achievements

Benchmark Apple Health, Withings, Oura, Strava, Habitica. Pick a
mood category, an entry-consistency category, and a small hidden /
Easter-egg group. Lock in the discovery rule (only show public
achievements when the user has data for the metric).

Total proposed: 15 public + 6 hidden = 21, taking the roster from
38 to 59.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Marc-André BombeckandClaude Opus 4.7 committed 2026-05-10 10:34:32 +02:00
1 parent d70a9b1ee9
commit e73813ad7c
1 file changed
+93
+93
View File
@@ -0,0 +1,93 @@
# v1.4.18 — achievements expansion research
## Benchmarking
We surveyed five reference systems before sketching the new HealthLog
achievement set:
- **Apple Health (Activity rings, Workouts)** — month-of-perfect-days,
ring-on-fire weeks, doubled-goal challenges. Tone is *celebratory but
optional*; nothing shames you for missing a ring.
- **Withings (Health+)** — milestone-based ("First weigh-in", "100
weigh-ins"), trend-based ("Lost 1 kg", "Maintained ±2 kg for 30 d"),
and seasonal challenges. Notable: never fires a coercive "you missed
a day" badge.
- **Oura** — readiness streaks, sleep regularity, recovery PRs, "first
workout of the year". Heavy use of personal-baseline comparisons (no
social leaderboard).
- **Strava** — local-legend / monthly-goal / segment-hunting; explicit
social comparison. Not a fit for HealthLog (no sharing surface).
- **Habitica** — gamified to-do; daily streaks with grace days, tag-
based achievements, hidden lore unlocks. The "hidden quest" pattern
is the inspiration for our Easter eggs.
## Categories that fit HealthLog
Keep the existing four (medication / vitals / security / engagement)
and introduce two new buckets: **mood** and **hidden** (the Easter-egg
group). Add two cross-cutting *axes* that aren't categories per se:
discovery (only earnable when the user has data for the metric) and
celebration (a special toast when a hidden one fires).
Categories explicitly **avoided** (per Marc's brief):
- Coercive volume nudges ("you measured the most this week!") — bad
incentive for a self-tracked health PWA.
- Diagnostic framing ("hypertensive milestone") — never reward a
classification that is medical bad news.
- Social-comparison ranking — there is no social surface to support it.
## Discovery rule
A public achievement (non-hidden) is only **shown to the user** when
the precondition predicate is satisfied. Predicate examples:
- mood badges → user has at least one `MoodEntry`
- weight badges → user has at least one `Measurement` of type `WEIGHT`
- BP/pulse badges → user has at least one `BLOOD_PRESSURE_SYS` /
`PULSE` measurement
- medication badges → user has at least one active `Medication`
Hidden Easter-eggs are *always shown as opaque "?" cards* but never
leak their conditions in the DOM, so a curious user knows the slot
exists without learning the trigger.
## Public proposals (15)
1. `mood-first` — "First mood entry" (1 pt, mood, milestone) — log any
mood. Precondition: user can earn once they have any data path open.
2. `mood-streak-7` — "Mood diarist" (45 pt) — 7 consecutive days of
mood logged.
3. `mood-streak-30` — "Mood diarist · 30 d" (180 pt).
4. `mood-up-7` — "Brighter week" (90 pt) — 7-day mood mean improved by
≥ 1.0 vs. previous 7-day window. Personal baseline only.
5. `weight-first` — "First weigh-in" (8 pt, vitals).
6. `weight-50` — "Fifty weigh-ins" (90 pt).
7. `weight-200` — "Two hundred weigh-ins" (320 pt).
8. `bp-first` — "First reading" (8 pt) — first BP measurement.
9. `bp-50` — "Fifty BP readings" (90 pt).
10. `bp-200` — "Two hundred BP readings" (320 pt).
11. `pulse-first` — "First pulse log" (8 pt).
12. `month-25-entries` — "Consistent month" (140 pt) — at least 25
distinct days with any entry inside one calendar month (Berlin TZ).
13. `entry-streak-7` — "Tracker streak 7 d" (70 pt) — 7 consecutive
days with at least one measurement OR mood OR intake.
14. `entry-streak-30` — "Tracker streak 30 d" (260 pt).
15. `weekend-warrior` — "Weekend tracker" (40 pt) — logged data on 4
consecutive Sat+Sun pairs.
## Hidden Easter-eggs (6)
- `hidden-night-owl` — logged any entry between 02:00–04:00 Berlin
local. Single occurrence. Title only revealed on unlock.
- `hidden-early-bird` — logged any entry between 04:00–06:00 Berlin.
- `hidden-leap-day` — logged any entry on Feb 29.
- `hidden-doctor-pdf` — exported a doctor-report PDF for the first
time (uses an existing audit log row for the trigger).
- `hidden-locale-flip` — switched UI locale at least once
(audit log: `settings.locale.update`).
- `hidden-bug-buddy` — submitted ≥ 5 bug reports (extending the
existing single bugReport milestone with a playful follow-on).
Total new achievements: 15 public + 6 hidden = **21**, taking the
roster from 38 → 59. Co-Authored by Claude Opus 4.7.