00.80.00
Release date: 2026-07-21 Previous release: 00.79.41 Maven coordinates (parent):
com.svenruppert.jsentinel:jSentinel-parent:00.80.00Full changelog: GitHub release v00.80.00
The operations and forensics release: runtime metrics and health export points (concept goal 9), production-grade event integrations on the signed envelope base (goal 8), a tamper-evident, independently verifiable audit hash chain (goal 7), and the strict-mode wiring of the consume-side verification failure paths (goal 10 subset). 7 new modules (reactor 54 → 61 library + demo modules), 13 feature prompts (P001–P013), 11 in-cycle entry-review fixes and 2 exit-review fixes, full reactor green.
Headline change — one tap, every exporter
Before 00.80, signed envelopes only reached remote consumers through the REST/SSE bridge; locally published envelopes had no integration point. Now there is one contract for every operational integration:
bus.subscribeEnvelope(new LoggingEventPublisher()); // grep-able EVENT lines
bus.subscribeEnvelope(new WebhookEventPublisher(config)); // signed envelopes over HTTPS
bus.subscribeEnvelope(new OpenTelemetryEventPublisher(otel.getLogsBridge())); // OTel log records
bus.subscribeEnvelope(new SiemEventExporter(new CefEnvelopeFormatter(), out)); // CEF/LEEF/NDJSON
new MetricsEventBusListener(metrics).subscribeTo(bus); // security.eventbus.* counters
new AuditIntegrityListener(appender).subscribeTo(bus); // tamper-evident hash chainA failing integration is isolated and counted — it can never break
publish(...).
What’s new in detail
| Goal | Module(s) | Delivered |
|---|---|---|
| 9 — Operations & Monitoring | jSentinel-monitoring | JSentinelMetricsPublisher (counters + push gauges, never-throw), NoOpJSentinelMetricsPublisher, ServiceLoader discovery; JSentinelMetricNames — the 9 concept-verbatim security.eventbus.* names plus minted security.auth.* / security.authz.* / security.session.* / security.audit.store.lag; the MetricsEventBusListener bridge; a JSentinelHealthIndicator SPI + JSentinelHealthCheck aggregator with diagnostics, audit-store-saturation and no-metrics-publisher indicators. |
| 8 — Event integrations | jSentinel-events(-rest), -events-webhook, -events-opentelemetry, -events-siem | Self-observability events on the six integrity records (loop-free direct dispatch); SignedEnvelopePublisher SPI + subscribeEnvelope(...) fan-out with per-publisher failure isolation; in-tree LoggingEventPublisher / EventStreamPublisher / alert sink; WebhookEventPublisher (bounded queue, virtual-thread worker, retry with backoff+jitter, https-mandatory, bearer per attempt, never logged); OpenTelemetryEventPublisher over the Logs Bridge (api-only, noop-safe); SiemEventExporter with CEF 0, LEEF 2.0 and NDJSON formatters. The wire codec moved to events.wire with a deprecated delegator for one release. |
| 7 — Tamper-evident audit | jSentinel-audit-integrity (+ testkit + eclipsestore) | AuditChainEntry + append-only AuditChainStore SPI + injective length-prefixed AuditChainEntryHasher (H(prev‖entry), fail-closed, golden-pinned); AuditIntegrityVerifier (paged + range, sealed result with 5 break reasons); signed audit batches (rotated keys keep verifying, revoked do not); AuditExportService + NDJSON codec (re-verification needs only the text + public keys); restart-safe Eclipse-Store persistence — entries written before and after a restart verify as one chain. |
| 10 subset — strict-mode consume | jSentinel-events | ConsumeFailureAction / ConsumeFailurePolicy (strict() fail-closed, operationalDefaults(), custom()) and ConsumeFailureHandler — the one place a failure becomes observable: exactly one self-observability event, optional dead letter, one operator log line per kind with stable events/... codes; total and never-throwing; a dead-lettering policy without a store fails at wiring time. |
Additivity
Everything is additive. No published API was removed; the one relocation
(EnvelopeWireCodec → …events.wire) keeps a
@Deprecated(forRemoval = true, since = "00.80.00") delegator at the old
events.rest location for one release. All new public types carry
@ExperimentalJSentinelApi + @since 00.80.00.
What it does not do
- No bundled monitoring stack, scrape endpoint, histograms or metric tags/dimensions (a deliberate V1 cardinality decision) — the SPI is the export point.
- No SIEM as part of the framework and no vendor binding — formatters only; the transport belongs to the host.
- No transport-level HMAC on the webhook — the signed envelope is the integrity layer; receivers verify with the events SPIs.
- No per-tenant audit chains (single chain per store in V1).
- Deferred concept goals stay deferred: MFA/step-up, WebAuthn, device/remember-me, risk-based auth, CSRF, privacy/retention.
Quality
Measured with the reactor PIT setup against the ≤ 3 pp acceptance bar; new
modules set new baselines. jSentinel-core held at 84 % (2231/2658);
jSentinel-events 84 % at +49 % code; new baselines include
jSentinel-monitoring 79 %, jSentinel-events-siem 94 %,
jSentinel-events-opentelemetry 100 %, jSentinel-audit-integrity 78 % and
its Eclipse-Store persistence 77 %. Every feature ships no-mock tests (real
implementations, recording doubles, real HttpServer/SDK/storage). Full
61-module reactor build with tests green. No mocks.
Roadmap
00.80.x candidates: SSE reconnect counter hook, per-tenant audit chains, dx↔events STRICT bridging, optional webhook HMAC opt-in. 00.81+: the deferred concept goals (MFA/step-up, WebAuthn, device management, risk-based auth, CSRF, privacy/retention).