The feedback loop is the path a single log entry travels before it changes what Unfair recommends next. A dose tap, a sleep sync, or a 10-second check-in flows through four stages — capture, signal extraction, re-ranking, and review — and each stage has a different latency. Understanding the loop matters because users often expect same-day recommendation changes from a signal class that, by design, cannot move the ranking for several days.
The four stages
Every log entry passes through the same sequence, regardless of source:
- Capture. A timestamped dose, wearable sync, check-in score, or symptom note is written to the local store. This step is near-instant and requires no network.
- Signal extraction. The raw entry is translated into the statistics the engine reads — adherence state, correlation metadata, smoothed outcome series from a moving average window, and any safety flags. Extraction runs on a rolling window, so one entry does not produce one signal; it updates an existing trend.
- Re-ranking. When accumulated signal crosses confidence gates (noise floor, minimum adherence, minimum series length), the ranking engine adjusts ingredient weights, confidence bands, and stop/pause conditions.
- Review. The updated ranking appears on the review screen with a plain-language rationale. Any user-visible change in the stack explanation belongs to this stage.
A re-ranking does not follow every capture. Most log entries leave the ranking unchanged because they simply confirm the existing trend.
Latency by signal type
Different signal classes move the ranking on different clocks. This is the single biggest source of user confusion about the loop.
| Signal class | Example | Typical latency to visible rank change |
|---|---|---|
| Safety flag | New adverse symptom logged alongside a stimulant | Same session; pause prompt within minutes |
| Adherence drift | 3 missed doses in a 7-day window | 24–72 hours; confidence band tightens |
| Subjective proxy shift | Energy score trending down on a 7-day smoothed series | 5–10 days after the trend stabilizes |
| Objective proxy shift | HRV 7-day average moving one SD | 7–14 days after the trend holds |
| Long-horizon outcome | VO2 max estimate, body composition | 28+ days; reads off a 28-day smoothed series |
| n-of-1 withdrawal-return | Planned pause of a single compound | Triggers at the next cycle boundary, typically 2–4 weeks |
A user who logs their first dose tonight and expects a different top recommendation by tomorrow is asking the wrong signal class for a same-day answer. The loop is designed to separate noise from signal before it moves the ranking — by definition that takes time.
A worked loop example
A user starts a 4-week ashwagandha trial at 600 mg pre-bed, logging doses and a pre-bed anxiety score, with Oura sleep syncing nightly.
- Day 1. Dose logged, anxiety 7/10, sleep efficiency 84%. Capture complete. No ranking change — a single point cannot move anything.
- Day 3. Third on-time dose. Adherence signal is healthy, so the engine removes the "low adherence" flag that had been reducing ashwagandha's weight during the 14-day baseline period.
- Day 10. Pre-bed anxiety 7-day average has moved from 6.8 to 5.7 (a 1.1-point drop, roughly one SD for this user). The drop crosses the noise floor after three consecutive days below baseline. The ranking engine lifts ashwagandha's confidence band; the review screen now says "pre-bed anxiety trending lower across 10 days; keep the current protocol."
- Day 18. Sleep efficiency 14-day average has lifted from 82% to 86%. Correlation metadata returns r = 0.31 at lag 1 between dose and sleep efficiency, clearing the noise floor. Ashwagandha is now ranked ahead of an alternative adaptogen the user had tagged as a candidate.
- Day 21. A missed dose on Day 20 drops adherence to 20/21. The consistency score stays in the stronger-signal band, so the rank does not wobble. A single miss does not reverse 18 days of signal.
- Day 28. Cycle review surfaces the full 4-week picture, including a 1.1-point anxiety drop, a 4% sleep efficiency lift, and a clean adherence profile. The engine marks ashwagandha as a kept compound for the next cycle.
The loop moved visibly four times across 28 days. Moving less often than the log frequency is the design, not a bug.
Minimum data for adaptation
The engine needs three conditions before it will adjust rank above noise:
- Dose entries for at least 60% of scheduled times in the last 14 days.
- At least one outcome signal per two-day window (subjective score, wearable sync, or symptom note).
- A baseline of at least 10 days on the outcome being evaluated.
Below these thresholds, the engine keeps the prior ranking and flags the stack as "low confidence" rather than reacting to sparse data.
How this appears in Unfair
The review screen shows the loop as an explanation, not a silent change. Every rank shift carries a short rationale — "ashwagandha moved up because pre-bed anxiety 7-day average dropped across 10 days" — so the user can separate engine decisions from their own interpretation. Low-data periods are labeled, not hidden, and the recommendation ranking holds the previous weights until real signal arrives.
Clinical safety note
The loop is designed to change slowly. If a user is experiencing severe or escalating symptoms, the right response is to pause the stack immediately and consult a clinician, not to wait for the next cycle review. Adverse-event signals are routed to the safety flag channel, which moves on a same-session clock, but even that channel is not a substitute for urgent medical evaluation when symptoms warrant it.