This is the real answer, and it's bigger than the ...

Creato il: 15 settembre 2026

Risposto usando GPT-5.6 Thinking da Chat01

Domanda

TennisLocks_FINAL_v1157_BO3_CONDITIONAL_COVERAGE_FIX_20260915.txt

This is the real answer, and it's bigger than the small-sample blend we already fixed. Let me show you what I found.Found it, and it's a much bigger deal than the small-sample blend. Let me walk you through the evidence.

The actual root cause: the point-tree itself has zero cross-set correlation, by construction. In TennisMarketStateSpace.build() (the function every single market in this file is built on top of), spwA/spwB are computed once, then the same fixed values get reused for every set in the match:

js
var spwA=c01(opts.spwA), spwB=c01(opts.spwB); // computed ONCE ... for(var setNo=0;setNo<bo;setNo++){ ... setDistRichCal(spwA,spwB,srv,target,opts) ... // SAME spwA/spwB every set, win or lose

There is no code path anywhere that adjusts a player's probabilities based on the set they just won or lost. Structurally, this treats every set as an independent draw from the same fixed process — the textbook i.i.d.-sets assumption your system prompt's "Anomaly B" flagged as the theoretical cause of Under-2.5 over-pricing. This isn't a per-match glitch. It's baked into the shared engine every market in this file calls.

And here's the smoking gun that this used to be corrected for and no longer is. Every single call site that builds this tree passes:

js
_structuralNoPopulationSetTiltV1105:true

I grepped the entire file for anywhere that flag is actually read. Nowhere. It's set to true at every call site and never once checked. It's a dead flag — a fossil left behind after a real mechanism was ripped out. And the comment sitting right above your BO3 coverage authority confirms it in plain English:

// No S1->S2 persistence model, population P3 target, tour-specific floor, or post-PMF tilt exists.

That's not a bug description — it's a deliberate design log entry. There used to be a population-level P3 calibration (a tour-wide correction pulling the i.i.d. point-tree's output toward the real observed 3-set rate), and it was removed entirely during the v1157 rewrite, with nothing put back in its place. The only thing left "correcting" P3 today is the tiny per-match recent-loss blend we already patched — and that was never built to substitute for a systemic calibration. It's noise-reduction on a handful of matches, not a fix for the whole population.

This is the generic issue. Every BO3 match this sheet prices gets its structural P3 straight from a model with no set-to-set correlation and no population correction. If real matches go 3 sets more often than a fixed-probability point tree predicts — which is exactly what the literature you cited argues — every single match is undershooting P3 by roughly the same systematic amount, not just the thin-sample ones.

How to wire it correctly, without touching the shared point engine: don't rebuild TennisMarketStateSpace (it's load-bearing for Totals, Props, everything — too much blast radius). Instead, reintroduce the calibration at the one place we're already safely operating: apply it to structuralQA/structuralQB in _tlBo3CoverageTargetV1154_, before the recent-form blend touches them, so both corrections compose cleanly through the same Fréchet-safe exact-score solver you already have.

This cut off but from here u should be able to correct this correctly and rebuild the broke part and wire correctly deleting means to remove

Do not hardcore 50% anywhere in the script do not use the corpus for here p3 for it only reaches 33% so using that will never fix this script

Again don’t fix b03 to 50% or use the corpus I’m trying to get p3 to get mass lol

Pensiero

Computed BO3 posterior and validated tennis script patch integrity

Worked for 5m 43s

Risposta

I rebuilt the BO3 path as v1158.

The key correction is slightly different from the original diagnosis. TennisMarketStateSpace.build() does reuse one SPW pair through every set, as you found. (TennisLocks_FINAL_v1157_BO3_CONDITIONAL_COVERAGE_FIX_20260915.txt) But above that, the posterior layer draws a common state plus an opposing relative state, then sends that fixed relative draw through the entire match tree. (TennisLocks_FINAL_v1157_BO3_CONDITIONAL_COVERAGE_FIX_20260915.txt) That persistence is what can manufacture excess sweeps and strip P3 mass.

v1158 now:

  • Keeps the common point state persistent for the match.
  • Refreshes the opposing relative point state at each set boundary.
  • Uses the engine's existing set kernel, including server carry and deciding-set tiebreak rules.
  • Builds the structural qA/qB from that refreshed geometry before recent-form evidence.
  • Preserves Match Winner exactly through the existing Fréchet-safe exact-score reconciliation.
  • Does not use a corpus P3 target.
  • Does not hardcode BO3 to 50%.
  • Does not install a fixed P3 floor.
  • If recent evidence is missing, the structural repair still works; v1157 previously aborted the whole coverage correction unless both players' recent evidence was valid. (TennisLocks_FINAL_v1157_BO3_CONDITIONAL_COVERAGE_FIX_20260915.txt)
  • The dead _structuralNoPopulationSetTiltV1105 flag is physically removed: 0 occurrences remain.
  • TennisMarketStateSpace.build() itself is byte-for-byte unchanged; I only exposed its existing single-set kernel read-only, so the load-bearing match engine wasn't rebuilt.

The old file explicitly documented that no persistence/population correction existed. (TennisLocks_FINAL_v1157_BO3_CONDITIONAL_COVERAGE_FIX_20260915.txt)

Regression checks passed: JavaScript syntax passes; Winner remains exact; PMF sums to 1 with no negative cells; fallback with unavailable refresh reproduces the canonical PMF to floating-point precision. In a synthetic 3×3 posterior test, persistent relative state produced 47.57% P3, while exact set-refresh produced 49.87% P3, a +2.29pp structural lift with zero corpus target and zero recent-form input.

Download the rebuilt v1158 script

Download the v1157 → v1158 patch/diff

Condividi questa Q&A