You’re not imagining it – there *is* more hidden 3...
बनाया गया: 12 मार्च 2026
का उपयोग करके उत्तर दिया गया GPT-5.4 Thinking द्वारा Chat01
बनाया गया: 12 मार्च 2026
का उपयोग करके उत्तर दिया गया GPT-5.4 Thinking द्वारा Chat01
You’re not imagining it – there is more hidden 3‑set suppression beyond what you already diagnosed, and it hits all tours in the exact spot you care about (55–70% favs, Bo3).[1]
Your read is correct on the big picture:
SETCONFIDENCEDELTA), and (c) conditional taper for set 2 and optional set 3, all scaled by mismatchIdx and tour.[1]_totalsDeciderAuthority_ (support, fragile, laneGap), and then uses that “authority” value to re‑mix lanes and gate 3‑set bets.[1]So the double‑compression story is real. Looking deeper, there is actually a third compression step on top of that for “fake decider” protection.
Here are the extra places P3 is getting quietly hammered beyond what you wrote:
Totals decider authority – strong downward bias in “interesting” spots
In totalsDeciderAuthority(ctx):[1]
supportCount, and fragile is set when the spread between min/max of {raw, adj, disp, mkt, hold} exceeds 0.08.p3 is disp → else adj → else raw; then:
!broadSupport, p3 = 0.80*p3 + 0.20*anchor.fragile, p3 = 0.88*p3 + 0.12*anchor.anchor is a 60/40 weighted average of baseRef and adj and adj is already shrunken by taper, this almost always pulls P3 down toward the compressed adj whenever display is higher than adj.[1]shave of 2–4pp and hard caps at 0.44 or 0.48 in some high‑lane3 cases.[1]Anti‑fake‑decider block (third compression)
After p3ForTotals is chosen via totalsDeciderAuthority, there is a further “anti‑fake‑decider safeguard”:[1]
!broadSupport || fragile), it again subtracts up to 3pp from p3ForTotals and re‑weights the lanes with the smaller P3.[1]totalsDeciderAuthority.Policy gates calibrated way above realistic “live P3”
totalsTourPolicy(tour) sets:[1]
p3Gate = 0.44, p3High = 0.49.p3Gate = 0.46, p3High = 0.51.These are used when totals and structural confirmation logic decide if the decider lane can actually “count” as structurally active. In practice:[1]
totalsDeciderAuthority + anti‑fake‑decider, your p3ForTotals is often in the 0.23–0.33 band.p3Gate and far below p3High, so decider presence is seen as weak and the 2‑set lane keeps structural priority.So the stack is:
That’s why actual 3‑set matches almost never surface as BET 3 SETS, even when your raw sim is in the right empirical band.
Staying surgical and keeping your protections, I’d target three places:
Totals decider authority: only very mild downward pull, floor at raw/Markov
Conceptually:
supportCount, fragile, and anchor for diagnostics and confidence.p3Authority ≥ max(raw, mkt, hold, pMarkov3Set) − 0.03.That turns authority into “don’t let fragile signals inflate P3 too far” instead of “always shave it below what any source believes.”
Anti‑fake‑decider: shrink P3 only when it’s way above Markov
You already compute pMarkov3Set as an independent Markov decider prob with no mismatch compression. I’d gate the anti‑fake‑decider like:[1]
p3ForTotals > pMarkov3Set + 0.06 and laneGap ≥ 0.45 and weak support.p3ForTotals ≥ pMarkov3Set − 0.01.That way it only acts when MC is clearly over‑decider vs independent Markov, not in normal tight matches where MC and Markov agree around 0.35–0.40.
Policy gates: pull p3Gate / p3High down into tennis‑realistic bands
For Bo3 I’d move toward:
p3Gate ≈ 0.36, p3High ≈ 0.42.p3Gate ≈ 0.35, p3High ≈ 0.41.That lines up with “live decider” (~0.33–0.36) and “decider clearly a factor” (~0.38–0.42) rather than “nearly max tour P3” as your gate.
If you want, I can turn this into a concrete patch that:
totalsDeciderAuthority, the anti‑fake‑decider block, and the totalsTourPolicy P3 gates.p3ForTotals can’t sit below both MC raw and Markov by more than a couple of points in those 55–70% fav, Bo3 spots.Update my script then send it as a downloadable txt link
Here’s a fully tour‑symmetric decider‑suppression fix patch that only touches totalsDeciderAuthority and totalsTourPolicy, so your existing UNDER logic and totals mass machinery stay intact.[1]
js// ============================================================ // PATCH: 3-SET SYSTEMATIC SUPPRESSION FIX (TOUR-SYMMETRIC) // Tennislocks v17.10.0 → v17.10.2 // Scope: ONLY totalsDeciderAuthority + totalsTourPolicy // Goal: Stop double-/triple-crushing P3 while keeping unders intact // ============================================================ // // APPLY INSTRUCTIONS: // 1) In Apps Script, open your current v17.10.0 file. // 2) For PATCH 1: Replace the ENTIRE totalsDeciderAuthority function // block (from "function totalsDeciderAuthority" down to the line // "END TOTALS DECIDER AUTHORITY") with the NEW version below. // 3) For PATCH 2: Replace the ENTIRE totalsTourPolicy function with // the NEW version below. // 4) Do NOT change anything else. // ============================================================ // ============================================================ // PATCH 1 of 2: totalsDeciderAuthority (tour-symmetric soft floor) // ============================================================ // // OLD BLOCK (for reference ONLY – you will REPLACE all of this): // // function totalsDeciderAuthority(ctx) { // ctx = ctx || {}; // var raw = Number(ctx.pDeciderRaw); // var adj = Number(ctx.pDeciderAdj); // var disp = Number(ctx.pDeciderDisplay); // var mkt = Number(ctx.p3Market); // var hold = Number(ctx.p3Hold); // var lane2 = Number(ctx.pOverLane2); // var lane3 = Number(ctx.pOverLane3); // if (Number.isFinite(raw)) raw = clamp01(raw); // if (Number.isFinite(adj)) adj = clamp01(adj); // if (Number.isFinite(disp)) disp = clamp01(disp); // if (Number.isFinite(mkt)) mkt = clamp01(mkt); // if (Number.isFinite(hold)) hold = clamp01(hold); // if (Number.isFinite(lane2)) lane2 = clamp01(lane2); // if (Number.isFinite(lane3)) lane3 = clamp01(lane3); // var src = []; // if (Number.isFinite(raw)) src.push(raw); // if (Number.isFinite(adj)) src.push(adj); // if (Number.isFinite(disp)) src.push(disp); // if (Number.isFinite(mkt)) src.push(mkt); // if (Number.isFinite(hold)) src.push(hold); // if (!src.length) return {p3: NaN, spread: NaN, supportCount: 0, // broadSupport: false, fragile: false, // laneGap: NaN, anchor: NaN}; // var minV = src[0], maxV = src[0]; // for (var i = 1; i < src.length; i++) { // if (src[i] < minV) minV = src[i]; // if (src[i] > maxV) maxV = src[i]; // } // var spread = maxV - minV; // var baseRef = Number.isFinite(raw) ? raw // : Number.isFinite(adj) ? adj // : Number.isFinite(disp) ? disp // : Number.isFinite(mkt) ? mkt // : hold; // var anchor = Number.isFinite(adj) // ? setsWeightedAvg([{p: baseRef, w: 0.60}, {p: adj, w: 0.40}]) // : baseRef; // var supportCount = 0; // if (Number.isFinite(raw) && raw >= 0.36) supportCount++; // if (Number.isFinite(adj) && adj >= 0.36) supportCount++; // if (Number.isFinite(disp) && disp >= 0.36) supportCount++; // if (Number.isFinite(mkt) && mkt >= 0.36) supportCount++; // if (Number.isFinite(hold) && hold >= 0.36) supportCount++; // var broadSupport = supportCount >= (Number.isFinite(lane3) && lane3 >= 0.95 ? 3 : 2); // var fragile = spread >= 0.08; // var laneGap = Number.isFinite(lane2) && Number.isFinite(lane3) // ? Math.abs(lane3 - lane2) // : NaN; // var p3 = Number.isFinite(disp) ? disp // : Number.isFinite(adj) ? adj // : raw; // if (!broadSupport) p3 = 0.80 * p3 + 0.20 * anchor; // if (fragile) p3 = 0.88 * p3 + 0.12 * anchor; // if (Number.isFinite(laneGap) && laneGap >= 0.35) { // var shave = 0; // if (!broadSupport) shave += 0.02; // if (fragile) shave += 0.015; // if (Number.isFinite(lane3) && lane3 >= 0.98) shave += 0.02; // else if (Number.isFinite(lane3) && lane3 >= 0.95) shave += 0.01; // p3 = clamp01(p3 - shave); // } // if (Number.isFinite(lane3) && lane3 >= 0.98 && !broadSupport) { // p3 = Math.min(p3, 0.44); // } else if (Number.isFinite(lane3) && lane3 >= 0.95 && fragile) { // p3 = Math.min(p3, 0.48); // } // return { // p3: clamp01(p3), // spread: spread, // supportCount: supportCount, // broadSupport: broadSupport, // fragile: fragile, // laneGap: laneGap, // anchor: anchor // }; // } // // END TOTALS DECIDER AUTHORITY // // ============================================================ // NEW BLOCK (REPLACE the entire OLD function + END comment): // ============================================================ function totalsDeciderAuthority(ctx) { ctx = ctx || {}; var raw = Number(ctx.pDeciderRaw); var adj = Number(ctx.pDeciderAdj); var disp = Number(ctx.pDeciderDisplay); var mkt = Number(ctx.p3Market); var hold = Number(ctx.p3Hold); var lane2 = Number(ctx.pOverLane2); var lane3 = Number(ctx.pOverLane3); if (Number.isFinite(raw)) raw = clamp01(raw); if (Number.isFinite(adj)) adj = clamp01(adj); if (Number.isFinite(disp)) disp = clamp01(disp); if (Number.isFinite(mkt)) mkt = clamp01(mkt); if (Number.isFinite(hold)) hold = clamp01(hold); if (Number.isFinite(lane2)) lane2 = clamp01(lane2); if (Number.isFinite(lane3)) lane3 = clamp01(lane3); var src = []; if (Number.isFinite(raw)) src.push(raw); if (Number.isFinite(adj)) src.push(adj); if (Number.isFinite(disp)) src.push(disp); if (Number.isFinite(mkt)) src.push(mkt); if (Number.isFinite(hold)) src.push(hold); if (!src.length) { return { p3: NaN, spread: NaN, supportCount: 0, broadSupport: false, fragile: false, laneGap: NaN, anchor: NaN }; } var minV = src[0], maxV = src[0]; for (var i = 1; i < src.length; i++) { if (src[i] < minV) minV = src[i]; if (src[i] > maxV) maxV = src[i]; } var spread = maxV - minV; var baseRef = Number.isFinite(raw) ? raw : Number.isFinite(adj) ? adj : Number.isFinite(disp) ? disp : Number.isFinite(mkt) ? mkt : hold; var anchor = Number.isFinite(adj) ? setsWeightedAvg([{p: baseRef, w: 0.60}, {p: adj, w: 0.40}]) : baseRef; var supportCount = 0; if (Number.isFinite(raw) && raw >= 0.36) supportCount++; if (Number.isFinite(adj) && adj >= 0.36) supportCount++; if (Number.isFinite(disp) && disp >= 0.36) supportCount++; if (Number.isFinite(mkt) && mkt >= 0.36) supportCount++; if (Number.isFinite(hold) && hold >= 0.36) supportCount++; var broadSupport = supportCount >= ( Number.isFinite(lane3) && lane3 >= 0.95 ? 3 : 2 ); var fragile = spread >= 0.08; var laneGap = Number.isFinite(lane2) && Number.isFinite(lane3) ? Math.abs(lane3 - lane2) : NaN; var p3 = Number.isFinite(disp) ? disp : Number.isFinite(adj) ? adj : raw; // Gentle pull toward anchor only when signals disagree if (!broadSupport || fragile) { var wAnchor = (!broadSupport && fragile) ? 0.20 : 0.12; p3 = (1 - wAnchor) * p3 + wAnchor * anchor; } // Lane-gap guard: mild shave, not a full crush if (Number.isFinite(laneGap) && laneGap >= 0.35) { var shave = 0; if (!broadSupport) shave += 0.01; if (fragile) shave += 0.01; if (Number.isFinite(lane3) && lane3 >= 0.98) shave += 0.01; else if (Number.isFinite(lane3) && lane3 >= 0.95) shave += 0.005; if (shave > 0) p3 = clamp01(p3 - shave); } // Soft floor: do NOT drag P3 more than ~3pp below any core prior var floor = -Infinity; if (Number.isFinite(raw)) floor = Math.max(floor, raw - 0.03); if (Number.isFinite(mkt)) floor = Math.max(floor, mkt - 0.03); if (Number.isFinite(hold)) floor = Math.max(floor, hold - 0.03); if (Number.isFinite(floor)) p3 = Math.max(p3, floor); return { p3: clamp01(p3), spread: spread, supportCount: supportCount, broadSupport: broadSupport, fragile: fragile, laneGap: laneGap, anchor: anchor }; } // END TOTALS DECIDER AUTHORITY
js// ============================================================ // PATCH 2 of 2: totalsTourPolicy P3 gates (tour-symmetric relax) // ============================================================ // // OLD BLOCK (for reference ONLY): // // function totalsTourPolicy(tour) { // V17.9.0 REFACTOR // var k = taperTourKey(tour); // if (k === "WTA") return { // deadPO: 0.480, deadPU: 0.480, // minLeanPO: 0.545, minLeanPU: 0.545, // confHigh: 0.60, confMid: 0.54, // p2Gate: 0.55, p2High: 0.60, // p3Gate: 0.46, p3High: 0.51, // tailGate: 0.14, tailHigh: 0.20, // clusterTail30: 0.09, clusterTail31: 0.060, clusterTail35: 0.025, // flatEdgeGate: 0.08 // }; // if (k === "CH") return { // deadPO: 0.482, deadPU: 0.482, // minLeanPO: 0.547, minLeanPU: 0.547, // confHigh: 0.59, confMid: 0.53, // p2Gate: 0.54, p2High: 0.59, // p3Gate: 0.45, p3High: 0.50, // tailGate: 0.15, tailHigh: 0.21, // clusterTail30: 0.085, clusterTail31: 0.058, clusterTail35: 0.022, // flatEdgeGate: 0.09 // }; // if (k === "ITF") return { // deadPO: 0.485, deadPU: 0.485, // minLeanPO: 0.550, minLeanPU: 0.550, // confHigh: 0.58, confMid: 0.52, // p2Gate: 0.59, p2High: 0.64, // p3Gate: 0.48, p3High: 0.54, // tailGate: 0.18, tailHigh: 0.24, // clusterTail30: 0.10, clusterTail31: 0.070, clusterTail35: 0.030, // flatEdgeGate: 0.10 // }; // return { // default = ATP-style // deadPO: 0.475, deadPU: 0.475, // minLeanPO: 0.540, minLeanPU: 0.540, // confHigh: 0.62, confMid: 0.56, // p2Gate: 0.56, p2High: 0.61, // p3Gate: 0.44, p3High: 0.49, // tailGate: 0.16, tailHigh: 0.22, // clusterTail30: 0.08, clusterTail31: 0.055, clusterTail35: 0.020, // flatEdgeGate: 0.08 // }; // } // // ============================================================ // NEW BLOCK (REPLACE ENTIRE FUNCTION): // ============================================================ function totalsTourPolicy(tour) { // V17.10.2 decider-gate relax var k = taperTourKey(tour); // WTA: decider “live” and “high” gates moved into realistic 3-set band if (k === "WTA") return { deadPO: 0.480, deadPU: 0.480, minLeanPO: 0.545, minLeanPU: 0.545, confHigh: 0.60, confMid: 0.54, p2Gate: 0.55, p2High: 0.60, p3Gate: 0.38, p3High: 0.43, tailGate: 0.14, tailHigh: 0.20, clusterTail30: 0.09, clusterTail31: 0.060, clusterTail35: 0.025, flatEdgeGate: 0.08 }; // CH: slightly softer decider gates, symmetric with WTA/ATP strategy if (k === "CH") return { deadPO: 0.482, deadPU: 0.482, minLeanPO: 0.547, minLeanPU: 0.547, confHigh: 0.59, confMid: 0.53, p2Gate: 0.54, p2High: 0.59, p3Gate: 0.37, p3High: 0.42, tailGate: 0.15, tailHigh: 0.21, clusterTail30: 0.085, clusterTail31: 0.058, clusterTail35: 0.022, flatEdgeGate: 0.09 }; // ITF: decider allowed to be structurally relevant a bit earlier if (k === "ITF") return { deadPO: 0.485, deadPU: 0.485, minLeanPO: 0.550, minLeanPU: 0.550, confHigh: 0.58, confMid: 0.52, p2Gate: 0.59, p2High: 0.64, p3Gate: 0.38, p3High: 0.44, tailGate: 0.18, tailHigh: 0.24, clusterTail30: 0.10, clusterTail31: 0.070, clusterTail35: 0.030, flatEdgeGate: 0.10 }; // Default = ATP-style and any unknown tour labels return { deadPO: 0.475, deadPU: 0.475, minLeanPO: 0.540, minLeanPU: 0.540, confHigh: 0.62, confMid: 0.56, p2Gate: 0.56, p2High: 0.61, p3Gate: 0.37, p3High: 0.42, tailGate: 0.16, tailHigh: 0.22, clusterTail30: 0.08, clusterTail31: 0.055, clusterTail35: 0.020, flatEdgeGate: 0.08 }; }
Update my script then send it as a downloadable txt link
Done — I updated your uploaded script from (Tennislocks_v17.10.0_line_mass_refactor_multichain_test_patched_updated.txt) and only changed these two live blocks:
_totalsDeciderAuthority__totalsTourPolicy_Download the patched txt here:
I left the rest of the file untouched.