What's Changed
This release focuses on concurrency correctness for trigger evaluation, fixes several timing and throttling bugs around delayed rules, and adds
rule-management APIs.
New
- Added
RuleKit.removeRule(named:)to unregister a previously set rule by name. - Rule registration is now idempotent: re-registering a rule for the same trigger name replaces the existing one (and logs a warning) instead of
stacking duplicates.
Fixes
- Frequency throttle now survives concurrency — triggers are claimed atomically, so a throttled rule can no longer fire more than once under concurrent
evaluation. - An interrupted delay no longer burns the throttle window — a trigger is claimed after its delay rather than before.
- A rule's condition is re-checked after its delay before firing, so it won't fire if conditions changed in the meantime.
- Event donations are no longer blocked waiting on a rule's delay.
- Per-rule failures are now isolated — a failure evaluating one rule no longer aborts evaluation of the others.
- A warning is now emitted when duplicate trigger names share a record.
- Valid local directory URLs are now accepted as a store location.
Performance
Storemoved off the main actor to its ownactor, making trigger firing fully structured and concurrency-safe.
Internal & Tests
- Migrated the test suite from XCTest to Swift Testing.
- Added regression coverage for the concurrent trigger-frequency race and per-rule failure isolation.
- Fixed the
setRuleexample in the README and added SPI badges.
Full Changelog: 0.5.4...0.5.5