Skip to content

v0.24.0

Choose a tag to compare

@ryanwi ryanwi released this 02 Jun 05:53
· 27 commits to main since this release

Fixed (security)

  • Killed sessions can no longer be reactivated — activate_session() and resume_session() raise when killed_at is set. Previously a session paused by the kill switch could be silently resumed. unkill_session() added for explicit operator recovery. SessionState.killed_at / SessionSummary.killed_at are new fields (existing rows default to NULL).

  • Event sequence monotonicity enforced on replay — EventStore.replay() raises SessionStateIntegrityError if the sequence contains gaps or duplicates.

Added

  • SessionState.started_at — stamped when a session first becomes ACTIVE; preserved through pause/resume. Enables run-duration computation.
  • ControlPlaneObserver.list_sessions() — now available on the sync facade, matching the async counterpart.

Changed (breaking)

  • ActionName stripped to UNKNOWN sentinel — 35 hardcoded domain action names removed. Use plain strings: decision="wire_transfer" instead of decision=ActionName.WIRE_TRANSFER. register_action_names() no longer required before use.

  • parse_action_name() no longer coerces unknown strings to UNKNOWN — any non-empty, non-"unknown" string passes through as-is. Unlisted actions reach the PolicyEngine normally instead of being blocked.

See docs/compatibility.md for migration details.