Executive Explainer · Internal

LIVE It Migration & Identity Resolution

Every LIVE It Tracker entry from the WordPress era now lives in Supabase, attributed to the right person, under a compliance posture built to survive a lawyer reading it. This is what moved, what it fixed, and what is still owed.
Prepared 20 September 2026 · revised same day Owner Coach Lucy Howell Status Migration complete · Form, history and challenges deployed

342 legacy submissions became 2,289 attributed rows across 55 members. Identity is now resolved through an alias table rather than assumed, which closes the fault that let a shared link show the wrong person's profile. All three gaps named in the first draft are now closed. One page fault and one data-quality decision remain.

2,289Rows restored
55Members with history
1,673Profiles reconciled
0Logins resolving to nothing

What the migration actually did

The old tracker was a 57-column Gravity Form. Every column collapsed into a single row shape — one row per thing measured, per day, per person — so that a legacy answer, a manual entry typed tomorrow and a future watch reading all share one structure.

TrackWhat came acrossRows
MOVE ItSteps, miles, walking, cardio, strength, stretching, meditation, plus which activity and which session was opened1,034
SERVE ItVolunteer minutes, dollars, in-kind value, blood units, how and who they served511
EARN ItAward type, name, level, whether it earned media271
My GoalGoal chosen and how it was measured231
LEARN ItLearning minutes and the kind of activity211
EAT ItBalanced meals, fruit & veg, hydration, reduced sugar31

491 rows carry a number. 1,798 carry what the member chose or typed. Text was imported because 12 members submitted nothing but text — a numeric-only migration would have erased them from the platform entirely.

The compliance posture, and why it matters

Every entry predates any device integration. No wearable, no HealthKit, no clinic, insurer or employer contributed a single value. This is consumer wellness journaling collected under terms accepted at signup — and that character is now provable from the database itself rather than from anyone's memory.

Seven guarantees, written into the data

  • Minimised. IP addresses, user agents, referrers, submission timing and time-of-day existed in the export and were deliberately left behind.
  • Labelled. Every row carries data_class, consent_basis and source.
  • Provenance. An import log records the source file, row counts, operator and date. One batch ID ties every row back to it.
  • Locked. Row Level Security on every new table, plus an explicit revoke of the public browser key. Two locks, not one.
  • Erasable. A request log and a tested deletion path — you can honour an erasure request and prove you honoured it.
  • Honest. Suspect values import flagged, never silently corrected, never counted as fact.
  • Non-destructive. No primary key rewritten. No coin balance touched. No coins minted retroactively.

The identity fault, and how it was closed

The original alarm was a shared link showing the wrong person's profile. The investigation found two distinct problems, both now fixed.

ProblemCauseFixState
Shared link showed Coach Lucy's profile to another signed-in userStale reviewer identity cached in the browser, overriding the live sessionGate keys purged and reconciled against the signed-in session on every loadLive
Nine people had a profile and a login under one email but different IDsProfiles created years before Supabase logins existed; nothing tied them togetherIdentity resolved through an alias table instead of assuming ID equalityLive
38 logins had no profile at all — they signed in to nothingSignups were not reliably creating a profile recordBackfilled, and a trigger now makes it deterministicLive

The repair deliberately did not rewrite anyone's primary key. Rewriting a key that other tables point at is how a migration becomes an outage, and a key you have rewritten is one you can no longer reconcile against the old system. Nothing moved; the lookup simply stopped assuming and started asking.

What is live right now

What was built after this was first written

This Explainer was drafted before the three gaps below were closed. They are now built, tested and deployed. The record of what was missing is kept because the reasoning behind each decision still matters.

All three gaps are closed

A replacement entry form Deployed
A Log a Day tab on LIVE It Trackers. Every question and dropdown option was recovered from the 342 real legacy submissions rather than invented, so anyone who used the old tracker recognises it. It writes the same one-row shape the migration used, resolves the member through the alias table rather than assuming the session ID matches the profile, and saving a day replaces that day — so correcting an entry cannot silently double a total.

Multiple simultaneous streak challenges Deployed
Challenge settings moved from a single stored object to a list. Choosing a metric now switches to that challenge or starts a new one, and never touches another. The previous configuration migrates forward on first load. Verified by test: a 14-day, 9,000-step challenge survives two metric switches and a page reload with its goal, length and progress intact.

Heart metrics Deployed
Heart rate, resting heart rate and heart rate variability now exist, with the identifiers the mobile build needs. All three are track-only: they display and trend, but cannot be set as a numeric streak target. Resting heart rate is better lower, so a streak would nudge a member to drive it down. HRV swings with illness, alcohol and stress, so a broken HRV streak reads as failure when it is usually biology. And for anyone on a beta blocker or with an arrhythmia, both numbers mean something else entirely. Displaying the data is sound; gamifying it is health advice this platform is not positioned to give.

One fault found while testing, still open

On the LIVE It Trackers page the Supabase script tags sit inside a JavaScript string, so the browser never executes them. The page ends up with the namespace present but no working database client — which means every check that tests for the namespace passes while nothing works. It is why the new form rendered perfectly and then failed to save.

The LIVE It modules now detect this and rebuild the client themselves, so the form works today. The underlying page fault is still there, and anything else on that page that expects a database client — including the navigation's sign-in state — is still getting nothing. That deserves its own fix rather than every module carrying a workaround.

Five questions, answered

Has the Streak Challenge update been deployed?

Yes. The first release was artwork and member-facing copy only, which is why the app looked unchanged. The behaviour has since been built and deployed: several challenges can now run at once, and the entry form feeds them.

Can we host more than one streak challenge at a time?

Yes, as of this release. The configuration is now a list rather than a single object. Each challenge holds its own metric, goal, length and start date, and choosing a different metric moves between them instead of overwriting.

Why is heart rate missing from the tables?

It was never added — this was a build gap, not a sync failure. The metrics now exist, with the identifiers the mobile build needs. They are deliberately display-and-trend only, for the clinical reasons set out above.

Should testing with Dr. Rob earn points for pulling data?

A recommendation rather than a finding: reward the behaviour, not the sync. Award coins once for connecting a device, then for what the member does. Paying per data pull turns a passive background process into an earnings stream and makes the coin economy impossible to defend later.

Is the shared-link profile fault resolved?

Yes, on two independent layers — the browser no longer lets a cached reviewer identity override a live session, and the database now resolves identity itself rather than trusting the session ID to match the profile.

One decision waiting on you

112 entries record more than eight hours of a single activity in one day

Across ten members: 7,000 minutes of learning on one date (117 hours), and repeated clusters at exactly 717–720 minutes of cardio, stretching, strength and meditation. The clustering and the concentration around two dates in March 2025 point to either a form fault or a few people running up numbers.

The migration imported them faithfully, which was correct. The open question is whether they should count. The recommendation is to flag them the way ten are already flagged — visible, labelled, excluded from totals, nothing deleted or altered, fully reversible. The thresholds are a judgement call about members' own records, so they should be set deliberately rather than quietly.

What this cost in defects found

Worth recording, because each was caught before it reached a member:

Recommended sequence

  1. Push the member history view — done.
  2. Build the replacement entry form — done.
  3. Support several challenges at once — done.
  4. Add heart rate and heart-rate variability — done, track-only.
  5. Fix the LIVE It Trackers page so its Supabase scripts actually execute, rather than leaving each module to rebuild the client.
  6. Set the data-quality thresholds and flag the 112 suspect entries.
  7. Rebuild the LIVE It Trackers page around the new form, keeping the specialist trackers (Pain, BMI, Weight, Treatment, Screen Time, Reactions) that the form does not cover.
  8. Sign the Supabase business associate agreement; have counsel read the posted terms against what the database now asserts about consent.
The Force for Health® Network · Executive Explainer · Internal circulation only.
This page is gated and excluded from search indexing. Share it by VIP reviewer code, never by pasting its contents into email.
QR code linking to this Executive Explainer Scan to open
this Explainer