averagejoematt method

the method · the open artifact

Grade your own LLM coach

Every wearable now ships an AI coach, and every one of them tells you what will happen. None of them publishes whether it was right. This page is the scorer that does — the same one that grades my eight coaches in public, running here in your browser. Paste what your coach predicted and what actually happened, and find out whether its confidence was ever worth anything.

Paste the ledger

One forecast per line: the confidence it stated, then what actually happened. CSV or tab-separated, header optional. Confidence can be 0.8, 80% or a word (low, medium, high); outcomes can be confirmed/refuted, yes/no, 1/0, or pending for calls that have not come due.

Nothing is uploaded. The scoring runs entirely in this page — there is no endpoint behind it, no request carrying your text, and nothing stored. Close the tab and it is gone.

The scorecard

What the numbers mean

Brier score is the mean squared error of the stated probabilities: mean((p − y)²). Zero is perfect. 0.25 is the always-say-50% baseline — the score you get by refusing to commit. Lower is better.

Skill versus the base rate is the honest question underneath: does the stated confidence beat simply guessing the observed average every single time? A coach that predicts "you'll sleep badly" on a week where you slept badly 80% of the time has a great hit rate and no skill at all. Negative skill means it did worse than that trivial baseline.

The reliability curve asks whether 80% actually means 80%. Each dot is a confidence band, sized by how many calls landed in it; on the diagonal is honest, below it is over-confident.

Calibrated and skilled are different claims, and the second gates the first. A forecaster whose confidences line up but whose skill is at or below zero reads not yet skillful here — reliability is never allowed to dress up a forecaster that lost to the base rate. Fewer than five resolved calls and the tool says insufficient data rather than inventing a verdict.

Rows whose outcome is not yet known are counted and excluded, never guessed. Rows that cannot be read are listed back to you rather than quietly scored at 0.5 — a defaulted confidence would put a claim on the scorecard that nobody made.

Take the scorer, not just the answer

The engine on this page is a standalone, MIT-licensed package: one Python file, one JavaScript file, zero dependencies, no network. It is the same code that produces my own calibration scoreboard — extracted rather than reimplemented, and held to that by a shared test-vector suite that three implementations (the deployed Python grader, the package, and the browser port running right now) must reproduce exactly, not approximately.

The package README documents the ledger schema and every grading rule in full, so a third party can reproduce a scorecard independently — in a spreadsheet if they want — and check this page rather than trust it. Source: oss/calibration-core/.

The demo ledgers are honest about themselves. My public ledger is a verbatim snapshot of the already-public /api/predictions surface, with its provenance stamped in the file; it was captured on day 1 of a fresh experiment cycle, so every call in it is still pending and it scores insufficient data — which is the correct answer, not a broken one. The worked example is explicitly synthetic and labelled as such: an illustrative wearable-coach ledger that exists so the page has something to render before you paste your own.

Generated by scripts/v4_build_grade_your_coach.py. The scorer is oss/calibration-core/, vendored to /assets/js/calibration-core.44404e5a.js and pinned to the platform grader by tests/test_calibration_core_parity.py. client-side · nothing uploaded