Loading inbox…
Loading inbox…
Verified reproduction: fantasy inseason stream --league-file data/manual/league_rosters_2026-27.json --start 2026-10-23 --end 2026-10-26 --json Verified replacement: fantasy inseason stream --league-file data/manual/league_rosters_2026-27.json --window-only 2026-10-23..2026-10-26 --json For actual matchup-aware reviews prefer --date plus explicit captured inputs and uncertainty settings; do not equate the legacy output with a full season-aware recommendation. --- a/docs/integrations/advisor.md +++ b/docs/integrations/advisor.md @@ -21,7 +21,7 @@ fantasy status # local SQLite (var/fantasy.db) is empty in a fresh clone: that's expected fantasy sim season --league-file data/manual/league_rosters_2026-27.json --no-save --json fantasy lineup plan --date 2026-10-22 --allow-stale --json -fantasy inseason stream --league-file data/manual/league_rosters_2026-27.json --start 2026-10-23 --end 2026-10-26 --json +fantasy inseason stream --league-file data/manual/league_rosters_2026-27.json --window-only 2026-10-23..2026-10-26 --json fantasy inseason trade --league-file data/manual/league_rosters_2026-27.json --partner 5 --give "Player A" --get "Player B" --json fantasy inseason lineup --help ``` --- a/web/src/content/advisor.md +++ b/web/src/content/advisor.md @@ -21,7 +21,7 @@ fantasy status # local SQLite (var/fantasy.db) is empty in a fresh clone: that's expected fantasy sim season --league-file data/manual/league_rosters_2026-27.json --no-save --json fantasy lineup plan --date 2026-10-22 --allow-stale --json -fantasy inseason stream --league-file data/manual/league_rosters_2026-27.json --start 2026-10-23 --end 2026-10-26 --json +fantasy inseason stream --league-file data/manual/league_rosters_2026-27.json --window-only 2026-10-23..2026-10-26 --json fantasy inseason trade --league-file data/manual/league_rosters_2026-27.json --partner 5 --give "Player A" --get "Player B" --json fantasy inseason lineup --help ```
pytest tests/test_inseason_scan.py -k test_stream_week_excludes_games_after_stint -vRegression-only diff below, verified to fail on 363facd; no production fix is claimed. A complete fix should share the selected chain player and half-open availability windows with the weekly evaluator. Merely clipping the streamer would omit the replacement player's remaining-week contribution. Do not change the roster based on this test.
--- a/tests/test_inseason_scan.py
+++ b/tests/test_inseason_scan.py
@@ -211,3 +211,37 @@
rs = table[0]["resim"]
assert rs["seeds"] == [11, 12] and rs["by_set"]["blend"]["me"]["p_title"]["n_seeds"] == 2
assert rs["class"] in {"helps", "speculative", "floor_only", "noise", "hurts", "mixed"}
+
+
+@pytest.mark.parametrize("stint_days, expected_games", [(None, 1), (1, 0)])
+def test_stream_week_excludes_games_after_stint(ctx, proj_path, stint_days, expected_games):
+ """A one-day streamer cannot contribute his only game on day two.
+
+ The public --stint-days contract says how long the streamer is kept, not
+ merely how long to charge his season cost. No choice of chain replacement
+ can make the departed streamer's own day-two game eligible.
+ """
+ df, vals = ctx.proj.df, ctx.values
+ ids = list(vals.index)
+ me = _players(ids[1:27:2], df, "AAA")
+ opp = _players(ids[2:27:2], df, "BBB")
+ first = date(2026, 11, 2)
+ days = [first + timedelta(days=i) for i in range(3)]
+ nba = NBASchedule(
+ games=[(d, "AAA", "BBB") for d in days] + [(days[1], "CCC", "DDD")],
+ source="synthetic-stint-regression",
+ )
+ add = ids[0]
+ fa = FreeAgent(add, "Streamer", "CCC", parse_positions(df.loc[add, "positions"]),
+ None, None, "player")
+ report = scan_streams(
+ df, ctx.settings, nba, me, opp, [fa], days,
+ generic_per_game_values(load_projections(proj_path), ctx.settings), vals["value"],
+ StreamParams(week_sims=0, season_sims=0, season_top=1,
+ stint_days=stint_days, waiver_lag=0),
+ drops=[me[-1].player_id],
+ )
+ row = next(r for r in report["pairs"] if r["add"] == add)
+ assert row["add_games"] == expected_games
+ if stint_days == 1:
+ assert row["add_starts"] == 0daily-routine · daily routine 2026-10-20 (evening; set 10-21)
lineup agent ≠ model chose {"2026-10-21":"Podziemski BN->IL; rest unchanged","2026-10-22..25":"already = ta (model: {"p_win":0.62,"plans":"lineup-0.3.0 per-day with --current-slots read 02:42Z","e)
main-agent · matchup score capture (read-only)
main-agent · first matchup score capture (read-only)
daily-routine · daily routine 2026-10-20
Yahoo already equals target_slots for 10-21; 10-22..10-25 active players with games all started (server re-read)
helps in all 3 projection sets (title +5.9/+8.9/+7.0 pp) and schedule-neutral (+1.8 pp); needs user yes
User reported clicking Start Active; re-read all week days: starters already match optimizer targets. Only change: Podziemski O -> IL (pre-authorised).
lineup-0.2.0: today matches Yahoo; 10-21 already set (same starters); 10-22 only Jokic plays -> set in advance
Brunson/Jokic have no game Wed; Podziemski Q (p_play prior 0.5) benched, re-check before GSW tip 10pm ET
recommendations[0] (value_search ok)
deviation: guard rule (user, picks 108+) - took top-5 #1 guard over recommendations[0] DeMar DeRozan; roster has 1 true guard; daily lineup crunch not modelled
recommendations[0] (value_search ok)
recommendations[0] (value_search ok)
recommendations[0] (value_search ok)
recommendations[0] (value_search ok)
recommendations[0] (value_search ok)
recommendations[0] (value_search ok)
recommendations[0] (value_search ok)
deviates from recommendations[0] (Bane 5.629, p_next 0.16): top-5 within 0.022 = tie; protocol tie-break prefers lower prob_available_next -> Kawhi 5.633, p_next 0.003
recommendations[0] (back-to-back 36/37)
recommendations[0] (value_search); top-5 within 0.02, lowest p_next 0.063
recommendations[0]; margin 0.064 over Wembanyama