bash -lc cat > /mnt/data/patch_tennislocks.py <<'PY'
from pathlib import Path
import re
path = Path('/mnt/data/TennisLocks_v22_FIXED.gs.txt')
text = path.read_text(encoding='utf-8')
orig = text
def must_replace(old, new, count=1):
global text
n = text.count(old)
if n != count:
raise RuntimeError(f'Expected {count} occurrence(s) for exact replace, found {n} for snippet starting: {old[:80]!r}')
text = text.replace(old, new)
def must_sub(pattern, repl, count=1, flags=0):
global text
new_text, n = re.subn(pattern, repl, text, count=count, flags=flags)
if n != count:
raise RuntimeError(f'Expected {count} regex replacement(s), found {n} for pattern: {pattern}')
text = new_text
1) Add unified confidence + guard helpers near totals confidence scale.
helper_anchor = "var _V20_CONF_PENALTY_SCALE = 0.025;\n"
helper_insert = """var _V20_CONF_PENALTY_SCALE = 0.025;\n\nfunction confFromEdge(edge, riskPenalty) {\n var e = Number(edge);\n var rp = Number(riskPenalty);\n if (!Number.isFinite(e)) return 'NONE';\n if (!Number.isFinite(rp)) rp = 0;\n var effEdge = Math.max(0, e - rp);\n if (effEdge >= 0.10) return 'HIGH';\n if (effEdge >= 0.06) return 'MID';\n if (effEdge >= 0.03) return 'LOW';\n return 'NONE';\n}\n\nfunction _guardPick(pSide, edge, confLabel) {\n if (!pSide) return '';\n var e = Number(edge);\n if (!Number.isFinite(e) || e < THRESHOLDS.MIN_PICK_CONF) return '';\n if (String(confLabel || '').toUpperCase() === 'NONE') return '';\n return pSide;\n}\n"""
must_replace(helper_anchor, helper_insert, count=1)
2) Replace MATCH_PICK winner blend with strict weighted average and keep pBlendA for anchor.
old_blend_pick = """ var pFinal = 0.5;\n var _hasElo = (Number.isFinite(pElo) && pElo > 0 && pElo < 1);\n if (_hasElo) {\n var _wM = THRESHOLDS.BLEND_W_MODEL;\n var _wS = THRESHOLDS.BLEND_W_STATS;\n var _wE = THRESHOLDS.BLEND_W_ELO;\n var _blTourK = 'ATP';\n try { _blTourK = taperTourKey(tourLabel); } catch(e) { _blTourK = 'ATP'; }\n var _blIsWta = (_blTourK === 'WTA');\n var _blIsCh = (_blTourK === 'CH');\n var _blTrustGate = _blIsWta ? 0.96 : _blIsCh ? 0.955 : 0.95;\n var _blEloCap = _blIsWta ? 0.18 : _blIsCh ? 0.19 : 0.22;\n var _blEloScale = _blIsWta ? 1.8 : _blIsCh ? 1.9 : 2.0;\n var _blNeutBand = _blIsWta ? 0.04 : _blIsCh ? 0.035 : (THRESHOLDS.MODEL_NEUTRAL_BAND || 0.03);\n var _oqA_bl2 = (statsA && statsA.oppQuality) ? statsA.oppQuality : null;\n var _oqB_bl2 = (statsB && statsB.oppQuality) ? statsB.oppQuality : null;\n var _tA_bl2 = (_oqA_bl2 && Number.isFinite(_oqA_bl2.trust)) ? Number(_oqA_bl2.trust) : 1.0;\n var _tB_bl2 = (_oqB_bl2 && Number.isFinite(_oqB_bl2.trust)) ? Number(_oqB_bl2.trust) : 1.0;\n var _trustMin_bl2 = Math.min(_tA_bl2, _tB_bl2);\n if (_trustMin_bl2 < _blTrustGate) {\n var _eloBoost2 = Math.min(_blEloCap, (_blTrustGate - _trustMin_bl2) * _blEloScale);\n _wE += _eloBoost2;\n _wM = Math.max(0.15, _wM - _eloBoost2 * 0.5);\n _wS = Math.max(0.10, _wS - _eloBoost2 * 0.5);\n }\n if (Math.abs(pModelA_raw - 0.50) < _blNeutBand ) {\n var _targetE = Math.min(_wE, 0.03);\n var _deltaE = _wE - _targetE;\n if (_deltaE > 0) {\n _wE = _targetE;\n _wM += _deltaE / 2;\n _wS += _deltaE / 2;\n }\n }\n _wF_mp = Math.max(0, Math.min(0.48, _wF_mp));\n var _baseSum = _wM + _wS + _wE;\n var _scale = (_baseSum > 0) ? ((1 - _wF_mp) / _baseSum) : 0;\n _wM *= _scale; _wS *= _scale; _wE *= _scale;\n _wE = Math.min(_wE, 0.22);\n var _wF_mp_raw = _wF_mp; // preserve for downstream engine call\n var _wSum = _wM + _wS + _wE + _wF_mp;\n if (_wSum > 0) { _wM /= _wSum; _wS /= _wSum; _wE /= _wSum; _wF_mp /= _wSum; }\n pFinal = _wM * pModelA + _wS * pStats + _wE * pElo + _wF_mp * _pFormA_mp;\n _wF_mp = _wF_mp_raw; // restore for downstream cap usage\n } else {\n _wF_mp = Math.max(0, Math.min(0.48, _wF_mp));\n var _wM0 = 0.50 * (1 - _wF_mp);\n var _wS0 = 0.50 * (1 - _wF_mp);\n var _wSum2 = _wM0 + _wS0 + _wF_mp;\n pFinal = (_wM0 * pModelA + _wS0 * pStats + _wF_mp * _pFormA_mp) / _wSum2;\n }\n pFinal = clamp01(pFinal);\n"""
new_blend_pick = """ var pFinal = 0.5;\n var pBlendA = NaN;\n var _hasElo = (Number.isFinite(pElo) && pElo > 0 && pElo < 1);\n if (_hasElo) {\n var wM = THRESHOLDS.BLEND_W_MODEL;\n var wS = THRESHOLDS.BLEND_W_STATS;\n var wE = THRESHOLDS.BLEND_W_ELO;\n var wSum = wM + wS + wE;\n if (wSum <= 0) { wM = 0.5; wS = 0.5; wE = 0; wSum = 1; }\n pBlendA = (wM * pModelA + wS * pStats + wE * pElo) / wSum;\n pBlendA = clamp01(pBlendA);\n pFinal = pBlendA;\n } else {\n var wM0 = 0.5;\n var wS0 = 0.5;\n var wSum0 = wM0 + wS0;\n if (wSum0 <= 0) { wM0 = 0.5; wS0 = 0.5; wSum0 = 1; }\n pBlendA = (wM0 * pModelA + wS0 * pStats) / wSum0;\n pBlendA = clamp01(pBlendA);\n pFinal = pBlendA;\n }\n pFinal = clamp01(pFinal);\n"""
must_replace(old_blend_pick, new_blend_pick, count=1)
3) Replace MATCH_PICK market anchor with capped move toward market using pBlendA.
old_anchor_pick = """ if (Number.isFinite(impliedProbA_pick) && impliedProbA_pick > 0 && !isTrapScenario_pick) {\n marketDivergence_pick = pFinal - impliedProbA_pick;\n var diff_pick = Math.abs(marketDivergence_pick);\n var pull_pick = 0;\n if (diff_pick > _maDivThr_p) {\n pull_pick = _maPullBase_p;\n try {\n var _oqA_p = (statsA && statsA.oppQuality) ? statsA.oppQuality : null;\n var _oqB_p = (statsB && statsB.oppQuality) ? statsB.oppQuality : null;\n var _fd_p = (_formLayer_mp && Number.isFinite(_formLayer_mp.delta)) ? Number(_formLayer_mp.delta) : 0;\n var _trustMinP = 1.0;\n if (_oqA_p && Number.isFinite(_oqA_p.trust)) _trustMinP = Math.min(_trustMinP, Number(_oqA_p.trust));\n if (_oqB_p && Number.isFinite(_oqB_p.trust)) _trustMinP = Math.min(_trustMinP, Number(_oqB_p.trust));\n if (Math.abs(_fd_p) > 0.03 && _trustMinP >= _maFormTrust_p) {\n var _modelDirAnchor = pFinal > 0.5 ? 1 : -1;\n var _formSupports = (Number.isFinite(_fd_p) && (_fd_p > 0) === (_modelDirAnchor > 0));\n if (!_formSupports && !_pickIsDog_p) pull_pick = Math.min(_maPullBig_p, pull_pick + _maPullForm_p);\n if (!_formSupports && _pickIsDog_p) pull_pick = Math.min(_maPullBase_p, pull_pick);\n anchorReason_pick = 'Divergence ' + Math.round(diff_pick * 100) + 'pp, Form Supports Model';\n } else if (_trustMinP < _maLowTrust_p) {\n pull_pick = Math.min(_maPullLowT_p, pull_pick);\n anchorReason_pick = 'Divergence ' + Math.round(diff_pick * 100) + 'pp, Low Schedule Trust';\n } else {\n anchorReason_pick = 'Divergence ' + Math.round(diff_pick * 100) + 'pp';\n }\n } catch(_eMAP) {\n anchorReason_pick = 'Divergence ' + Math.round(diff_pick * 100) + 'pp';\n }\n if (pull_pick > 0) {\n var _dir_pull_pick = (marketDivergence_pick > 0 ? 1 : -1);\n pFinal = clamp01(pFinal - pull_pick * _dir_pull_pick);\n anchorWeightUsed_pick = pull_pick;\n marketAnchorApplied_pick = true;\n }\n } else {\n anchorWeightUsed_pick = _maSoftW_p;\n anchorReason_pick = 'Soft Alignment';\n }\n } else if (isTrapScenario_pick) {\n"""
new_anchor_pick = """ if (Number.isFinite(impliedProbA_pick) && impliedProbA_pick > 0 && !isTrapScenario_pick) {\n var _anchorSource_pick = Number.isFinite(pBlendA) ? pBlendA : pFinal;\n var diff_pick = _anchorSource_pick - impliedProbA_pick;\n marketDivergence_pick = diff_pick;\n var sign_pick = (diff_pick > 0) ? 1 : ((diff_pick < 0) ? -1 : 0);\n var maxPull_pick = 0.08;\n var pull_pick = Math.min(Math.abs(diff_pick), maxPull_pick);\n var anchored_pick = _anchorSource_pick - pull_pick * sign_pick;\n if ((_anchorSource_pick > impliedProbA_pick && anchored_pick < impliedProbA_pick) ||\n (_anchorSource_pick < impliedProbA_pick && anchored_pick > impliedProbA_pick)) {\n anchored_pick = impliedProbA_pick;\n }\n pFinal = clamp01(anchored_pick);\n if (pull_pick > 0) {\n anchorWeightUsed_pick = pull_pick;\n marketAnchorApplied_pick = true;\n anchorReason_pick = 'Divergence ' + Math.round(Math.abs(diff_pick) * 100) + 'pp';\n } else {\n anchorWeightUsed_pick = 0.0;\n anchorReason_pick = 'Soft Alignment';\n }\n } else if (isTrapScenario_pick) {\n"""
must_replace(old_anchor_pick, new_anchor_pick, count=1)
4) Replace FINAL_BET_SUMMARY/secondary winner blend with strict weighted average.
old_blend_summary = """ var wModel = THRESHOLDS.BLEND_W_MODEL;\n var wStats = THRESHOLDS.BLEND_W_STATS;\n var wElo = THRESHOLDS.BLEND_W_ELO;\n var eloConf = Math.abs((Number.isFinite(pElo) ? pElo : 0.5) - 0.5);\n var modelConf = Math.abs(pMatchModelA - 0.5);\n if (eloConf > 0.10 && modelConf < 0.05) {\n wElo = 0.20; wModel = 0.40; wStats = 0.40;\n }\n if (Number.isFinite(pElo)) {\n if (pElo > 0.60 && pMatchModelA < 0.50) {\n wElo = 0.08; wModel = 0.40; wStats = 0.40;\n } else if (pElo < 0.40 && pMatchModelA > 0.50) {\n wElo = 0.08; wModel = 0.40; wStats = 0.40;\n }\n }\n var statsConf = Math.abs(pStatsA - 0.5);\n if (Number.isFinite(pElo) && eloConf > 0.06) {\n var eloDir = (pElo > 0.5) ? 1 : -1;\n var modelDir = (pMatchModelA > 0.5) ? 1 : -1;\n var statsDir = (pStatsA > 0.5) ? 1 : -1;\n // Elo + Model agree, Stats disagrees\n if (eloDir === modelDir && eloDir !== statsDir && modelConf > 0.04) {\n wElo = 0.22; wModel = 0.50; wStats = 0.28;\n }\n // Elo + Stats agree, Model disagrees\n else if (eloDir === statsDir && eloDir !== modelDir && statsConf > 0.04) {\n wElo = 0.22; wStats = 0.50; wModel = 0.28;\n }\n }\n var wSum = wModel + wStats + wElo;\n wModel /= wSum; wStats /= wSum; wElo /= wSum;\n var pFinalA = clamp01(\n wModel * clamp01(pMatchModelA) +\n wStats * clamp01(pStatsA) +\n wElo * (Number.isFinite(pElo) ? clamp01(pElo) : clamp01(pMatchModelA))\n );\n var msDenom2 = (wModel + wStats);\n if (msDenom2 > 0) {\n if (pFinalA > 0.50 && pMatchModelA < 0.50 && pStatsA < 0.50) {\n var pMSOnly = (wModel * pMatchModelA + wStats * pStatsA) / msDenom2;\n pFinalA = clamp01(pMSOnly);\n } else if (pFinalA < 0.50 && pMatchModelA > 0.50 && pStatsA > 0.50) {\n var pMSOnly2 = (wModel * pMatchModelA + wStats * pStatsA) / msDenom2;\n pFinalA = clamp01(pMSOnly2);\n }\n }\n"""
new_blend_summary = """ var wModel = THRESHOLDS.BLEND_W_MODEL;\n var wStats = THRESHOLDS.BLEND_W_STATS;\n var wElo = THRESHOLDS.BLEND_W_ELO;\n var wSum = wModel + wStats + wElo;\n if (wSum <= 0) { wModel = 0.5; wStats = 0.5; wElo = 0; wSum = 1; }\n var pFinalA = clamp01((\n wModel * clamp01(pMatchModelA) +\n wStats * clamp01(pStatsA) +\n wElo * (Number.isFinite(pElo) ? clamp01(pElo) : clamp01(pMatchModelA))\n ) / wSum);\n"""
must_replace(old_blend_summary, new_blend_summary, count=1)
5) Replace MATCH_PREVIEW winner blend with strict weighted average and pBlendA_pv.
old_blend_preview = """ var pFinalA = 0.5;\n var hasElo = (Number.isFinite(pElo) && pElo > 0 && pElo < 1);\n if (hasElo) {\n var _wM_pv = THRESHOLDS.BLEND_W_MODEL;\n var _wS_pv = THRESHOLDS.BLEND_W_STATS;\n var _wE_pv = THRESHOLDS.BLEND_W_ELO;\n var _oqA_blend = (statsA && statsA.oppQuality) ? statsA.oppQuality : null;\n var _oqB_blend = (statsB && statsB.oppQuality) ? statsB.oppQuality : null;\n var _tA_blend = (_oqA_blend && Number.isFinite(_oqA_blend.trust)) ? Number(_oqA_blend.trust) : 1.0;\n var _tB_blend = (_oqB_blend && Number.isFinite(_oqB_blend.trust)) ? Number(_oqB_blend.trust) : 1.0;\n var _trustMin_blend = Math.min(_tA_blend, _tB_blend);\n var _blTourK_pv = 'ATP';\n try { _blTourK_pv = taperTourKey(tourLabel); } catch(e) { _blTourK_pv = 'ATP'; }\n var _blIsWta_pv = (_blTourK_pv === 'WTA');\n var _blIsCh_pv = (_blTourK_pv === 'CH');\n var _blTrustGate_pv = _blIsWta_pv ? 0.96 : _blIsCh_pv ? 0.955 : 0.95;\n var _blEloCap_pv = _blIsWta_pv ? 0.20 : _blIsCh_pv ? 0.22 : 0.25;\n var _blEloScale_pv = _blIsWta_pv ? 1.8 : _blIsCh_pv ? 1.9 : 2.0;\n var _blNeutBand_pv = _blIsWta_pv ? 0.04 : _blIsCh_pv ? 0.035 : (THRESHOLDS.MODEL_NEUTRAL_BAND || 0.03);\n if (_trustMin_blend < _blTrustGate_pv) {\n var _eloBoost = Math.min(_blEloCap_pv, (_blTrustGate_pv - _trustMin_blend) * _blEloScale_pv);\n _wE_pv += _eloBoost;\n _wM_pv = Math.max(0.15, _wM_pv - _eloBoost * 0.5);\n _wS_pv = Math.max(0.10, _wS_pv - _eloBoost * 0.5);\n }\n if (Math.abs(pModelA - 0.50) < _blNeutBand_pv) {\n var _targetE_pv = Math.min(_wE_pv, 0.05);\n var _deltaE_pv = _wE_pv - _targetE_pv;\n if (_deltaE_pv > 0) {\n _wE_pv = _targetE_pv;\n _wM_pv += _deltaE_pv / 2;\n _wS_pv += _deltaE_pv / 2;\n }\n }\n _wF_pv = Math.max(0, Math.min(0.48, _wF_pv));\n var _baseSum_pv = _wM_pv + _wS_pv + _wE_pv;\n var _scale_pv = (_baseSum_pv > 0) ? ((1 - _wF_pv) / _baseSum_pv) : 0;\n _wM_pv *= _scale_pv; _wS_pv *= _scale_pv; _wE_pv *= _scale_pv;\n var _wSum_pv = _wM_pv + _wS_pv + _wE_pv + _wF_pv;\n pFinalA = (_wM_pv * pModelA + _wS_pv * pStats + _wE_pv * pElo + _wF_pv * _pFormA_pv) / _wSum_pv;\n } else {\n _wF_pv = Math.max(0, Math.min(0.48, _wF_pv));\n var _wM0_pv = 0.50 * (1 - _wF_pv);\n var _wS0_pv = 0.50 * (1 - _wF_pv);\n var _wSum2_pv = _wM0_pv + _wS0_pv + _wF_pv;\n pFinalA = (_wM0_pv * pModelA + _wS0_pv * pStats + _wF_pv * _pFormA_pv) / _wSum2_pv;\n }\n pFinalA = clamp01(pFinalA);\n"""
new_blend_preview = """ var pFinalA = 0.5;\n var pBlendA_pv = NaN;\n var hasElo = (Number.isFinite(pElo) && pElo > 0 && pElo < 1);\n if (hasElo) {\n var _wM_pv = THRESHOLDS.BLEND_W_MODEL;\n var _wS_pv = THRESHOLDS.BLEND_W_STATS;\n var _wE_pv = THRESHOLDS.BLEND_W_ELO;\n var _wSum_pv = _wM_pv + _wS_pv + _wE_pv;\n if (_wSum_pv <= 0) { _wM_pv = 0.5; _wS_pv = 0.5; _wE_pv = 0; _wSum_pv = 1; }\n pBlendA_pv = (_wM_pv * pModelA + _wS_pv * pStats + _wE_pv * pElo) / _wSum_pv;\n pBlendA_pv = clamp01(pBlendA_pv);\n pFinalA = pBlendA_pv;\n } else {\n var _wM0_pv = 0.5;\n var _wS0_pv = 0.5;\n var _wSum2_pv = _wM0_pv + _wS0_pv;\n if (_wSum2_pv <= 0) { _wM0_pv = 0.5; _wS0_pv = 0.5; _wSum2_pv = 1; }\n pBlendA_pv = (_wM0_pv * pModelA + _wS0_pv * pStats) / _wSum2_pv;\n pBlendA_pv = clamp01(pBlendA_pv);\n pFinalA = pBlendA_pv;\n }\n pFinalA = clamp01(pFinalA);\n"""
must_replace(old_blend_preview, new_blend_preview, count=1)
6) Replace MATCH_PREVIEW market anchor.
old_anchor_preview = """ if (Number.isFinite(impliedProbA) && !isTrapScenario) {\n marketDivergence = (pFinalA - impliedProbA);\n var diff = Math.abs(marketDivergence);\n var pull = 0;\n if (diff > _maDivThr) {\n pull = _maPullBase;\n try {\n var _oqA_a = oqA || (statsA && statsA.oppQuality ? statsA.oppQuality : null);\n var _oqB_a = oqB || (statsB && statsB.oppQuality ? statsB.oppQuality : null);\n var _formL = _formLayer_pv;\n var _fd = (_formL && Number.isFinite(_formL.delta)) ? Number(_formL.delta) : 0;\n var _trustMinA = 1.0;\n if (_oqA_a && Number.isFinite(_oqA_a.trust)) _trustMinA = Math.min(_trustMinA, Number(_oqA_a.trust));\n if (_oqB_a && Number.isFinite(_oqB_a.trust)) _trustMinA = Math.min(_trustMinA, Number(_oqB_a.trust));\n if (Math.abs(_fd) > 0.03 && _trustMinA >= _maFormTrust) {\n pull = Math.min(_maPullBig, pull + _maPullForm);\n anchorReason = 'Divergence ' + Math.round(diff * 100) + 'pp, Form Supports Model';\n } else if (_trustMinA < _maLowTrust) {\n pull = Math.min(_maPullLowT, pull);\n anchorReason = 'Divergence ' + Math.round(diff * 100) + 'pp, Low Schedule Trust';\n } else {\n anchorReason = 'Divergence ' + Math.round(diff * 100) + 'pp';\n }\n } catch(_eMA) {\n anchorReason = 'Divergence ' + Math.round(diff * 100) + 'pp';\n }\n if (pull > 0) {\n var _dir_pull = (marketDivergence > 0 ? 1 : -1);\n pFinalA = clamp01(pFinalA - pull * _dir_pull);\n anchorWeightUsed = pull;\n marketAnchorApplied = true;\n }\n } else {\n var _maAgreeDir = (pFinalA > 0.5) ? 1 : -1;\n var _maMarketDir = (impliedProbA > 0.5) ? 1 : -1;\n if (_maAgreeDir === _maMarketDir && diff < (_maDivThr * 0.50)) {\n var _maReinforce = Math.min(0.008, diff * 0.15);\n pFinalA = clamp01(pFinalA + _maAgreeDir * _maReinforce);\n anchorWeightUsed = _maReinforce;\n anchorReason = 'Market Confirms (' + Math.round(diff * 100) + 'pp)';\n } else {\n anchorWeightUsed = _maSoftW;\n anchorReason = 'Soft Alignment';\n }\n }\n } else if (isTrapScenario) {\n"""
new_anchor_preview = """ if (Number.isFinite(impliedProbA) && !isTrapScenario) {\n var _anchorSource_pv = Number.isFinite(pBlendA_pv) ? pBlendA_pv : pFinalA;\n var diff = _anchorSource_pv - impliedProbA;\n marketDivergence = diff;\n var sign = (diff > 0) ? 1 : ((diff < 0) ? -1 : 0);\n var maxPull = 0.08;\n var pull = Math.min(Math.abs(diff), maxPull);\n var anchored = _anchorSource_pv - pull * sign;\n if ((_anchorSource_pv > impliedProbA && anchored < impliedProbA) ||\n (_anchorSource_pv < impliedProbA && anchored > impliedProbA)) {\n anchored = impliedProbA;\n }\n pFinalA = clamp01(anchored);\n if (pull > 0) {\n anchorWeightUsed = pull;\n marketAnchorApplied = true;\n anchorReason = 'Divergence ' + Math.round(Math.abs(diff) * 100) + 'pp';\n } else {\n anchorWeightUsed = 0.0;\n anchorReason = 'Soft Alignment';\n }\n } else if (isTrapScenario) {\n"""
must_replace(old_anchor_preview, new_anchor_preview, count=1)
7) Cap opponent-quality adjustments in logit space directly inside _apply.
old_apply_return = """ return clamp01(adj);\n }\n"""
new_apply_return = """ var rawRate = raw;\n var adjRate = clamp01(adj);\n var logRaw = logit(rawRate);\n var logAdj = logit(adjRate);\n var delta = logAdj - logRaw;\n var maxShift = 0.35;\n if (delta > maxShift) delta = maxShift;\n if (delta < -maxShift) delta = -maxShift;\n var finalRate = sigmoid(logRaw + delta);\n return clamp01(finalRate);\n }\n"""
occurs in the target function twice due exact helper duplicate in file snapshot? replace both.
must_replace(old_apply_return, new_apply_return, count=2)
8) Canonical decider in computeDeciderSetProb.
old_decider_func = """function computeDeciderSetProb(sim, bestOf) {\n try {\n if (!sim || !sim.totalRuns || !sim.setScores) return NaN;\n if (bestOf === 5) {\n return ((sim.setScores["3-2"] || 0) + (sim.setScores["2-3"] || 0)) / sim.totalRuns;\n }\n // default Bo3\n return ((sim.setScores["2-1"] || 0) + (sim.setScores["1-2"] || 0)) / sim.totalRuns;\n } catch(e) { return NaN; }\n}\n"""
new_decider_func = """function computeDeciderSetProb(sim, bestOf) {\n try {\n if (!sim) return NaN;\n if (bestOf === 3) {\n if (sim._fullBimodal && Number.isFinite(sim._fullBimodal.pDeciderAuth)) {\n return clamp01(sim._fullBimodal.pDeciderAuth);\n }\n if (Number.isFinite(sim.pDeciderAuth)) {\n return clamp01(sim.pDeciderAuth);\n }\n }\n if (!sim.totalRuns || !sim.setScores) return NaN;\n if (bestOf === 5) {\n return ((sim.setScores["3-2"] || 0) + (sim.setScores["2-3"] || 0)) / sim.totalRuns;\n }\n return ((sim.setScores["2-1"] || 0) + (sim.setScores["1-2"] || 0)) / sim.totalRuns;\n } catch(e) { return NaN; }\n}\n"""
must_replace(old_decider_func, new_decider_func, count=1)
9) Add pDeciderAuth and vetoSets to computeFullBimodal.
must_replace(
""" mcDist: null\n };\n""",
""" mcDist: null,\n pDeciderAuth: NaN,\n vetoSets: false\n };\n""",
count=1)
must_replace(
""" var biResult = _computeBimodalScore(\n p3, splitGap, med2, med3, modeAdj,\n valleyCentralMass, leftTail, rightTail,\n lmp, tourK, p3Raw\n );\n var finalIsSplitGap = (biResult.label === 'BIMODAL' || biResult.label === 'SOFT');\n""",
""" var biResult = _computeBimodalScore(\n p3, splitGap, med2, med3, modeAdj,\n valleyCentralMass, leftTail, rightTail,\n lmp, tourK, p3Raw\n );\n var pDeciderAuth = Number.isFinite(p3) ? clamp01(p3) : (Number.isFinite(p3Raw) ? clamp01(p3Raw) : NaN);\n var vetoSets = false;\n if ((biResult.label === 'BIMODAL' || biResult.label === 'FRAGILE') &&\n Number.isFinite(pDeciderAuth) && pDeciderAuth > 0.30 && pDeciderAuth < 0.45) {\n vetoSets = true;\n }\n var finalIsSplitGap = (biResult.label === 'BIMODAL' || biResult.label === 'SOFT');\n""",
count=1)
must_replace(
""" mcDist: mcDist\n };\n}\n""",
""" mcDist: mcDist,\n pDeciderAuth: pDeciderAuth,\n vetoSets: vetoSets\n };\n}\n""",
count=1)
10) Store canonical decider back on sim after full bimodal build.
must_replace(
""" var _fullBi = computeFullBimodal(sim, marketLine, tourLabel, bo);\n sim._fullBimodal = _fullBi;\n""",
""" var _fullBi = computeFullBimodal(sim, marketLine, tourLabel, bo);\n sim._fullBimodal = _fullBi;\n if (_fullBi && Number.isFinite(_fullBi.pDeciderAuth)) sim.pDeciderAuth = _fullBi.pDeciderAuth;\n""",
count=1)
11) Build sets engine config with canonical p3 and 32k thresholds.
must_replace(
""" var tourK = 'ATP';\n try { tourK = taperTourKey(ctx.tourLabel); } catch (_eTK) { tourK = 'ATP'; }\n var tourCfg = setsMarketTourCfg(ctx.tourLabel); // baseP3, maxP3, holdLo/Hi, …\n var cal32k = get32kCalibration(tourK); // mvtDecHigh, mvtDecMid, mvtDecLow\n var cfg = {\n""",
""" var tourK = 'ATP';\n try { tourK = taperTourKey(ctx.tourLabel); } catch (_eTK) { tourK = 'ATP'; }\n var tourCfg = setsMarketTourCfg(ctx.tourLabel); // baseP3, maxP3, holdLo/Hi, …\n var cal32k = get32kCalibration(tourK); // mvtDecHigh, mvtDecMid, mvtDecLow\n var bimodal = (ctx && ctx.bimodal) ? ctx.bimodal : ((ctx && ctx._fullBimodal) ? ctx._fullBimodal : null);\n var cfg = {\n""",
count=1)
must_replace(
""" // Compute derived thresholds\n cfg.p3BetThr = Math.max(cfg.maxP3 * 0.83, cfg.calHigh + 0.02);\n cfg.p3LeanThr = Math.max(cfg.maxP3 * 0.60, cfg.baseP3, cfg.calMid);\n // ===========================================================================\n // SECTION 2 — SOURCE EXTRACTION\n var p2Raw = clamp01(a20 + b20);\n var p3Raw = clamp01(a21 + b21);\n // Primary source: calibrated display p3\n var p3Primary;\n if (Number.isFinite(ctx.deciderDisplay)) {\n p3Primary = clamp01(ctx.deciderDisplay);\n } else if (Number.isFinite(ctx.deciderAdj)) {\n p3Primary = clamp01(ctx.deciderAdj);\n } else if (Number.isFinite(ctx.deciderRaw)) {\n p3Primary = clamp01(ctx.deciderRaw);\n try {\n var _fbDisp = clusterDisplayP3({\n tourLabel: ctx.tourLabel,\n pDecider: p3Primary,\n pDeciderRaw: p3Primary,\n pDeciderAdj: p3Primary,\n holdA: ctx.holdA,\n holdB: ctx.holdB\n });\n if (Number.isFinite(_fbDisp)) p3Primary = clamp01(_fbDisp);\n } catch (_eFBD) { }\n } else {\n p3Primary = p3Raw;\n }\n""",
""" // Compute derived thresholds\n cfg.p3BetThr = Math.max(cfg.maxP3 - 0.02, cfg.calHigh - 0.02);\n cfg.p3LeanThr = Math.max(cfg.baseP3 + 0.06, cfg.calMid);\n cfg.minDeciderThr = cfg.calLow - 0.03;\n cfg.p2LeanThr = 1 - cfg.p3LeanThr;\n cfg.p2BetThr = 1 - cfg.p3LeanThr + 0.04;\n // ===========================================================================\n // SECTION 2 — SOURCE EXTRACTION\n var p3Raw = NaN;\n if (bimodal && Number.isFinite(bimodal.pDeciderAuth)) {\n p3Raw = clamp01(bimodal.pDeciderAuth);\n } else if (Number.isFinite(ctx.deciderDisplay)) {\n p3Raw = clamp01(ctx.deciderDisplay);\n } else if (Number.isFinite(ctx.deciderAdj)) {\n p3Raw = clamp01(ctx.deciderAdj);\n } else if (Number.isFinite(ctx.deciderRaw)) {\n p3Raw = clamp01(ctx.deciderRaw);\n } else {\n p3Raw = clamp01(a21 + b21);\n }\n p3Raw = clamp(p3Raw, tourCfg.minP3, tourCfg.maxP3);\n var p2Raw = clamp01(1 - p3Raw);\n var p3Primary = p3Raw;\n""",
count=1)
12) Tune sets can3Bet formula and veto after decision.
must_replace(
""" var can3Bet = !hardSweep3Kill && !minDecider3Kill\n && (p3Final >= cfg.p3BetThr + riskPenalty3)\n && (sup3Count >= 2)\n && (agreementLevel !== 'DISAGREE');\n""",
""" var can3Bet = !hardSweep3Kill && !minDecider3Kill\n && (p3Final >= cfg.p3BetThr + riskPenalty3)\n && (sup3Count >= 2)\n && (agreementLevel !== 'DISAGREE' || p3Final >= 0.66);\n""",
count=1)
must_replace(
""" out.setsPick = setsPick;\n out.setsConfidence = capConfByRead(setsConfidence, displayConf);\n""",
""" if (bimodal && bimodal.vetoSets && setsConfidence !== 'HIGH') {\n setsPick = 'PASS';\n setsConfidence = 'NONE';\n }\n out.setsPick = setsPick;\n out.setsConfidence = (setsConfidence === 'NONE') ? 'NONE' : capConfByRead(setsConfidence, displayConf);\n""",
count=1)
13) Prefer canonical bimodal decider when available in the lightweight sets O/U helper.
must_replace(
""" if (!sim || !sim.totalRuns || !sim.setScores) return '';\n var mk = buildSetsMarketEngine({\n""",
""" if (!sim || !sim.totalRuns || !sim.setScores) return '';\n try {\n if (!sim._fullBimodal || !Number.isFinite(sim._fullBimodal.pDeciderAuth)) {\n sim._fullBimodal = computeFullBimodal(sim, NaN, tourLabel, bo);\n }\n if (sim._fullBimodal && Number.isFinite(sim._fullBimodal.pDeciderAuth)) sim.pDeciderAuth = sim._fullBimodal.pDeciderAuth;\n } catch(_eMkBi) {}\n var mk = buildSetsMarketEngine({\n""",
count=1)
must_replace(
""" deciderAdj: (bo === 3 && Number.isFinite(sim.pDeciderAdj)) ? Number(sim.pDeciderAdj) : NaN,\n""",
""" deciderAdj: (bo === 3 && Number.isFinite(sim.pDeciderAdj)) ? Number(sim.pDeciderAdj) : NaN,\n deciderDisplay: (bo === 3 && sim._fullBimodal && Number.isFinite(sim._fullBimodal.pDeciderAuth)) ? Number(sim._fullBimodal.pDeciderAuth) : NaN,\n bimodal: sim._fullBimodal || null,\n""",
count=1)
14) Prefer canonical bimodal decider in preview sets header and sets preview.
must_replace(
""" var _pvCoinflipHdr = !!(_pvDecision && _pvDecision.classification === "PASS" && _pvThinWinner && (_pvDecision.structuralCoinFlip || _pvDecision.weakDataPolicy || _pvDecision.edgeAbs <= 0.05));\n""",
""" var winnerEdgePreview = Math.abs(Number.isFinite(_pvDecision && _pvDecision.marketEdge) ? Number(_pvDecision.marketEdge) : (edge !== null ? edge / 100 : pickConfidence));\n var winnerRiskPenalty = (Number.isFinite(matchVolatility) ? clamp01(matchVolatility) : 0) * 0.025;\n var winnerConf = confFromEdge(winnerEdgePreview, winnerRiskPenalty);\n var finalWinnerPick = _guardPick((_pvDecision && _pvDecision.classification !== "PASS") ? String(_pvDecision.pickSide || '') : '', winnerEdgePreview, winnerConf);\n if (!finalWinnerPick && _pvDecision && _pvDecision.classification !== "PASS") {\n _pvDecision.classification = "PASS";\n _pvDecision.pickLabel = "PASS";\n }\n var _pvCoinflipHdr = !!(_pvDecision && _pvDecision.classification === "PASS" && _pvThinWinner && (_pvDecision.structuralCoinFlip || _pvDecision.weakDataPolicy || _pvDecision.edgeAbs <= 0.05));\n""",
count=1)
must_replace(
""" var _pvConfStr = (_pvDecision.classification === "PRIMARY") ? "HIGH" :\n (_pvDecision.classification === "LEAN") ? (_pvDecision.fragileFavorite ? "LOW" : "MID") :\n (_pvDecision.classification === "LIVE_DOG") ? "HIGH" : confStr;\n""",
""" var _pvConfStr = (winnerConf && winnerConf !== 'NONE') ? winnerConf : 'LOW';\n""",
count=1)
must_replace(
""" var _setsPreview = buildSetsMarketEngine({\n""",
""" try {\n if (_totSim && (!_totSim._fullBimodal || !Number.isFinite(_totSim._fullBimodal.pDeciderAuth))) {\n _totSim._fullBimodal = computeFullBimodal(_totSim, marketLine, tourLabel, bo);\n }\n if (_totSim && _totSim._fullBimodal && Number.isFinite(_totSim._fullBimodal.pDeciderAuth)) {\n _totSim.pDeciderAuth = _totSim._fullBimodal.pDeciderAuth;\n }\n } catch(_eTotBiPreview) {}\n var _setsPreview = buildSetsMarketEngine({\n""",
count=1)
must_replace(
""" deciderDisplay: (bo === 3) ? clusterDisplayP3({ tourLabel: tourLabel, pDecider: deciderPct, pDeciderRaw: deciderPct, pDeciderAdj: _p3setAdj, holdA: hA, holdB: hB }) : NaN,\n""",
""" deciderDisplay: (bo === 3 && _totSim && _totSim._fullBimodal && Number.isFinite(_totSim._fullBimodal.pDeciderAuth)) ? _totSim._fullBimodal.pDeciderAuth : ((bo === 3) ? clusterDisplayP3({ tourLabel: tourLabel, pDecider: deciderPct, pDeciderRaw: deciderPct, pDeciderAdj: _p3setAdj, holdA: hA, holdB: hB }) : NaN),\n bimodal: (_totSim && _totSim._fullBimodal) ? _totSim._fullBimodal : null,\n""",
count=1)
must_replace(
""" appendSetsMarketBlock(lines, eDice + " Sets Market:", _setsPreview);\n""",
""" var setsSide = '';\n if (_setsPreview && _setsPreview.available && _setsPreview.setsPick) {\n var _setsPickUpper = String(_setsPreview.setsPick).toUpperCase();\n if (_setsPickUpper.indexOf('3 SETS') >= 0) setsSide = '3 SETS';\n else if (_setsPickUpper.indexOf('2 SETS') >= 0) setsSide = '2 SETS';\n }\n var setsProb = NaN;\n if (setsSide === '3 SETS') setsProb = Number(_setsPreview && _setsPreview.p3);\n else if (setsSide === '2 SETS') setsProb = Number(_setsPreview && _setsPreview.p2);\n var setsEdge = Number.isFinite(setsProb) ? Math.abs(setsProb - 0.5) : NaN;\n var setsRiskPenalty = (_setsPreview && String(_setsPreview.riskTag || '').toUpperCase() === 'POLICY_RISK') ? 0.02 : 0;\n var setsConf = confFromEdge(setsEdge, setsRiskPenalty);\n var finalSetsPick = _guardPick(setsSide, setsEdge, setsConf);\n if (!finalSetsPick && _setsPreview) {\n _setsPreview.setsPick = 'PASS';\n _setsPreview.setsConfidence = 'NONE';\n } else if (_setsPreview) {\n _setsPreview.setsConfidence = setsConf;\n }\n appendSetsMarketBlock(lines, eDice + " Sets Market:", _setsPreview);\n""",
count=1)
15) Apply totals guard just before totals display meta is built.
must_replace(
"""var _totReasonNice = prettyTotalsReason(_totReason);\nvar _totDisplayMeta = buildTotalsDisplayMeta(totDecision);\n""",
"""var _totReasonNice = prettyTotalsReason(_totReason);\nvar totalsSide = (String(totDecision).indexOf('UNDER') >= 0) ? 'UNDER' : ((String(totDecision).indexOf('OVER') >= 0) ? 'OVER' : '');\nvar totalsEdge = Math.abs((Number.isFinite(totConfProb) ? Number(totConfProb) : (Number.isFinite(_pOverEvalForConf) ? Number(_pOverEvalForConf) : 0.5)) - 0.5);\nvar totalsRiskPenalty = (_totCtx && Number.isFinite(_totCtx.totalsConfPenalty)) ? Number(_totCtx.totalsConfPenalty) : 0;\nvar totalsConfUnified = confFromEdge(totalsEdge, totalsRiskPenalty);\nvar finalTotalsPick = _guardPick(totalsSide, totalsEdge, totalsConfUnified);\nif (!finalTotalsPick) {\n totDecision = 'PASS';\n totConf = 'NONE';\n} else {\n totConf = totalsConfUnified;\n}\nvar _totDisplayMeta = buildTotalsDisplayMeta(totDecision);\n""",
count=1)
16) Ensure preview sets header also gets canonical bimodal when possible.
must_replace(
""" var _pvSetsHdr = buildSetsMarketEngine({\n""",
""" try {\n if (_totSim && (!_totSim._fullBimodal || !Number.isFinite(_totSim._fullBimodal.pDeciderAuth))) {\n _totSim._fullBimodal = computeFullBimodal(_totSim, marketLine, tourLabel, bo);\n }\n if (_totSim && _totSim._fullBimodal && Number.isFinite(_totSim._fullBimodal.pDeciderAuth)) {\n _totSim.pDeciderAuth = _totSim._fullBimodal.pDeciderAuth;\n }\n } catch(_ePvBiHdr) {}\n var _pvSetsHdr = buildSetsMarketEngine({\n""",
count=1)
must_replace(
""" deciderAdj: (bo === 3) ? _p3setAdj : NaN,\n""",
""" deciderAdj: (bo === 3) ? _p3setAdj : NaN,\n deciderDisplay: (bo === 3 && _totSim && _totSim._fullBimodal && Number.isFinite(_totSim._fullBimodal.pDeciderAuth)) ? _totSim._fullBimodal.pDeciderAuth : NaN,\n bimodal: (_totSim && _totSim._fullBimodal) ? _totSim._fullBimodal : null,\n""",
count=1)
17) Also wire canonical bimodal into secondary sets market block in FINAL_BET_SUMMARY.
must_replace(
""" deciderAdj: (bo === 3 && sim && Number.isFinite(sim.pDeciderAdj)) ? Number(sim.pDeciderAdj) : NaN,\n""",
""" deciderAdj: (bo === 3 && sim && Number.isFinite(sim.pDeciderAdj)) ? Number(sim.pDeciderAdj) : NaN,\n deciderDisplay: (bo === 3 && sim && sim._fullBimodal && Number.isFinite(sim._fullBimodal.pDeciderAuth)) ? Number(sim._fullBimodal.pDeciderAuth) : NaN,\n bimodal: (sim && sim._fullBimodal) ? sim._fullBimodal : null,\n""",
count=1)
if text == orig:
raise RuntimeError('No changes made')
path.write_text(text, encoding='utf-8')
print('Patched successfully')
PY
python3 /mnt/data/patch_tennislocks.py
Thought for 10m 10s