From 4c302b5722d994cb0467c5a9cc10dcfa29f998f4 Mon Sep 17 00:00:00 2001 From: Kev Date: Fri, 31 Jul 2026 07:43:12 -0400 Subject: [PATCH] =?UTF-8?q?report:=20free=20proof=20surface=20Review=20Zer?= =?UTF-8?q?o=20=E2=80=94=20three=20of=20four=20leads=20have=20no=20data=20?= =?UTF-8?q?source?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nothing built. Docs only. The premise was that this is cheap assembly over existing aggregates; verified, it is not. 0.1 FILTERABILITY — the endpoints are NOT filterable. Probed live: /api/ledger/accuracy?sport=mlb -> total 937 ?sport=wnba -> total 937 ?window=7 -> total 937 identical payloads; the params are ignored (the req.query reads at routes/ledger.js:61-63 belong to a different route than /accuracy at :68). Sport and tier CAN be sliced client-side from /api/accuracy's sports map and /api/ledger/model's by_tier. TIME WINDOW CANNOT — window_days is fixed at 30 inside getModelAggregate with no param and no stored series, so "accuracy over time" has no data source. 0.3 CLV CANNOT LEAD WITH A NUMBER. /api/ledger/model exposes the aggregate, and live it returns beat_close_pct = null and clv_distribution = null despite clv_sample 937. They are null BY DESIGN: ledgerService publishes them only when clvCaptureReliable() passes, and it does not — the capture is still the starved instrument the 07-28 repair improved but did not finish. The trap to avoid is exact: clv_beat/clv_sample = 34/937 = 3.6% is computable and would be WRONG, because the value is null due to instrument distrust, not a missing division. Publishing it would be the marketing fabrication this order most forbids. CLV can only lead with an honest absence. 0.2 The honest-record laws are ALREADY enforced at source: buckets return A pct:null (n=2), B 60% (512), C 57% (413), D pct:null, F pct:null — thin tiers already refuse to round. C genuinely sits below B, which is the unflattering truth and must be shown as-is. 0.4 CALIBRATION CURVE has no data source — clv_distribution is null and there is no claimed-vs-actual endpoint; the 07-26 calibration work was a one-off read-only measurement, never wired to a served surface. BUILDABLE NOW: tier hit-rates by sport with existing hollows preserved, client-side sport/tier filtering, the capped 3-call sample, and honest state copy including a CLV not-yet-publishable panel that names the reliability guard. NEEDS ITS OWN ORDER FIRST: CLV as a leading number (blocked on capture reliability, not presentation), accuracy over time (needs a param or daily series), the calibration curve (needs a claimed-vs-actual endpoint). RECOMMENDS shipping tier-record-forward with an honest CLV building panel rather than CLV-forward — CLV-forward with a null cannot lead, and with 3.6% would be a lie. That preserves the premise's strongest claim (a real thin honest record out-credibilizes a fake fat one) without inventing a number. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01QJs13VsyiSKYQP6rj3NNmc --- specs/free-proof-surface-review-zero.md | 82 +++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 specs/free-proof-surface-review-zero.md diff --git a/specs/free-proof-surface-review-zero.md b/specs/free-proof-surface-review-zero.md new file mode 100644 index 0000000..35fece3 --- /dev/null +++ b/specs/free-proof-surface-review-zero.md @@ -0,0 +1,82 @@ +# FREE PROOF SURFACE — REVIEW ZERO (report; surface NOT built) +2026-07-31. Nothing built. `git diff` = docs only. + +The order's premise is that this is assembly over existing honest aggregates ("Code's *cheap* +claim — verify it"). **Verified: it is NOT cheap, and three of the four things the surface is +supposed to lead with have no data source today.** Building the page anyway would mean +inventing numbers — the one thing the order forbids most explicitly. + +## 0.1 — FILTERABILITY: **THE ENDPOINTS ARE NOT FILTERABLE. VERIFIED BY PROBE.** +`/api/ledger/accuracy` accepts nothing. Live: + + ?sport=mlb -> overall.total 937 + ?sport=wnba -> overall.total 937 + ?window=7 -> overall.total 937 + +Identical payload every time — the params are ignored (the `req.query.sport/tier` reads at +`routes/ledger.js:61-63` belong to a DIFFERENT route, not `/accuracy` at `:68`). + +**What CAN be sliced today:** `/api/accuracy` returns a real **`sports` map** (`mlb`, `wnba`) +each with its own `sample`/`byGrade`/`min_sample`, and `/api/ledger/model` returns `by_tier`. +So **sport and tier are servable client-side from existing payloads.** +**TIME WINDOW IS NOT.** `window_days` is fixed at **30** inside `getModelAggregate`; there is no +param and no historical series. **"Accuracy over time" has no data source** — it needs a backend +param (or a stored daily series), which is a build, not assembly. + +## 0.3 — 🔴 CLV CANNOT LEAD WITH A NUMBER. THE CANONICAL AGGREGATE RETURNS NULL. +CLV *is* exposed — `/api/ledger/model` → `aggregate` — and here is the live payload: + + settled 937 · hits 547 · misses 390 · hit_pct 58 · pending 91 + clv_sample 937 · clv_beat 34 · clv_faded … · clv_flat … + beat_close_pct = null ← the number the surface was to lead with + clv_distribution = null + window_days 30 · min_sample 20 + +`beat_close_pct` and `clv_distribution` are **null by design**: `ledgerService` publishes them +only when `clvCaptureReliable() && settled >= 20 && clv_sample > 0`. The reliability guard is +false — the capture is still the starved instrument the 07-28 repair improved but did not +finish (closing_prob 59→406 of ~1,250 rows). + +**So the honest CLV headline today is an ABSENCE, not a percentage.** And the temptation to +avoid is precise: `clv_beat / clv_sample` = **34/937 = 3.6%** is computable and would be +**wrong** — it is null *because the instrument is not trustworthy*, not because nobody did the +division. **Publishing 3.6% as "beat close" would be exactly the marketing fabrication this +order forbids.** CLV leads with *"tracking since … · building · not yet publishable"* and names +why — which is defensible, but it is a different surface from the one specced. + +## 0.2 — HONEST-RECORD LAWS: **ALREADY HONORED. PRESERVE, DON'T REBUILD.** +`/api/ledger/accuracy` buckets: **A `{hits:1,total:2,pct:null}` · B `{309/512, pct:60}` · +C `{235/413, pct:57}` · D `{1/5, pct:null}` · F `{1/5, pct:null}`.** Thin tiers already return +**`pct: null`, not a rounded number** — the hollow law is enforced at the source. **C at 57% is +genuinely below B at 60%**, which is the honest, unflattering truth and must be shown as-is. + +## 0.4 — CALIBRATION CURVE: **NO DATA SOURCE.** +The pack's S4 curve needs *claimed vs actual per probability bucket*. `clv_distribution` is null, +and there is **no claimed-vs-actual endpoint at all**. The 07-26 calibration diagnosis was a +one-off read-only measurement, never wired to a served surface. **The curve cannot be assembled +from anything live** — it is a build. + +## WHAT IS ACTUALLY BUILDABLE NOW (honest assembly, no new metrics) +1. **Tier hit-rates by sport** — real: overall 937 @ 58%, plus per-sport `mlb`/`wnba` splits and + `byGrade` buckets **with the existing `pct:null` hollows preserved**. +2. **Sport + tier filtering** — client-side over `/api/accuracy`'s `sports` map. No backend work. +3. **The capped 3-call rotating sample** — already served on the snapshot (Build 1), resolved-only. +4. **Honest state copy** — "tracking since · n building · promising, accruing", and the CLV panel + as an explicit *not-yet-publishable* state naming the reliability guard. + +## WHAT NEEDS A BUILD FIRST (and should be its own order) +- **CLV as a leading number** ← blocked on capture reliability, not on presentation. +- **Accuracy over time** ← needs a windowed param or a stored daily series. +- **Calibration curve** ← needs a claimed-vs-actual endpoint. + +## RECOMMENDATION +Ship the surface as **tier-record-forward with an honest CLV "building" panel**, not +CLV-forward — because CLV-forward with a null cannot lead, and CLV-forward with 3.6% would be a +lie. Then unblock CLV (capture reliability) and add the curve/time-series as their own orders. +That keeps the strongest claim of the premise intact — *a real thin honest record +out-credibilizes a fake fat one* — without inventing a single number. + +## TAGS +VERIFIED: filter params ignored (probed); `beat_close_pct`/`clv_distribution` null on the live +canonical aggregate; hollow law already enforced at source; no calibration endpoint exists. +CANNOT DETERMINE: none. **BLOCKED: CLV-forward lead, accuracy-over-time, calibration curve.**