Skip to content

Releases: Guard-Core/guard-agent-rs

v3.2.4

Choose a tag to compare

@rennf93 rennf93 released this 15 Oct 21:53
Immutable release. Only release title and notes can be modified.
f483111

v3.2.4 (2026-10-15)

Redis persistence off the core lock, Python agent parity in redaction, transport and flush, lockstep with the agent family at 3.2.4 (v3.2.4)

Fixed

  • The Redis persist no longer runs under the core lock: writes are tracked background tasks that stop drains, so a slow or failing Redis no longer delays event-emitting requests. In-flight writes are capped at buffer_size (shared by events and metrics): past the cap the record stays in memory only, counts toward redis_persist_failures, and one warning is logged per degradation episode. A write whose record left the buffer before the task started is skipped, and membership is tracked in a key map instead of scanning the buffer. Lockstep release with the agent family at 3.2.4.
  • Redaction, transport and flush semantics match the Python agent (#57, #58). Values nested past the depth bound are redacted wholesale, JSON-looking string values are parsed and sanitized (and wholesale redacted past 8192 characters), metric tag values get the same nested handling, and the transport runs a second header sanitization pass like _redact_sensitive_headers. An encrypted batch answered with 413 is split and each half re-encrypted instead of dropped whole, and the right half of a split is still sent when the left half fails. A permanent rejection (400, 404, 422) counts as sent and resets the flush streak and the retry gate. The rules loop starts only when a project id is set, an encryption key with surrounding whitespace is stripped, and loop_failures.flush resets every loop iteration. POST accepts only 200 and 201, GET follows the same rules, redirects are not followed, and any other status, an unparseable 200 or a 200 with an empty object is retried at once without opening the breaker
  • Persisted records are reloaded in the order the store returns them, like the Python agent, instead of sorted by key (#60)

Changed

  • With the guard-core feature enabled, the optional guard-core-rs requirement moves to 4.4.0 so the agent ships in lockstep with the engines. serde_json enables preserve_order so redacted payloads keep their key order. Publish guard-core-rs 4.4.0 first

v3.2.3

Choose a tag to compare

@rennf93 rennf93 released this 12 Oct 23:37
Immutable release. Only release title and notes can be modified.
14ea427

v3.2.3 (2026-10-12)

Core version reporting, lockstep with the agent family at 3.2.3 (v3.2.3)

Note

  • The crate version moves to 3.2.3 so all five agents ship the same version.

Changed

  • With the guard-core feature enabled, GuardAgent::new fills guard_core_version from guard_core_rs::VERSION when it is unset, so the Guard SaaS sees which core is running; a value set by the caller wins. The optional guard-core-rs requirement moves to 4.3.3.

v3.2.2

Choose a tag to compare

@rennf93 rennf93 released this 09 Oct 10:20
Immutable release. Only release title and notes can be modified.
v3.2.2
3f004cd

v3.2.2 (2026-10-09)

The engine-seam release: the guard-core-rs telemetry bridge and the reference log-record formatters land, lockstep with guard-agent 3.2.2 on PyPI (v3.2.2)

Note

  • Lockstep with the family: PyPI's guard-agent 3.2.2 is live and this crate tags the same wave (the crate's first content release since 3.2.0)

Added

  • The guard-core-rs engine seam (bridge, behind the guard-core feature): GuardAgentTelemetry implements the facade's guard_core_rs::composite::TelemetryHandler sink trait, so the engine's CompositeAgentHandler fan-out hands the agent every middleware-emitted event and metric - the Rust counterpart of the reference agent_handler=GuardAgentHandler(...) handoff. The event map is name for name against _utils/agent_events.py (event_type, ip_address, country, user_agent, endpoint, method, decorator_type, rule_type, handler_name, action_taken, reason, response_time transfer directly; status_code and pattern_matched surface from the facade's free-form metadata bag exactly as the reference's per-site kwargs populate them; a fresh idempotency key stamps on construction; the metadata bag forwards as the wire object for the agent's ingest-time redaction); the metric map parses the seven METRIC_* wire names and rejects unknown types as sink errors. Threading contract: the facade's trait is synchronous (the engine's I/O-free seam idiom), so the send paths spawn onto the wired runtime (fire-and-forget from any thread, buffering cannot fail) while the lifecycle paths block on it (call off the async request path); initialize_redis rides the trait default since the agent attaches its own persistence through attach_redis_handler (the reference initialize_agent/initialize_redis pairing). Nine tests drive the map, the full sync lifecycle against a real runtime (start, buffered sends through the spawned tasks, the at-least-once flush failure surface, the dynamic-rules carrier, health degradation, stop), and the composite bus adapter end to end.
  • The reference log-record formatters (logging_utils, the GAP-R12 logging half): json_record (the JsonFormatter four-field shape in reference key order), text_record (the [%(name)s] %(asctime)s - %(levelname)s - %(message)s layout), and asctime (the python-logging formatTime stamp, UTC) - the portable record-rendering half of logging_utils.py; the reference's setup_agent_logging registry wiring stays documented as N.A.-idiom (the log facade has no registry for this crate to own, the host subscriber formats through its own machinery)

Changed

  • Crate version is 3.2.2 (Cargo.toml / Cargo.lock), matching the release tag and the PyPI guard-agent 3.2.2 wave.

Compatibility

  • Drop-in. Consumers on 3.2.1 can move to 3.2.2 with no code or config changes; both new surfaces are additive at the crate root (the bridge behind the guard-core feature).

v3.2.1

Choose a tag to compare

@rennf93 rennf93 released this 07 Oct 02:11
v3.2.1
1a9dcd8

v3.2.1 (2026-10-07)

The family lockstep artifact: the 3.2.1 wave tag (v3.2.1)

An empty lockstep release for the Guard agent family 3.2.1 wave: no shipped change, the crate has a zero src/ diff since 3.2.0 apart from the version. The tag exists so the family stays version-aligned while the TypeScript port ships the wave's only runtime fix (the js/polynomial-redos endpoint normalization hardening, guard-agent-ts 3.2.1).

Changed

  • Crate version is 3.2.1 (Cargo.toml / Cargo.lock), matching the release tag. No dependency, feature, or behavior delta since 3.2.0.

Compatibility

  • Drop-in. Consumers on 3.2.0 can move to 3.2.1 with no code or config changes.

v3.2.0

Choose a tag to compare

@rennf93 rennf93 released this 01 Oct 22:28
v3.2.0
abc2fef

v3.2.0 (2026-10-01)

Hardening and coverage release: the fail-secure response-body read restored on every platform, a 100% line coverage gate on CI, and the crypto and utility stack brought current.

Added

  • 100% line coverage gate (.github/workflows/ci.yml): cargo-llvm-cov enforces the full line coverage floor on CI; the agent, transport, persistence, and encryption paths are driven there by unit twins and integration extensions (src/agent.rs, src/transport.rs, src/persistence.rs, src/encryption.rs, tests/).
  • Community and security scaffold (CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md, .github/): issue and PR templates, FUNDING, dependabot config, and a CodeQL workflow.

Changed

  • Crate version is 3.2.0 (Cargo.toml / Cargo.lock), matching the release tag.
  • Crypto and utility stack current (Cargo.toml): aes-gcm 0.11, hmac 0.13, sha2 0.11, rand 0.10, base64 0.23, redis 1.7.1, thiserror 2.0.21, with the AEAD, digest, and rand API migrations applied (src/encryption.rs, src/signing.rs).
  • CI actions current (.github/workflows/): actions/checkout v7, actions-rust-lang/setup-rust-toolchain v2, taiki-e/install-action 2.87.21.

Fixed

  • Fail-secure response-body read on every platform (src/transport.rs): a failed body read is always a retryable transport failure, never classified from an empty string; a 201 with an unreadable body no longer counts as Accepted and a 429 no longer surfaces as a clean RateLimited.
  • Lockfile escapes the yanked yoke-derive 0.8.3 (Cargo.lock): the msrv-aware resolver now picks the 0.8.4 republish, keeping the cargo-deny yanked check fully armed.

v3.1.0

Choose a tag to compare

@rennf93 rennf93 released this 27 Sep 16:41
v3.1.0
edc8b5c

v3.1.0 (2026-09-27)

Parity release: the 3.0.2 to 3.1.0 agent feature train, in the same window as the Python and TypeScript agents.

Added

Added

  • AES-256-GCM encrypted ingest (src/encryption.rs): batches can be encrypted end to end before they leave the host, matching the Python agent contract.
  • Sensitive-header redaction: configurable sensitive_headers / metadata and tag keys (src/config.rs, DEFAULT_SENSITIVE_HEADERS) redacted before buffering.
  • Dynamic rules: the agent pulls rule updates from the ingestion API and applies them locally without a restart (src/agent.rs, src/models.rs), with tests in tests/dynamic_rules.rs.
  • Local rate limiter (src/rate_limiter.rs): token-bucket local limiting protects the host from event floods before anything is buffered or shipped.
  • on_error and max_payload_size knobs (src/config.rs): operators choose the failure behavior and cap the serialized payload size.
  • Helper ports (src/utils.rs): the LOW-surface helpers shared by the new subsystems.

Changed

  • Crate version is 3.1.0 (Cargo.toml / Cargo.lock), matching the release tag.

guard-agent-rs 3.0.2

Choose a tag to compare

@rennf93 rennf93 released this 23 Sep 23:34
v3.0.2
19962c2

guard-agent-rs 3.0.2 (2026-09-24)

First tagged release of guard-agent-rs, and its first crates.io publish.

Added

  • Parity with the reference guard-agent 3.0.2, including the payload-signature contract: HMAC-SHA256 over the uncompressed body, with the server verifying after decompression
  • Release automation: release.yml Release Gate (fmt, clippy, tests at tag on stable and 1.92, tag-matches-crate-version gate) plus an automated crates.io publish job on release creation
  • Makefile and .github/scripts/bump_version.py version-bump script

Fixed

  • The partial-failure warning no longer claims Redis retention when Redis is not configured.