Updating script with user’s corrections
I see that the user wants to update their script with specific changes, such as modifying line 7270, adjusting momentum settings, and fixing the recursive bug. I'll review the uploaded file, apply these fixes, and ensure syntax issues are addressed. Once ready, I'll provide the updated file as a downloadable text.
Checking JS syntax and identifying issues
I’m planning to check the JS syntax using the node --check command, even though it's for Apps Script (ES5). For undefined variables, I might run some static scanning or use ESLint, though it's not installed. I’ll load the file and search for key sections like simHA, contextAdjustedSPW, and SET_CONFIDENCE_DELTA.
{"queries":["Update my script with corrections then send it as a downloadable txt link and after making corrections check for syntax and undefined issues.","simHA_totals simHB_totals Markov Line simHA simHB line 7270","matchOutcomeProbs SET_CONFIDENCE_DELTA 0.06 0.02 momentum","matchupAdjustedSPW contextAdjustedSPW applyPreSimulationAdjustments WTA 0.97 multiplier","BTMS Bradley-Terry Stochastic Block Model tier penalty tier shift simHA_totals sandbox"] ,"source_filter":["files_uploaded_in_conversation"]}
Addressing double dipping and adjusting pre-simulation logic
I’ve identified a potential issue in the code where multiple functions seem to apply the same pre-simulation adjustments. The function contextAdjustedSPW calls applyPreSimulationAdjustments and then other functions like matchupAdjustedSPW do the same. We need to ensure applyPreSimulationAdjustments is only called once on the base SPW—before any further adjustments—or check if it should come after.
{"queries":["applyPreSimulationAdjustments(","return applyPreSimulationAdjustments(adjustedSPW)","PLAYER_FS_GAMES_DIST applyPreSimulationAdjustments","validateBothPlayersData applyPreSimulationAdjustments rawA rawB","contextAdjustedSPW applyPreSimulationAdjustments double"] ,"source_filter":["files_uploaded_in_conversation"]}
Tracking down double dipping and redundant adjustments
It looks like there’s double dipping in the logic: contextAdjustedSPW is applying applyPreSimulationAdjustments, and then validateBothPlayersData does the same. This likely results in the WTA multiplier (and other adjustments) being applied multiple times. I'll need to check where computeHoldFromSPW is used to see if it's contributing to this issue.
{"queries":["function computeHoldFromSPW","computeHoldFromSPW applyPreSimulationAdjustments","WTA 0.97 multiplier computeHoldFromSPW","computeHoldFromSPW(', 'MATCH'","skipClassAdj true computeHoldFromSPW"] ,"source_filter":["files_uploaded_in_conversation"]}
Editing file and applying updates
I need to open the file and apply several fixes. First, I’ll search for the line using simHA and simHB (line 7270). Then, we need to address the momentum delta issue by searching for SET_CONFIDENCE_DELTA and double-check its usage at 0.06. Additionally, I’ll look into how applyPreSimulationAdjustments is used to fix the adjustment loop.
Revising approach for adjustments and context handling
I think the best solution is to modify contextAdjustedSPW not to call applyPreSimulationAdjustments but rather return the raw adjustedSPW first. Then, we apply the pre-simulation adjustments at the start while reading the SPW, with an optional flag. This would make sure the adjustments happen only once, and everything else aligns.
Addressing double-dipping in simulation adjustments
It looks like the simulation is using already pre-adjusted values for pA and pB, but the double-dipping problem arises when functions like validateBothPlayersData pass adjusted values into contextAdjustedSPW or applyPreSimulationAdjustments again. We need to review how validateBothPlayersData is used, especially in match preview and other functions, to see if the adjustments are applied multiple times. I'll explore the computeHoldFromSPW definition to check for additional adjustments.
bash -lc ls -l /mnt/data && sed -n '1,80p' /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt | head
Locating Markov-related lines
I’ll search the file using grep to find references to "MARKOV" and "simHA" around line 7270. The file is pretty large, with over 545k lines, so I’ll use grep -n to include line numbers and hone in on the exact lines I need. This should help pinpoint where the changes fit in.
bash -lc grep -n "Markov" -n /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt | head -n 20
Inspecting the Markov line
The Markov-related code appears to be around line 7901, likely within the MATCH_PREVIEW section after the BTMS shift. Since the file’s line numbers may differ, I'll focus on inspecting lines near 7901 to better understand the context, especially around the user-specified line 7270.
bash -lc sed -n '7840,7960p' /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt
Locating the Markov line code
It looks like the Markov cross-check involves using simHoldA and simHoldB, but those are derived before the BTMS shift, potentially in MATCH_PICK rather than MATCH_PREVIEW around line 7840. The user mentioned the Markov line uses simHA and simHB variables with tier penalties. We should search for "Markov Line" and "simHA_totals."
bash -lc grep -n "Markov.*Line" /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt | head -n 50
Inspecting Markov line code for totals
The "Markov/Dist fair total line" seems to be around line 11024. We should focus on modifying the code that sets _mkTot, possibly using simHA or simHA_totals. I'll check the code from line 10980 to 11040 to gather more details.
bash -lc sed -n '10940,11080p' /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt
Modifying Markov/Dist code to use totals
The code currently uses simHA and simHB in the matchOutcomeProbs function, but we should shift to using simHA_totals and simHB_totals for consistency with the totals sandbox. These are defined earlier with BTMS logic, so we can modify the code to conditionally use simHA_totals or hA accordingly. However, I’ll need to check for specific totals behavior in the MATCH_PREVIEW section.
Updating code for MATCH_PREVIEW and momentum hammer
In MATCH_PREVIEW, simHA_totals and simHB_totals are already clean and used correctly, so we’ll switch to those in the Markov/Dist totals section. The user's request to keep BTMS for match winners aligns with using simHA_totals in both the sandbox totals and Markov cross-check.
Now, to address the momentum hammer issue, I'll need to locate the SET_CONFIDENCE_DELTA constant and check where the 0.06 shift is applied. I'll search for that value in the relevant sections of the code.
bash -lc grep -n "SET_CONFIDENCE_DELTA" /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt | head -n 50
Adjusting momentum shift based on user preference
At line 3867, the momentum shift is set to 0.06, but we need to reduce it to 0.02 to align with totals. The user suggests this adjustment is optional, so I’m thinking we can adjust it for match outcome probabilities where it affects win probability. However, this may impact the blowout feature, which BTMS already manages. I'll review matchOutcomeProbs (lines 3800-3980) to refine this.
bash -lc sed -n '3780,3995p' /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt
Adjusting confidence delta for consistency across engines
The SET_CONFIDENCE_DELTA is currently set to 0.06 in matchOutcomeProbs, but to align with the competitive totals, we need to reduce it to 0.02 (or adjust based on the tour). The user suggests a slight variation—0.025 for WTA and 0.02 for ATP. We will implement this with a check for tourCode() to ensure the values match those in runMatchSimulation_Exact. This maintains consistency while giving WTA a slightly higher momentum shift.
Adjusting delta based on tour type and configuration
We'll base the momentum shift (SET_CONFIDENCE_DELTA) on tourCode() or getTourFromSheet(). If it's 'WTA,' the value will be 0.025, otherwise, 0.020. We need to ensure that the totals-only path respects this setting, potentially controlling momentum by modifying matchOutcomeProbs to accept an options object for this purpose. This way, we ensure consistency across both cross-checks and totals.
Extending signature for backward compatibility and flexibility
To support the optional sixth parameter (opts) for setDelta or setMomentumDelta, we can extend the signature while maintaining backward compatibility with five arguments. We can check for opts inside propConfig. If propConfig is present and valid, we can implement the desired behavior, allowing flexibility in disabling momentum or adjusting delta values based on the context.
Aligning momentum adjustments for winner and totals engines
The user wants the winner engine to use a momentum shift of 0.02, not 0.06. We can set the default to 0.02 and let users override it if needed. For the totals engine, we might allow a 0.0 or 0.02 value, keeping it optional and decoupling momentum.
Verifying computeHoldFromSPW function
The user mentioned various functions, like PLAYER_FS_GAMES_DIST, adjusting SPW, which could involve computeHoldFromSPW—likely applying tour or surface adjustments. Since I couldn’t find it through a search, I'll need to locate it manually and verify how it’s interacting with the logic.
bash -lc grep -n "function computeHoldFromSPW" -n /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt | head -n 20
bash -lc sed -n '8700,8850p' /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt
Preventing multiple pre-simulation adjustments
I’ve realized there might be some double counting because applyPreSimulationAdjustments is being called multiple times. This might happen when functions are passing SPW to contextAdjustedSPW, which doesn’t take SPW directly. I need to make sure the pre-simulation adjustments are applied only once, to avoid any overlapping effects from multiple calls.
Clarifying adjustments in SPW flow
It looks like computeHoldFromSPW doesn’t call applyPreSimulationAdjustments, implying the SPW should already have tour adjustments before being passed in. This means the multipliers like 0.97 are applied elsewhere, possibly in validateBothPlayersData. I need to verify if pA_adj is pre-adjusted before being passed to computeHoldFromSPW.
bash -lc grep -n "function _buildPropContext" -n /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt | head -n 20
bash -lc sed -n '8356,8455p' /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt
Checking double pre-simulation adjustments
It looks like validateBothPlayersData is just for validation in this context, not adjusting pA and pB. The applyPreSimulationAdjustments seems to be applied again, possibly leading to double adjustments. I'll need to check MATCH_PREVIEW where validateBothPlayersData is used to ensure no redundancy.
bash -lc grep -n "validateBothPlayersData" /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt | head -n 20
Inspecting MATCH_PREVIEW and related functions
I see there are more likely relevant lines around 9080 and 9194, especially in MATCH_PREVIEW and other functions. I’ll take a closer look at those sections to understand better how the logic flows and check for any potential issues.
bash -lc sed -n '9000,9145p' /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt
Analyzing pre-simulation adjustments and redundant variables
In P_blend, they call validateBothPlayersData and set pA and pB with pre-sim adjusted values. But then contextAdjustedSPW reads the raw SPW and applies applyPreSimulationAdjustments again. This means there’s redundant computation, but it shouldn't cause double counting. I’ll check getTheoreticalGameMetrics to find if it applies adjustments twice.
bash -lc grep -n "getTheoreticalGameMetrics" -n /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt | head -n 20
bash -lc sed -n '7009,7085p' /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt
Inspecting potential double application of adjustments
getTheoreticalGameMetrics doesn’t apply pre-sim adjustments, so SPW should already include the pre-adjustments. There’s no double-dipping in computeHoldFromSPW, but the user says matchupAdjustedSPW calls for adjustments twice. I’ll check validateBothPlayersData to clarify if it’s returning already adjusted values, which might lead to redundant adjustments later.
bash -lc sed -n '2060,2165p' /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt
Investigating usage of validation.pA and pB
It seems validateBothPlayersData applies pre-simulation adjustments to raw values, and many functions may later use validation.pA and validation.pB. I’ll search for where validation.pA is used to better understand how it's passed through the code, especially since P_blend doesn’t seem to pass them to contextAdjustedSPW.
bash -lc grep -n "validation.pA" /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt | head -n 40
Inspecting code around lines 9180-9240
I’ll check the code between lines 9180 and 9240 to see what’s happening in that area. It's likely a key part of the process that might shed light on any potential issues, especially in terms of how values get passed or adjusted through different functions.
bash -lc sed -n '9160,9250p' /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt
Inspecting code around lines 9280-9340
In the code, validateBothPlayersData returns pA and pB, but they aren't directly used. They are assigned but then overridden by contextAdjustedSPW, which reads SPW. There's a relevant code section at line 9321 that uses pA and pB. I'll check between lines 9280 and 9340 for more context.
bash -lc sed -n '9280,9350p' /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt
Inspecting MATCH_PREVIEW function and computeCoreContext
It looks like in the MATCH_PREVIEW function, validation.pA and validation.pB are assigned, but later pA_adj = contextAdjustedSPW('A') is used instead. This suggests that the original pA values might not be used. I’ll need to check if computeCoreContext is using validateBothPlayersData — it may be. I'll look at the code around line 6060.
bash -lc grep -n "function computeCoreContext" -n /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt | head -n 20
bash -lc sed -n '6236,6335p' /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt
Analyzing computeCoreContext’s influence on SPW adjustments
It looks like computeCoreContext adds a class-aware SPW shift due to Elo gap (up to +/-0.08), which might cause double adjustments—potentially leading to blowout. It’s separate from the BTMS tier shift and could introduce inconsistency. The user didn’t mention removing it, so I'll focus on addressing the other corrections they've outlined.
Considering potential double-counting of Elo adjustments
It seems like Elo adjustments might be applied twice: once in computeHoldFromSPW and again in computeCoreContext. However, the user hasn't flagged this as an issue, so it could be part of the intended double-dipping path. They mentioned functions adjusting multiple times, but I wonder if applyPreSimulationAdjustments should be outside contextAdjustedSPW.
Revising architecture to prevent recursive errors
Given that the user insists on a potential recursive bug, it's worth considering making applyPreSimulationAdjustments idempotent or implementing a flag to avoid double application, such as _preSimAdjustedCache. While it's tricky, they pointed out that applyPreSimulationAdjustments involves the WTA 0.97 multiplier and further adjustments, which could cause recursive issues in logic flow.
Clarifying adjustment order and potential issues
I need to check if pA/pB is being used downstream in functions expecting raw values, like for BTMS shifts of holds. The concern about double-dipping comes up because applyPreSimulationAdjustments is called within contextAdjustedSPW and might adjust values again downstream. As adjustments for surface or round factors occur, it's clear that applyPreSimulationAdjustments should be applied before computeHoldFromSPW.
Reworking adjustments to prevent redundant application
It looks like applyPreSimulationAdjustments might be applied redundantly if passed through both validateBothPlayersData and contextAdjustedSPW. To avoid double adjustments, I could consider removing it from validateBothPlayersData or making applyPreSimulationAdjustments idempotent. A simpler solution might be applying it only at the base stage like readSPW or validateBothPlayersData.
Identifying double opponent return adjustment
It seems that passing a pre-adjusted SPW avoids double application, but we still need to ensure pre-sim adjustments are consistently applied. Modifying validateBothPlayersData to return raw values could prevent redundant adjustments, but there appears to be a problem with repeated opponent return adjustments: matchupAdjustedSPW and computeHoldFromSPW both apply these adjustments, causing double-dipping. This could be the "recursive bug" the user mentioned.
Addressing double opponent return adjustment
The issue seems to be that multiple functions are applying the opponent return adjustment at different stages. matchupAdjustedSPW already adjusts for opponent return, then computeHoldFromSPW does it again, and computeCoreContext goes a step further. To fix it, I should ensure computeHoldFromSPW doesn't apply the adjustment if it's already included in the SPW.
Plan for adjusting opponent return and applying skipOppAdj
I'll add the skipOppAdj parameter with a default setting of false to handle double opponent return adjustments. This will be useful for callsites that already apply opponent adjustments externally, adjusting them to bypass internal adjustments when needed. I'll ensure that we manage the computeHoldFromSPW, computeCoreContext, and other related processes accordingly. Careful attention is necessary to not impact other calculations or break accuracy in the results.
bash -lc sed -n '9880,9965p' /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt
bash -lc grep -n "matchupAdjustedSPW('" /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt | head -n 50
bash -lc grep -n "matchupAdjustedSPW" /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt | tail -n 30
import re, pathlib, textwrap, json, os, sys, math
from pathlib import Path
src_path = Path("/mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_FIX.txt")
text = src_path.read_text(encoding="utf-8")
len(text), text[:200]
pattern = r"var _MO_TOT_MP = matchOutcomeProbs\(\(typeof simHA !== 'undefined' && Number\.isFinite\(simHA) ? simHA : hA), \(typeof simHB !== 'undefined' && Number\.isFinite\(simHB) ? simHB : hB), _startSrvMP, bestOf);"
m = re.search(pattern, text)
m.start() if m else None
m2 = re.search(r"var SET_CONFIDENCE_DELTA = 0.06;[^\n]*\n", text)
m2.group(0), m2.start()
m3 = re.search(r"function computeHoldFromSPWspw,side,phase,skipClassAdj{", text)
m3.start(), text[m3.start():m3.start()+80]
for s in ["computeHoldFromSPW(pA_adj, 'A', 'MATCH');", "computeHoldFromSPW(pB_adj, 'B', 'MATCH');", "computeHoldFromSPW(pA_adj, 'A', 'FS');", "computeHoldFromSPW(pB_adj, 'B', 'FS');"]:
print(s, text.count(s))
print(text.count("computeHoldFromSPW(matchupAdjustedSPW('A'), 'A', 'FS', true);"))
print(text.count("computeHoldFromSPW(matchupAdjustedSPW('B'), 'B', 'FS', true);"))
print(text.count("computeHoldFromSPW(matchupAdjustedSPW('A'),'A','FS',true);"))
print(text.count("computeHoldFromSPW(matchupAdjustedSPW('B'),'B','FS',true);"))
text.count("var hA = computeHoldFromSPW(useSpwA, 'A', 'FS', shouldSkipClassAdj);"), text.count("var hB = computeHoldFromSPW(useSpwB, 'B', 'FS', shouldSkipClassAdj);")
new_text = text
1) Markov/Dist totals uses totals sandbox holds
old_line = "var _MO_TOT_MP = matchOutcomeProbs(((typeof simHA !== 'undefined' && Number.isFinite(simHA)) ? simHA : hA), ((typeof simHB !== 'undefined' && Number.isFinite(simHB)) ? simHB : hB), _startSrvMP, bestOf);"
assert old_line in new_text
replacement_block = (
"var _holdA_tot_mp = ((typeof simHA_totals !== 'undefined' && Number.isFinite(simHA_totals)) ? simHA_totals : ((typeof simHoldA !== 'undefined' && Number.isFinite(simHoldA)) ? simHoldA : hA));\n"
" var _holdB_tot_mp = ((typeof simHB_totals !== 'undefined' && Number.isFinite(simHB_totals)) ? simHB_totals : ((typeof simHoldB !== 'undefined' && Number.isFinite(simHoldB)) ? simHoldB : hB));\n"
" var _MO_TOT_MP = matchOutcomeProbs(_holdA_tot_mp, _holdB_tot_mp, _startSrvMP, bestOf);"
)
new_text = new_text.replace(old_line, replacement_block, 1)
2) Momentum delta in matchOutcomeProbs
old_delta_line = "var SET_CONFIDENCE_DELTA = 0.06; // Restored from 0.02 to re-enable set momentum (blowouts/unders)\n"
assert old_delta_line in new_text
new_delta_block = (
" // NOTE (2026-02-21): Keep set-to-set momentum mild so Match Winner + Totals stay consistent.\n"
" // Default deltas match the totals simulation (runMatchSimulation_Exact): ATP 0.020, WTA 0.025.\n"
" // Override per-call via propConfig.setDelta or disable via propConfig.disableSetMomentum.\n"
" var _tourMO = tourCode();\n"
" var SET_CONFIDENCE_DELTA = (propConfig && propConfig.disableSetMomentum === true) ? 0 :\n"
" (propConfig && Number.isFinite(propConfig.setDelta)) ? Number(propConfig.setDelta) :\n"
" ((_tourMO === 'WTA') ? 0.025 : 0.020);\n"
" SET_CONFIDENCE_DELTA = Math.max(0, Math.min(0.08, SET_CONFIDENCE_DELTA));\n"
)
new_text = new_text.replace(old_delta_line, new_delta_block, 1)
3) computeHoldFromSPW signature
new_text = new_text.replace("function computeHoldFromSPW(spw, side, phase, skipClassAdj){",
"function computeHoldFromSPW(spw, side, phase, skipClassAdj, skipOppAdj){", 1)
3b) wrap opponent return adjustment inside computeHoldFromSPW
opp_block_old = (
" var oppSide = (side === 'A') ? 'B' : 'A';\n"
" var oppRetStats = readStatsFromSummary(oppSide);\n"
" adjustedHold = applyOppBreakAdj(adjustedHold, oppRetStats && oppRetStats.retGameWinRate, tour);\n"
)
assert opp_block_old in new_text
opp_block_new = (
" if (!skipOppAdj) {\n"
" var oppSide = (side === 'A') ? 'B' : 'A';\n"
" var oppRetStats = readStatsFromSummary(oppSide);\n"
" adjustedHold = applyOppBreakAdj(adjustedHold, oppRetStats && oppRetStats.retGameWinRate, tour);\n"
" }\n"
)
new_text = new_text.replace(opp_block_old, opp_block_new, 1)
4) computeCoreContext: avoid double opponent-return adjustment by skipping internal opp adj
new_text = new_text.replace("var hA_match = computeHoldFromSPW(pA_adj, 'A', 'MATCH');",
"var hA_match = computeHoldFromSPW(pA_adj, 'A', 'MATCH', false, true);", 1)
new_text = new_text.replace("var hB_match = computeHoldFromSPW(pB_adj, 'B', 'MATCH');",
"var hB_match = computeHoldFromSPW(pB_adj, 'B', 'MATCH', false, true);", 1)
new_text = new_text.replace("var hA_fs = computeHoldFromSPW(pA_adj, 'A', 'FS');",
"var hA_fs = computeHoldFromSPW(pA_adj, 'A', 'FS', false, true);", 1)
new_text = new_text.replace("var hB_fs = computeHoldFromSPW(pB_adj, 'B', 'FS');",
"var hB_fs = computeHoldFromSPW(pB_adj, 'B', 'FS', false, true);", 1)
5) prop callsites using matchupAdjustedSPW should skip opp adj inside computeHoldFromSPW
new_text = new_text.replace("computeHoldFromSPW(matchupAdjustedSPW('A'), 'A', 'FS', true);",
"computeHoldFromSPW(matchupAdjustedSPW('A'), 'A', 'FS', true, true);")
new_text = new_text.replace("computeHoldFromSPW(matchupAdjustedSPW('B'), 'B', 'FS', true);",
"computeHoldFromSPW(matchupAdjustedSPW('B'), 'B', 'FS', true, true);")
new_text = new_text.replace("computeHoldFromSPW(matchupAdjustedSPW('A'),'A','FS',true);",
"computeHoldFromSPW(matchupAdjustedSPW('A'),'A','FS',true,true);")
new_text = new_text.replace("computeHoldFromSPW(matchupAdjustedSPW('B'),'B','FS',true);",
"computeHoldFromSPW(matchupAdjustedSPW('B'),'B','FS',true,true);")
6) PROP_FIRST_SET_FAIR_LINE: skip opp adjustment only when using matchupAdjustedSPW
old_hA_line = "var hA = computeHoldFromSPW(useSpwA, 'A', 'FS', shouldSkipClassAdj);"
old_hB_line = "var hB = computeHoldFromSPW(useSpwB, 'B', 'FS', shouldSkipClassAdj);"
assert old_hA_line in new_text and old_hB_line in new_text
new_hA_block = (
"var _skipOppAdj_fs = !spwProvided; // matchupAdjustedSPW already bakes opponent return into SPW\n"
" var hA = computeHoldFromSPW(useSpwA, 'A', 'FS', shouldSkipClassAdj, _skipOppAdj_fs);"
)
new_text = new_text.replace(old_hA_line, new_hA_block, 1)
new_text = new_text.replace(old_hB_line, "var hB = computeHoldFromSPW(useSpwB, 'B', 'FS', shouldSkipClassAdj, _skipOppAdj_fs);", 1)
7) validateBothPlayersData: stop pre-sim adjustments (prevents double-adjustment loops)
old_val_block = (
" // APPLY PRE-SIMULATION ADJUSTMENTS for tour/surface BEFORE returning\n"
" // This ensures all simulations (Markov chain, Monte Carlo, firstSetDistribution) \n"
" // receive tour/surface-adjusted SPW values\n"
" var pA = validA ? applyPreSimulationAdjustments(rawA) : null;\n"
" var pB = validB ? applyPreSimulationAdjustments(rawB) : null;\n"
)
assert old_val_block in new_text
new_val_block = (
" // NOTE: Do NOT apply tour/surface multipliers here.\n"
" // Many downstream pathways (contextAdjustedSPW / simulation engines) already apply them;\n"
" // doing it here risks accidental double-adjustment loops.\n"
" // Keep validateBothPlayersData as a pure validator + raw value carrier.\n"
" var pA = validA ? rawA : null;\n"
" var pB = validB ? rawB : null;\n"
)
new_text = new_text.replace(old_val_block, new_val_block, 1)
len(new_text), len(text)
out_path = Path("/mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_UNIFIED_FIXES.txt")
out_path.write_text(new_text, encoding="utf-8")
out_path
bash -lc cp /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_UNIFIED_FIXES.txt /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_UNIFIED_FIXES.js && node --check /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_UNIFIED_FIXES.js
bash -lc grep -n "_skipOppAdj_fs" -n /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_UNIFIED_FIXES.txt | head -n 20
bash -lc grep -n "_holdA_tot_mp" /mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_UNIFIED_FIXES.txt | head -n 10
bash -lc node - <<'NODE'
const vm = require('vm');
const fs = require('fs');
const code = fs.readFileSync('/mnt/data/Tennis.God.JS.refactor.TOTALS_ENGINE_UNIFIED_FIXES.js','utf8');
try {
vm.runInNewContext(code, {console: {log:()=>{}, error:()=>{}}, Math});
console.log('EVAL_OK');
} catch (e) {
console.error('EVAL_ERROR', e && e.message);
process.exit(1);
}
NODE
Thought for 10m 43s