Bellcow GM / What's New
What's new
Release notes for Bellcow GM · newest first
Only shipped changes appear here. Nothing on this page is a roadmap item, a “coming soon” or a plan — if it is listed, it is live on bellcowgm.com. Where a release made the product less flattering — a published accuracy number that went down, a claim that had to be softened — that is listed too.
Marketing site: the things you should be able to read before paying
- Sample GM Plan — a complete plan for a clearly fictional league, so you can see exactly what a season pass buys before buying one. Read it →
- Methodology — the data, the models, the simulation, the AI's narrow role and the published backtest, with an honest section on where the model is weak. Read it →
- Data Coverage — every source, the refresh cadence, what “Last Updated” means, what happens when a feed is late, and what is not live. Read it →
- Guided demo — a screen-by-screen walkthrough of the whole app on a fictional league, no account needed. Take the tour →
- This page.
- Pricing rewritten to state, in one place: the exact price, that it is one payment per season, exactly what a pass covers, the league allowance on each tier, what free does not include, that nothing auto-renews and there is nothing to cancel, and how refunds work.
- Footer rebuilt so every policy, support route and account link is reachable from any page. A stale support address on a domain we no longer use was removed; the one address is support@bellcowgm.com.
- Removed a testimonial. The homepage carried a five-star quote from a “beta manager”. We have no customers yet, so it had no business being there. It is gone, and nothing has replaced it.
The Bellcow Football Intelligence Engine
The product's football analysis no longer comes from a fantasy platform. Projections, rankings, breakout scores and player values are now computed by our own engine, from openly licensed data (nflverse, CC BY 4.0) plus Stats Guy Fantasy market values.
- The published intelligence bundle ships with the site and is also served live, so intelligence can be refreshed without redeploying the app.
- The refresh is scheduled, not manual. It used to be a laptop command run three times a week; it now runs automatically at 11:00 UTC every Tuesday, Friday and Sunday — ahead of the morning digest, so the email and the app never disagree.
- Two independent guards refuse to publish a bundle containing fewer than 500 players, so a partial refresh can't quietly replace a good bundle.
- Attribution to nflverse and Stats Guy Fantasy is a licence condition and is visible in the site footer and on the app's Data Health page.
Claims audit: every advertised claim made true
We audited the marketing copy against the shipped code. It found five ship-stoppers and twelve partial or overstated claims. All are now closed — mostly by fixing the code, and in a few places by correcting the copy.
Alerts now actually reach people
The event engine was computing per-user, per-league ranked alerts every 15 minutes and then discarding them. They are now stored per user, deduped, capped at 50 with a 14-day expiry, and served to a real inbox. The app polls every five minutes while open, badges the nav and toasts on new ones.
The morning digest carries the plan
The digest used to send injured players plus a global trending-adds list. It now runs the Bellcow engine server-side and sends up to three moves per league with the exact bid, the exact drop and the reason — or says the league is quiet. It never recommends from a platform's trending list.
Numbers that were quietly wrong
- Per-game values deflated as the season went on. A rest-of-season calculation divided by games remaining with a floor of 12, so from about Week 6 every per-game value shrank — roughly 33% too low by Week 9 and 75% by Week 14 — dragging every absolute threshold in the product with it. Fixed; Week 1 behaviour is unchanged and the rest of the season is now correct.
- Title-odds deltas were measuring their own noise. A change was scored as one simulation minus a separate, independently-drawn simulation — measured noise of about ±1.9 percentage points against real signals near zero. The simulator is now seeded, base and scenario share their random draws, and deltas are computed in 15 paired batches with their own standard error. Nothing prints unless it clears twice that error; otherwise the product says “too close to call”. A no-op change now measures exactly 0.00.
- Bye odds only worked for six-team playoffs and reported 0% for every other bracket size. The bracket is now generic.
Claims the code now keeps
- Trades improve both teams. The finder previously tolerated deals that made the partner slightly worse, and the Trade Sniper tab had no partner test at all. Both now require a real gain on the other side, and the sniper shows their gain or drops the row.
- FAAB bids are sized to your league. The league's real bid history was computed and never used. Bids now scale to the observed median winning bid, and every figure — including the conservative one — is capped by your remaining budget.
- Priority-league advice is attached to the actual claim rank rather than always passing zero.
- Roster space is checked before you are told to drop someone.
- The plan is three moves. The header said “your 3-move plan” above six cards. The plan is three; the rest are “also considered”.
Platform parity
- Yahoo superflex lineups were being mangled into an unfillable slot, silently costing those leagues a full starter. Fixed, and pasted
SUPERFLEX/SFLEX/OPnow resolve too. - Yahoo D/ST points-allowed tiers were never imported, and ESPN read only four scoring values and defaulted the rest. Both now import their real scoring.
- Yahoo FAAB budgets were hardcoded to 100 regardless of the league's real budget. Now taken from the league or inferred from team balances, and flagged when inferred.
- Leagues without a schedule were drawing random pairings on every simulation run, and their matchup page was permanently empty. Yahoo now attempts its real schedule; anything still missing gets one deterministic balanced round-robin, flagged as modelled.
Data Health and confidence
- Per-source status was stamped at publish time, so a stalled refresh kept reporting “healthy” next to a days-old timestamp. Status is now recomputed against the clock.
- “Plan confidence” was a hardcoded string, and the engine's per-player confidence file was fetched and never read. Confidence is now real: it comes from the players in your plan and is capped by data age.
The backtest got worse, on purpose
The replay was scoring against end-of-season roster status, which silently dropped players who got injured later in the year — an easier test than the one we said we were running. Fixed. The published table moved from RB 67% / WR 53% / TE 56% / QB 56% to RB 63% / WR 50% / TE 49% / QB 50%, and gained a kickers row showing their real 0.15 rank correlation. Training seasons are now pinned so a retrain cannot ingest the holdout season.
Copy we corrected rather than defended
Where the product legitimately could not do what the site said, the site changed: the sample cards no longer advertise a title-odds gain for a depth stash (the product prints “too close to call”, so the page does too), and the title-odds, Data Health and league-format claims were rewritten to describe real behaviour, including the modelled-schedule limitation.
Pre-season readiness: the real 2026 season replayed against the product
Everything before this had been tested at a single frozen week with synthetic rosters. We now replay the real 2026 NFL season — the actual schedule, so real bye weeks — against hundreds of generated leagues across all five platforms, 6 to 16 teams, every scoring and waiver variant, plus fourteen named edge cases (a zero-player team, all starters on bye, an empty free-agent pool, exhausted FAAB, malformed lineup slots, a two-team league). Eighteen weeks, roughly 300 customers per week, and a real browser driving every page on desktop and mobile.
The launch blocker
The morning digest could not have delivered. It was scheduled as a normal function, and a scheduled function is killed at 30 seconds. The replay measured about 36ms of work per stored user, so the digest was already near 25 seconds at 308 customers and would have been killed mid-loop past roughly 800 — a partial send, no retry, and no record of who had been emailed. Delivery is now resumable and windowed: it fires repeatedly across a window, sends for at most 20 seconds per invocation, and records every address sent against the calendar day so the next fire resumes where the last stopped. The alert sweep got the same bounded treatment.
Server bugs the replay found
- One malformed user record silently disabled alerts for everybody. A single stored league of
nullthrew inside the relevance pass and aborted the entire run — every other customer got zero alerts, every 15 minutes, until that record was repaired. Each user is now isolated. - The digest had no send-once guard, so a double scheduler fire mailed the whole list twice (134 duplicates at week 6 in the replay).
- A league connected twice rendered twice and was counted twice in the digest subject line.
- Expired alerts were never collected for users who had stopped receiving new ones.
Alert volume: the bell has to mean something
The old bar produced roughly 240 alerts per customer per week — 1.32 million ids across a replayed season — which churned the storage cap within a single cycle, so genuine alerts were evicted within hours. The threshold was raised and capped at six per run. The same season now writes 28,000 ids, users sit well under the cap, and the oldest surviving alert is a week old.
Seven UI crashes, all found by the browser replay
- The Injuries tab threw on any player id missing from the bundle and silently did nothing — the previous page just stayed on screen.
- The lineup page threw outright on a malformed slots array.
- Title odds threw for any league below the simulator's four-team minimum.
- Power rankings divided by zero and rendered
NaNfor every team in a league imported without scoring or start slots. - A raw
nullprinted as a lineup slot label, andNaNrendered in the drop table. - On mobile, a wide table could push the whole document sideways.
Two data bugs
- Injured players were being reported to customers as being on a bye, because “on bye” was inferred from a missing weekly projection — and Out/IR players have no projection either. Bye is now derived from whether the player's NFL team has anyone projected that week.
- TE-premium scoring was inert. The setting was read but nothing could spend it, so TE-premium leagues scored identically to full PPR.
Leagues are now also repaired on load — malformed slots, missing scoring, non-array rosters — and Data Health says when a league imported incomplete. The digest warns when it is planning against a roster that hasn't synced in a week.
Sign-in restored
Sign-in was broken on the live site: the transactional email key had been revoked, so every magic-code request failed. Fixed end to end — the sending domain bellcowgm.com was verified with its DNS records, a fresh key scoped to sending on that domain only was issued, and outbound mail now comes from a Bellcow address rather than a pre-rebrand one. Verified live: a code request succeeds and the email delivers.
Connector and payment walkthrough
All five league connectors and the payment flow were tested live on bellcowgm.com. Two small bugs were found and fixed:
- The “Your leagues” card ran the sync timestamp into the link with no space (“synced just nowOpen →”).
- A failed ESPN import — a private league, or a wrong id or season — surfaced ESPN's raw truncated JSON error straight to the user. It now shows a plain-English message, with a nudge toward the private-league fields when the error looks like an authentication problem.
One finding is still open and is not a code change: the payment provider's post-checkout confirmation message still carries the pre-rebrand product name. That copy lives in the payment provider's dashboard, not in this repository.
Homepage: the full feature list
The homepage gained a complete “what Bellcow GM actually does” section covering the real feature set in four groups — what happens every day without you asking, how to see where you stand, the in-app assistant, and what makes it trustworthy. Every feature listed was verified working during the connector and payment pass, not written from a spec.
Earlier history. Bellcow GM has not launched publicly yet, so these notes begin at the point the product became something we were willing to charge for. Anything before that was pre-release work and is not listed.
Related
Live system status
Methodology
Data coverage
Report a bug · Send feedback