Check-in incomplete
The system names the missing inputs instead of producing a confident plan from defaults.
Target interaction specification
Given how I feel, the time I have, and the equipment available, what kind of general-fitness session makes sense today, and why?
Compass may suggest a general-fitness session from the current check-in, but the reasoning must remain visible. A defined warning-symptom hold must dominate every optimization and produce no exercise prescription. The interface must not present the result as diagnosis or treatment.
Case-study thesis
This is the behavior to build toward. The implementation receipts below remain the record of what exists today.
The important interaction is not generating a workout. It is making the recommendation inspectable, editable where appropriate, stale when inputs change, and impossible to quietly optimize around a safety hold.
State model
If two states would look identical to the person, the implementation is not finished.
The system names the missing inputs instead of producing a confident plan from defaults.
Sleep, energy, soreness, symptoms, time, and equipment are summarized for review.
The session emphasizes progression and states the inputs that supported that choice.
The session maintains ordinary training with its reasons visible.
The session intentionally reduces load and explains which inputs caused the change.
A defined warning symptom stops exercise prescription, sets duration to zero, and explains the product boundary.
Changing time or equipment recomputes the plan while preserving the explanation of what changed.
A plan generated from an earlier check-in is visibly stale once relevant inputs change.
Edge cases
Definition of done
HAAM produktutgåva · Today’s session
Compass turns a local check-in — sleep, energy, soreness, symptoms, time, equipment — into a session you can read. Build, base, restore, or pause. Pause carries no exercises. The web host uses demo data. It is a general-fitness prototype.

modes
4Build, base, restore, pause. Pause has no exercises. Fifteen-minute cap in the plan engine.
cardiac warning
HoldA cardiac symptom in the check-in pauses training. Swaps cannot remove the hold.
web host
Democompass.haam.co is an Expo web export over fixture data.
plan engine
LocalbuildDailyPlan is deterministic. Covered by Node unit tests.
The job
I wanted today’s work decided from sleep, energy, soreness, symptoms, time, and equipment, with the reasons visible, and with a way to swap or stop.
A recovery score that does not produce a session still leaves the morning unplanned. A black-box generator hides the judgement. Compass keeps the prescription on the page: mode, duration, exercises, and the hold if it fired.
Diagnosis, treatment, medical-device claims, and genome-driven training are out of the loop.
The morning
The public host is the demo path. HealthKit exists in source and is unverified on a signed device in the evidence file.
01
Sleep, energy, soreness, symptoms, available minutes, and equipment. The plan is only as current as this input.
02
The engine chooses build, base, restore, or pause from the check-in. Cardiac warning forces pause and an empty exercise list.
03
The session shows why it landed there. Equipment swaps can filter exercises. They cannot lift a safety hold.
04
The day’s plan can be kept locally. Optional narrative APIs stay off unless someone pastes their own keys, and then they receive summaries, not raw samples.
Design decisions
compass.haam.co
Safety
If the check-in includes a cardiac symptom, safetyHold is true, mode is pause, duration is zero, and exercises is []. Swaps cannot refill that list. I wrote the hold before I wrote the session library.
Transparency
A person who already moves a lot still needs to see why today is restore instead of build. The interface keeps the prescription and the inputs in the same glance.
Claim boundary
compass.haam.co is fixture data. The HealthKit adapter is in the repository. This evidence file does not claim a signed-device run or a TestFlight submit.
The working stack
Engine
Local, deterministic, unit-tested. Cardiac hold short-circuits exercises.
Runtime
React Native 0.86, React 19. Web export is the public host.
Sources
Fixture feed on the web. HealthKit adapter in source, unverified on device here.
Host
Vercel Expo web export. Not production-used as a health product.
In evidence
01A check-in produces a readable session with mode and reasons
02Cardiac warning yields pause with an empty exercise list
03Equipment swaps cannot remove the safety hold
04The public host can be explored on demo data
Where it stops
HealthKit is implemented in source and was not verified on a signed device in the evidence file. There is no TestFlight submit in this pass. Wearable OAuth and a genome viewer are out.
This is a general-fitness prototype. It is not a medical device, diagnosis, or treatment. No fitness-outcome language belongs here.
HAAM’s role
Compass loop, sibling classification, claim boundary, plan engine, demo adapter, docs, and unit tests. Direct work, 2026.
How we learned
The product starts from a small set of signals that affect the day in front of you: sleep, energy, available time, and what has already happened this week. The research question is not how to generate more workouts, but which signals are useful enough to change today's recommendation and still remain understandable.
Optional analytics. Google Analytics and Clarity load only if allowed; form, email, and chat content are excluded.