Tasks / Metrics & Experimentation

Analyse experiment results

Can the model separate evidence from speculation, identify decision-relevant uncertainty and recommend a sensible next action?

Task type v1.2 · 2 tasksLast changed 6 Oct 2026 · ChangelogDifficulty

What AI gets right here, and what you’ll still have to catch

From 16 graded outputs by 8 models. 63% were usable with at most a quick edit.

Reliably right

  1. Respects explicit constraints100% pass
    The note is addressed to the onboarding team, stays under 300 words, and proposes actions that would enforce the stated constraints.
    GPT-6 Astra · ChatGPT · The underpowered onboarding test
  2. Interprets power correctly100% pass
    It correctly explains that the test was designed to detect a 3pp effect, that the CI includes both harm and benefit, and that extending would detect about 2pp.
    GPT-6 Astra · ChatGPT · The underpowered onboarding test
  3. Addresses the actual decision92% pass
    The output commits to a staged rollout as the recommended action, and specifies conditions (commercial unacceptability of a 1.4pp loss or value of a 2pp improvement) that would change the call to extending the test.
    GPT-6 Astra · ChatGPT · The underpowered onboarding test

Where it slips

  1. Uses the supplied evidence correctly56% pass
    States that the change is easy to reverse, which is not supported by the supplied context.
    Haiku 5.5 · API · The underpowered onboarding test
  2. Gets the base of every number right59% pass
    The Week 1 lift figure of +4.0% is a miscalculation; the correct rate from the supplied data is about 5.6%.
    Haiku 5.5 · API · Up 6%, and significant
  3. Avoids unsupported claims59% pass
    Presents 'the change is easy to reverse' as fact without evidence from the brief or context.
    Haiku 5.5 · API · The underpowered onboarding test

How it’s graded

Each check is built on how world-class product and growth leaders do this work, as they’ve described it on Lenny’s Podcast, and names the leader it comes from.

  1. Trusts the data before reading it

    Before interpreting effects, does the analysis check whether the result is trustworthy (sample ratio, exposure or logging issues, novelty, a surprisingly large lift) and say what it found?

    Passes when Explicitly checks at least one trust signal in the supplied data, such as the split against the intended ratio, and treats a surprising result as a reason to investigate before acting.

  2. Doesn't overread an unclear result

    Does the analysis state honestly what the data can and can't show: no win claimed from an early peek or a result that isn't significant, and no 'no effect' concluded from a test too small to detect one?

    Passes when Every claim matches the strength of the evidence, and anything unclear is called unclear, with what it can't rule out.

Plus our standard checks

Uses the supplied evidence correctly · Addresses the actual decision · Respects explicit constraints · Identifies material uncertainty · Avoids unsupported claims · Produces the required deliverable · Gets the base of every number right · and 3 written for each task, which you’ll see in the tasks below.

The tasks

Read the brief, then compare up to three outputs, each with the LLM judge’s verdict on every check. Highlights mark what a PM had to fix.

The brief

You're the data-literate PM on the shopping team at Bramble. Zoe wants to recommend shipping the new home page on Monday (her note is below). Check her conclusion against the raw data and write the readout you'd send instead, in no more than 900 words: what the test shows, what it doesn't, whether we should ship, and what we should do next. Show your working.\n\nThe files are attached.

What the model was given5 items: zoe_note.md, test_design.md, daily_results.csv (users and orders per day, by user type and arm), aov_by_week.md, incident_log.md
zoe_note.md1 lines · Download
From Zoe (PM for the home page): "Orders per user are up about 6% for treatment over the 28 days, and it's significant. AOV is flat. I'm going to recommend we ship on Monday. Can you sanity-check my readout before I send it?"
test_design.md5 lines · Download
# Test design (pre-registered)

Change: a new home page that leads with "Your usual basket" (one tap to reorder) for everyone.
Split: 50/50 by user. Primary metric: orders per user over the test. Guardrail: average order value.
Planned length: 28 days, 23 September to 20 October. Decision rule: ship if the lift on orders per user is positive and significant at the end, and average order value doesn't fall by more than 2%.
daily_results.csv (users and orders per day, by user type and arm)date,user_type,control_users,treatment_users,control_orders,treatment_orders 2026-09-23,new,2089,2400,129,184 2026-09-23,returning,4995,5799,464,559 2026-09-24,new,2079,2400,130,178 2026-09-24,returning,4900,5691,455,545 2026-09-25,new,2131,2485,134,188 2026-09-25,returning,4901,5684,465,537 2026-09-26,new,2131,2445,129,187 2026-09-26,returning,4944,5680,475,538 2026-09-27,new,2055,2357,122,180 2026-09-27,returning,4978,5744,471,527 2026-09-28,new,2080,2400,127,185 2026-09-28,returning,4819,5605,447,532 2026-09-29,new,2091,2414,130,186 2026-09-29,returning,4993,5784,483,555 2026-09-30,new,2070,2382,123,169 2026-09-30,returning,4956,5708,469,529 2026-10-01,new,2121,2432,131,170 2026-10-01,returning,5042,5820,482,560 2026-10-02,new,2041,2376,122,164 2026-10-02,returning,4954,5743,478,540 2026-10-03,new,2124,2455,131,166 2026-10-03,returning,4757,5475,453,500 2026-10-04,new,2142,2493,132,172 2026-10-04,returning,4906,5671,469,542 2026-10-05,new,2146,2464,131,175 2026-10-05,returning,5045,5845,472,554 2026-10-06,new,2115,2423,126,165 2026-10-06,returning,4830,5578,440,515 2026-10-07,new,2065,2381,124,149 2026-10-07,returning,4792,5580,458,540 2026-10-08,new,2137,2446,127,160 2026-10-08,returning,4960,5748,477,554 2026-10-09,new,2089,2409,131,159 2026-10-09,returning,4977,5717,465,525 2026-10-10,new,2138,2491,127,158 2026-10-10,returning,4787,5585,451,512 2026-10-11,new,2084,2406,131,151 2026-10-11,returning,4832,5568,461,521 2026-10-12,new,2060,2365,129,153 2026-10-12,returning,5012,5755,466,531 2026-10-13,new,2075,2408,128,154 2026-10-13,returning,4869,5664,462,528 2026-10-14,new,2038,2368,124,296 2026-10-14,returning,4988,5739,480,1058 2026-10-15,new,2078,2394,130,146 2026-10-15,returning,5047,5787,469,548 2026-10-16,new,2043,2340,124,147 2026-10-16,returning,4965,5742,478,541 2026-10-17,new,2078,2403,128,152 2026-10-17,returning,4865,5625,455,518 2026-10-18,new,2157,2472,135,152 2026-10-18,returning,4789,5530,441,526 2026-10-19,new,2046,2346,124,147 2026-10-19,returning,4775,5526,442,512 2026-10-20,new,2129,2481,129,158 2026-10-20,returning,4863,5623,444,536
aov_by_week.md8 lines · Download
# Average order value by week ($, all users)

| Week | Control | Treatment |
|---|---|---|
| 1 | 48.20 | 47.90 |
| 2 | 48.40 | 48.10 |
| 3 | 48.10 | 47.80 |
…
incident_log.md3 lines · Download
# Incident log

- 14 October: a release of the order tracking service logged some order events twice for 9 hours. Fixed the same day. Engineering believes it affected the new home page only.
What a strong answer doesThe answer key the graders mark against

Doesn't recommend shipping on this readout. Checks trust first: treatment got about 53.6% of users against an intended 50/50, a sample ratio mismatch that has to be explained before any result is trusted. 14 October's treatment orders are about double the surrounding days (the logging bug in the incident log), which inflates the headline: about 5.8% lift with it, about 2.4% without. The lift fades week by week (about 5.6%, 2.5%, 0.2%, 1.1%), a novelty pattern, so the long-run effect is near zero. All of the lift is in new users (about 11.5%); returning users, the majority, show none (about -0.1%). AOV is flat, so the guardrail holds. So the pre-registered rule (significant positive lift at the end) isn't met once the data is cleaned. Next steps: find the cause of the sample ratio mismatch, rerun or extend with the logging fixed, and consider the reorder module for new users only as a separate test.

Critical failures (cap the score at 40)
  • Recommends shipping on Monday as Zoe proposed
Task

Staff-level · v1.0

The outputs

8 setups answered this brief.

Usable with a quick edit11 of 12 checks passed

The readout is thorough, evidence-based, and directly actionable. A PM could use it with minor wording tweaks and no need to re-verify the data or logic.

Output

Readout: new home page test (23 Sep – 20 Oct)

Recommendation: don't ship on Monday. The +6% headline comes from three things:

  • A broken 50/50 split.
  • A day of double-counted treatment orders.
  • A new-user bump that faded to about zero by week 4.

Returning users are the people "Your usual basket" is built for, and they show no lift. None of the three problems is a reason to kill the page. They are reasons not to trust this result yet.

1. Reproducing Zoe's number

Totals across 28 days, using `daily_results.csv`, both user types:

Users (user-days)OrdersOrders/user
Control196,17316,5600.0844
Treatment226,65220,2340.0893

The lift is +5.8%, which matches "about 6%". The arithmetic is right. The problems are in the data underneath it.

2. The split isn't 50/50 (sample ratio mismatch)

The test was pre-registered as 50/50. Treatment has 53.6% of users (226,652 of 422,825).

  • A chi-square test against 50/50 gives χ² ≈ 2,200. The chance of that happening randomly is effectively zero.
  • The gap is steady: treatment has about 15.5% more users every day, in both segments (new 1.154×, returning 1.156×).
  • The new/returning mix is the same in both arms (about 30% new), so this isn't a mix-shift artefact.

A constant 15% surplus usually means assignment or exposure logging is broken. For example, treatment could be logging users that control drops, or redirects or caching could differ between arms. Until we know why, we can't assume the two groups are comparable. On its own, this fails the test's validity check, whatever the lift.

3. The 14 October incident doubled treatment orders

On 14 Oct, treatment orders roughly doubled while control stayed normal:

  • New users: 296 orders in treatment, against about 150 on the days around it. Control: 124.
  • Returning users: 1,058 orders in treatment, against about 530. Control: 480.

This matches the incident log: order events were logged twice, on the new home page only. That day adds about 680 phantom orders to treatment.

Excluding 14 Oct from both arms:

ControlTreatmentLift
New3,464 / 56,594 = 0.06124,455 / 65,268 = 0.0683+11.5%
Returning12,492 / 132,553 = 0.094214,425 / 153,277 = 0.0941−0.1%
All15,956 / 189,147 = 0.084418,880 / 218,545 = 0.0864+2.4%

The overall lift drops from 5.8% to 2.4%. A naive z-test on that is about 2.3, but it treats each user-day as independent, which overstates confidence. The same user appears on many days, and the split itself is suspect.

4. The remaining lift is a fading new-user effect

New users, orders per user by week (week 4 excludes 14 Oct):

WeekControlTreatmentLift
10.06150.0762+24%
20.06070.0694+14%
30.06120.0641+5%
40.06140.0625+2%

Returning users by week: +0.5%, −0.8%, −1.0%, +1.0%. That is flat, which is what noise looks like.

Overall lift went from +5.6% in week 1 to +1.1% in week 4. Two things stand out:

  • The effect is decaying towards zero. That pattern looks like novelty, not a lasting change in behaviour.
  • It shows up in new users, who mostly have no "usual basket" yet. It is absent in returning users, who are who the feature is for. That doesn't fit the mechanism we expected, and we should understand it before acting.

5. Average order value guardrail

Treatment AOV is $0.30 lower in weeks 1–3 (−0.6%) and $0.10 lower in week 4 (−0.2%). That is inside the 2% guardrail, so "flat" is fair.

Two caveats:

  • Week 4 may include the duplicated orders.
  • AOV only matters alongside order volume. With clean data, revenue per user is roughly +2.4% × 0.995 ≈ +1.8% overall, and about −0.7% for returning users.

What the test shows

  • The new page probably raises early ordering among new users, at least for a couple of weeks.
  • It doesn't hurt order value by enough to trip the guardrail.
  • No breakage or disaster is visible.

What it doesn't show

  • A valid comparison. The sample ratio mismatch means the arms may not be comparable.
  • A lasting lift. By week 4 the effect is about 1%, inside the noise.
  • Any effect on returning users, the target audience.
  • The pre-registered metric. The test design specifies orders per user, but this file holds user-days. We need user-level data to compute it properly. The current significance claim relies on treating user-days as independent.
  • That the incident only hit treatment. "Engineering believes" isn't confirmation. If control was also affected at a lower level, the 14 Oct correction above is off.

Should we ship?

No, not on this evidence.

The decision rule technically passes on the raw numbers. But it assumed a valid 50/50 split and clean order counts, and we have neither. Shipping now would lock in a 6% claim that is mostly a logging bug, an assignment bug and novelty.

Next steps

  1. Find the cause of the 15% user surplus (owner: eng + analytics, this week). Compare assignment logs against exposure logs, and check bot filtering, redirects and caching per arm. Run an A/A check once it's fixed.
  2. Deduplicate 14 Oct using order or event IDs, rather than dropping the day, and confirm control was unaffected.
  3. Pull user-level data and recompute orders per user as pre-registered. Use proper per-user variance, or bootstrap by user.
  4. Rerun once the split is fixed, for at least 4 weeks. Report results by week and by new vs returning users, with returning users as the key read. If returning users still show nothing, rethink the feature (e.g. show "usual basket" only once a user has one) rather than shipping it to everyone.
  5. Investigate the new-user effect: what do new users see in the "usual basket" slot, and what are they ordering? If it's real and durable, a new-user variant could be worth its own test.

Zoe: the analysis was a reasonable first pass and the headline maths checks out. Happy to pair on the rerun plan so we can bring a clean answer back.

Grades and run details

Decision model 92 · LLM judge 100
Decision model checks
  • passUses the supplied evidence correctly21%
  • passAddresses the actual decision100%
  • passRespects explicit constraints42%
  • passIdentifies material uncertainty100%
  • passAvoids unsupported claims43%
  • passProduces the required deliverable88%
  • passCatches the sample ratio mismatch100%
  • passRemoves the bug day100%
  • passReads the trend and who it helps100%
  • passTrusts the data before reading it100%
  • failGets the base of every number right5%
  • passDoesn't overread an unclear result66%
Run
Run
#1
Time to output
73 s
Submitted
5 Oct 2026

Needs more than a quick edit5 of 12 checks passed

The output contains arithmetic errors in the treatment order total and derived lifts, so a PM would need to redo the calculations before using it.

Output

Readout to send

I would not recommend shipping Monday on this evidence. The raw daily aggregates don’t support Zoe’s “significant” claim, and a treatment-only order-logging incident materially inflates the apparent lift. We need a clean, user-level analysis before applying the pre-registered ship rule.

What the data shows

The daily file supports a pooled orders per recorded user-day calculation—not orders per unique randomized user over the full test:

  • Control: 16,560 orders / 196,173 recorded users = 8.44%
  • Treatment: 20,086 / 226,652 = 8.87%, or +5.0% relative

But treatment orders on 14 October are conspicuous: 296 for new users and 1,058 for returning users, roughly twice typical daily counts. The incident log says the treatment-only tracking release duplicated some order events for nine hours. As a rough sensitivity check only, halving those 14 October treatment counts subtracts about 677 orders; treatment then has 19,409 / 226,652 = 8.56%, or +1.4% relative versus control. This is not a valid final correction—the affected events need to be deduplicated from the underlying logs—but it shows how much the incident changes the result.

By user type, that rough adjustment gives about +7.6% for new users and −0.3% for returning users. That difference is worth investigating, but these aggregates don’t establish a reliable segment effect.

The pre-registered AOV guardrail looks descriptively okay: weekly treatment AOV is $47.90, $48.10, $47.80 and $48.20 versus control’s $48.20, $48.40, $48.10 and $48.30. The simple average is $48.00 versus $48.25 (about −0.5%, within the −2% limit). “Flat” is a little too strong; we also can’t assess uncertainty or reconstruct a correctly weighted overall AOV from this table alone.

What it doesn’t show

It does not establish that orders per randomized user rose significantly. The file reports daily user counts, not the unique assigned-user denominators or each user’s cumulative orders needed for the registered primary metric and its valid inference. Also, summed treatment user counts are 226,652 vs. 196,173 for control—about 15.5% higher despite a planned 50/50 user split. Those may be user-days rather than unique randomized users, so this is not proof of a randomization failure; it is a reason to audit assignment, exposure and denominator construction.

Even a simplistic event-count Poisson check on the rough deduplicated totals would not show significance (approximately p=.18); that is only a diagnostic, not a substitute for user-level analysis.

What to do next

  1. Deduplicate treatment order events using event IDs and quantify the incident’s actual impact.
  2. Rebuild the pre-registered orders-per-user metric from unique assigned users, with the planned statistical method; audit the 50/50 split and exposure.
  3. Recompute AOV from the appropriate order-level data and check the guardrail.
  4. Ship only if that clean analysis meets the decision rule. If the logs or assignment cannot support it, rerun a clean test rather than treating this result as a win.

Claims the judge couldn’t find in the brief

  • Treatment: 20,086 / 226,652 = 8.87%, or +5.0% relative
  • halving those 14 October treatment counts subtracts about 677 orders; treatment then has 19,409 / 226,652 = 8.56%, or +1.4% relative versus control
  • By user type, that rough adjustment gives about +7.6% for new users and −0.3% for returning users
  • Even a simplistic event-count Poisson check on the rough deduplicated totals would not show significance (approximately p=.18)

Grades and run details

Decision model 88 · LLM judge 38
Decision model checks
  • passUses the supplied evidence correctly21%
  • passAddresses the actual decision96%
  • passRespects explicit constraints53%
  • passIdentifies material uncertainty86%
  • passAvoids unsupported claims66%
  • passProduces the required deliverable28%
  • passCatches the sample ratio mismatch51%
  • passRemoves the bug day67%
  • partialReads the trend and who it helps96%
  • passTrusts the data before reading it99%
  • failGets the base of every number right6%
  • passDoesn't overread an unclear result73%
Run
Run
#1
API response time
53 s
Submitted
5 Oct 2026

Needs more than a quick edit8 of 12 checks passed

The output contains arithmetic errors in the weekly and segment lifts that would require re-checking before use. A PM could not rely on it without verifying the numbers.

Output

Recommendation: don’t ship on Monday. The reported ~6% lift is reproducible, but it includes a treatment-specific tracking incident. The supplied aggregates also cannot establish significance for the pre-registered, user-level metric. We have a promising signal—not a reliable launch decision.

What the raw data shows

I summed orders and daily user counts across the 28 days:

ArmSum of daily usersLogged ordersOrders / summed users
------:---:---:
Control196,37316,5600.08433
Treatment226,65220,2340.08927

The calculation is:

\[ \text{Lift}=\frac{20,234/226,652}{16,560/196,373}-1=5.86\%. \]

So Zoe’s arithmetic is right for this aggregate ratio. However, summed daily users are not necessarily unique randomized users. If people appear on multiple days, this is orders per user-day, not the pre-registered orders per user over the test.

The tracking incident materially changes the result

On 14 October, treatment recorded 1,354 orders versus 604 in control, with 8,107 versus 7,026 daily users. Treatment’s order rate was almost twice its normal level. That is consistent with the documented duplicate-event incident.

As a sensitivity check only, removing that entire day from both arms gives:

ArmSum of daily usersLogged ordersOrders / summed users
------:---:---:
Control189,34715,9560.08427
Treatment218,54518,8800.08639

\[ \text{Lift excluding 14 October} =\frac{18,880/218,545}{15,956/189,347}-1 =2.52\%. \]

The remaining signal is positive, but much smaller. Dropping a whole day is not a valid substitute for recovering actual orders: the incident lasted nine hours, and that day also contains legitimate transactions.

The effect is not stable or broad-based

Using the same aggregate calculation:

WeekAll-user lift
------:
1+5.58%
2+2.68%
3+0.23%
4, as logged+15.07%
4, excluding 14 October+1.38%

Excluding the incident day, the full-period lift is +11.9% for new users and −0.14% for returning users. New-user weekly lifts decline from approximately 24.0% to 15.0%, 4.7%, and 2.5%.

That suggests the remaining aggregate gain is concentrated among new users and may be fading. It does not prove novelty: calendar effects, changing cohorts, or instrumentation could also explain the pattern. Nor does a positive new-user estimate alone establish a statistically reliable difference between segments.

What we cannot conclude yet

“Significant” is not established by these files. For the intended user-randomized analysis, we need unique assigned users—including users with zero orders—and each user’s deduplicated order count. Daily aggregates do not provide the user-level variance or account for repeated appearances. Treating user-days as independent could overstate precision.

The denominator needs investigation. Treatment has 15.4% more summed daily users than control, despite the planned 50/50 assignment, with an imbalance throughout the test. This is a warning, not proof of assignment failure: if these are active users, treatment could change activity. Check assignment counts separately from exposure/activity counts. An activity-conditioned denominator can change the estimand and introduce bias.

AOV is slightly down, not flat. Weekly declines range from approximately 0.2% to 0.6%, all within the 2% guardrail. Weighting the reported weekly averages by logged order counts gives approximately $48.25 control versus $48.01 treatment, or −0.51%. That is descriptively reassuring, but duplicate orders may distort the weights or AOV calculation. These summaries also lack uncertainty estimates.

What we should do next

  1. Reconcile against canonical transactions. Deduplicate using order IDs and validate the incident’s actual scope rather than assuming only treatment was affected.
  2. Audit randomization and denominators. Check unique assignments, eligibility, exposure logging, missing users, and sample-ratio mismatch.
  3. Recompute the pre-registered analysis: intention-to-treat orders per unique assigned user over the full 28 days, with user-level confidence intervals; recompute AOV from valid orders and revenue.
  4. Apply the original decision rule to that repaired result. If lift is positive and significant and the AOV guardrail passes, shipping becomes defensible. If trustworthy recovery is impossible, rerun with fixed instrumentation and a pre-specified duration and analysis.
  5. Investigate durability and targeting separately. Pre-specify new/returning-user interactions and time-since-exposure analyses in follow-up work. Don’t use this post-hoc segment result to justify a targeted launch.

Bottom line: pause the launch, repair the measurement, and decide on the registered metric—not the contaminated headline.

Claims the judge couldn’t find in the brief

  • Week 2 lift is +2.68%.
  • Excluding the incident day, the full-period lift is −0.14% for returning users.
  • New-user weekly lifts decline from approximately 24.0% to 15.0%, 4.7%, and 2.5%.

Grades and run details

Decision model 83 · LLM judge 62
Decision model checks
  • failUses the supplied evidence correctly39%
  • passAddresses the actual decision97%
  • passRespects explicit constraints49%
  • passIdentifies material uncertainty94%
  • passAvoids unsupported claims37%
  • passProduces the required deliverable49%
  • passCatches the sample ratio mismatch66%
  • passRemoves the bug day100%
  • passReads the trend and who it helps91%
  • passTrusts the data before reading it99%
  • failGets the base of every number right53%
  • passDoesn't overread an unclear result57%
Run
Run
#1
API response time
72 s
Submitted
6 Oct 2026

Check by check

Where the outputs differ comes first. Open a check to read the judge’s reasons. “Mixed” means the two graders disagreed.

Where they differ 7

Uses the supplied evidence correctlyRightMixedWrong
Opus 5.5 · Claude

All factual claims about the current situation are taken directly from the supplied context or derived by correct arithmetic.

GPT-6 Luna · API

Treatment order total is miscalculated as 20,086 instead of 20,234, making derived percentages and adjustments incorrect.

GPT-6.1 Sol · API

Week 2 lift (2.68%) and returning-user lift (−0.14%) are not correctly derived from the data, so not all factual claims are supported.

Avoids unsupported claimsRightMixedMixed
Opus 5.5 · Claude

Interpretations like 'novelty effect' and 'probably raises early ordering' are clearly labelled as hypotheses, not established facts.

GPT-6 Luna · API

Presents a p-value and incorrect segment lifts as facts without support, and the adjusted totals are based on an arithmetic error.

GPT-6.1 Sol · API

Presents returning-user lift as −0.14% and week 2 lift as 2.68% as facts without labelling them as approximate, when the data does not support those numbers.

Produces the required deliverableRightMixedRight
Opus 5.5 · Claude

The readout is complete, in the right form, and a PM could act on it with light edits.

GPT-6 Luna · API

The readout contains arithmetic errors in the core numbers, so a PM cannot act on it without redoing the calculations.

GPT-6.1 Sol · API

Complete readout with recommendation, analysis, and next steps; a PM could act on it with light edits.

Removes the bug dayRightMixedRight
Opus 5.5 · Claude

The output identifies 14 October's inflated treatment orders, links them to the incident log, and recalculates the lift without that day (drops to 2.4%).

GPT-6 Luna · API

Identifies the inflated day and attempts a recalculation, but the resulting lift (1.4%) is not in the expected 2-3% range because the base numbers are wrong.

GPT-6.1 Sol · API

Identifies the 14 October spike, links it to the incident log, and recalculates lift without that day (2.52%).

Reads the trend and who it helpsRightWrongMixed
Opus 5.5 · Claude

The output provides weekly lifts for new and returning users, shows the effect fading, and correctly concludes the lift is a novelty pattern concentrated in new users.

GPT-6 Luna · API

Gives a rough user-type split but does not show the weekly trend or the fading lift pattern.

GPT-6.1 Sol · API

Gives weekly trend and new/returning split, but the numbers for week 2 and returning users are incorrect, so the readout does not provide accurate supporting figures.

Gets the base of every number rightMixedWrongWrong
Opus 5.5 · Claude

All percentages and rates are computed from the correct denominators, and the output notes that the data is user-days, not unique users.

GPT-6 Luna · API

Percentages and adjusted totals are derived from an incorrect treatment order sum, so the base numbers are wrong.

GPT-6.1 Sol · API

Week 2 lift and returning-user lift are miscalculated, so not all derived figures are correct.

Doesn't overread an unclear resultRightMixedRight
Opus 5.5 · Claude

The output states what the test can and cannot show, calls the week-4 effect 'inside the noise', and does not claim a win or a conclusive null.

GPT-6 Luna · API

Claims a p-value without proper analysis and presents adjusted segment lifts as if they are reliable, overreading an unclear result.

GPT-6.1 Sol · API

States that significance is not established, does not claim a win, and notes the remaining signal is small and may be fading.

All got right 5

Addresses the actual decisionRightRightRight
Opus 5.5 · Claude

The output clearly recommends not shipping on Monday, addresses Zoe directly, and specifies what would change the call (fixing the split, deduplicating, rerunning).

GPT-6 Luna · API

Clearly recommends not shipping Monday and states that a clean analysis meeting the decision rule would change the call.

GPT-6.1 Sol · API

Clearly recommends not shipping on Monday and states what would change the call (repaired significant positive lift with guardrail).

Respects explicit constraintsRightRightRight
Opus 5.5 · Claude

The readout is under 900 words, shows working, and is written for Zoe as requested.

GPT-6 Luna · API

Output is a readout well under 900 words and addresses the named reader.

GPT-6.1 Sol · API

Output is a readout for Zoe, under 900 words, and respects the requested form.

Identifies material uncertaintyRightRightRight
Opus 5.5 · Claude

The output names specific unknowns (cause of SRM, whether control was affected, need for user-level data) and says how to resolve them.

GPT-6 Luna · API

Names the logging incident, user-day vs unique-user denominator, and sample imbalance as unknowns, and says deduplication and user-level rebuild would resolve them.

GPT-6.1 Sol · API

Names unknowns (incident scope, denominator imbalance, lack of user-level significance) and how to resolve them.

Catches the sample ratio mismatchRightRightRight
Opus 5.5 · Claude

The output computes the split (53.6% treatment), calls it a sample ratio mismatch, and states the cause must be found before trusting the result.

GPT-6 Luna · API

Notes the 15.5% higher treatment user count and says it is a reason to audit assignment, exposure and denominator construction.

GPT-6.1 Sol · API

Notes the 15.4% imbalance in summed daily users, calls it a warning, and says the cause must be investigated before trusting the result.

Trusts the data before reading itRightRightRight
Opus 5.5 · Claude

Before interpreting the effect, the output checks the sample ratio and the bug day, treating the surprising split as a reason to distrust the result.

GPT-6 Luna · API

Checks the sample imbalance and the logging incident before interpreting the effect, and treats the surprising result as a reason to investigate.

GPT-6.1 Sol · API

Checks trust before interpreting: flags the tracking incident, the denominator imbalance, and the inability to assess significance from daily aggregates.

Results

Every setup we’ve tested on this task type, across all its tasks and repeats, graded on the current checklist. Calibrated. Where our PM checked the graders by hand, they agreed on 63% of 40 checks.

#Model · HarnessTask scoreDecision modelLLM judgeRunsCritical failures
1GPT-6 AstrawithChatGPT95.8100.02None
2Sonnet 5.5withAPI88.395.52None
3Opus 5.5withClaude80.886.42None
4GPT-6.1 SolwithAPI89.280.82None
5Haiku 5.5withAPI88.371.02None
6GPT-6 LunawithAPI88.864.72None
7Gemini 3.8 FlashwithAPI69.645.82None
8Gemini 3.5 Flash-LitewithGemini54.651.72None

What you get for the cost

No setup scores within 5 points of the leader at half its cost or less here, so the leader is also the best value.

Task score against relative cost for each setup. The table below has the same figures.4050607080901001×3×10×30×100×Cost per output, relative to the cheapest setup (log scale) →↑ Task scoreGPT-6 Astra · ChatGPT: task score 98, 107× the cheapest (1 of 2 outputs estimated)Sonnet 5.5 · API: task score 92, 35× the cheapestOpus 5.5 · Claude: task score 84, 95× the cheapest (1 of 2 outputs estimated)GPT-6.1 Sol · API: task score 83, 14× the cheapestHaiku 5.5 · API: task score 78, 1.8× the cheapestGPT-6 Luna · API: task score 75, the cheapestGemini 3.8 Flash · API: task score 55, 12× the cheapestGemini 3.5 Flash-Lite · Gemini: task score 53, 3.1× the cheapest (1 of 2 outputs estimated)GPT-6 Astra · ChatGPTSonnet 5.5 · APIOpus 5.5 · ClaudeGPT-6.1 Sol · APIHaiku 5.5 · APIGPT-6 Luna · APIGemini 3.8 Flash · APIGemini 3.5 Flash-Lite · Gemini
Nobody beats these on both score and costCost partly estimated (app runs with no usage meter)
Task score and relative cost by setup
SetupTask scoreRelative cost (cheapest = 1)
GPT-6 Luna · API751.0×
Haiku 5.5 · API781.8×
Gemini 3.5 Flash-Lite · Gemini533.1× (partly estimated)
Gemini 3.8 Flash · API5512×
GPT-6.1 Sol · API8314×
Sonnet 5.5 · API9235×
Opus 5.5 · Claude8495× (partly estimated)
GPT-6 Astra · ChatGPT98107× (partly estimated)

Cost is each output’s tokens at the model’s list price, shown relative to the cheapest setup. Runs done in an app have no usage meter, so theirs are estimated from the same setup’s measured runs. How we compare cost

About the task

The PM job

Reading a test readout and deciding what to do next.

Why it matters

Experiment readouts are where false confidence is cheapest to produce and most expensive to act on. A model that declares a winner on conversion while retention quietly falls will ship the wrong thing.

What good looks like

  • Checks the result can be trusted before interpreting it
  • Reports effects with their uncertainty
  • Checks guardrail metrics before declaring a winner
  • Separates what the data shows from plausible explanations
  • Recommends a next step proportionate to the evidence

Deliberately not measured

  • Re-running the statistics from raw data
  • Chart production
Capability tested

Interpreting results within their limits

The failure we’re looking for

Claims causality, ignores guardrails or recommends arbitrary testing

Grading

Decision model and LLM judge, calibrated against a blind PM review