bash -lc python3 - <<'PY'
from pathlib import Path
p=Path('/mnt/data/TennisLocksEngine_v411_CANONICAL_SEQUENCE_PROP_MARKETS_REBUILD_DISPLAY_PREVIEW_FIX_20260716.txt')
s=p.read_text(encoding='utf-8')
old=""" line=line.replace(/\s*\|\sLength forecast:[^|]/ig,'')
.replace(/\s*\|\sTop exact-score path(?: within that length)?:[^|]/ig,'');
compact=line.replace(/\s+/g,' ').trim();"""
new=""" line=line.replace(/\s*\|\sLength forecast:[^|]/ig,'')
.replace(/\s*\|\sTop exact-score path(?: within that length)?:[^|]/ig,'')
.replace(/\s*\|\s*/g,' | ')
.replace(/\s{2,}/g,' ')
.trim();
compact=line.replace(/\s+/g,' ').trim();"""
if old not in s: raise SystemExit('format anchor missing')
p.write_text(s.replace(old,new,1),encoding='utf-8')
PY
cp /mnt/data/TennisLocksEngine_v411_CANONICAL_SEQUENCE_PROP_MARKETS_REBUILD_DISPLAY_PREVIEW_FIX_20260716.txt /tmp/tennislocks_check.js
node --check /tmp/tennislocks_check.js
python3 - <<'PY'
from pathlib import Path
p=Path('/mnt/data/TennisLocksEngine_v411_CANONICAL_SEQUENCE_PROP_MARKETS_REBUILD_DISPLAY_PREVIEW_FIX_20260716.txt')
s=p.read_text(); start=s.index('function tlPublicEngineVersion(){'); end=s.index('function tlAuditWinnerIntegrity(ctx){',start); block=s[start:end]
t=Path('/tmp/test_preview_fix.js')
t.write_text("var _ENGINE_VERSION='v411-CANONICAL-SEQUENCE-PROP-MARKETS-REBUILD-20260715';\nfunction _sc(x){return String(x).replace(/\bcanonical\b/ig,'main');}\n"+block+r'''
function assert(c,m){if(!c)throw new Error(m);}
var leak=['---','🎾 TENNISLOCKS v411-CANONICAL-SEQUENCE-PROP-MARKETS-REBUILD-20260715 🎾','FORECAST Player A | 61.0%','TOTAL GAMES: Over 22.5','PLAYER PROPS'];
var a1=tlAuditPublicDisplayContract(leak),r1=tlRepairPublicPreviewLines(leak,a1);
assert(!r1.some(function(x){return /CANONICAL/i.test(x);}), 'slug remained');assert(r1.some(function(x){return /TOTAL GAMES/.test(x);}), 'totals hidden');assert(r1.some(function(x){return /PLAYER PROPS/.test(x);}), 'props hidden');
var mismatch=['MATCH SUMMARY: Winner forecast: Player A 60.0% | Length forecast: 3 sets 58.0% | Expected total: 24.0 games','MATCH LENGTH:','Forecast: 2 sets / Under 2.5 (57.0%)','Length probabilities: 2 sets 57.0% | 3 sets 43.0%','TOTAL GAMES: Over 22.5','Tiebreak forecast: NO TIEBREAK (55.0%)','Match chance: at least one 60.0% | no tiebreak 40.0%','PLAYER PROPS'];
var a2=tlAuditPublicDisplayContract(mismatch),r2=tlRepairPublicPreviewLines(mismatch,a2);
assert(r2[0]==='MATCH SUMMARY: Winner forecast: Player A 60.0% | Expected total: 24.0 games','summary formatting damaged: '+r2[0]);assert(!r2.some(function(x){return /^Forecast: 2 sets/i.test(x);}), 'length headline remained');assert(!r2.some(function(x){return /^Tiebreak forecast:/i.test(x);}), 'tb headline remained');assert(r2.some(function(x){return /TOTAL GAMES/.test(x);}), 'totals hidden mismatch');assert(r2.some(function(x){return /PLAYER PROPS/.test(x);}), 'props hidden mismatch');
console.log('PASS all focused regression tests');
''')
PY
node /tmp/test_preview_fix.js
printf '\n--- DIFF SUMMARY ---\n'
diff -u /mnt/data/TennisLocksEngine_v411_CANONICAL_SEQUENCE_PROP_MARKETS_REBUILD.txt /mnt/data/TennisLocksEngine_v411_CANONICAL_SEQUENCE_PROP_MARKETS_REBUILD_DISPLAY_PREVIEW_FIX_20260716.txt | grep -E '^(@@|+function _tlPublic|+function _tlRepair|^- return [["DISPLAY ERROR|+ _displayLines=|^-lines.push(eTennis|^+lines.push(eTennis|^+ if (/)' | head -80
sha256sum /mnt/data/TennisLocksEngine_v411_CANONICAL_SEQUENCE_PROP_MARKETS_REBUILD_DISPLAY_PREVIEW_FIX_20260716.txt
Thought for 1m 54s