RonanRx · Design Lead Recommendation · For founder approval
One recommended landing that doubles as the secure PHI workspace and the surface worth opening — because until the messaging waiver is signed, the app is the only safe place a patient’s clinical detail can live.
A text announces, then goes quiet. It cannot answer a question on demand, and right now it cannot legally hold the answer at all.
Three things only the web can give the patient. First, on-demand status: which stage their compounded prep is at, when it ships, when the next refill is due — the one recurring question a push notification can announce but never let you check anytime or act on. Second, synthesis: an outcome trend, a lab read in plain language, a completeness picture — things the patient cannot reconstruct in their head. Third, and decisively, the safe channel: until the patient signs the text-PHI messaging waiver (Consent kind text_messaging), clinical detail — allergies, current medications, weight — cannot travel by text. So the app is the single safe place to give that information and keep it current.
That regulatory wall is the wedge, not an apology. We make it the reason to log in, framed as patient-as-admin: you are the keeper of your own chart, and this is your command center. The required CRUD — allergies, meds, biometrics — stops being admin you owe the pharmacy and becomes visible progress you own.
The single feeling: relief and quiet authority. The patient lands and instantly knows three things — what is happening with their care, the one thing to do next, and that their record is complete and safe where it belongs. No chasing the care team. No wondering if a text got through.
Spine: The Standing Order — a concierge command center. Summary before detail, one clear next action, calm and certain. Below is the surface as it actually renders, top to bottom, in the steady state.
Your Standing Order — Metabolic program
Review allergiesYour Health Record — the secure place for clinical detail
Your pharmacist checks every prep against your allergies. Edits are saved as a new version — nothing is overwritten.
Your check-ins — last six weeks
A check-in opens this week. 20 seconds — reflect and tell your care team.
Messaging
Rendered in Georgia/system sans for portability; production uses Fraunces + Inter per DESIGN.md. Status colors and chip rules are the project palette verbatim.
Each module names its real data source or marks it aspirational. Real ships on existing entities; Partial needs a presentation layer; New is a net-new patient-managed PHI surface.
One full-width card resolving the whole account into a single prioritized action plus a glanceable program status line and a five-step fulfillment stepper. No score, no efficacy claim — logistics and participation only. The open is always rewarded with certainty.
Real Resolver over: PatientProgramEnrollment · RefillTask · OutcomeCheckIn · Shipment · profile gaps. Deterministic priority sort — no new model.
A completeness ring expanding to guided, one-at-a-time section cards: Allergies, Current medications you take, Biometrics. Each carries a “why this matters” line and an instant non-judgmental confirmation on save (“Recorded — this goes to your care team”). Edits mint a new current version, never a raw mutable table. This is the dual-role linchpin: the ring is the engagement metric and the capture mechanic.
New Today: PatientGraph stores allergies/medications/vitals as versioned JSONB; net-new: patient-editable Allergy, self-reported Medication, longitudinal Biometric surfaces. ExtractedClinicalField pre-fills draft cards the patient confirms.
When a cadence window is open, a fast 1–5 self-report with an optional note, then a gentle, skippable trend afterward and explicit forgiveness for missed days. Logging earns insight: the entry resolves into a line the patient wants to revisit. The recurring reason to return between refills.
Real Source: OutcomeCheckIn (score 1–5; cadence weekly/biweekly/monthly; status scheduled/sent/responded/missed) driven by the existing daily OutcomeCheckInJob.
Per program: current compounded prep, a re-readable “about your preparation” overview (how to take and store, freshness window, ingredient-batch provenance), days remaining, next refill date, and one primary action — Confirm / Adjust date / Pause. The “a text can’t hold this” artifact.
Real Source: Prescription · RefillTask · FormulaVersion. Trust chips gate on the computed QualityRelease.checklist_results["lot_traceable"] — never on released? alone. Days-of-supply is new.
Lab results surfaced with color-state and a “what this means for your program” note — not a raw PDF — placed prominently because viewing results is the single biggest portal login driver. The note is drafted by clinical agents and falls back to “review with your care team” when the LLM is unavailable.
Partial Source: LabOrder · LabResult (normal/abnormal). Optimal-range + retest-trend layer and the agent note are net-new; agents already fall back safely.
A quiet card stating the current safe channel. Unsigned: “the secure place for your clinical details” with a single low-pressure offer to sign. Signed: “text updates on” with a three-year secure-record note. The waiver is a capability the patient grants — never a coercive gate, and the app is fully usable without it.
Real Source: Consent (kind text_messaging; status pending/signed/revoked; seal_state). Sign routes to the existing AuthorizationsController /a/* flow.
A read-only arc of the real care relationship — prescription approved, prep compounded (honest “Lot traced” chip), shipped, delivered, check-in completed, refill due. Slow-burn proof of forward motion that raises switching cost without gamifying medication.
Real Source: Event activity feed + the fulfillment chain + OutcomeCheckIn.
The landing reads Consent(kind: text_messaging) and adapts. The unsigned state is the default safe path — never a degraded one.
Instructive and protective. The app is the safe channel; data capture leads.
Reward and insight. Routine updates can flow over text, so the app becomes the deep-dive surface.
One deterministic resolver picks the single most prominent CTA by patient state. It is the hero, and it is what makes the open always pay off.
| Patient state | The one CTA | Driven by |
|---|---|---|
| New / profile incomplete | “Add your allergies so your team has the full picture” | PatientGraph section presence |
| Awaiting doctor approval | “Your prescriber is reviewing — we’ll let you know” (reassure, no action) | PharmacyOrder / DoctorApproval |
| In compounding | “Being prepared — confirm your allergy list before it ships” | CompoundingTask + profile gap |
| Shipped | “Arriving Thursday — track it”, then “confirm you received the correct prep” | Shipment (dispatched / in_transit) |
| Check-in due | “Your check-in is open — 20 seconds” | OutcomeCheckIn (scheduled / sent) |
| Steady-state refill | “11 days of supply remain — confirm your refill” | RefillTask (due_date) |
| All caught up | “Everything’s on track” — surface the trend + timeline instead | no open task → insight mode |
Priority order, highest first: blocking profile gap → shipment exception → check-in due → refill due → shipment in motion → awaiting approval → steady. Ties break by recency. The resolver is pure Ruby over existing statuses.
Tasteful and restrained, within the stack: no chart library, no JS animation library. Motion is CSS transitions, Hotwire frame swaps, and inline SVG.
stroke-dashoffset animation, reduced-motion respected) with an emphasized endpoint — the reward surface, not decoration.For a truthful static mock: what wires to a shipped entity today, what needs a presentation layer, and which CRUD surfaces are net-new.
| Module | Status | Backing entity | The gap |
|---|---|---|---|
| One Thing First resolver | Real | existing statuses | new view logic only, no model |
| Fulfillment stepper + trust chips | Real | QualityRelease, Shipment | chip must gate on computed lot_traceable |
| Prep & refills card | Real | Prescription, RefillTask, FormulaVersion | days-of-supply estimate is new |
| Check-in card + trend | Real | OutcomeCheckIn / OutcomeCheckInJob | SVG trend is net-new UI over real data |
| Waiver-state landing switch | Real | Consent + AuthorizationsController /a/* | adaptive copy is new; /a/* flow currently held for review |
| Program timeline | Real | Event feed | arc rendering is new UI |
| Labs reader | Partial | LabOrder, LabResult | optimal-range/trend + agent “what this means” note net-new |
| Allergies (editable) | New | only PatientGraph.allergies JSONB today | first-class patient-managed surface; AR-encrypted, audited, versioned |
| Current medications (self-reported) | New | only PatientGraph.medications JSONB | distinct from pharmacy Prescription; patient-confirmed only |
| Biometric time series | New | PatientGraph.vitals is a signup snapshot | timestamped, longitudinal, patient-entered; the natural first chart |
| Delivery-confirmation tap | New | Shipment | no patient-confirmation field today |
Five lenses were explored. The Standing Order wins because it carries the dual role best while staying calm and on-brand — but it borrows the strongest single mechanic from each.
| Concept | Reward | Feasibility | On-brand | Borrow |
|---|---|---|---|---|
| The Standing Order concierge command center |
The spine: status-since-last-visit hero + one next action. | |||
| The Daily Pulse streak + trajectory |
The forgiving consistency view — never streak-guilt. | |||
| Your Care Picture outcomes verdict |
Plain-language “what this means” on labs — no health score. | |||
| Your Health Picture completeness-first |
The completeness ring + “why we ask” microcopy. | |||
| Bench telehealth program home |
The re-readable “about your preparation” overview + delivery-confirm tap. |
Static HTML mock first — one file, the project palette and type, every chip honest — then wire modules to entities in three phases.
One Thing First resolver, fulfillment stepper with honest trust chips, prep & refills card, check-in card + SVG trend, program timeline, and the waiver-state switch. All back onto shipped entities (RefillTask, Shipment, QualityRelease, OutcomeCheckIn, Consent). No new models. CSS/SVG ring and sparkline; no new dependencies.
Render LabOrder/LabResult with color-state, optimal-range, and retest trend; add the agent-drafted “what this means for your program” note (clinical agents stay in unavailable-safe fallback). Days-of-supply estimate. Delivery-confirmation tap on Shipment.
The real lift and the dual-role linchpin. Route edits through a workflow service that mints a new current PatientGraph version (draft → current → superseded) — auditable, non-destructive. New PHI columns AR-encrypted like Patient, lookup-hash only where searchable, Event + PhiAccessLog on write, idempotent writes. Pre-fill draft cards from ExtractedClinicalField, patient-confirmed only — AI proposes, never asserts. Then the biometric trend chart and optional passive weight sync.
lot_traceable. No raw mutable PHI tables; every edit is versioned and audited.