0.000037  2026-05-16 18:22:44-07:00 America/Los_Angeles

    - Fix peer-registration leak across all shared-state drivers when peer dies ungracefully (SIGKILL/segfault/OOM); reap stale dead-pid entries on registration, filter peers(), implement peer_left sweeps (Base::FS, Base::DBI, JSONFile, LocalMemory)
    - Chain AtomicPipe::peer_left to Base::FS SUPER so on-disk FIFO + sidecar reap runs alongside Atomic::Pipe state cleanup
    - Fix Test::test_watch_pids race: child writes ready-signal file via atomic rename and serializes errors into payload
    - Fix Service::Handle await_response/await_all_responses hang when peer dies on suspend_supported drivers; _pending_peer_active also checks captured-pid liveness
    - Add suspend deadlines: Client::suspend accepts expires_at/expires_in; Handle treats missed deadline as peer-gone across JSONFile, LocalMemory, Base::FS (.suspend sidecar), Base::DBI (new suspend_expires column)
    - Run MariaDB/MySQL/PostgreSQL tests against every ~/dbs/<prefix>-* installation: new IPC::Manager::Test::DBVersions helper forks an AsyncSubtest per discovered version with $ENV{PATH} pointing at that version's bin dir; falls back to system PATH when ~/dbs is missing; skip_all when neither yields a viable driver
    - Drop DBD::mysql dependency: IPC::Manager::Client::MySQL now requires DBD::MariaDB (DBIx::QuickDB::Driver::MySQL prefers it and emits dbi:MariaDB DSN when available). Lets MariaDB-only hosts run the MySQL client without an alternate-lib-location DBD::mysql build.
    - ipcm_spawn(dbh => $dbh) and ipcm_connect($id, undef, dbh => $dbh): pass a pre-connected DBI handle instead of letting the protocol build its own. Protocol auto-detected from $dbh->{Driver}{Name} (Pg/MariaDB/mysql/SQLite); route reassembled from $dbh->{Name} so the spawn->info string remains usable by peers that connect via the DSN path. Useful for embedding the IPC bus inside an app that already owns a DBI connection without forcing it to bootstrap a separate one.

0.000036  2026-05-10 21:03:04-07:00 America/Los_Angeles

    - Add Role::Service::run_returns_to_caller opt-in so _ipcm_service returns to caller after run() instead of POSIX::_exit (for exec.stay_in_begin preload services)
    - Service::State::_ipcm_service honors run_returns_to_caller; refactor setjump body so exit() fires only when opt-in off
    - Service::State::ipcm_service forwards exec.stay_in_begin flag to exec'd child (was stripped before JSON serialization)
    - Add [PruneCruft] to dist.ini so blib/, pm_to_blib, MYMETA.* stop leaking into release tarballs

0.000035  2026-04-26 20:18:58-07:00 America/Los_Angeles

    - Loosen upper-bound timing assertion in t/unit/peer_active_timeout.t to <10s (was <3s, fired on loaded smokers)
    - Loosen upper-bound timing assertion in t/unit/Util.t tinysleep test to <5s (was <1s, fired on loaded smokers)

0.000034  2026-04-26 03:43:44-07:00 America/Los_Angeles

    - ConnectionUnix::_drain_reads early-returns EOF when $fh undef (global-destruction race destroying IO::Socket::UNIX before disconnect)
    - Serializer::JSON::Zstd accepts level + dictionary constructor args; cinfo serializer slot accepts [$class, %args]; instances cached by class+args
    - Base::FS::requeue_message / read_resume_file use 4-byte length-prefixed framing instead of newline (safe for binary serializers)
    - Add Serializer::JSON::Zstd; chosen as default when Compress::Zstd 0.20+ installed, falls back to plain JSON otherwise (runtime recommendation, not hard dep)
    - UnixSocket no longer appends trailing newline to serialized payloads (vestigial under SOCK_DGRAM, broke binary serializers)
    - Handle::await_all_responses short-circuits gone-peer probe via new _have_gone_pending_peers helper
    - Fix Handle::await_all_responses hang on peer crash; mirrors await_response semantics; accepts optional $timeout
    - Bound Spawn::wait peer-disappear poll with deadline (default 60s, peer_timeout / $ENV{IPC_MANAGER_SPAWN_PEER_TIMEOUT})
    - Test->run_all/run_one SIGTERM-then-SIGKILL subtest child pgroup on alarm timeout so service grandchildren get reaped; child becomes pgroup leader via POSIX::setpgid
    - Add Client::ConnectionUnix, connection-oriented UNIX-socket driver on SOCK_STREAM with 4-byte length-prefixed framing and hello handshake; no EPIPE auto-reconnect
    - Add Role::Client::Connection for uniform per-peer connection API (has_connection, connections, disconnect_connection, last_activity, close_idle_connections)
    - Role::Service::Select supports dynamic select-handle sets via have_dynamic_handles_for_select; cache rebuilds IO::Select each iteration for those drivers
    - Bump optional Atomic::Pipe dep from 0.022 to 0.026 in dist.ini, viable check, and test gates
    - Add Role::Outbox: per-peer non-blocking send queue for FIFO/datagram clients; services flip send_blocking=0 at startup; per-peer order NOT preserved
    - Client base sets _creator_pid once in init so DESTROY in forked child doesn't unlink parent FIFO/socket/route; default fallbacks for full Outbox API
    - Client::AtomicPipe and Client::UnixSocket consume Role::Outbox; non-blocking when send_blocking=0, blocking otherwise
    - Client::ConnectionUnix consumes Role::Outbox with per-connection send_buffer (SOCK_STREAM mid-frame partial writes can't restart); overrides pending_sends/drain_pending/have_writable_handles/writable_handles
    - Service::Select adds select_write(); Service::watch uses IO::Select->select($r,$w,undef,$cycle) to wake on writability

0.000033  2026-04-25 01:47:50-07:00 America/Los_Angeles

    - Reset Test->run_all alarm per subtest (180s each instead of single sweep budget); IPC_MANAGER_TEST_TIMEOUT env override; failure names timed-out subtest
    - JSONFile NoInotify uses Time::HiRes::stat for nanosecond-resolution mtime; drop INTERVAL wait before SHA tiebreaker
    - Speed up two slowest Test subtests: blocking waitpid replaces 50-iter pid_is_running poll (~12.9s -> <1s); drop arbitrary sleep fences from test_intercept_errors (~3.6s -> ~2.3s)
    - Add Test->run_one(protocol, test); split t/<Protocol>.t into per-subtest files under t/<Protocol>/ for prove -j parallelism (whole-suite ~71s -> ~24s)

0.000032  2026-04-23 08:27:50-07:00 America/Los_Angeles

    - Accidentally uploaded wrong 0.000031 tarball, re-releasing to fix

0.000031  2026-04-23 08:25:32-07:00 America/Los_Angeles

    - Fix Handle::await_response race where peer that responded then exited got reported as "peer ... went away"; final non-blocking poll re-checks for response after peer-active probe reports gone

0.000030  2026-04-22 13:17:49-07:00 America/Los_Angeles

    - Fix 0.000028 regression where UnixSocket route-length check croaked for short peer ids on long TMPDIR; check deferred to Base::FS::on_disk_name and only fires when hashed form doesn't fit

0.000029  2026-04-21 07:31:45-07:00 America/Los_Angeles

    - Expose ipcm_service first-fork child pid via $handle->child_pid (supervisors can use standard spawn path with pre/post_fork_hook + ready handshake instead of rolling own fork helper)

0.000028  2026-04-20 13:48:46-07:00 America/Los_Angeles

    - Support arbitrarily long peer names: DBI drivers widen ipcm_peers.id and ipcm_messages to/from from VARCHAR(36) to VARCHAR(512); FS drivers hash overlong/unsafe ids to "h-" + 40 hex sha256 with .name sidecar; UnixSocket sizes threshold to sun_path

0.000027  2026-04-19 09:58:22-07:00 America/Los_Angeles

0.000026  2026-04-19 08:36:18-07:00 America/Los_Angeles

    - Split Client::SharedMem into its own CPAN dist (IPC-Manager-Client-SharedMem); module, tests, SysV probe, Makefile.PL/dist.ini shims no longer ship here

0.000025  2026-04-19 06:33:45-07:00 America/Los_Angeles

    - Add optional $timeout to Service::Peer::ready, Service::Handle::ready, Client::peer_active; polls via IO::Select on peer-change fd (inotify) or 0.05s sleep-retry, replacing 0.025s busy-wait in Service::State

0.000024  2026-04-18 14:57:47-07:00 America/Los_Angeles

    - Fix sync_request hang when peer disappears mid-request: await_response snapshots peer at send time and croaks on full unregistration; suspend_supported protocols still wait across clean suspend / restart-under-new-pid
    - Add optional $timeout to sync_request and await_response (croak on deadline; unchanged when omitted)
    - Sweep orphaned Atomic::Pipe reassembly state via new Client peer_left() hook called from service loop on peer-delta removal

0.000023  2026-04-17 12:06:27-07:00 America/Los_Angeles

    - Strengthen SysV IPC configure probe: concurrent-contention and rapid create/destroy phases catch hosts where semop sporadically returns EINVAL under load
    - Add kernel-limit probe disabling SharedMem when /proc/sys/kernel/sem or shmmni/shmmax below workable minimums
    - Add persistence probe disabling SharedMem when external reaper (systemd-logind RemoveIPC, ipcrm cron, cgroup IPC policy) destroys freshly-created semaphore mid-probe
    - Detect systemd-logind RemoveIPC=yes without user linger and include as diagnostic hint in install failure message

0.000022  2026-04-16 16:49:45-07:00 America/Los_Angeles

    - Reap children in the service loop via waitpid(-1, WNOHANG) so unrelated zombies are cleaned up
    - Add run_on_pid hook and on_pid service callback for reaped non-worker child processes
    - Add pids key to the watch() activity hash mapping reaped non-worker pid to exit value

0.000021  2026-04-16 07:18:10-07:00 America/Los_Angeles

    - Fill in missing Changes entries for 0.000020

0.000020  2026-04-16 01:09:03-07:00 America/Los_Angeles

    - Refactor Service::State to use Long::Jump instead of labelled redo
    - Disable SharedMem at install time when host SysV IPC is broken
    - Fix test_service_callbacks race waiting for on_peer_delta
    - Fix test_workers race where parent reads empty pid file

0.000019  2026-04-13 15:01:40-07:00 America/Los_Angeles

    - Add post_fork_hook to Role::Service and post_fork callback to Service for double-fork/daemonize support

0.000018  2026-04-12 02:20:35-07:00 America/Los_Angeles

    - Fix UnixSocket reads on FreeBSD: use recv() instead of diamond operator for SOCK_DGRAM sockets
    - Fix SharedMem semaphore EINVAL race: disconnect Handle client before Spawn destruction
    - Fix message ordering on systems with coarse Time::HiRes resolution
    - Add sort_messages to Client base class to centralize message sort logic

0.000017  2026-04-11 09:16:39-07:00 America/Los_Angeles

    - Fix on_general_message test race where file was observed before content was written

0.000016  2026-04-10 09:25:35-07:00 America/Los_Angeles

    - Fix Spawn shutdown race where fast services exit before wait() captures their PIDs

0.000015  2026-04-09 16:16:09-07:00 America/Los_Angeles

    - Use Cpanel::JSON::XS directly and lazily reinitialize to survive global destruction
    - Replace JSON::PP prereq with Cpanel::JSON::XS in dist.ini
    - Fix Spawn::wait() to waitpid child processes before destroying shared resources
    - Add debug flag to Spawn, reduce test suite noise

0.000014  2026-04-08 14:58:59-07:00 America/Los_Angeles

    - Refactor viable() into base-class wrapper around _viable() so it never throws
    - Fix DB tests failing to skip when DBI is too old
    - Fix DB viable() not detecting missing server binaries (initdb, mysqld, etc.)
    - Fix inotify tests failing when Linux::Inotify2 < 2.3 is installed
    - Enforce Atomic::Pipe minimum version 0.022 in viable check and tests
    - Add JSON::PP prereq, remove unused Sub::Util, fix IO::Select version in dist.ini
    - Add 180-second timeout with stack trace to integration tests

0.000013  2026-04-08 08:14:28-07:00 America/Los_Angeles

    - Fix SQLite DEFAULT FALSE incompatibility with older SQLite versions
    - Fix UnixSocket broadcast test race on FreeBSD and older Linux kernels

0.000012  2026-04-07 16:36:22-07:00 America/Los_Angeles

    - Fix JSONFile cache staleness detection when Linux::Inotify2 is absent
    - JSONFile now requires either Linux::Inotify2 or Digest::SHA (recommended dep)
    - Split inotify-affected tests into Inotify/NoInotify variants

0.000011  2026-04-05 14:10:41-07:00 America/Los_Angeles

    - Reintegrate DBI and UnixSocket clients back into this dist
    - Add JSONFile client
    - Add SharedMemory client, rename InMemory to LocalMemory
    - Add exec-services feature and refactor tests
    - Fix DBI clients: blob handling, viable() checks, message ordering, SQLite timestamps
    - Fix UnixSocket client: add version requirement and suspend_supported method
    - Fix error propagation when requests cause errors
    - Various bugfixes for hidden errors
    - Add unit and integration tests for DBI and UnixSocket clients
    - Add documentation
    - Require newer DBIx::QuickDB

0.000010  2026-04-01 16:34:06-07:00 America/Los_Angeles

    - Break DBI and UnixSocket clients into their own dists

0.000009  2026-03-30 11:07:14-07:00 America/Los_Angeles

    - Skip postgresql tests on systems without initdb

0.000008  2026-03-29 09:37:55-07:00 America/Los_Angeles

    - Remove leftover debugging

0.000007  2026-03-28 12:05:47-07:00 America/Los_Angeles

    - Fix issues with listed deps

0.000006  2026-03-26 19:18:54-07:00 America/Los_Angeles

    - Introduce 'Service' feature

0.000005  2026-02-23 19:54:20-08:00 America/Los_Angeles

    - Fix Linux::Inotify dep in test
    - Fix SQLite dep in test

0.000004  2026-02-23 10:49:55-08:00 America/Los_Angeles

    - Fix UnixSocket issues usually seen on BSD

0.000003  2026-02-19 20:41:21-08:00 America/Los_Angeles

    - Add IO::Select and handle capabilities where possible
    - Possibly fix UnixSocket

0.000002  2026-02-19 18:57:37-08:00 America/Los_Angeles

    - Attempt to add debugging for UnixSocket issues

0.000001  2025-12-31 20:40:44-08:00 America/Los_Angeles

    - Initial Release
