Repository navigation
Releases: Guard-Core/guard-agent-rs
Releases · Guard-Core/guard-agent-rs
Release list
v3.2.4
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
stopdrains, so a slow or failing Redis no longer delays event-emitting requests. In-flight writes are capped atbuffer_size(shared by events and metrics): past the cap the record stays in memory only, counts towardredis_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, andloop_failures.flushresets 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-corefeature enabled, the optionalguard-core-rsrequirement moves to 4.4.0 so the agent ships in lockstep with the engines.serde_jsonenablespreserve_orderso redacted payloads keep their key order. Publish guard-core-rs 4.4.0 first
v3.2.3
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-corefeature enabled,GuardAgent::newfillsguard_core_versionfromguard_core_rs::VERSIONwhen it is unset, so the Guard SaaS sees which core is running; a value set by the caller wins. The optionalguard-core-rsrequirement moves to 4.3.3.
v3.2.2
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-agent3.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 theguard-corefeature):GuardAgentTelemetryimplements the facade'sguard_core_rs::composite::TelemetryHandlersink trait, so the engine'sCompositeAgentHandlerfan-out hands the agent every middleware-emitted event and metric - the Rust counterpart of the referenceagent_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_codeandpattern_matchedsurface 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 sevenMETRIC_*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_redisrides the trait default since the agent attaches its own persistence throughattach_redis_handler(the referenceinitialize_agent/initialize_redispairing). 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(theJsonFormatterfour-field shape in reference key order),text_record(the[%(name)s] %(asctime)s - %(levelname)s - %(message)slayout), andasctime(the python-loggingformatTimestamp, UTC) - the portable record-rendering half oflogging_utils.py; the reference'ssetup_agent_loggingregistry wiring stays documented as N.A.-idiom (thelogfacade 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 PyPIguard-agent3.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-corefeature).
v3.2.1
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
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
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 intests/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_errorandmax_payload_sizeknobs (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
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.