Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ tab wiring. Everything else lives in `js/`:
| `sim.js` | the client-side Monte Carlo: the cutline replay, the per-event points draws, and the 2027 drop-in |
| `movers.js` | the biggest-movers panel |
| `forecast.js` | the standings table, column guide, expanded row, what-if |
| `possible.js` | the five "what's left" panels |
| `possible.js` | the six "what's left" panels |
| `race.js` | the event-odds chart and table |
| `projection.js` | the two experimental tables (2027, EuroTour) |
| `whatif.js` | the What-if tab: sliders for an invented player, dropped into the 2027 field |
Expand Down
1 change: 1 addition & 0 deletions docs/how-it-works.html
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,7 @@ <h1>How the DGPT points system works</h1>
<div class="band">Changelog</div>
<table class="table-ledger">
<tbody>
<tr><td class="changelog-date">Sep 22</td><td><b>A gap to the cutline now comes with a price, and there is a head-to-head panel.</b> "137 short" is a true number that nobody can act on. On the What's left tab, the cutline chart now also draws the line where it lands in a kind season and in a cruel one — its 10th and 90th percentiles either side of the median — and a table under it prices all three as a <b>finishing place at the last event on the calendar</b>: the worst place that still carries a player over each line. The reason the same gap costs two players different finishes is the 2026 counting caps. A result is only worth what it beats, so a player whose best two playoff finishes are already banked keeps only the difference, and the arithmetic has to run through their own pools rather than off the points table. Below it, <b>Head to head</b> takes any two players still in contention and answers the other question: not how far from the line, but how far from each other. Pick a pair and it walks the leader's weekend down the points curve — a win, a podium, a 20th, dead last — and for each one gives the finish the chaser needs and how many places clear of them that is. The margin is not a fixed number, because the curve is brutally top-heavy: catching someone who finishes 3rd is a different task from catching the same player finishing 30th, and against a big enough lead the panel says so outright rather than printing a column of dashes. Both are exact arithmetic on the published curve, not a simulation — they say what has to happen, not how likely it is, which is what the rest of the tab is for.</td></tr>
<tr><td class="changelog-date">Sep 20</td><td><b>The event-odds tab now shows who went out, who came back, and when.</b> Under the win-probability chart there is a tally of <b>skulls</b> — one for each player who, at that moment, took none of the ten thousand simulated tournaments. That is the strongest thing this model can say about anybody: with 10,000 runs it is not "unlikely", it is the resolution floor. They are sparse on Thursday and a wall of them on Sunday afternoon. Climbing back out takes ten times that, 0.1%, which is what the rest of the tab means by alive — do it and you get a <b>phoenix</b>. The gap between the two thresholds is deliberate: on a single one, a player sitting on the floor flickers between marks every few minutes, and across the races on file the gap holds the worst case to two deaths for any one player while keeping the bird genuinely rare, about one an event. The table below is no longer cut at 0.1% either — it carries <b>the whole field</b>, everyone still alive first and then the players who have fallen through, most recently out at the top, with a new <b>Out</b> column giving the moment each one went. A player who was never above the floor reads "never" rather than a time, because being recorded for your place on the leaderboard is not the same as having been in it. The thresholds are each player's own odds, not the fork chart's lines: those are scores, and a player slips under one without playing a bad hole whenever the field ahead of them birdies.</td></tr>
<tr><td class="changelog-date">Sep 20</td><td><b>Fixed: the event-odds charts were unreachable past halfway on a phone.</b> They are held to a minimum width so a dozen labelled lines stay readable, which on a 390px screen leaves a little over half the chart off the side of its own scroll box — and the tap-to-read handler had claimed the horizontal drag, so no gesture was left that could scroll to the rest. A sideways swipe now moves the chart and a tap still reads it out. Nothing changed for a mouse, where hovering scrubs exactly as before.</td></tr>
<tr><td class="changelog-date">Sep 20</td><td><b>The event-odds charts no longer spend most of their width on nobody playing.</b> The time axis was real wall-clock, which sounds like the honest choice and mostly wasn't: scoring is recorded about every six minutes while a round is on and then not at all until the next morning, so across the four races on file between <b>69% and 81%</b> of the axis was dead ground and the tournament itself was squeezed into the gaps between the nights. Any stretch longer than twenty-five minutes is now drawn at twenty-five minutes, with a break mark on the axis showing where the clock was cut. Nothing is hidden by that: a block is only recorded when the scoring actually moved, so every line crossed those hours as a single straight segment either way, and inside a round the spacing is untouched — a frantic finish is still wide and a slow stretch still narrow. The chart also now labels each run of play by its day rather than ruling off at midnight, and <b>a new picker crops both charts to one day</b>, rescaling them to it. Neither the day picker nor the axis moves a number. There is deliberately no drag-to-zoom: horizontal drag is how these charts are read on a phone, and a zoom box would have to fight the readout for the same finger.</td></tr>
Expand Down
4 changes: 4 additions & 0 deletions docs/js/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@
const state = { div: "mpo", view: "forecast", data: {}, sort: { key: "p_champ", dir: "desc" },
colsMode: "auto", permalink: null, moverWin: "week", moversOpen: false,
cloudMode: "chart", lev: {}, raceAxis: "time", raceWin: null,
// the head-to-head pair, per division: a PDGA number picked in
// MPO means nothing in the FPO list, so the panel validates
// what it restores against the division it is drawing
h2h: {},
// the experimental tabs load their own bundles and keep their
// own sort, so switching tabs never disturbs the forecast table
proj: {}, projSort: {},
Expand Down
Loading
Loading