Skip to content

v5.1.1

Choose a tag to compare

@github-actions github-actions released this 10 Aug 20:53
· 146 commits to develop since this release
v5.1.1
f2948d4

[5.1.1] — 2026-08-10

Fixed

  • The plan limits stopped refreshing whenever the panel was not on screen. The poll was gated on
    isShowing, so a collapsed tool window or a chat tab that was not the selected one asked for nothing at
    all — and a quota window is not the plugin's state to begin with: other sessions, other devices and
    claude.ai spend the same windows, and a reset is a wall-clock event that owes nothing to this IDE. The
    figure on screen was therefore whatever the last probe happened to catch, and it only moved again when
    something else triggered one — a turn, or opening the dashboard. "It only updates when I talk to the agent"
    is precisely what a visibility-gated poll looks like from outside. The gate is gone and the period is 30 s;
    what it was saving is one control request per half minute against a process that is already running, and
    the event-driven refreshes (turn edges, rate_limit_event, dashboard open, session ready) are unchanged.

Added

  • The chat's plan-limit row now says how long each window has leftReset time: 4h 18m on its own line
    directly under that window's bar, with the full sentence in the tooltip. A percentage alone does not say
    whether it is urgent: 90% with eight minutes to go and 90% with six hours to go are different situations,
    and only the dashboard was answering that. Under the bar rather than beside it because the row is already
    three items wide per window, and a fourth made the countdown the first thing to be squeezed out — the one
    case where it matters most. The countdown is computed by one function in app-core
    (CC.resetIn/resetInShort) that the dashboard card now shares, and a window with no reset time renders
    no element rather than an empty slot that would read as "resets now".

Changed

  • Every get_usage poll now logs the reply it got, rate_limits verbatim (truncated), at INFO. The
    derived per-window lines cannot answer the question that keeps coming up — is the number on screen stale,
    or is the server still saying that?
    — because a window the reply omits leaves no line at all, and one
    carried forward from the previous poll is indistinguishable from a fresh one. It immediately earned its
    place: a live capture showed two of three consecutive polls coming back in the header-seeded shape
    (five_hour/seven_day only, no limits[], resets_at rounded to .000Z), which is the degraded reply
    5.1.0's merge exists for, and confirmed the binary does not cache the endpoint.
  • RateLimitInfo.resetsAtIso() puts the epoch-seconds → ISO-8601 conversion on the model, so a window that
    reaches a surface from the event stream and one that arrives in the get_usage report are
    interchangeable to everything that renders them. It was a private copy in the dashboard's builder, and the
    composer needed the same thing.

Verifying this release. Both the .asc files and the tag are signed by the project's CI
signing key
(docs/ci-signing-key.asc), which is itself certified by the maintainer's hardware
key — so the chain terminates in a key that has never been on a computer.

What the signatures do NOT assert is that a human pressed a button: the release is cut
automatically from main. That claim rests on the two gates around it — main accepts only
reviewed pull requests, and publication requires an approval on a protected environment.

gpg --import docs/ci-signing-key.asc
gpg --verify claude-code-native-*.zip.asc   # these bytes came from this workflow
git verify-tag <tag>                        # this workflow cut this release from main