Catalina Health · Coach Graici · Build Tracker
Inputs / Outputs Build Map
Per-phase sequence diagrams and an editable tracker for every API call, webhook, and integration touchpoint in the member–Graici journey. Status, owner, and sprint persist locally in this browser — share by exporting state via the toolbar.
Lanes:
Member · Portal · Graici · Super Admin · Catalina Team · Sage Bio · External
Status:
Not Started
In Progress
Blocked
Done
OVArchitecture Overview
The Health Hub Portal kicks off the member journey by pushing demographic data into Graici. Graici owns the member-facing experience end-to-end. The Graici Super Admin generates the PDF requisition; the Catalina Team is the human in the loop who creates the Sage Bio account and uploads the requisition. Sage Bio pushes three distinct webhooks back to Graici: member account created, requisition uploaded, results uploaded. Graici fans those out as member notifications and as status-only updates to the Portal.
flowchart LR
classDef external fill:#F5F0E8,stroke:#D9D2C5,color:#2A2A2A
classDef catalina fill:#0A6B7A,stroke:#0A6B7A,color:#FFFFFF
classDef graici fill:#E2725B,stroke:#E2725B,color:#FFFFFF
classDef member fill:#FFFFFF,stroke:#0A6B7A,color:#0A6B7A,stroke-width:2px
classDef human fill:#FFF8E6,stroke:#D69E2E,color:#2A2A2A
M([Member]):::member
P[Health Hub Portal]:::catalina
G[Coach Graici]:::graici
SA[Graici Super Admin]:::graici
CT[Catalina Team — humans]:::human
S[Sage Bio]:::external
LC[LabCorp / Mobile Phlebotomist]:::external
ST[Stripe]:::external
P -- demographic push --> G
G -- profile complete · status updates --> P
M <-- conversational UX, notifications, scheduling --> G
G -- PDF req generation --> SA
SA -- delivers req --> CT
CT -- creates account, uploads req --> S
S -- account.created · req.uploaded · results.uploaded --> G
G -- book draw appt --> LC
G <-- payment intents · webhooks --> ST
Architectural rules:
Graici is read-only against Sage Bio in V1. Graici does NOT create Sage accounts or POST requisitions — the Catalina Team does that out-of-band. The Portal receives status-only updates from Graici (never PHI). The member never logs into Portal or Sage Bio.
P1Portal handoff — demographic push
Member journey starts at the Health Hub Portal. The owner activates a member; the Portal pushes the member's demographic data to Graici, which stages the member record and prepares onboarding.
sequenceDiagram
autonumber
participant P as Portal
participant G as Graici
participant M as Member
P->>G: POST /v1/members/intake (demographics, affiliate_id, optional pre_assigned_tier)
G-->>P: 200 OK (catalina_member_id, invite_token)
G->>P: webhook member.staged
G->>M: SMS + email invite link
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P2Member onboarding & profile setup
Member clicks the invite, creates an account with 2FA, completes the Health OS profile (goals, training history, current routine), and signs disclosures. Graici prompts the member to generate a baseline Health Summary at this point to protect personalized data going forward.
sequenceDiagram
autonumber
participant M as Member
participant G as Graici
M->>G: GET /v1/invites/{token}
G-->>M: prefill context + affiliate name
M->>G: POST /v1/auth/register (password, phone)
M->>G: POST /v1/auth/2fa/verify (code)
M->>G: PATCH /v1/members/{id}/profile (goals, training, conditions)
M->>G: POST /v1/members/{id}/disclosures (HIPAA, terms, data sharing)
G->>M: prompt — create baseline Health Summary
M->>G: POST /v1/members/{id}/health-summary/baseline (consents)
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P3Path selection — tier OR lab + review bundle
Graici presents the member two purchase paths: a recurring health tier (configured by the owner in the Portal) OR a standalone lab + review bundle. Member chooses; payment runs through Stripe.
sequenceDiagram
autonumber
participant M as Member
participant G as Graici
participant ST as Stripe
G->>M: present tier options + lab+review bundle
M->>G: GET /v1/members/{id}/options-available
G-->>M: tier list + bundle descriptor
M->>G: POST /v1/members/{id}/checkout (tier_id OR bundle_id)
G->>ST: create payment intent
ST-->>G: client_secret
M->>ST: confirm payment (member-side)
ST->>G: webhook payment_intent.succeeded
G->>G: activate tier or bundle on member record
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P4Profile complete — sync back to Portal
Once the member's profile is set up and a path is selected, Graici pushes the status back to the Portal. The Portal sees the member move from Invited → Activated, and (if a tier or bundle was purchased) records the kickback ledger entry. Status-only — no PHI flows to the Portal.
sequenceDiagram
autonumber
participant G as Graici
participant P as Portal
G->>P: webhook member.profile-complete (status='activated')
G->>P: webhook member.tier-purchased OR member.bundle-purchased (sale_amount, kickback_amount)
P-->>G: 200 ack
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P5Member initiates lab requisition
Member decides they're ready for the lab in their tier or bundle and tells Graici. Graici emits a requisition request to the Graici-side Super Admin, which is the first step in producing the PDF requisition.
sequenceDiagram
autonumber
participant M as Member
participant G as Graici
participant SA as Super Admin
M->>G: POST /v1/members/{id}/labs/request
G-->>M: confirmation — req is being prepared
G->>SA: POST /v1/super-admin/requisition-requests (member info, panel codes, source)
SA-->>G: 202 accepted, task_id
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P6Super Admin — PDF requisition → Catalina Team
The Graici Super Admin fills out the requisition PDF template with the member's data and delivers it to the Catalina Team for upload into Sage Bio. This is a Graici-internal subsystem; the delivery to Catalina Team can be via secure email, an admin work queue, or a Slack alert — pick one before V1.
sequenceDiagram
autonumber
participant SA as Super Admin
participant CT as Catalina Team
SA->>SA: generate requisition PDF (template + member data)
SA->>CT: deliver PDF (email, work queue, or Slack notification)
CT-->>SA: pickup confirmation (manual)
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P7Catalina Team — create Sage account & upload requisition
Out-of-band human step. The Catalina Team takes the PDF requisition from the Super Admin and (a) creates a Sage Bio visualizer account for the member using their email, and (b) uploads the requisition into Sage Bio. Both are manual operations performed in the Sage Bio admin tool.
sequenceDiagram
autonumber
participant CT as Catalina Team
participant S as Sage Bio
CT->>S: out-of-band — create visualizer account (member email)
S-->>CT: account created (sage_member_id)
CT->>S: out-of-band — upload requisition PDF
S-->>CT: requisition stored (sage_requisition_id)
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P8Sage Bio — member account created webhook
First inbound webhook from Sage Bio. Tells Graici that the member now exists in Sage's visualizer. Graici uses the member email in the webhook payload to bind sage_member_id to the catalina_member_id it already has.
sequenceDiagram
autonumber
participant S as Sage Bio
participant G as Graici
participant P as Portal
S->>G: POST /v1/webhooks/sage (member_account.created)
G->>G: identity bind — sage_member_id ↔ catalina_member_id via member_email
G->>P: webhook member.status-update (status='sage_account_active')
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P9Sage Bio — requisition uploaded webhook → notify member, prompt scheduling
Second inbound webhook. When the requisition is loaded into the Sage Bio visualizer, Sage pushes the event to Graici. Graici notifies the member that their req is ready and prompts scheduling — at a LabCorp location or via a mobile phlebotomist. Status-only update to Portal.
sequenceDiagram
autonumber
participant S as Sage Bio
participant G as Graici
participant M as Member
participant P as Portal
S->>G: POST /v1/webhooks/sage (requisition.uploaded)
G->>G: cache requisition state
G->>M: notification — "Your req is ready, schedule your draw"
G->>P: webhook member.status-update (status='req_uploaded')
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P10Member schedules phlebotomy — LabCorp or mobile
Member picks a path: walk into a LabCorp draw site or have a mobile phlebotomist come to them. Graici books the appointment through the chosen provider's API (or out-of-band booking + manual confirmation in V1).
sequenceDiagram
autonumber
participant M as Member
participant G as Graici
participant LC as LabCorp/Mobile
participant P as Portal
M->>G: POST /v1/members/{id}/phlebotomy/schedule (method, location, time)
G->>LC: book appointment (API or manual fallback)
LC-->>G: confirmation
G->>M: appointment confirmed + reminders scheduled
G->>P: webhook member.status-update (status='draw_scheduled')
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P11Sample collection
Member draws their sample. LabCorp or mobile provider reports collection completion; Graici updates state and lets the member know results are typically 3–5 days out.
sequenceDiagram
autonumber
participant LC as LabCorp/Mobile
participant G as Graici
participant M as Member
participant P as Portal
LC->>G: webhook draw.completed (sage_requisition_id, collected_at)
G->>M: notification — "Sample collected, results in 3–5 days"
G->>P: webhook member.status-update (status='sample_collected')
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P12Sage Bio — results uploaded webhook
Third inbound webhook. When results are loaded into the Sage Bio visualizer, Sage pushes the event. Graici pre-warms its cache (lab values, Health Index), notifies the member, and pushes a status-only update to the Portal.
sequenceDiagram
autonumber
participant S as Sage Bio
participant G as Graici
participant M as Member
participant P as Portal
S->>G: POST /v1/webhooks/sage (results.uploaded)
G->>S: GET /v1/sage/members/{id}/labs (pre-warm cache)
G->>S: GET /v1/sage/members/{id}/health-index (pre-warm cache)
G->>M: notification — "Your results are ready"
G->>P: webhook member.status-update (status='results_ready')
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P13Member views results + Noctor AI Q&A
Member opens Graici, sees their results and Health Index. Can ask follow-up questions about their data; questions route to Sage's Noctor AI with member-data context and render back with required clinical disclaimers preserved verbatim.
sequenceDiagram
autonumber
participant M as Member
participant G as Graici
participant S as Sage Bio
M->>G: GET /v1/members/{id}/labs
G-->>M: lab values (cached, Sage fallback on miss)
M->>G: GET /v1/members/{id}/health-index
M->>G: POST /v1/members/{id}/questions (question text)
G->>S: POST /v1/sage/noctor/query (sage_member_id, question, context)
S-->>G: answer + citations + required disclaimers
G-->>M: rendered answer with disclaimers verbatim
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P14Physician review scheduling
For tier and lab+review bundle members, Graici offers physician review scheduling. Slots come from Sage Bio. Member books through Graici; Graici books the review with Sage; reminders are dispatched on the scheduled cadence.
sequenceDiagram
autonumber
participant M as Member
participant G as Graici
participant S as Sage Bio
participant P as Portal
G->>S: GET /v1/sage/reviews/slots
S-->>G: available slots
G->>M: present slots
M->>G: POST /v1/members/{id}/reviews (slot_id, questions)
G->>S: POST /v1/sage/reviews (slot_id)
S-->>G: sage_review_id
G->>M: confirmation + reminders
G->>P: webhook member.status-update (status='review_scheduled')
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P15Member Health Summary generation
After the physician review, Graici composes the Member Health Summary: lab values + Health Index + trend context, rendered against the Catalina template, attributed to the supervising clinician. Stored against the member; available always-on in Graici.
sequenceDiagram
autonumber
participant G as Graici
participant S as Sage Bio
participant M as Member
G->>G: POST /v1/members/{id}/health-summary (review_id)
G->>S: GET /v1/sage/members/{id}/labs
G->>S: GET /v1/sage/members/{id}/health-index/history
G->>G: render Member Health Summary (PDF + structured)
G->>M: notification — "Your Health Summary is ready"
M->>G: GET /v1/members/{id}/health-summary/{summary_id}
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|
P16Renewal, retest, and offboarding
Graici nudges renewal as the tier or bundle approaches expiry, manages retest reminders, and handles member data control (preferences, Sage data-sharing revoke, account deletion). Status-only updates flow to Portal throughout.
sequenceDiagram
autonumber
participant G as Graici
participant M as Member
participant ST as Stripe
participant S as Sage Bio
participant P as Portal
G->>M: renewal nudge ladder (30d, 14d, 7d, 1d)
M->>G: POST /v1/members/{id}/checkout (renewal)
ST->>G: webhook payment_intent.succeeded
G->>P: webhook member.tier-renewed
M->>G: PATCH /v1/members/{id}/preferences (channels, quiet hours)
M->>G: DELETE /v1/members/{id}/consents/sage (revoke)
G->>S: DELETE /v1/sage/members/{id}/access
M->>G: DELETE /v1/members/{id} (account delete)
G->>P: webhook member.offboarded
| # | Direction | Endpoint / Event | Inputs | Outputs | Status | Owner | Sprint |
|---|