Here's every single patch with the **exact full li...
Criado em: 13 de março de 2026
Respondido usando GPT-5.4 Thinking por Chat01
Criado em: 13 de março de 2026
Respondido usando GPT-5.4 Thinking por Chat01
Here's every single patch with the exact full line from your script — all tours included. Just Ctrl+F each FIND string and swap it.
FIND:
var _blEloCap = _blIsWta ? 0.20 : _blIsCh ? 0.22 : 0.25;
REPLACE:
var _blEloCap = _blIsWta ? 0.18 : _blIsCh ? 0.19 : 0.22;
FIND:
var _targetE = Math.min(_wE, 0.05);
REPLACE:
var _targetE = Math.min(_wE, 0.03);
FIND:
var _targetE_pb = Math.min(wElo, 0.05);
REPLACE:
var _targetE_pb = Math.min(wElo, 0.03);
FIND:
var _wSum = _wM + _wS + _wE + _wF_mp;
REPLACE (add the cap line right above it):
text_wE = Math.min(_wE, 0.22); var _wSum = _wM + _wS + _wE + _wF_mp;
FIND:
var _p3MmC = (_p3TK === 'WTA') ? 0.20 : (_p3TK === 'CH') ? 0.18 : 0.16;
REPLACE:
var _p3MmC = (_p3TK === 'WTA') ? 0.12 : (_p3TK === 'CH') ? 0.11 : 0.10;
FIND:
var _p3ClP = (_p3TK === 'WTA') ? 0.03 : (_p3TK === 'CH') ? 0.028 : 0.025;
REPLACE:
var _p3ClP = (_p3TK === 'WTA') ? 0.015 : (_p3TK === 'CH') ? 0.012 : 0.012;
FIND:
var _mpMmC = (_mpTK === 'WTA') ? 0.20 : (_mpTK === 'CH') ? 0.18 : 0.16;
REPLACE:
var _mpMmC = (_mpTK === 'WTA') ? 0.12 : (_mpTK === 'CH') ? 0.11 : 0.10;
FIND:
var _mpClP = (_mpTK === 'WTA') ? 0.03 : (_mpTK === 'CH') ? 0.028 : 0.025;
REPLACE:
var _mpClP = (_mpTK === 'WTA') ? 0.015 : (_mpTK === 'CH') ? 0.012 : 0.012;
FIND:
var _mpMmCWin = (_mpTKWin === 'WTA') ? 0.20 : (_mpTKWin === 'CH') ? 0.18 : 0.16;
REPLACE:
var _mpMmCWin = (_mpTKWin === 'WTA') ? 0.12 : (_mpTKWin === 'CH') ? 0.11 : 0.10;
FIND:
var _mpClPWin = (_mpTKWin === 'WTA') ? 0.03 : (_mpTKWin === 'CH') ? 0.028 : 0.025;
REPLACE:
var _mpClPWin = (_mpTKWin === 'WTA') ? 0.015 : (_mpTKWin === 'CH') ? 0.012 : 0.012;
This is the biggest bug — the formula penalizes coinflips instead of mismatches.[1]
FIND (2 lines together):
textvar _set3PenMP = _mpClP * _closeMP; var _pAdjMP = _pDecRawMP * (1 - _mpMmC * _mmMP) - _set3PenMP;
REPLACE:
textvar _set3PenMP = _mpClP * (1 - _closeMP); var _favWpMP = Math.max(Number(_pSeedMP) || 0.5, 1 - (Number(_pSeedMP) || 0.5)); var _shouldCompressMP = (_favWpMP > 0.70) || (_mmMP > 0.60); var _pAdjMP = _shouldCompressMP ? clamp01(_pDecRawMP * (1 - _mpMmC * _mmMP) - _set3PenMP) : _pDecRawMP;
FIND (2 lines together):
textvar _set3PenWin = _mpClPWin * _closeWin; _p3AdjWin = clamp01(_pDecRawMkWin * (1 - _mpMmCWin * _mmWin) - _set3PenWin);
REPLACE:
textvar _set3PenWin = _mpClPWin * (1 - _closeWin); var _favWpWin = Math.max(Number(_pSeedWin) || 0.5, 1 - (Number(_pSeedWin) || 0.5)); var _shouldCompressWin = (_favWpWin > 0.70) || (_mmWin > 0.60); _p3AdjWin = _shouldCompressWin ? clamp01(_pDecRawMkWin * (1 - _mpMmCWin * _mmWin) - _set3PenWin) : _pDecRawMkWin;
FIND (3 lines together):
textvar disp = (0.65 * adj) + (0.35 * raw); if (raw >= liveGate && drag >= 0.04) { disp = Math.max(disp, adj + 0.35 * drag); }
REPLACE:
textvar disp = (0.45 * adj) + (0.55 * raw); if (drag > 0.06) { disp = Math.max(disp, 0.85 * raw); } if (raw >= liveGate && drag >= 0.04) { disp = Math.max(disp, adj + 0.40 * drag); }
FIND:
: ((sim && Number.isFinite(_totSim.pDecider)) ? _totSim.pDecider : 0);
REPLACE:
: ((sim && Number.isFinite(sim.pDecider)) ? sim.pDecider : 0);
This isn't a value change — it's a whitespace fix. Around line ~16735 in runMatchSimulation_Exact, there's a block at column 0 that should be indented 2 spaces. Search for this block starting at column 0:
textvar _tourK = _taperTourKey_(tourLabel); var _mIdx = _mismatchIdxFromSeeds_(opts, hA, hB, tourLabel); // base correlation var SET_DELTA_MP = 0.03; // in heavy mismatches: slightly more correlation => more 2-0 sweeps (lower totals mean) if (_mIdx >= 0.65) {
Add 2 spaces to the start of EVERY line in that block (from var _tourK through the closing } of the else if branch). The block ends at:
}
after SET_DELTA_MP = 0.03 + (_dBoostMP * 0.65) * _dScaleMP;
Every line in that block needs (2 spaces) prepended. They're inside runMatchSimulation_Exact but lost their indentation.
Same issue exists in other spots — any line at column 0 that references statsA, statsB, hA, hB, tourLabel, _totSim, gamesListAdj, displayProbA, _sqsTourInfo, or bestOf that isn't a function declaration needs to be indented to match surrounding lines.
| Patch | What | Why It Matters |
|---|---|---|
| 1.1 | Elo cap 0.20/0.22/0.25 → 0.18/0.19/0.22 | MATCH_PICK was using old values, inflating taper seed |
| 1.2 | targetE 0.05 → 0.03 | Disagreement wasn't penalizing Elo enough |
| 1.2b | Prop targetE 0.05 → 0.03 | Same fix in prop blend path |
| 1.3 | Hard cap wE at 0.22 | Missing in MATCH_PICK (already in MATCH_PREVIEW) |
| 5a-5c | MmC 0.20/0.18/0.16 → 0.12/0.11/0.10 | Compression was 2x too strong for all tours |
| 5a-5c | ClP 0.03/0.028/0.025 → 0.015/0.012/0.012 | Closeness penalty 2x too strong for all tours |
| 6a-6b | _closeMP → (1 - _closeMP) | BIGGEST BUG — was penalizing coinflips not mismatches |
| 6a-6b | Mismatch gate favWp > 0.70 | Skips ALL compression for favorites below 70% |
| 7 | Display blend 65/35 → 45/55 + 85% floor | Crushed adj was dragging display too low |
| 8 | _totSim.pDecider → sim.pDecider | Wrong variable in fallback = undefined |
| 9 | 0-indent lines need 2-space indent | Causes _mIdx is not defined crash in GAS V8 |
Based on my full audit, here are all patches — your 5 specified ones that are still missing, plus the 8 additional bugs I found. I'll give you exact FIND → REPLACE for each.
Location: MATCHPICK blend path, around character 558348
FIND:
var _blEloCap = _blIsWta ? 0.20 : _blIsCh ? 0.22 : 0.25;
REPLACE WITH:
var _blEloCap = _blIsWta ? 0.18 : _blIsCh ? 0.19 : 0.22;
Location: Same MATCHPICK blend block, inside the neutrality compression if (Math.abs(...) < _blNeutBand) branch
FIND:
var _targetE = Math.min(_wE, 0.05);
REPLACE WITH:
var _targetE = Math.min(_wE, 0.03);
Location: Same MATCHPICK blend block, right before the var _wSum = _wM + _wS + _wE + _wFmp line
FIND:
var _wSum = _wM + _wS + _wE + _wFmp;
REPLACE WITH:
text_wE = Math.min(_wE, 0.22); var _wSum = _wM + _wS + _wE + _wFmp;
Location: Inside simulateSet(), around character 312980
FIND:
textvar _tankMiFloor = _tankIsWta ? 0.50 : _tankIsCh ? 0.51 : _tankIsItf ? 0.51 : 0.52; var _tankMiRange = _tankIsWta ? 0.28 : _tankIsCh ? 0.29 : _tankIsItf ? 0.31 : 0.30;
REPLACE WITH:
textvar _tankMiFloor = _tankIsWta ? 0.56 : _tankIsCh ? 0.59 : _tankIsItf ? 0.58 : 0.58; var _tankMiRange = _tankIsWta ? 0.32 : _tankIsCh ? 0.31 : _tankIsItf ? 0.32 : 0.30;
This is a huge one — with the old floor of 0.50, a 64% WTA favorite maps to tankMismatchIdx ≈ 0.50, which fires tanking at a 2-game deficit. With the fix it maps to ≈ 0.25, which means tanking stays dormant for moderate favorites.[1]
Location: Around character 800476, inside the main MATCHPICK totals Markov adjustment
FIND:
textvar _mpMmC = (_mpTK === 'WTA') ? 0.20 : (_mpTK === 'CH') ? 0.18 : 0.16; var _mpClP = (_mpTK === 'WTA') ? 0.03 : (_mpTK === 'CH') ? 0.028 : 0.025;
REPLACE WITH:
textvar _mpMmC = (_mpTK === 'WTA') ? 0.12 : (_mpTK === 'CH') ? 0.11 : 0.10; var _mpClP = (_mpTK === 'WTA') ? 0.015 : (_mpTK === 'CH') ? 0.012 : 0.012;
This is the direct cause of your adj 26.6%. The 0.20 compression coefficient crushes p3 by 20% × mismatchIdx. After this fix, for a 64% WTA favorite, compression drops from ~8pp to ~3pp.[1]
Location: Around character 572084, inside the winner engine p3 calculation (_mpMmCWin)
FIND:
textvar _mpMmCWin = (_mpTKWin === 'WTA') ? 0.20 : (_mpTKWin === 'CH') ? 0.18 : 0.16; var _mpClPWin = (_mpTKWin === 'WTA') ? 0.03 : (_mpTKWin === 'CH') ? 0.028 : 0.025;
REPLACE WITH:
textvar _mpMmCWin = (_mpTKWin === 'WTA') ? 0.12 : (_mpTKWin === 'CH') ? 0.11 : 0.10; var _mpClPWin = (_mpTKWin === 'WTA') ? 0.015 : (_mpTKWin === 'CH') ? 0.012 : 0.012;
Same fix as Patch 5 but in the winner-engine's p3 calculation. Without this, the winner decision sees a wrong p3 and HEAVYDECIDER fires incorrectly.[1]
Location: Search for _p3MmC = (_p3TK
FIND:
textvar _p3MmC = (_p3TK === 'WTA') ? 0.20 : (_p3TK === 'CH') ? 0.18 : 0.16; var _p3ClP = (_p3TK === 'WTA') ? 0.03 : (_p3TK === 'CH') ? 0.028 : 0.025;
REPLACE WITH:
textvar _p3MmC = (_p3TK === 'WTA') ? 0.12 : (_p3TK === 'CH') ? 0.11 : 0.10; var _p3ClP = (_p3TK === 'WTA') ? 0.015 : (_p3TK === 'CH') ? 0.012 : 0.012;
The closeness variable (_closeMP) equals 1 - |pSeed - 0.5| / 0.5, meaning close matches = HIGH value. Using it directly as a penalty multiplier means close matches get penalized MORE. That's backwards.
Location 1: Around character 800645
FIND:
_set3PenMP = _mpClP * _closeMP;
REPLACE WITH:
_set3PenMP = _mpClP * (1 - _closeMP);
Location 2: Around character 572267
FIND:
_set3PenWin = _mpClPWin * _closeWin;
REPLACE WITH:
_set3PenWin = _mpClPWin * (1 - _closeWin);
The p3 correction block already does this correctly with (1 - _closeP3) — the other two just have the bug.[1]
Location: Inside function _clusterDisplayP3_(ctx), around character 605870
FIND:
textvar disp = (0.65 * adj) + (0.35 * raw); if (raw >= liveGate && drag >= 0.04) { disp = Math.max(disp, adj + 0.35 * drag); }
REPLACE WITH:
textvar disp = (0.55 * adj) + (0.45 * raw); if (raw >= liveGate && drag >= 0.04) { disp = Math.max(disp, adj + 0.55 * drag); }
For Noskova before: 0.65×0.27 + 0.35×0.42 = 0.3225. The recovery max was also 0.27 + 0.35×0.15 = 0.3225. Both paths gave the exact same number, making recovery useless.
After fix: 0.55×0.27 + 0.45×0.42 = 0.3375. Recovery: 0.27 + 0.55×0.15 = 0.3525. Now recovery adds +3pp.[1]
Location: Inside matchOutcomeProbs(), around character 327751
FIND:
text} else if (_moMismatchIdx >= 0.15) { var _deltaScale = (_moMismatchIdx - 0.15) / 0.50;
REPLACE WITH:
text} else if (_moMismatchIdx >= 0.30) { var _deltaScale = (_moMismatchIdx - 0.30) / 0.50;
With the new miFloor, a 64% WTA favorite has mismatchIdx ≈ 0.25. The old gate at 0.15 meant this fires and boosts set-momentum delta, which compounds set-1 winner advantage → fewer 3-setters. Raising to 0.30 keeps moderate favorites out of the ramp.[1]
Location: Same matchOutcomeProbs() block, right after Patch 10
FIND:
SET_CONFIDENCE_DELTA = 0.03 + _deltaBoost * _deltaScale;
REPLACE WITH:
SET_CONFIDENCE_DELTA = 0.03 + _deltaBoost * _deltaScale * 0.65;
This applies the 0.65× scaling factor from Patch 4.2 in your instruction file. Without it, when the ramp DOES fire (for true mismatches 73%+), it still ramps too aggressively.[1]
Location: Search for _histA = _readSurfaceHistory_, around character 831616
FIND:
_histA = _readSurfaceHistory_(A, 'A', _histTourInfo);
REPLACE WITH:
text_histA = _readSurfaceHistory_(A, 'A', _histTourInfo); if (_histA === undefined) _histA = null;
And same for _histB:
FIND:
_histB = _readSurfaceHistory_(B, 'B', _histTourInfo);
REPLACE WITH:
text_histB = _readSurfaceHistory_(B, 'B', _histTourInfo); if (_histB === undefined) _histB = null;
The _readSurfaceHistory_ function can fall through its try/catch without returning, which gives undefined. The downstream display check Number.isFinite(_histA) handles NaN and null, but undefined prints literally as "undefined".[1]
| Metric | Before | After All Patches |
|---|---|---|
| Mismatch Index | ~0.25 | ~0.25 (unchanged, already patched) |
| Tank Mismatch (simulateSet) | ~0.50 ❌ | ~0.25 ✅ |
| Raw MC P3 | 41.8% | ~43–44% |
| Markov Adj P3 | 26.6% | ~37–39% |
| Display P3 | 31.9% | ~38–41% |
| SET_CONFIDENCE_DELTA | ~0.035 | 0.030 (base, no ramp) |
| Set-2 Loser Hold Penalty | tanking active | tanking dormant |
The cascade was: stale tank floor inflated raw suppression → old Markov compression crushed adj to 26.6% → inverted closeness penalty made it worse → weak display drag couldn't recover → display locked at 31.9%. Fixing all 12 patches breaks every link in that chain.[1]
Sources
Update my script with all 20+ plus patches don’t skip the patches
Send the updated script as a downloadable txt link