What's new in v0.8.6
v0.8.6 decouples the daemon's detect and score stages from the ingestion and eviction loop onto a single dedicated analysis worker fed by a bounded queue, so a long analysis pass can no longer stall ingestion or TTL eviction. Under sustained overload the worker sheds whole batches rather than blocking, and every shed is metered, never silent. The two bounded queues are now configurable, the per-batch carbon context is shared by reference count instead of deep-cloned on the hot path, and the daemon tuning surface is documented in --help and man. There is no breaking change to the daemon wire protocol, the configuration format, or any existing command. The minimum supported Rust version stays 1.96.0. The release-gate lab validation passed end to end.
Daemon: dedicated analysis worker
detect and score no longer run inline on the tokio::select! ingestion loop. They run on a single dedicated worker task fed over a bounded channel, in FIFO order so the stateful cross-trace correlator still sees a deterministic sequence. A long analysis pass can no longer stall rx.recv() or the TTL eviction ticker, so ingestion and eviction liveness no longer depend on analysis latency.
Daemon: metered load shedding and fail-loud
When analysis cannot keep up with sustained load, the bounded queue fills and whole batches are shed instead of blocking ingestion. Shedding is explicit and metered, never a silent drop. perf_sentinel_analysis_queue_depth exposes the live backlog, and perf_sentinel_analysis_shed_batches_total and perf_sentinel_analysis_shed_traces_total count what was dropped. If the worker itself stops, for example a detector panics on a pathological trace, the daemon exits with an error so a supervisor restarts it rather than staying up while it silently analyzes nothing, the same fail-loud behavior the older inline design had.
Daemon: configurable queue depths
Two new [daemon] keys make the bounded queues tunable: ingest_queue_capacity (the ingestion channel) and analysis_queue_capacity (the analysis worker queue), both defaulting to 1024 with a validated range of 1 to 1048576. Raise them under bursty load to reduce ingestion backpressure and analysis shedding. Both were previously hardcoded.
Performance: shared carbon context
The per-batch CarbonContext is shared across analysis batches by Arc instead of deep-cloning the region map and calibration table on every evicted batch. On the common no-scraper deployment the per-batch enqueue is now a reference-count bump rather than a HashMap clone.
CLI: tunables surfaced in --help and man
watch --help now lists every [daemon] tunable (listeners, sizing, the bounded-queue knobs, and the sub-sections), analyze --help lists the batch [thresholds], [detection] and [green] tunables, and the root help carries a config-location note. perf-sentinel man now emits one page per subcommand, so tuning documented only in a subcommand's long help is discoverable from the manual, not just from --help.
Documentation
The README and its French mirror gain four operator-facing points: the deterministic output guarantee (identical input yields byte-identical JSON and SARIF, so a CI quality gate never flickers), the daemon backpressure and shedding behavior, the internal sampling_rate interaction with count-based detectors kept distinct from upstream sampling, and the OTLP ingestion trust boundary. The limitations guide notes that the per-window disclosure archive is best-effort. The daemon architecture diagram reflects the analysis worker, the bounded work channel, metered shedding, and the fail-loud arm.
Helm chart
charts/perf-sentinel 0.2.50 to 0.2.51, appVersion 0.8.5 to 0.8.6. Template surface unchanged, additive metadata only.
Operator-visible behavior change
Under sustained overload the daemon now sheds whole analysis batches rather than blocking ingestion, and the shed is counted on the three new perf_sentinel_analysis_* metrics. The detect and score verdicts, the daemon routes, the OTLP wire shape, and the existing configuration keys are unchanged. The two new configuration keys are optional with backward-compatible defaults.
Why this is a patch and not a minor
The release is additive and backward compatible. The analysis worker is an internal restructuring of the existing detect and score path with no change to detection verdicts, daemon routes, the OTLP wire protocol, or existing configuration keys. The new queue-depth keys and the three shedding metrics are additive. The minimum supported Rust version stays 1.96.0.
Validation
The release-gate lab validation passed end to end on a live cluster and is recorded as PASS in the ledger.
Verifying this release
# Binary integrity via SLSA Build L3 attestation
gh attestation verify perf-sentinel-linux-amd64 \
--owner robintra --repo perf-sentinel
# A periodic disclosure produced by this binary
perf-sentinel verify-hash --report perf-sentinel-report.json \
--expected-identity "https://github.com/robintra/perf-sentinel/.github/workflows/release.yml@refs/tags/v0.8.6" \
--expected-issuer "https://token.actions.githubusercontent.com"gh CLI 2.49 or newer required for gh attestation verify (unchanged from v0.7.2).
Full Changelog: v0.8.5...v0.8.6