• v5.1.0 93891cb366

    v5.1.0
    All checks were successful
    CI / build-and-test (push) Successful in 2m10s
    CI / docker-build (push) Successful in 24s
    Stable

    joeyr released this 2026-10-07 18:10:38 -05:00 | 10 commits to main since this release

    debug:True shows what Claude looked up to answer.

    Added

    • debug:True on query-chat and espnff mcp. It adds a few lines of
      small grey text under the answer: how many rounds and lookups it took and
      how long, each round's lookups with what was asked
      (get_team_info (team 4)), and the tokens in and out, with how many of
      those in came from the cache. An answer given with no lookups says
      0 rounds, no lookups, which is how an answer from memory shows itself.
      Only the asker sees it. It is not saved with the conversation, so a
      follow-up is unaffected, and Make Public posts the answer without it.

    Changed

    • The usage in the claude/api success log line now includes the cache
      totals of every request a question sent.
      It used to count input and
      output only, with cache figures from the last request alone, so a question
      with tool rounds under-reported what it read and wrote. The separate
      cacheReadInputTokens and cacheCreationInputTokens fields beside it are
      unchanged and still show the last request.
    Downloads
  • v5.0.0 a01ab69e3e

    v5.0.0
    All checks were successful
    CI / build-and-test (push) Successful in 2m16s
    CI / docker-build (push) Successful in 26s
    Stable

    joeyr released this 2026-10-07 17:09:10 -05:00 | 12 commits to main since this release

    Every Claude call moves from Haiku 4.5 to Haiku 5.5, a tenth of the price.
    query-chat and espnff mcp now share one conversation, so a follow-up in
    either remembers what you asked the other.

    Changed

    • query-chat and espnff mcp run on Claude Haiku 5.5 at high effort,
      with thinking on.
      Haiku 4.5 sent no thinking or effort setting and
      answered without thinking. Haiku 5.5 thinks before it answers, steered by
      the new CLAUDE_CHAT_EFFORT (low, medium, high, xhigh or max;
      default high). Both commands use one level because they share a
      conversation, and changing effort between requests misses the prompt
      cache. CLAUDE_MAX_TOKENS goes from 5,000 to 10,000, because thinking now
      counts toward the cap. The prompt cache stays at one hour
      (PROMPT_CACHE_TTL). Haiku 5.5 caches prompts from 512 tokens, where Haiku
      4.5 needed 4,096, so short query-chat questions now cache too.
    • The two commands share one conversation per person per channel. Ask
      about your lineup in espnff mcp, then follow up in query-chat, or the
      other way round. Each command still sends its own instructions and tools,
      so the first question after switching re-reads the conversation at full
      price. Follow-ups in the same command are cached again after that. A chat
      question after fantasy questions alone still gets the channel history of
      its window, since fantasy turns carry public answers but no channel
      history. new:True in either command starts the shared conversation over.
    • LoL lane detection runs on Haiku 5.5 at medium effort, with thinking
      still off and nothing cached: one short call per game.
      LOL_LANE_DETECTION_MODEL now defaults to claude-haiku-5-5.
    • The start-up key check runs at low effort, uncached. It uses
      CLAUDE_MODEL, like the commands.
    • Breaking: CLAUDE_MODEL and LOL_LANE_DETECTION_MODEL must name a model
      that accepts an effort setting.
      Claude Haiku 4.5 does not, so a stack
      that still sets either to claude-haiku-4-5-20251001 gets an API error on
      every question and every lane lookup. Update the stack file before this
      image rolls out:
      set both to claude-haiku-5-5, CLAUDE_MAX_TOKENS to
      10000, and add CLAUDE_CHAT_EFFORT: high. Those values work with 4.2.2
      as well, so the stack can go first.

    Fixed

    • A question Claude's safety filters decline gets a plain answer saying
      so.
      Haiku 5.5 runs classifiers that can stop a reply, sometimes part-way.
      The bot used to fail as if the API had broken, or show the half answer. It
      now says the question was declined and that rewording it may help.
    Downloads
  • v4.2.2 307930920f

    v4.2.2
    All checks were successful
    CI / build-and-test (push) Successful in 3m7s
    CI / docker-build (push) Successful in 48s
    Stable

    joeyr released this 2026-10-05 00:08:49 -05:00 | 13 commits to main since this release

    Fixed

    • The matchup header says "expected" instead of "proj". The number in
      brackets after each score is ESPN's live guess at the final score, but
      "proj" read as the table's PROJ column, which is the pre-game projection.
      So the header said (proj 125.0) above a TOTAL row that said 111.7, and
      the two seemed to disagree. The table's matching row is now EXPECTED too,
      sitting under the points columns, from mcp-gateway 0.68.0.
    Downloads
  • v4.2.1 c996c51dcf

    v4.2.1
    All checks were successful
    CI / build-and-test (push) Successful in 2m17s
    CI / docker-build (push) Successful in 26s
    Stable

    joeyr released this 2026-10-04 18:57:46 -05:00 | 15 commits to main since this release

    Fixed

    • Injury letters in the matchup table are bold red, so they no longer read
      as part of a name.
      Plain, Rice Q and McConk O looked like a surname
      and an initial. ESPN marks the same letters in red, and so does the table
      now. Only the letter changes, so the columns stay where they were. A
      one-letter position such as K is left alone, because a number comes
      before it rather than a name. In a Discord app too old to draw ANSI the
      letter shows plain, as before.
    Downloads
  • v4.2.0 cb170fc633

    v4.2.0
    All checks were successful
    CI / build-and-test (push) Successful in 3m16s
    CI / docker-build (push) Successful in 43s
    Stable

    joeyr released this 2026-10-04 18:09:10 -05:00 | 16 commits to main since this release

    Changed

    • /aufhocker espnff matchup's table has a bold header and bold totals.
      The header row is bold and underlined, and the rows from TOTAL down are
      bold. Markdown does nothing inside a code block, and the code block is what
      keeps the columns lined up, so the table is now an ansi code block. The
      codes take up no columns: an older Discord app that doesn't draw them shows
      the table plain, still aligned. The fantasy server's own table stays
      unstyled, because Claude reads it too.
    • The header line rounds scores the way the table does. The scores and
      projections above the table now round half up from the two decimals the
      fantasy server sends. toFixed rounded the stored binary value instead, so
      a figure like 116.85 came out 116.8 in the header and 116.9 in the table
      under it. The table's new LIVE row and wider name columns come from
      mcp-gateway 0.67.0.
    Downloads
  • v4.1.1 2ce777260b

    v4.1.1
    All checks were successful
    CI / build-and-test (push) Successful in 2m17s
    CI / docker-build (push) Successful in 26s
    Stable

    joeyr released this 2026-10-04 17:38:25 -05:00 | 17 commits to main since this release

    Fixed

    • /aufhocker espnff help works for the team's owner again. Their card
      lists all sixteen fantasy tools plus the paragraph on changing the team,
      which came to 2,260 characters. Discord refuses a message over 2,000, so
      the owner got an error instead of the card. Everyone else, with ten tools,
      was unaffected. Tools that change the team are now named once, in the
      paragraph that says which wait for Confirm, instead of also getting a
      line in the list. That brings the owner's card to about 1,900 characters
      with every summary still in it. The tool list comes from the fantasy
      server, so it can grow without a change here. The card now always fits:
      when the summaries don't, it lists the tool names alone, and if even
      those don't fit, as many as do plus "and N more".
    Downloads
  • v4.0.0 63b6933d1b

    v4.0.0
    All checks were successful
    CI / build-and-test (push) Successful in 3m10s
    CI / docker-build (push) Successful in 43s
    Stable

    joeyr released this 2026-10-04 14:06:09 -05:00 | 20 commits to main since this release

    Removed

    • LoL win predictions are gone. A game-start post no longer gets a third
      edit with a 🔮 Prediction field: no win percentages, reasoning, squad tips
      or win condition. The result no longer says whether the prediction was
      right or shows a running 🎯 Record. That is one Claude call less for every
      game the monitor announces. Ranked data, recent champion form and lane
      order are unchanged.
    • /aufhocker lol predictions is gone, and /aufhocker lol help no
      longer mentions predictions. Discord drops the subcommand when the bot
      registers its commands at boot.
    • The prediction settings are gone: LOL_PREDICTION_ENABLED,
      LOL_PREDICTION_TIPS_ENABLED, LOL_PREDICTION_CLASSIC_ENABLED,
      LOL_PREDICTION_MODEL and LOL_PREDICTION_API_KEY (with its _FILE
      form). The bot ignores them if they are still set. The
      aufhocker_lol_prediction_key Swarm secret is no longer read.
      Drop its
      LOL_PREDICTION_API_KEY_FILE line and its secrets: entries from the
      stack file, then delete the secret. That leaves seven secrets.
    • Migration 017 deletes the stored predictions. It drops
      lol_prediction_history, which held the past predictions and their
      accuracy, and strips the _prediction copy from
      lol_active_games.spectator_data. It runs at boot like every migration.
      Its rollback recreates the empty table, but the deleted rows can't be
      recovered. Tested against a real Postgres by applying 001–017 over seeded
      rows, rolling back and applying again.

    Changed

    • Lane detection has its own model setting, LOL_LANE_DETECTION_MODEL.
      It used to borrow LOL_PREDICTION_MODEL. The code default is still Haiku
      4.5, and .env.config sets Sonnet 5.5, which is what lane detection was
      already running on. Set LOL_LANE_DETECTION_MODEL in the stack file,
      or lane detection drops to the Haiku default. It now always bills
      CLAUDE_API_KEY.
    • A remake's result now reads "no stats recorded". It used to add
      "prediction not counted".
    • A game announced before the upgrade and finished after it keeps its
      🔮 Prediction field. Its result just doesn't get a verdict line.
    Downloads
  • v3.6.0 814de38c3e

    v3.6.0
    All checks were successful
    CI / build-and-test (push) Successful in 2m7s
    CI / docker-build (push) Successful in 26s
    Stable

    joeyr released this 2026-10-02 18:21:49 -05:00 | 21 commits to main since this release

    Changed

    • The bot runs on Node 24, the current LTS, instead of Node 22. The
      Docker image, CI's build container, .nvmrc and engines all moved
      together, and @types/node moved to 24 with them. Node 22 was still
      patched, but only as maintenance LTS until April 2027. Nothing in the
      stack file changes, because the image carries its own Node. Running from
      source now needs Node 24.
      On 22, npm ci warns about the engine but
      still installs. The whole suite, the build, lint and the type check pass
      on Node 24.21.0 with npm 11.19.0. The only native packages are two dev
      tools, which ship prebuilt for 24.
    • CI reinstalls dependencies when the Node version changes. The
      node_modules cache was keyed on the lockfile alone, so the first run on
      a new runtime would have restored modules installed by the old one.
      .nvmrc is now part of the key.
    Downloads
  • v3.5.2 f6f0b70758

    v3.5.2
    All checks were successful
    CI / build-and-test (push) Successful in 2m23s
    CI / docker-build (push) Successful in 24s
    Stable

    joeyr released this 2026-10-02 12:34:42 -05:00 | 23 commits to main since this release

    Fixed

    • A fantasy question reconnects to the fantasy server instead of waiting
      on a timer.
      If the fantasy server wasn't answering when the bot started,
      the bot retried it on a timer that grew to two hours apart. So once the
      server was back, /aufhocker espnff mcp could keep saying it wasn't
      connected for up to two more hours, while telling people to try again in a
      few minutes. Now a question asked while the server is missing tries it
      again on the spot, and gets answered if it's back. espnff help starts an
      attempt too, so running it again shows the result. Two people asking at
      the same moment share one attempt rather than connecting twice.
    • The background retry tops out at 15 minutes instead of two hours. It
      still starts at a minute and doubles, so a server that's down all day
      costs about a hundred log lines. help and the log now catch up on their
      own within 15 minutes, even if nobody asks.
    • The "not connected" replies name both log lines to check:
      preflight/mcp for a failure at boot, and claude/mcp for each retry
      since. Pointing only at the first meant an outage that started after boot
      had nothing in the log where it said to look.
    Downloads
  • v3.5.1 30b842a23e

    v3.5.1
    All checks were successful
    CI / build-and-test (push) Successful in 2m23s
    CI / docker-build (push) Successful in 26s
    Stable

    joeyr released this 2026-10-02 09:36:22 -05:00 | 24 commits to main since this release

    Fixed

    • Make Public says why it can't post instead of failing silently. A
      slash command works even in a channel the bot can't see, because its reply
      goes back through the interaction. Make Public posts as the bot, so a
      channel that hides itself from the bot accepted the private answer and
      then refused to publish it. The click went unanswered, and Discord showed
      only "This interaction failed". Now the bot replies privately and names
      the two permissions it needs in that channel (View Channel and Send
      Messages
      ). The answer stays pending, so once an admin grants them, the
      same button works. Any other failed post gets a "try again" reply. This
      covers chat and fantasy answers and the D2 Terror Zone and DClone embeds.
    Downloads