═════════════...
Tạo vào: 14 tháng 9, 2026
Trả lời bằng GPT-5.6 Thinking bởi Chat01
Tạo vào: 14 tháng 9, 2026
Trả lời bằng GPT-5.6 Thinking bởi Chat01
════════════════════════════════════════
🎾 TENNISLOCKS 🔒
OFFICIAL MATCH MODEL
VERSION 3.0
GENERATED 8:03 PM | September 13, 2026
ENGINE Point • Game • Set Probability Model
════════════════════════════════════════
🎯 Challenger 75 (OUTDOOR) | Best of 3 | Line: 22.5
Tour: ATP-CH | Court speed (CPI): 38
Metadata confidence: HIGH
────────────────────────────────────────
Titouan Droguet vs Nicolai Budkov Kjaer
────────────────────────────────────────
────────────────────────────────────────
💰 MODEL PICKS:
📊 LEANS:
Match type: Mixed serve and return, one side clearly better. (MIXED_UNEVEN)
Risk: 0.00 (LOW)
Pricing data quality: STRONG | opponent-rank samples 7/7 | trust -
PLAYER INTEL
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
Titouan Droguet Nicolai Budkov Kjaer
Rank 103 149
Elo 1776 1590
Avg Opp Rank 390 237
Schedule A: SOFT (trust -, ranks 0) | B: MID (trust -, ranks 0)
Serve Style ace 10.8% ace 6.1%
Momentum RECENT_RESULTS RECENT_RESULTS
Hold % 82.3% 76.7%
Recent-row SPW (raw) 64.5% 60.1%
Dominance Ratio 0.99 0.65
Recent Hold SD 9.7% 21.1%
Break Rate 23.3% 17.7%
1st Srv Win % 70.0% 65.3%
2nd Srv Win % 50.2% 50.0%
1st Srv In % 61.3% 62.9%
Recent-row implied hold82.0% (64.5% SPW) 73.8% (60.1% SPW)
Signals: official betting threshold cleared
════════════════════════════════════════
🎲 SETS OUTLOOK
[SET RESEARCH REF] CANONICAL_POINT_ROOT | CH/HARD/MAIN/CANONICAL_POINT_STATE_SET_COUNTS_V1144 | read-only, no live blend
[SET INPUTS] SPW A/B 64.6% / 61.5% | Hold A/B 82.3% / 76.7% | route UNIFIED_CURRENT_POINT_ROOT_V1113
[SET TB CAL] not applied | tree P(7-6) 20.8% | raw 20.8% | hist not measured | n null | CANONICAL_POINT_ROOT_NO_HISTORICAL_SET_TB_MUTATOR_V1144 | set-winner margin preserved by construction
[SET AUTHORITY] ACTIVE | BO3_NONIID_VISIBLE_SET_TRANSITION_V1145 | stationary point/game/set baseline plus explicit non-IID transition owner when evidence is usable
[SET HISTORY STORAGE] BO3 transition evidence is EPHEMERAL ONLY | current visible Match Inputs ordered scores | no save/load/cache/network promotion
[SET TRANSITION] APPLIED | visible transitions 19 | reversal 6 / stay 13 | effective log-odds contrast 0.447
[SET NON-IID P3] stationary baseline 47.9% | transition target 42.8% | delta -5.2pp | P3 is NOT capped at 50%
[SET LENGTH ROOT] raw point/game/set P3 47.9% | winner-aligned stationary P3 47.9% | final P3 42.8% | final Winner marginal preserved by IPF
[SET WINNER ALIGN] final winner error 1.1e-16 | final set-count margin error 1.1e-16
[SET EXACT PMF] 2-0 39.5% | 2-1 25.5% | 0-2 17.7% | 1-2 17.3% | final P3 42.8%
[SET ACTION] LEAN UNDER 2.5 | probability 57.2% | model fair odds -134 | MEDIUM | forecast only
[SET BETTING GATE] self-priced final exact-score PMF | HIGH >= 60.0% = official PICK | MID 55.0%-<60.0% = LEAN | below 55.0% = PASS | model fair odds never feed back into probability
[SET FAIR PRICE] Over 2.5 +134 | Under 2.5 -134
[SET TREE DIAGNOSTIC] canonical P(2) 52.1% | canonical P(3) 47.9% | canonical point/game/set tree
📊 Player Stats (Current Live-Source Audit):
Totals Fair Line (canonical structural threshold ref): 23.5 (CDF 50/50) | Full-dist median ref: 23.0
Full-dist range (pricing ref): P10=18 | P50=23 | P90=33
Totals EV (tree mean): 24.6 | Median: 23.0
Projected match duration: not produced | BO3_MINUTES_CELL_THIN
Settlement full-dist mode: 22g | settlement density zone: 18-20g 22.6%
All-match median ref: 23.0g | Conditional totals (not picks): E[T|2 sets] 20.3 | E[T|3 sets] 30.5 | alternative 3-set probability 43%
Settlement PMF top exacts: 22g 8.7% | 19g 8.2% | 20g 8.0% | 23g 6.6% | 18g 6.5% | 21g 5.5% | 31g 5.1% | 17g 5.1% [canonical full-match mixture]
========================================
🎯 TOTAL GAMES
[TOTAL GAMES FORECAST] LEAN OVER 22.5 | 54.3% | MEDIUM confidence | forecast only
Pricing method: all legal full-match score paths are summed against your Total Games line. No single exact score controls the pick.
Decision reason: OVER 54.3% clears the CH Total Games lean threshold (53.4%+) but not the full-pick threshold (56.0%+).
At 22.5: Over 54.3% | Under 45.7%
Total Games probability authority: ONE canonical joint score+games PMF | no second threshold recalibration is applied after the current length root.
Set-count decomposition at 22.5:
2-set lane: 57.2% match mass | P(Over | 2 sets) 20.4% | contributes 11.7pp raw Over mass
3-set lane: 42.8% match mass | P(Over | 3 sets) 99.7% | contributes 42.7pp raw Over mass
Combined no-push P(Over 22.5) = 54.3% from all lanes.
First-server sensitivity (diagnostic only): A serves first -> Over 54.3% | B serves first -> Over 54.3% | mean-total gap 0.07g
Projected total-games distribution: fair line 23.5 | mean 24.6 | median 23 | largest single exact bucket 22g (8.7%, not a majority and not the O/U authority)
Exact-total concentration: dominant 3-game cluster 18-20g = 22.6%.
Unconditional pricing distribution: 80% range 17-31 | SD 5.8 | mode 22g (8.7%) | leaders 22g 8.7% | 19g 8.2% | 20g 8.0% | 23g 6.6% | 18g 6.5%
########################################
🎯 PROP PROJECTIONS 🎯
########################################
📊 Titouan Droguet - Player Props:
Games Won: mean 13.1 | median 13 | mode 12 | full-match distribution
1st Set Games Won: 5.39 projected
Sets Won: BET 2+ SETS | 65.0% | HIGH
Serve Games: not requested | enter a service prop line to price
Serve Points Played: not requested | enter a service prop line to price
Serve Points Won: not requested | enter a Serve Points Won line to price
Aces: not requested | enter a Aces line to price
Double Faults: not requested | enter a Double Faults line to price
Breaks Won: not requested | enter a Breaks Won line to price
Break Points Created: not requested | enter a Break Points line to price
BP Conversion: not requested | enter a Break Points line to price
Opp BP Save: not requested | enter a Break Points line to price
Opponent Matchup: opp return 26% | context only; official pricing uses the final match tree
Historical sample: 12.0 service games | projected Games Won CV: 24%
📊 Nicolai Budkov Kjaer - Player Props:
Games Won: mean 11.6 | median 12 | mode 13 | full-match distribution
1st Set Games Won: 4.76 projected
Sets Won: LEAN 1+ SET | 60.5% | MEDIUM
Serve Games: not requested | enter a service prop line to price
Serve Points Played: not requested | enter a service prop line to price
Serve Points Won: not requested | enter a Serve Points Won line to price
Aces: not requested | enter a Aces line to price
Double Faults: not requested | enter a Double Faults line to price
Breaks Won: not requested | enter a Breaks Won line to price
Break Points Created: not requested | enter a Break Points line to price
BP Conversion: not requested | enter a Break Points line to price
Opp BP Save: not requested | enter a Break Points line to price
Opponent Matchup: opp return 35% | context only; official pricing uses the final match tree
Historical sample: 10.6 service games | projected Games Won CV: 34%
🎲 Match-Level Context:
Sets Played: LEAN UNDER 2.5 | P(2 sets) 57.2% / P(3 sets) 42.8% | expected 2.43 sets
3-set match / both players win a set: YES 42.8% | NO 57.2% | no betting action
Exact match-score paths: Titouan Droguet 2-0 39.5% | Titouan Droguet 2-1 25.5% | Nicolai Budkov Kjaer 2-0 17.7% | Nicolai Budkov Kjaer 2-1 17.3%
If forecast winner Titouan Droguet wins: straight sets 60.7% | Nicolai Budkov Kjaer steals one set 39.3% conditional (25.5% of all match paths)
Individual win 1+ set: Titouan Droguet 82.3% | Nicolai Budkov Kjaer 60.5% | marginal coverage only; NOT the BO3 3-set probability; includes paths where that player wins the match
Straight-set loss chance: Titouan Droguet 17.7% | Nicolai Budkov Kjaer 39.5%
Games/aces/breaks use the full match tree, not a single 2-0 or 2-1 scoreline.
Surface: HARD | Tour ace reference 7.1% | double-fault reference 4.1%
textnew fix made the under 2.5 more instead of lean over 2.5
pythonimport math p3=0.479 q=(1+math.sqrt(1-2*p3))/2 q 0.6024695076595961
pythondef logit(x): return math.log(x/(1-x)) def stationary(q,delta): eps=1e-9 lo=eps hi=1-eps if q>.5: lo=max(lo,(2*q-1)/q+eps) def q0(q1): return q*(1-q1)/(1-q) def f(q1): a=q1;b=q0(q1) return logit(a)-logit(b)-delta flo=f(lo);fhi=f(hi) if flo>=0:q1=lo elif fhi<=0:q1=hi else: for _ in range(80): mid=(lo+hi)/2 fm=f(mid) if fm>0: hi=mid else: lo=mid q1=(lo+hi)/2 return q1,q0(q1) q1,q0=stationary(q,0.447) iid=2*q*(1-q) non=q*(1-q1)+(1-q)*q0 q,q1,q0,iid,non,non-iid (0.6024695076595961, 0.6452116094910423, 0.5376925571038701, 0.479, 0.4274983739065445, -0.05150162609345549)
pythonfor p3 in [0.479,0.428]: print(p3, (1-p3)*0.204+p3*0.997)
Yes — I found why. v1145 is doing exactly what the new transition formula tells it to do, but that may not be the behavior you intended.
Your stationary point/game/set root had P(3 sets) = 47.9%. The new transition layer saw 19 transitions: 13 stays vs 6 reversals. In the code, a positive transition log-odds contrast means persistence: after a player wins a set, they are more likely to win the next set than after losing one. (TennisLocks_FINAL_v1145_BO3_NONIID_SET_TRANSITION_20260913.txt)
With your reported effective contrast of +0.447, the math works out almost exactly to the output:
So this is not an Under/Over publishing bug. The publisher simply takes whichever side of the finalized PMF is above 50%, with 55–60% becoming a lean. (TennisLocks_FINAL_v1145_BO3_NONIID_SET_TRANSITION_20260913.txt)
The important issue is what you intended v1145 to fix. The header says the patch was meant to remove the structural ceiling that prevented P3 from exceeding 50%, particularly when reversal evidence supports a longer match. (TennisLocks_FINAL_v1145_BO3_NONIID_SET_TRANSITION_20260913.txt) But the actual implementation is two-sided:
javascriptuplift = nonIidP3 - iidP3; target = p3 + uplift;
That means reversal history can raise P3, but persistence history can also lower P3 substantially. (TennisLocks_FINAL_v1145_BO3_NONIID_SET_TRANSITION_20260913.txt)
For this particular matchup, that change is also why your Total Games Over weakened. Using your displayed lane numbers, the stationary 47.9% P3 would imply roughly 58.4% Over 22.5; after v1145 cuts P3 to 42.8%, it becomes the displayed 54.3% Over.
I would change v1145 to a one-sided correction: reversal evidence may increase P3, but persistence evidence does not push the clean canonical P3 downward.
Replace:
javascriptvar iidP3=2*q*(1-q), nonIidP3=q*(1-tr.qAfterWin)+(1-q)*tr.qAfterLoss, uplift=nonIidP3-iidP3, target=Math.max(1e-6,Math.min(1-1e-6,p3+uplift));
with:
javascriptvar iidP3=2*q*(1-q), nonIidP3=q*(1-tr.qAfterWin)+(1-q)*tr.qAfterLoss, rawUplift=nonIidP3-iidP3, uplift=Math.max(0,rawUplift), target=Math.max(1e-6,Math.min(1-1e-6,p3+uplift));
I would also expose both values in the audit:
javascriptrawP3Delta: rawUplift, p3Delta: target-p3, oneSidedTransitionFloorApplied: rawUplift < 0
Then this Droguet–Kjaer match would remain at the canonical ~47.9% P3 instead of being driven to 42.8%. It would therefore be PASS on Sets 2.5, not Lean Under. It would not automatically become Lean Over 2.5, because the original canonical root itself was still below 50%.
That's the key distinction: the old problem prevented legitimate Over probabilities above 50%; fixing that does not imply this particular match should become Over. Your current v1145 went further and introduced a new two-way historical modifier. The source itself notes that this patch “does not claim new forward validation,” which makes the new downward mutation especially worth treating cautiously. (TennisLocks_FINAL_v1145_BO3_NONIID_SET_TRANSITION_20260913.txt)
If your actual target is for the model to identify genuine Over 2.5 leans, I'd keep the ceiling removal but not manufacture an Over here; I would make the transition layer one-sided or diagnostic-only until the negative/persistence side has been separately validated.