Commit Graph
171 Commits
Author SHA1 Message Date
Marc-André Bombeck a756c51be8 docs(ios-handoff): A-Foundation — README skeleton + philosophy + repo-tour + architecture + API contracts 2026-05-14 23:33:20 +02:00
Marc-André Bombeck 9bfbbdf345 docs(ios-handoff): C-UI&State — web-UI tour + design system + state mgmt + pattern cookbook + i18n 2026-05-14 23:32:12 +02:00
Marc-André Bombeck 24cd5cece1 docs(ios-handoff): D-AI Layer — coach, insights, health-score mental model
Three of D's five files. The Coach + Insights + Health-Score surfaces are
server-resident; iOS Claude must consume, not reimplement. Documents the
layered prompt builder, GROUND RULES 1-15 (including W4d/W19c safety
contracts that hold the EU MDR line), the safety-contract matrix loader,
cache-invalidation rules, source-attribution provenance, and the
deterministic asOf discipline introduced in v1.4.25 Fix-G.
2026-05-14 23:30:50 +02:00
Marc-André Bombeck 6153be04cf docs(ios-handoff): C-UI&State design system + state mgmt + i18n 2026-05-14 23:28:12 +02:00
Marc-André Bombeck 0a9257357b docs(planning): W22 release-redo phase report 2026-05-14 23:20:18 +02:00
Marc-André Bombeck 068b49e709 docs(planning): Fix-N reconcile phase report
Closes the W21 reconcile pass. Captures the six commits, the 49 new
test assertions, three documented deviations (inventory-section
keeping its details shell, medication-form parseDose left alone,
apiError signature broadening), and final-gate evidence.
2026-05-14 23:12:05 +02:00
Marc-André Bombeck c75a68a88c docs(planning): W21 reconcile plan 2026-05-14 22:20:35 +02:00
Marc-André Bombeck f88c275df4 docs(planning): W21 i18n runtime findings 2026-05-14 22:14:26 +02:00
Marc-André Bombeck 65319317cd docs(planning): W21 dead-code findings 2026-05-14 22:08:16 +02:00
Marc-André Bombeck e8139e9f93 docs(planning): W21 simplifier findings 2026-05-14 22:05:18 +02:00
Marc-André Bombeck 5448d19fee docs(planning): W21 code-review findings 2026-05-14 22:03:26 +02:00
Marc-André Bombeck 0f4431cbf1 docs(planning): W21 senior-dev findings 2026-05-14 22:02:38 +02:00
Marc-André Bombeck 94f97fa26a docs(planning): W21 product-lead assessment 2026-05-14 22:01:42 +02:00
Marc-André Bombeck 472da13da7 docs(planning): W21 design findings 2026-05-14 22:01:28 +02:00
Marc-André Bombeck 230e7531b0 docs(planning): W21 security findings 2026-05-14 22:01:16 +02:00
Marc-André Bombeck 51f23ef318 docs(planning): W18 Low + apply-with-care cluster phase report 2026-05-14 21:53:23 +02:00
Marc-André Bombeck 7d625343f9 docs(planning): note safeRequestProp widening follow-up in W15 phase report 2026-05-14 21:51:04 +02:00
Marc-André Bombeck 4ab0d17808 docs(planning): W15 hygiene cluster phase report
Wave 5 hygiene wave summary covering the four atomic commits and
their verification matrix:
  fddb9754 — 380 dead i18n keys retired (25 false-positives kept)
  41c7425b — BASE_SYSTEM_PROMPT + INSIGHTS_SYSTEM_PROMPT removed
  61d156e7 — safeRequestProp narrow-catch + Tailwind @source base
  76dea94b — Cat-C comment path rewrite on /api/insights/targets
2026-05-14 21:48:11 +02:00
Marc-André Bombeck 781e6e180d docs(planning): W20-rest P6 polish phase report
Shipped 3 of 11 P6 polish items in this wave under touch-disjoint
constraints (W15 owns messages/*.json + system prompts, W18 owns
charts core / errors / audit-log / deviceType / drift-guard / CSS
anti-patterns / S1-S12):
  - P6-1 Pearson incomplete-beta replacement
  - P6-3 Coolify auto-deploy maintainer toggle
  - P6-8 GH translation-feedback issue template

Deferred to v1.4.26 (8 items + rationale):
  - P6-2 sentinel HK envelopes (no parser yet)
  - P6-4 Coach lastYear window (spec ambiguity + 9 surfaces)
  - P6-5 Coach prefill on row tap (Wave 4b stable footprint)
  - P6-6 per-night sleep-stage chart (W18 surface + new endpoint)
  - P6-7 locale-native date formats (i18n only — W15)
  - P6-9 hand-review FR/ES/IT/PL prose (i18n only — W15)
  - P6-10 Cat-B endpoint triage (per-endpoint maintainer go/no-go;
    7 recommendations enumerated in the report)
  - P6-11 mood verbal labels (already shipped in v1.4.25 polish pass;
    no remaining surfaces)
2026-05-14 21:46:41 +02:00
Marc-André Bombeck ab54d86bf8 docs(planning): W19f titration ladder + Wave 4b closeout phase report
Closes Wave 4b. The GLP-1 medication detail page section stack is
now complete: DrugLevelChart (W19c) -> SideEffectsSection (W19d) ->
SchedulingSection (W19e) -> TitrationSection (W19f) ->
IntakeHistoryList (existing).

40 new tests across the three commits (22 ladder helper, 8 route,
10 component). Migration 0060 stays unassigned.
2026-05-14 21:28:27 +02:00
Marc-André Bombeck 631b841c5f docs(planning): W19e cadence + compliance phase report 2026-05-14 21:16:21 +02:00
Marc-André Bombeck f0f3143cab docs(planning): W19d side-effect taxonomy phase report
Commits, scope, test counts, gate results, deviations, and the
medication-detail-page layout map handoff for W19e (reminders /
cadence / compliance) and W19f (titration ladder).
2026-05-14 21:02:52 +02:00
Marc-André Bombeck 575e951c50 docs(planning): W19c-Safety GROUND RULE 15 + refusal probes phase report 2026-05-14 20:46:52 +02:00
Marc-André Bombeck 32c1a41c2f docs(planning): W19c-Frontend dialog + chart + settings phase report 2026-05-14 20:32:28 +02:00
Marc-André Bombeck 6d748de389 docs(planning): W14b-Content step body + entry-point phase report 2026-05-14 20:09:46 +02:00
Marc-André Bombeck e2fd11ed9c docs(planning): W19c-Backend research-mode + PK phase report
Records the three commits, scope delivered, and the contracts
W19c-Frontend needs:

  - RESEARCH_MODE_DISCLAIMER_VERSION import path,
  - computeOneCompartment / shotPhaseAt signatures,
  - drug-id enum + look-up helper,
  - GET/POST/DELETE API contract for the Settings toggle,
  - chart-wiring rule that hides the curve when persisted
    acknowledgment version drifts behind the server-side constant.

Also notes the two-compartment math deferred to v1.5 and the Ka
textbook-approximation fallback used for non-tirzepatide drugs.
2026-05-14 19:56:36 +02:00
Marc-André Bombeck 64089e56da docs(planning): W14b-Foundation phase report
Five commits landed for the onboarding rebuild scaffold: schema
migration, OnboardingShell primitive, nested step routes, progress
API, and 132 new i18n entries across six locales. Documents the
deviation from the flat-file locale layout the spec assumed, the
left-over content work for the W14b-Content agent, and the test
counts (45 directly-touched tests, full suite green at 3460 passed).
2026-05-14 19:46:26 +02:00
Marc-André Bombeck 204dd98e60 docs(planning): Fix-I e2e brittleness hot-fix report
Capture root-cause analysis and fix narrative for the two e2e specs
that were failing on PR #168's latest CI run — Recharts 3.x DOM shift
hitting charts-mobile.spec.ts, and a brittle literal AI-prose
assertion in dashboard.spec.ts replaced with the structural insight-
summary slot.
2026-05-14 19:40:49 +02:00
Marc-André Bombeck d2fd9511cd docs(planning): preserve Session-2 phase reports and research files
Bundle 51 .planning/ artifacts written by the Round-3 wave agents and the
W10 reviewer pass that were never staged: phase reports for W3/W5b/W6/W7d/W7e/W8/W8b/W8c/W8e/W11/W11a/W11b/W14a/W14c/W16a-c/W17bc/W19a/W19b/W20a + Fix-G/H,
plus research backgrounders for Apple Health, GLP-1, Withings, Health-Score
provenance, source-priority two-axis, W10 reviewer outputs, and others.

Historical record only - no production-code or schema changes.
2026-05-14 19:28:52 +02:00
Marc-André Bombeck 1c18aeb8b1 docs(planning): v1.4.25 Session 2 handoff for continuation in Session 3
Session 2 hit ~78% context across orchestrator + both W14b-Foundation
and W19c sub-agents. Both paused before any destructive work. This
handoff captures everything that landed, what's in-flight, what's
remaining, and the recommended dispatch order for Session 3.

PR #168 stays as Draft. develop accumulates further commits in Session
3 until Marc's UAT signoff at W23.
2026-05-14 19:21:08 +02:00
Marc-André Bombeck a1ffa497f1 fix(security): Withings webhook secret as URL path segment, not query string
Move the Withings webhook shared secret from `?secret=…` to a path
segment (`/api/withings/webhook/<secret>`) so it never lands in the
reverse-proxy `query_string` access-log column or GlitchTip URL/
breadcrumb capture surface (W10 finding M-2).

Withings has no facility for custom HTTP headers on outgoing
notifications and never signs the body — every Notify.subscribe call
accepts only action/callbackurl/appli/client_id/nonce/signature, so
the callback URL is the only authenticity surface a subscriber
controls. Path-segment binding is the largest practical shift away
from loggable query strings that Withings supports end-to-end.

The legacy `/api/withings/webhook` route stays alive for one release
cycle (removal target: v1.4.27) so existing subscriptions keep
delivering. The query-string path now emits a deprecation breadcrumb
on every hit. Active users re-subscribe organically when they reconnect
for the v1.4.25 `user.activity` OAuth-scope upgrade.

Tests: 8 new for the path-segment route (valid / invalid / missing /
unset-env / prefix-match / rate-limited / HEAD / GET), 3 new for
`getWithingsWebhookCallbackUrl()`. Existing legacy-route tests
continue to pass over the refactored shared helper.
2026-05-14 17:46:25 +02:00
Marc-André Bombeck 4745d7fbf5 docs(planning): note Fix-E confirms C2 sleep-suffix translations were already complete (W10 reconcile-A follow-up)
Fix-C's release-readiness flag about i18n-locale-integrity drift on
`insights.sleep.headlineCaptionSuffix` reflected a transient mid-session
snapshot — commit e14466e already shipped native translations for all
six locales and the integrity test is green (26/26). Append a follow-up
note to the W10 reconcile-A design report so the audit trail is complete.
2026-05-14 17:06:43 +02:00
Marc-André Bombeck ed6fd46c5b docs(planning): W8d v1.4.25 AH-server-prep phase report
Captures the five-sub-task wave that locks the Apple Health server
contract before the v1.5 iOS-Swift session: migrations 0052 / 0053 /
0054, the mapping extension, the personal-records skeleton, and the
opt-in VO2 max tile. Restates the WORKOUT_ROUTE drop rationale and
lists the items deferred to v1.4.26+.
2026-05-14 16:07:50 +02:00
Marc-André Bombeck 89fb3bcc6c docs(planning): W9f hot-fixes addendum to W9e phase report
Records the two release-blockers resolved against the W9e translation
wave before tagging v1.4.25:

- Fix 1 (parseLocaleFromAcceptLanguage regression): no-op — the W7d
  agent flagged a stale failure that the W9e wave itself had already
  closed by adding a dedicated FR/ES/IT/PL prefix-match test block.
- Fix 2 (missing comparison.toggleHint): bundled into 6a7da4b which
  restored the key across all six locales alongside the audio-exposure
  / time-in-daylight enum backfill.

All quality gates clean — full suite 2583 passed (1 skipped), above
the post-W9e baseline of 2577.
2026-05-14 15:55:42 +02:00
Marc-André Bombeck 5d5a934774 chore(i18n): translation-bundle build script + W9e phase report
scripts/i18n/build-locale.py walks messages/en.json and emits the four
AI-initial locale bundles (FR / ES / IT / PL) via a layered translation
strategy: full-path overrides for highly contextual strings, a
common-vocab lookup keyed on the lowercase EN value, placeholder
protection that splits {interpolation} tokens and <tag> markers out
before translation and re-glues them verbatim afterwards, and a
fallback to the English value for long-tail prose the script can't
cover. Re-running the script on a fresh en.json keeps the four
locale bundles in parity automatically — handy when new keys land
between releases.

The phase report (.planning/phase-W9e-v1425-translations-report.md)
captures the per-locale vocabulary calls (Apple-Health / Withings
register checks for each language), the system-prompt routing
decision (EN body + REPLY LANGUAGE footer rather than four native
~500-line bodies, to preserve every safety contract verbatim), and
the deferred polish for v1.4.26 (hand-review prose for the highest-
traffic surfaces, native FR/ES/IT/PL prefs strings in
buildPrefsPrefix, locale-native date formats).
2026-05-14 15:40:51 +02:00
Marc-André Bombeck d72c60c098 docs(planning): v1.4.25 session handoff document
Previous Claude session reached 79% context. Handoff for the new
session to pick up W8 → W13 cleanly without re-reading the full
phase-report trail. Lists exactly what's landed (all 23 waves
inventoried), what's still open (W8/W9e/W10/W11/W12/W13), the
critical Marc-Voice + branch-model + i18n conventions, the
in-flight test failures to expect, and the verbatim greeting for
the new session.
2026-05-14 14:22:17 +02:00
Marc-André Bombeck 98f7d11861 chore: resolve parallel-agent merge conflicts + sweep up loose edits
7 conflict files resolved by taking the upstream/HEAD side (which carries
the W4d/W5/W6c/W3f feature additions). Stashed-side changes that were
genuine new features re-land in subsequent commits if any were lost.

This sweeps up the loose state the W4e+W5e+W5d combined agent left
mid-stash. Resolves develop's working tree for clean push.
2026-05-14 14:19:08 +02:00
Marc-André Bombeck 6f04123982 docs(planning): W3f v1.4.25 four polish wins phase report
Records the four polish-bar deliverables (per-card target-edit cog,
comparison-overlay grey-out, orphan general-status endpoint cleanup,
per-night sleep-stages stacked bar) with their commit SHAs,
file lists, verification results, and notes on the parallel-agent
commit-message collision that swept Win 1 into d74aa20.
2026-05-14 14:12:15 +02:00
Marc-André Bombeck 03f58c75b8 docs(planning): W4d v1.4.25 GLP-1 full integration phase report 2026-05-14 14:04:53 +02:00
Marc-André Bombeck 044f971133 docs(planning): v1.4.25 W9 repo polish phase report 2026-05-14 13:50:29 +02:00
Marc-André Bombeck d6315026b4 docs(planning): record W5 v1.4.25 Coach drawer polish phase report 2026-05-14 13:38:54 +02:00
Marc-André Bombeck d51e488739 docs(planning): W6c v1.4.25 doctor-report toggles phase report 2026-05-14 13:34:09 +02:00
Marc-André Bombeck d94981e010 chore(withings): document full meastype mapping + API coverage audit
Adds src/lib/withings/mapping.md as the single source of truth for the
meastype → MeasurementType table that the client.ts MEASURE_TYPE_MAP
mirrors, and .planning/research/withings-api-coverage.md as the full
audit of the Withings public API surface (Measure, Sleep, Heart,
Activity, Workouts, User, Notify) against HealthLog's ingestion.

The audit scores each gap on user-value / effort / schema-impact and
slots additions into v1.4.25 (cheap mappings), v1.4.26 (sleep + activity
sync, body composition expansion) and v1.5 (ECG, AFib, workouts).
2026-05-14 13:21:28 +02:00
Marc-André Bombeck 58bbb4ec78 docs(planning): record W7b timezone follow-up report 2026-05-14 13:19:17 +02:00
Marc-André Bombeck ca7673358e docs(planning): W4 v1.4.25 insights sub-pages phase report 2026-05-14 13:19:17 +02:00
Marc-André Bombeck ebde50d1c5 docs(planning): W3e v1.4.25 zielwerte redesign phase report
Captures the 9-phase implementation:
- per-phase commit SHAs (SHA → subject table)
- files added / changed / removed with line-count summary
- skills invoked (frontend-design, mobile-first-design, mcp__shadcn)
  + how each shaped the result
- aiEnabled gate implementation walkthrough so reviewers can verify
  the Coach CTA gate
- verification results (typecheck / lint / test / format)
- 6 open questions for Marc (PROMPT_VERSION, streak thresholds, met-
  this-week threshold, MOOD_STABILITY pill redundancy, prefill i18n
  decision, deferred cog-edit affordance)
- 4 deferred items with rationale
2026-05-14 12:45:09 +02:00
Marc-André Bombeck aea39d976d docs(planning): v1.4.25 W7 per-user timezone report 2026-05-14 12:14:26 +02:00
Marc-André Bombeck 4cb8ba3491 docs(planning): record v1.4.25 W2 CI-fix work — coach-prefs + e2e
Two carryover failures fixed in this session before the rest of W2
closes:
  - tests/integration/coach-prefs.test.ts NextRequest URL mock
    (v1.4.22 carryover, deferred from v1.4.23 + v1.4.24)
  - e2e/chart-overlay-controls.spec.ts portalled-toggle viewport
    + e2e/charts-mobile.spec.ts Pixel-5 axis-tick visibility

Report covers root causes, file paths + line ranges, verification
exit codes for the integration suite, and the local-environment
limitation that blocked e2e verification (Node 25 vs CI's Node 22
prerender regression). Final e2e verification will arrive from the
next CI run on develop.
2026-05-14 11:55:45 +02:00
Marc-André Bombeck ac54bb26e8 chore: sync develop with v1.4.24 release from main
v1.4.24 (security + accessibility hardening) shipped directly on main as
a hotfix-style release. Back-merging the two main-only commits
(ca03c60 chore(release): v1.4.24, 604009d per-user timezone proposal)
into develop so the v1.4.25 work continues on the standard branch model.

# Conflicts:
#	.planning/ROADMAP.md
2026-05-14 11:32:28 +02:00
Marc-André Bombeck 604009dc4f docs(planning): per-user timezone proposal — long-form record for v1.5
Issue #167 (Warsaw user, v1.4.23) reports that the CSV export reads as
UTC because `Date.prototype.toISOString()` writes the `Z` suffix and
spreadsheet viewers drop the marker. The technical bug is small — 4
lines in `src/lib/export.ts` — but the architectural surface it
exposes is large: the whole app is hardcoded to `Europe/Berlin` for
display, analytics buckets, reminder cron, Withings sync mapping,
charts, PDF, Coach context (10 distinct symptoms total).

This commit records the long-form analysis so a future planning pass
does not start from zero:

- `.planning/feature-user-timezone.md` — full proposal: symptom
  catalogue across 10 surfaces, design space (A: export-only quick
  fix, B: per-user `displayTimezone` setting, C: rejected
  auto-detect), migration strategy with concrete file/line touches,
  the date-string risk split (`MoodEntry.date` freeze vs
  `MedicationSchedule.windowStart` re-anchor — they need different
  contracts), DST edge cases, parametrised test plan (Berlin / UTC /
  New York / Tokyo / Kiritimati), and open product-call questions
  for the v1.5 planning pass.
- `.planning/v15-backlog.md` — one-line carry under a new "From issue
  triage" section pointing at the proposal.
- `.planning/ROADMAP.md` — reserved-milestones block notes per-user
  timezone as a v1.5 candidate, with v1.6+ as fallback if v1.5 stays
  iOS-focused.

Scope-clean: the v1.4.25 quick fix (ISO-8601-with-offset CSV) is
documented as independent. It closes #167 on its own without
touching the architectural scope captured here.
2026-05-12 22:45:42 +02:00