report: full-output grade mapping spec + collapse cost measured

Report-only. Nothing built, reconnected, or promoted.

Premise corrected again: the three-layer engine is BUILT but NOT WIRED and NOT
DEPLOYED (0 python refs in every grade-path file, 0 python in Dockerfile; there
is no engine1Adapter). So no posterior/CI/similarity prior exists to inventory
or diff. Measured against the collapse that actually exists instead.

THREE collapses, not one: (A) estimateProbability's components discarded at
analyzeViaEngine1:521-524; (B) THE SEVERE ONE - p_win never reaches the grade
at all (engine1.js has zero probability references), so the probability is
excluded from grading rather than collapsed into it; (C) grade_thresholds.json
(probability->grade) read backwards to manufacture confidence.
Market-efficiency scaling is never computed - a gap, not a collapse.

MEASURED on 354 settled rows carrying the served letter and the locked pre-game
p_win (forward, not lookahead). Grade->outcome point-biserial r: champion letter
0.0050 (p~0.93, null) vs probability letter 0.1313 (p~0.013). Per sport: MLB
champ 0.0686 n.s. vs prob 0.2356 (p~0.0004); WNBA champ -0.0986 vs prob -0.1258
- BOTH INVERSE. The served letter is inverted between its only two populated
tiers (B 52.4% n=168 vs C 56.9% n=174).

Verdict: costly on MLB, and un-collapsing does NOT help WNBA -> the challenger
must be MLB-FIRST. Five falsifiable mapping rules specced, incl. R2
(uncertainty grades down) stated explicitly and droppable if it fails.

Hard requirement on the next order: persist per-row n, SE and pre-adjustment p,
or R2/R4 can never be adjudicated (not stored today).

Re-adjudication list flagged incl. proj-v1.1's NOT PROVEN verdict (judged
against the collapsed champion, so not final) and ROI-by-grade (with B/C
inverted, the MLB-C +4.57% segment is likely an artifact of a meaningless
letter).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QJs13VsyiSKYQP6rj3NNmc
This commit is contained in:
Kev
2026-07-30 23:47:11 -04:00
parent dd98b0b614
commit 708f0fde5c
3 changed files with 309 additions and 0 deletions
+55
View File
@@ -463,6 +463,61 @@
> `sports.{sport}` and reads ACCRUING until its own n≥20 clears; never `overall`, which would silently
> borrow MLB/WNBA credibility.
> ## 🧪 FULL-OUTPUT GRADE MAPPING + COLLAPSE COST 2026-07-30 (report-only) → **`specs/full-output-grade-mapping.md`**
> Track-B 1 of 3. Nothing built, reconnected, or promoted. **PREMISE CORRECTED AGAIN: the three-layer
> engine is BUILT but NOT WIRED and NOT DEPLOYED** (re-verified independently — 0 python refs in every
> grade-path file, 0 python lines in `Dockerfile`; there is no `engine1Adapter`, the real files are
> `utils/gradeAdapter.js` + `analyzeViaEngine1.js`). So no posterior/CI/similarity prior is produced
> today; Phase 1 could not inventory a live three-layer output and Phase 3 could not diff against one.
> Phase 3 was run instead against the collapse that ACTUALLY exists — which is **worse** than the
> premise describes, and measurable now.
> **THREE COLLAPSES (VERIFIED), not one.** (A) `estimateProbability` returns
> `{p_over,p_under,components{base,recency,weighted,opp_adjustment,home_adjustment,consistency_adjustment,cv}}`
> and `analyzeViaEngine1:521-524` keeps ONLY the scalar — `est.components` is attached to nothing.
> **(B) THE SEVERE ONE: `p_win` never reaches the grade at all** — the letter is `engine1`'s factor
> index and `engine1.js` has ZERO probability references, so the probability isn't collapsed INTO the
> grade, it's excluded FROM it. (C) `grade_thresholds.json` (PROBABILITY→GRADE) is read BACKWARDS to
> manufacture `confidence`. **0.2: market-efficiency scaling is NEVER COMPUTED** — a gap, not a
> second collapse.
> **🔴 PHASE 3 — THE COLLAPSE IS COSTLY ON MLB, AND UN-COLLAPSING DOES NOT HELP WNBA.** 354 settled
> rows carrying both the served letter and the locked pre-game `p_win` (forward test, NOT lookahead).
> Grade→outcome point-biserial r: **champion letter 0.0050 (p≈0.93, NULL)** vs **probability letter
> 0.1313 (p≈0.013)**. Per sport: **MLB champ 0.0686 n.s. vs prob 0.2356 (p≈0.0004, n=224)** —
> **WNBA champ 0.0986 vs prob 0.1258 (n=130, BOTH INVERSE)**. The pooled number is MLB's signal
> diluted by WNBA's inversion; this independently corroborates the 07-26 calibration finding that the
> champion does not discriminate on WNBA. **→ the full-output challenger must be MLB-FIRST; shipping
> it for WNBA on the pooled number would ship an anti-predictive grade.**
> **THE SERVED LETTER IS INVERTED BETWEEN ITS ONLY TWO POPULATED TIERS: B hits 52.4% (n=168), C hits
> 56.9% (n=174).** A user reading B as better than C is reading noise. Probability letters spread
> 30.8% (D) → 70.0% (B+), use 10-11 of 11 letters vs the champion's 3-4, and split ROI **1.42%
> (A-family, n=78) vs 26.62% (C-/D/F, n=51) — a 25-point spread**. Banding is NOT the lossy part
> (0.1313 banded vs 0.1349 raw).
> **PHASE 2 — five EXPLICIT, FALSIFIABLE rules specced** (none assumed to be an improvement):
> R1 posterior→letter via the table read FORWARD · **R2 uncertainty grades DOWN, stated not smuggled:
> `p_adj = 0.5 + (p0.5)·(1 k·min(1, 1.96·SE/W0))`, k=1, W0=0.15 — falsifiable: rows R2 moves down
> must hit closer to their NEW band or R2 is WRONG and gets dropped** · R3 archetype adjusts the
> PROJECTION never the letter (drop if MAE doesn't improve) · R4 efficiency scales the THRESHOLD per
> sport, `E_sport` FIT from each sport's own record — success = equal hit rate per letter ACROSS
> sports · R5 abstain below min instances, never a default C.
> **🔴 HARD REQUIREMENT ON THE NEXT ORDER: R2/R3/R4 are UNMEASURABLE today — per-row instance count
> `n` is NOT stored on the ledger.** The challenger build MUST emit and persist `n`, `SE`, and the
> pre-adjustment `p`, or the CI-width and efficiency rules can never be adjudicated.
> **3.7 CONSUMERS:** nothing consumes a distribution, so a distribution-based grade is safe IF it
> still emits a letter; what changes is the letter DISTRIBUTION — `tierGating`, byGrade buckets
> (AccuracyBadge/ModelRecord/TierRecord), `outcomeService.gradeBucket`, `isAB` in hero +
> deskShowcase (the hero pool grows), `GRADE_RANK`/`selectTopGrades`, `capper_minimum_grade:'A-'`,
> newsletter templates. **A-GRADES: probability grading emits 53 A-family rows where the champion
> emitted 2. This is NOT the forbidden "rescale to mint A's"** — it is a measurably more informative
> basis (new information), and the A's earn it (A 65.5%, A+ 62.5%, B+ 70.0% vs D 30.8%) — **but A-
> hits 44.0%, breaking top-tier monotonicity, so the A-RATED marketing hold STAYS until the
> challenger's own forward record shows a monotone top tier.**
> **PHASE 4 RE-ADJUDICATION LIST (flagged, not re-run):** champion p_win→CLV 0.375 · the over-side
> skew audit · **proj-v1.1's "NOT PROVEN" — it was judged against the COLLAPSED champion, so its
> death is NOT final** · the C1 takeable-floor derivation · the 07-26 calibration curves (its WNBA
> finding is corroborated and looks robust; MLB needs re-running) · **ROI-by-grade — with B and C
> inverted, "MLB-C is the +4.57% profitable segment" is very likely an artifact of a meaningless
> letter, not a real segment** · `confidence` on every historical row (never use it as a weight).
- **Redirect EXISTS + WIRED:** `closingCapture.buildCaptureRows``closing_captures` (append-only,
provenance: captured_at/book/line_type/both-prices/missed_reason) via `intradayRefreshService:221`
+ internal endpoint; `ledgerService.attachClosingProb``closing_prob` (de-vigs both raw sides,