• v3.11.1 01c9f86197

    v3.11.1
    All checks were successful
    CI / Frontend tests, audit, and build (push) Successful in 1m54s
    CI / Bot/backend version sync (push) Successful in 24s
    CI / Docker image build (push) Successful in 13s
    CI / Backend lint (ruff) (push) Successful in 42s
    Release / Create Forgejo release (push) Successful in 26s
    CI / Bot tests and audit (push) Successful in 1m52s
    Release / Build and push versioned images (push) Successful in 55s
    CI / Backend migration, tests, and audit (push) Successful in 9m1s
    Stable

    claude-bot released this 2026-08-05 18:32:14 +00:00 | 534 commits to main since this release

    Approval was unreachable, and the quote board was failing silently.

    Three bug fixes found while investigating why a recurring session was offered
    no title suggestions. One new migration (e0f1a2b3c4d5), additive and with
    a best-effort backfill. BOT_CONTRACT_VERSION stays 1 — no /api/bot/* change,
    so images can be upgraded one at a time.

    Fixed

    • [webapp] GM approval was unreachable on a default install. sessions. audio_processing_status conflated where the audio file is with whether the
      GM had signed off on the content. Under the default retention mode
      (delete_after_processing) the status jumps straight to approved — which
      means "audio deleted", not "GM approved" — so the approve endpoint, which
      required ready, could never be called. Everything gated behind it was dead:
      publishing session highlights to players, reposting the GM-corrected summary
      to Discord, journal entries, and next-session title suggestions. Content
      approval now has its own state and its own endpoint,
      POST /sessions/{id}/approve, gated on having a summary rather than on audio
      state. POST /sessions/{id}/audio/approve remains as a deprecated shim.
      Transcript editing and the feedback tally were gated the same way and are
      likewise fixed. (#278)
    • [webapp] Post-summary tasks fired from three places that didn't know about
      each other
      , so a hand-edited summary rebuilt the campaign storyline and
      nothing else. Replaced with a single fan-out that distinguishes the initial
      transcription from a later edit — the recap email and lore extraction no
      longer re-fire because a GM fixed a typo. (#278)
    • [webapp] Title suggestions generated from nothing, and destroyed
      themselves on failure.
      The task read context from completed sessions but
      runs while the session is still confirmed, and on any LLM error it
      overwrote a good suggestion set with an empty one plus a fresh timestamp.
      (#278)
    • [webapp] The quote board was silently empty. Endpoints that accept
      response_format: json_object without enforcing it can return structurally
      invalid JSON, which the strict parser rejected — logging the result as
      "0 highlights", indistinguishable from the model finding nothing memorable.
      JSON parsing is now tolerant of a truncated or over-closed response, shared
      across every structured-output caller, and both repair and total failure are
      logged at WARNING. A related bug cleared existing highlights before checking
      whether the new extraction returned anything, so each retry of a failing
      session destroyed the previous good set. (#279)
    • [webapp] Admin retention warning for "delete after processing" understated
      the consequences; it now tells you to correct the transcript before approving.
      (#278)

    Added

    • [webapp] Title suggestions on the session edit form — sessions created
      from a recurring series are materialized by a background task and never pass
      through the new-session form, so this is the only place they can be titled
      from a suggestion. (#278)
    Downloads