Session Log
Terse one-line-per-change record of decisions made outside of normal commits (config changes, external dashboard setup, business decisions) — append to this, don’t rewrite history.
- 2026-06-18 — Fixed
stripeWebhookmissingcheckout.session.completedsubscription (new signups weren’t upgrading); fixed missing IAM invoker permission (403 on all webhook calls); verified end-to-end with a real test-mode payment. - 2026-06-18 — Switched support contact from Grant’s personal email to
theroundrobinhelp@gmail.comacross legal pages, about page, footer, and billing-portal error. - 2026-06-18 — Resolved BMaC keep-vs-retire question: kept as supplemental donation option (not redundant — payouts confirmed routing through the same Stripe account as subscriptions, no tax-separation risk).
- 2026-06-18 — Set up external tax tracking (Google Sheets, outside this repo) and quarterly estimated-tax TickTick reminders for Hansell Ventures LLC; deferred Stripe→Sheets automation until real subscriber volume exists.
- 2026-06-18 — Migrated AdSense from a personal Individual account
(
ca-pub-1386753632665435, closed) to a new Business account under Hansell Ventures LLC (ca-pub-7126063136941605, pending Google review) — Individual→Business can’t be converted in place. Updated publisher ID in_layouts/default.html,assets/js/ad-slot.js,bracket/src/app.jsx. - 2026-06-18 — Mobile UI/UX audit closing out 3 TickTick tickets: added
isPhoneViewportresponsive logic tobracket/view/src/app.jsx(previously had none, unlike Bracket Studio); enlarged + regrouped Bracket Studio’s phone action-sheet buttons (FFO/NFO/AC inline, CMP/Pool separated, all ≥36-44px); added team logos throughoutpredictions/index.htmlfrom the previously-unusedlogos/directory. Verified via local Playwright screenshots at 390px. - 2026-06-18 — Refreshed homepage hero copy and Bracket Studio card description (see Project Overview for the new tagline); retired the old “the methodology behind the madness” slogan.
- 2026-06-18 — Imported a Claude Design mockup (“Bracket Studio Redesign.html”) and
implemented it in
bracket/src/app.jsx: desktop/tablet header switched from labeled buttons to a circular icon-only toolbar with hover tooltips (newIconBtnhelper, defined outsideAppalongsideTeamCard/CompareCard); board’s Compare Resumes / Seedlines / Bubble sections split into tabs (newboardTabstate, default"compare") with per-tab action zones, panels kept mounted viadisplay:none(not unmounted) so drag-and-drop stays live; keyboard shortcuts (C,F/N/A, seed-number keys) now also callsetBoardTab(...)to switch tabs; Help modal rewritten with Toolbar/Board Tabs sections. Mobile (isPhoneViewport) and narrow single-pane mode (isNarrowViewport) intentionally untouched — mockup was desktop-only. Sort strip, ghost conference pills, and range sliders already matched the mockup pre-existing, no changes needed there. Pushed tomainas commit94c0076. Logged as a completed TickTick task in the UI & UX column. - 2026-06-19/20 (retroactive) — Hall of Fame tool, several rounds of eligibility-math
and data-correctness fixes: corrected an off-by-one in Modern-Era/Senior Pool
eligibility timing (validated against Drew Brees’s real first-ballot induction);
fixed a
DEFENSE_POSITIONSgap ("DL"label missing, truncating J.J. Watt-style careers) and a second one ("MLB"missing, affecting 104 players); fixedfetch_offense_seasons()silently dropping zero-stat seasons for core special-teamers (Matt Slater), requiring a roster-first join instead of stats-first; fixed the Kellen Winslow Sr./Jr. name collision with an eligibility-timing plausibility check inattach_label(); added acareer_fully_observedfeature so the model stops treating honors as a full substitute for production when a player’s entire career (not just the tail end) is inside the 1999+ stats window, fixing Matt Slater’s overrated score. - 2026-06-20 — Hall of Fame table redesign: split the single “Committee Prediction”
cell into separate sortable Projected Induction Year / Induction Chance columns;
replaced the auto-written “Career Summary” column (now modal-only) with Award Points
and a new per-player Signature Stat (
pick_signature_stat()inbuild_hof_data.py— compares the position-typical raw counting stat against Pro Bowls/All-Pro/Award Points/Championships/Playoff Wins within the same peer group, keeps whichever the player is most exceptional at; fixed a same-peer-group bug along the way that was unfairly favoring honors); added a 4-bucket Eligibility filter (Enshrined/Eligible Now/Projected/Not Yet Eligible) so a not-yet-eligible player with an active queue projection (e.g. Adrian Peterson, Tom Brady) has a real bucket instead of disappearing when “Eligible” was checked. - 2026-06-21 — Hall of Fame trust/data-richness pass: fixed a real bug in
simulate_induction_queue()where a candidate never aged out of the Modern-Era pool into the unprojected Senior Pool track, letting weak cases get handed unrealistic far-out predicted years (Hines Ward: 2041 → 2035 after the fix); added a persistentfirst_eligible_yearfield powering new “Nth year of eligibility” displays; rewrote the “Next Up” card (HoFW + eligibility year + overall chance per candidate, plus a “Just Missed” list from the existingon_bubbledata); converted the Eligibility checkboxes into a multi-select dropdown; added a trust-building callout near the table explaining HoFW’s real inputs; added colored per-year tags to Projected Induction Year; added inline unit/scale clarification to the modal’s Career Value / Peak Value rows; strengthened the methodology copy distinguishing the deterministic queue-simulation snapshot from the calibratedinduction_chanceprobability. - 2026-06-21 — Fixed Class of 2026 showing only Luke Kuechly instead of all five real
inductees (Brees, Fitzgerald, Kuechly, Vinatieri, Craig): fixed a
RET-status roster bug inflating Drew Brees’slast_seasonby a year; decoupledeligible_retired()/assign_track()fromCURRENT_SEASONvia newLAST_REAL_CLASS_YEARconstant (was silently dropping recently-retired real inductees like Fitzgerald from the entire modeled pool); addedMANUAL_INDUCTEE_OVERRIDESfor Craig (pre-1999 career) and Vinatieri (kicker, unscored position) — seescripts/HOF_FIXES.mdfor all three. Re-ranbuild_hof_data.pyand committed the regeneratedhof_data.json. - 2026-06-21 — Hall of Fame model correction pass driven by Grant’s spot-check of 7
specific players: fixed
championships’ sign-flipped collinear coefficient; added a value-floor discount on Pro Bowl/All-Pro/All-Decade credit for players whose career_value is weak relative to established peers; added a small-sample confidence shrink for active players’ early seasons. Net result: Mahomes now scores clearly above the 100 baseline (was barely-Lock), Calvin Johnson moved into Lock tier, Matt Slater dropped well below Urlacher/Watt (was above them), Frank Gore moved into Borderline, Cordarrelle Patterson dropped out of Strong Case into Borderline, and Ja’Marr Chase/Justin Jefferson both dropped behind DeAndre Hopkins. Philip Rivers/Eli Manning/Ben Roethlisberger stayed in Long Shot despite two further attempts — seescripts/HOF_FIXES.mdfor why those were reverted instead of forced. Cross-validated AUC-ROC 0.999 / average precision 0.89 (up from 0.877), no regressions on previously-fixed reference cases (Gronkowski, Hines Ward). Re-ranbuild_hof_data.pyand committed the regeneratedhof_data.json+hof_model_coefficients.json. - 2026-06-21 — Follow-up fixes from Grant: (1) found and fixed a real data bug, not a
tuning issue — Jason Peters was modeled as a one-season
TE(his real career was 17 seasons at tackle after a rookie-year position conversion), with his real career honors attached to that phantom season; addedol_predominant_player_ids()to exclude players whose roster history is predominantly an unmodeled OL position, which removes him from the modeled pool entirely (correct — same bucket as kickers/punters, not yet eligible forMANUAL_INDUCTEE_OVERRIDESsince he isn’t enshrined). (2) Added aRING_LOGIT_WEIGHT-driven post-hoc championship bonus, gated by its own value-floor discount curve, to credit Roethlisberger/Gronkowski for their rings without reopening the Slater/Patterson loophole. Gronkowski moved from Strong Case (81.8) to Lock (96.3), now above Jason Witten as intended. Roethlisberger moved up (41.3→45.8) but stayed Long Shot — pushing further trades off against Cordarrelle Patterson, who’s now right at the Strong/Borderline cusp (76.2 vs. ~75.8 threshold); seescripts/HOF_FIXES.mdfor why 0.5 was kept as the balance point. CV AUC-ROC 0.9989 / average precision 0.913 (both slightly improved). Top-25 trr_value and the prior round’s reference cases (Slater/Urlacher/Watt ordering, Chase/Jefferson/Hopkins ordering) checked clean, no regressions. Re-ranbuild_hof_data.pyand committed the regeneratedhof_data.json+hof_model_coefficients.json. - 2026-06-21 — Pre-1999 Hall of Fame coverage pass, using Grant’s new Stathead
license: added 177 new
MANUAL_INDUCTEE_OVERRIDESentries tobuild_hof_data.pyfor real Pro Football Hall of Famers whose entire career predates the 1999+ stats window and who weren’t otherwise represented (previously only Roger Craig and Adam Vinatieri existed in this bucket). Sourced via one bulk Stathead Player Season Finder query (match=player_season_combined,is_hof=Ypassed as an explicit URL param — checking the radio button via JS didn’t actually get included in the submitted query string, a real bug worth remembering if Stathead is scripted again) acrossyear_min=1920–year_max=1998, giving career years/position for 174 of 177 targets; the remaining 3 (Guy Chamberlin, Jimmy Conzelman, Ray Flaherty — all pre-1930s player-coaches absent from Stathead’s HOF query) got manual best-effort entries from public-record career years, flagged as such in theirnotefield. Target list derived by diffing the full 387-entry Wikipedia HOF roster againsthof_data.json’s existing covered names, excluding non-player roles (coach/owner/GM/etc.) and OL/kicker/punter positions (no scoring pipeline). Position labels derived from Wikipedia’s own text description rather than mapping legacy Stathead position codes, which mishandled pre-modern-era positions (e.g. Sammy Baugh’s single-wing “TB” code reads as QB, not RB; Don Hutson’s “LE” code has no clean modern mapping). Verified zero duplicate names/player_ids against the 177 new entries and the existing 10,216 covered names; confirmed the edited file parses as valid Python (179 total override entries: Craig + Vinatieri + the 177 new). Pipeline not yet re-run — this sandbox’s network allowlist blocks severalnfl_data_pycalls the script depends on (raw.githubusercontent.comCSV/parquet fetches, GitHub release binaries forimport_draft_picks/import_schedules/import_team_desc/import_ids/import_seasonal_pfr/import_snap_counts), sohof_data.jsonstill needspython3 scripts/build_hof_data.pyrun locally (per the existing “not run in CI” convention) and the regenerated JSON committed before these 177 players actually appear on the live site. - 2026-06-21 — Fixed a follow-up bug found right after the 177-override pass: Jerry
Rice still showed
seasons_played: 6post-fix because he’s a different bucket than that pass covered — his career spans 1999 (debuted 1985, retired 2004) rather than predating it entirely, so he was never eligible forMANUAL_INDUCTEE_OVERRIDES. Traced and confirmed his actual HoFW score was already correct (227.4, Lock, rank 1/2035 WRs) — only the bio span was wrong. Fixedfetch_draft_honors()/build_player_features()to pull real debut/retirement years fromimport_draft_picks()’sseason/tocolumns (covers draft classes back to 1979) and extend the truncated span instead of replacing the model output — seescripts/HOF_FIXES.mdfor the at-least-53-other-players scope and the still-open Signature Stat gap (needs a real PFR/Stathead career-totals scan, written up for a follow-up pass). Code change made, pipeline not yet re-run — same sandbox network restriction as the 177-override pass; needspython3 scripts/build_hof_data.pyrun locally and the regeneratedhof_data.jsoncommitted.