Skip to content

Releases: runcycles/cycles-client-rust

v0.2.4

08 May 12:37
e8a9f4a

Choose a tag to compare

Changed

  • Crates.io description and keywords broadened to cover the three pillars of
    Cycles' runtime authority: spend, risky tool actions, and audit gaps. Prior
    framing ("budget-management protocol — deterministic spend control") only
    surfaced the spend dimension and missed search-intent traffic for action
    control and audit-trail use cases.
  • Keyword set updated from ["cycles", "budget", "llm", "ai-agents", "cost-control"] to ["ai-agents", "llm", "budget", "governance", "audit-log"]. Same five-keyword cap, broader coverage.
  • README.md opening reorganized around the three pillars (spend / risky
    actions / audit gaps), each with a one-line concrete affordance, instead
    of leading with budget enforcement only.

No behavioral changes. API surface, wire protocol, and conformance audit
results are identical to 0.2.3.

v0.2.3 — 404 unit-mismatch diagnostic

11 Apr 13:31
f468763

Choose a tag to compare

Fixed

  • Misleading 404 on reserve / decide / event when the request unit does not match the stored budget's unit (#8). The server indexes budgets by the composite (scope, unit) key, so reserving in the wrong unit surfaces as "Budget not found for provided scope: …" even when the scope itself has an ACTIVE budget. create_reservation, create_reservation_with_metadata, decide, and create_event now enrich such 404s in-flight with the unit that was sent, so the mismatch is self-diagnosing. All other Error::Api fields (status, code, request_id, retry_after, details) are preserved unchanged — no behavioral change for other errors.

    Example enriched error:

    Api { status: 404, code: Some(NotFound),
          message: "Budget not found for provided scope: tenant:rider
                    (request was sent with unit=TOKENS; verify an ACTIVE
                     budget exists at this scope AND unit — the server
                     indexes budgets by (scope, unit), so a mismatched
                     unit surfaces as a 404 NOT_FOUND)",
          request_id: Some("..."), ... }
    

Docs

  • Amount, WithCyclesConfig::new, the with_cycles_usage example, and the README Quick Start all note the (scope, unit) budget indexing invariant (spec line 667) so new users don't hit this.

Tests

  • 5 new unit tests (client::tests::enrich_budget_not_found_*) and 4 new wiremock integration tests (create_reservation_404_*, decide_404_*, create_event_404_*, plus a non-matching 404 pass-through control). Coverage 95.55% (472/494 lines), above the 95% project threshold.

Server-side follow-up

The underlying misleading 404 is a server diagnostic gap, tracked as runcycles/cycles-server#79. Once the server fix (v0.1.25.6) is deployed, wrong-unit requests return structured 400 UNIT_MISMATCH with details.{scope, requested_unit, expected_units} directly — the client enrichment in this release remains forward-compatible and will simply stop firing on the wrong-unit case (still fires for truly-missing 404s). Retirement of the workaround is tracked in #10 and is non-urgent.

Install

[dependencies]
runcycles = "0.2.3"

Full diff: v0.2.2...v0.2.3 · PR: #9 · crates.io: runcycles 0.2.3 · docs.rs: runcycles 0.2.3

v0.2.2 API helpers, ergonomics

02 Apr 20:29
4ffc0df

Choose a tag to compare

What's Changed

  • fix: API ergonomics from dev feedback (0.2.2) by @amavashev in #5

Full Changelog: v0.2.1...v0.2.2

v0.2.1 doc update

31 Mar 12:11
50d281f

Choose a tag to compare

Updated README, version

Full Changelog: v0.2.0...v0.2.1

v0.2.0 - Initial public release

31 Mar 11:45
b600265

Choose a tag to compare

What's Changed

  • Add complete Rust client for Cycles budget authority protocol by @amavashev in #1
  • fix(ci): bump MSRV from 1.75 to 1.88 by @amavashev in #2
  • fix(ci): pass rust-versions explicitly to avoid MSRV mismatch by @amavashev in #3
  • chore: exclude internal files from crates.io package by @amavashev in #4

New Contributors

Full Changelog: https://github.com/runcycles/cycles-client-rust/commits/v0.2.0