Cast Forecast
CompareEvidence

no login, no key, every number sourced

Evidence

Bottles: 687. Gates on record: 5. Release 758634b.

Not predicted: tinted (626), powders (1), lip products (45), zinc too low to predict a cast (2), and any render more than 1 L* off its prediction (0).

0.982

blend model fit (R squared, 16 renders)

1.17

dE00 to target on a second selfie (bar 2.0)

0.355

blend strength at colorIntensity 100

19

API units spent on K1b

K1b blend strength by colorIntensity

blend strength

colorIntensity 0: 0colorIntensity 20: 0.06875640946898776colorIntensity 40: 0.14046144365325952colorIntensity 60: 0.20547521356948223colorIntensity 80: 0.27293400475218116colorIntensity 100: 0.3545024830997824
colorIntensity 0100
Gate
Question
Result
Gate 1
Does a film model measured over black and white backgrounds predict on-skin whitening better than the label's zinc percentage? (PLOS ONE 2025 raw data, 13 volunteers, held out by person and by formulation)
FAIL film model 4.79 L* mean error vs label model 1.61. Exploratory only: on the one differently formulated product, a one-parameter film model missed by 0.69 L* vs the label's 2.35. gate1-results.md (opens in a new tab)
K2
Is YouCam's skin tone analysis a usable measurement of the colour in a photo?
FAIL 2 of 3: identical result on a fresh upload (pass), but it moved only 0.15x as much as the measured cheek when the photo was made 10 percent brighter, and it sits 15.1 dE00 from the measured cheek. Reading, not pre-registered: it reports a lighting-normalized tone. Post-hoc daylight check: FAIL, the colour moved 5.81 dE00 against a 1.0 bar. k2-results.md (opens in a new tab)
K1
Can YouCam Makeup VTO render a sunscreen-like film, with coverage as the dose?
FAIL on 4 of 5: L* reversals at coverage 60 in 3 of 6 series, max dL* 12.7 < 15, inverse dE00 2.03 > 2.0, texture 0.556 < 0.80; R^2 0.954 passed. Post hoc reading (not pre-registered): colorIntensity, not coverage, acted as the dose. k1-results.md (opens in a new tab)
K1b
Same question with colorIntensity as the dose and coverage as texture
Gate 2
Does a retail bottle's film, measured on a black and a white card with a phone, predict its whitening on skin better than the label's mineral percentage? (one consenting subject, forearms)
NOTE Not run. On 2026-10-28 the builder decided not to run the in-person session (cards and forearm), so there is no Gate 2 data and nothing on the site rests on it. Bottles are instead predicted from their FDA labels with the label model Gate 1 tested.
  1. 1

    Read the gates

    Each gate has a written pass rule, and every result stays, pass or fail. Gate 1's page notes what was looked at before its rule was written.

    docs/gates on GitHub (opens in a new tab)
  2. 2

    Check the prediction

    Refits the label model from the study table and recomputes Gate 1's held-out error.

    curl -s https://cast-forecast.vercel.app/api/label-model

  3. 3

    Ask it as an agent

    The same model, as MCP tools an agent can call.

    curl -s https://cast-forecast.vercel.app/api/mcp -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"predict_cast","arguments":{"bottle_id":"cetaphil-sheer-mineral-face","skin_lightness":55}}}'

    llms.txt (opens in a new tab)
  4. 4

    Check the render mapping

    Recomputes the K1b inverse from the published curve.

    curl -s https://cast-forecast.vercel.app/api/gates

  5. 5

    The data

    The 13-volunteer study table every prediction is fitted on (CC BY 4.0), and the FDA label behind each of the 687 bottles.

    data/ on GitHub (opens in a new tab)
  6. 6

    Read the code

    Lint, types, tests, build and a bundle scan run on every push.

    StephenSook/cast-forecast (opens in a new tab)

Read from docs/gates in the repo at release 758634b. K1b used one person and one lighting condition. It tests YouCam's renderer, not any sunscreen.