This release makes i2scim's Signals client behave the way operators of goSignals expect, and ensures pending events and acks survive a restart.
-
Streams now report a clear lifecycle state
- Streams are
enabled,paused, ordisabledinstead of a single error flag.pausedself-recovers;disabledmeans an operator needs to look. ExistingssfConfig.jsonfiles upgrade automatically. - HTTP failures are handled by code: 401 retries briefly, 403 stops immediately, 429 honors
Retry-Afterand never auto-disables, 5xx and network errors back off and retry. - On push or poll failure, i2scim asks the remote's
/statusendpoint whether it has paused itself — distinguishing a remote outage from a remote that's deliberately quiet. - A keepalive event is sent on idle push streams, so a broken path is caught before real events pile up.
- Protocol errors from the receiver (RFC 8935 §2.4) are recorded with the specific error code and JTI in
errorMsg. A signature failure automatically reloads the issuer PEM and retries once. - New config:
scim.signals.pub.unauthorized.retry.{max,delay},scim.signals.pub.status.check.interval,scim.signals.pub.idle.verify.interval, plusrcv.*equivalents.
- Streams are
-
Pending events and acks survive restart
- Failed push events are persisted — to MongoDB on the Mongo backend, to
<scim.prov.memory.dir>/events/on the memory backend. Restarts no longer lose them, and adisabledstream keeps its queue for automatic replay when re-enabled. - SCIM operations no longer wait on push outcome. A slow receiver can no longer slow down the SCIM API.
- Retry budgets are now wall-clock based (default 6 hours) instead of attempt counts.
- Poll-side acks are persisted too, so a restart between "applied locally" and "ack delivered" doesn't cause re-delivery.
- The issuer PEM file is watched for changes — out-of-band key rotations are picked up automatically.
- Events generated before stream registration completes are buffered and replayed once registration succeeds. A persistent failure raises clear warnings.
- Disk and queue usage is monitored with configurable warn / critical / fatal thresholds.
- New config:
scim.signals.pub.retry.elapsed.limit,scim.signals.pub.pem.watch,scim.signals.pub.storage.{warn,crit,fatal}.pct,scim.signals.pub.preregister.warn.minutes.
- Failed push events are persisted — to MongoDB on the Mongo backend, to
-
Security and fixes
- Patched CVE-2026-39852 and CVE-2026-41417; refreshed dependencies.
- JWKS load failures at boot are now non-fatal — a temporarily unreachable JWKS no longer blocks startup.
/statusprobes append thestream_idquery parameter per SSF §7.1.2.- Fixed NPE on receipt of inbound verify events.
- Quieted noisy CycloneDX and retry-worker shutdown warnings.