Version 2.1.1 (26/07/2026) ******************** Feature: External-module lifecycle (T1.4) — Psyclone now auto-starts, supervises and gracefully stops external-module executables declared in a spec; a crashed internal space is auto-restarted for crash isolation, and helpers are told to exit before the node stops so they shut down cleanly within the stop timeout Feature: Declarative TriggerGroup join primitive (T1.6) — a that fires only on grouped activation (requires-all / requires-any / min-count) across multiple triggers, with a matching CMSDK join primitive Feature: psytest self-checking system suite hardened — self-creates its MyFiles fixture (a clean checkout needs no manual test/test.txt), resolves the ExternalModules helper relative to the Psyclone executable, adds an External-Module auto-start end-to-end stage, and emits a rich per-test summary report Feature: Full trigger-filter operator set documented and verified — worked examples plus corrected semantics for all 8 trigger-filter ops (equals/notequals, equalsnumeric/notequalsnumeric, greaterthan/lessthan, haskey, maxage) Fix: Fixed inverted equalsnumeric / notequalsnumeric trigger filters and haskey matching; numeric ops now parse as float64 and maxage operand is milliseconds Fix: Fixed a shutdown self-SIGKILL/hang — Node::terminate could EndProcess its own pid; it now notifies spaces of shutdown before stopping external executables so helpers exit gracefully Fix: Fixed ExternalModules graceful-stop on Windows — a CREATE_NEW_CONSOLE child can't receive the parent's console ctrl, so the helper now handles CTRL_BREAK/C/CLOSE and exits when its space is shut down Fix: Fixed Node::createSpace reusing a stale ProcessMap entry — Root osID/type are refreshed on reuse (stale shared-memory safety) Fix: Bundled CMSDK fixes (see CMSDK changelog): intermittent network_http teardown hang (double-delete race in NetworkChannel with bounded teardown waits + invalid-handle hardening), Windows GetExitCodeProcess misuse reporting running processes as terminated (259), and a Linux thread-reap SIGSEGV/hang Build: Fixed clean builds from scratch — the per-module build/ object directories are now self-created by the compile rules (mkdir -p) instead of relying on parse-time guards, so make clean && make (and make rebuild) work out of the box on all four modules (CMSDK/Examples/Psyclone/System) Build: Examples vs2022 now links against the non-SSL CMSDK2022.lib to fix the Windows build Docs: TriggerGroup marked Shipped across the Psyclone user/system guides; trigger-filter reference expanded with verified worked examples Version 2.1.0 (12/07/2026) ******************** Feature: Native macOS support — Psyclone and CMSDK now build, run and pass the full test suite on Apple Silicon/Intel macOS, not just Linux and Windows Feature: Added a unified CMSDK unit test framework (UnitTestFramework.h/.cpp) — one PASS/FAIL line per object, indented perf metrics, timestamped performance JSON with compare= %-deltas for automated regression tracking, live progress line, per-test process isolation with timeout, self-healing shared-memory cleanup between runs Feature: Routed `Psyclone test=cmsdk` (all), `test=` (single test in isolation), `test=list` to the new CMSDK unit test framework, with compare=, out=, outdir=, verbose=1, fork=0 options Feature: Authored/converted ~20+ CMSDK object unit tests, incl. new coverage for Base64, hash (MD5/SHA1/SHA256/CRC32/SHA3/Keccak), MathClasses, Bitmap, HTML, xml_parser, Subscriptions, VantagePoints, Observations, ControlMessage, ThreadManager, DataMessage — 33 tests, all passing Feature: Rebuilt Examples/psytest.xml into a self-checking function + performance test — context-chained stages exercising context switching, time sync, ping/pong (guaranteed and UDP/best-effort), signals, dynamic context switching with interval triggers, and whiteboard/file-catalog/data-catalog retrieval; each stage prints a concise PASS/FAIL + perf line; PsyTest_Summary aggregates a final SUCCESS/FAILED verdict; stall watchdogs report a stage-specific failure instead of hanging Feature: Added tail-latency percentile reporting (p50/p90/p95/p99/p99.9) to the PingMaster/PingUDPMaster/SignalMaster performance tests, alongside the existing throughput/avg_age metrics Feature: Added a `network_https` unit test exercising a real TLS handshake and encrypted HTTP round-trips over loopback with a runtime-generated self-signed certificate, for SSL/TLS builds (`make ssl`) Feature: Added `-O0` unoptimised debug/ssldebug build targets for a real single-step debugging experience Feature: Added VS Code workspace configuration for macOS C++ development (IntelliSense, build tasks, integrated debugger) Feature: Added web API documentation and a Partner project dashboard script Feature: Added a full NewPsySpec.xml feature implementation audit (Implemented / Parsed-only / Not-implemented, with file:line evidence) and a prioritised roadmap, published alongside this codebase Fix: Fixed a macOS-only thread-liveness bug that caused shutdown hangs — IsThreadRunning/CheckForThreadFinished used a destructive pthread_join as a liveness probe, reaping the thread so a later authoritative join operated on an already-joined pthread_t (heap-corrupting undefined behaviour); switched to non-destructive pthread_kill(h,0) liveness + a single authoritative join Fix: Fixed two macOS-only timeout-emulation primitives (macos_pthread_mutex_timedlock, macos_pthread_join_with_timeout) that silently never honoured their timeout, turning bounded waits into indefinite hangs under contention — root cause of intermittent 30s teardown hangs Fix: Fixed macOS CPU percentage calculation — GetProcAndOSCPUUsage mixed Mach clock ticks (~100/sec) with microsecond-scale process ticks, inflating reported CPU usage by ~10,000x Fix: Implemented real per-thread CPU measurement on macOS via Mach thread_info (previously a stub returning garbage stats for Root-space components) Fix: Fixed ComponentMemory/ProcessMemory off-by-one arena bounds checks and resize/destroyComponent memmove lengths that were over-copying by indexSize*8 bytes Fix: Fixed a dangling-pointer bug in MessageDataCatalog (HTML/TEXT branches) where a std::string temporary's buffer was read after the temporary was destroyed Fix: Fixed SubscriptionEngine, Node, Monitoring, ServiceManager, InterSystemManager, System/Catalog and CCMCatalog using std::map::operator[] on read paths, which silently inserted NULL/empty entries under a shared read lock — a source of routing races and unbounded map growth from arbitrary query keys Fix: Fixed mutex leaks on early returns across Monitoring, ServiceManager, InterSystemManager and ThreadManager Fix: Fixed a PsyProbe out-of-bounds pointer arithmetic bug when indexing recent-message rings Fix: Fixed a Console EOF busy-loop that spun at 100% CPU when stdin closed Fix: Fixed pre-existing psytest.xml spec bugs — duplicate crank names, a broken context-transition chain that stalled the run after the ping stage, and undefined %SignalCount%/%RequestCycles% variables Fix: Fixed aarch64 Linux builds incorrectly detected as 32-bit, breaking builds on ARM64 Linux (e.g. Raspberry Pi 5) Fix: Fixed Linux Python3 build — hardcoded python3.4m include/lib paths replaced with sysconfig-derived paths; fixed LP64 SWIG binding word-size mismatch causing vector vs vector ODR clashes Fix: Fixed the make lgpl / make bsd distribution builds failing on macOS — replace.sh (repo root and CMSDK) used the GNU-only sed -b flag, which BSD sed rejects, and BSD sed aborted with "RE error: illegal byte sequence" on the CP1252-encoded quickstart template; the -b flag is now feature-detected at runtime and sed runs under LC_ALL=C (byte-transparent, preserves CRLF; GNU sed behaviour on Linux/Cygwin unchanged). Verified identical distribution archives on macOS and Linux Perf: TCP messaging throughput ~42k → ~90k msg/s and latency 23.8us → ~11us (~2x) by keeping sockets non-blocking instead of flipping blocking mode on every send, and only reading from the socket when the buffer doesn't already hold the requested bytes Perf: UDP messaging throughput ~107k → ~155k msg/s and latency 9.3us → ~6us via the same socket-mode and buffered-read optimisations Perf: Replaced a per-message 36KB recent-message ring memmove in ComponentMemory/ProcessMemory with a circular write index, removing a large memmove from the hot path Perf: Removed a per-message heap allocation and a no-match leak in the message-routing hot path (SubscriptionEngine::getTriggersForMsg) by adding a fill-in-place overload Perf: MessageProtocol::ReceiveMessage now peeks the header into a stack buffer and does a single malloc(size), replacing a malloc(1KB)+free+malloc(size) sequence per message Perf: Removed 4 fcntl syscalls per message from the TCP send path and 2 from the read path by eliminating redundant per-call socket-mode switching Perf: PsySpace thread-run functions return THREAD_RET without a heap allocation Perf: Increased CMSDK DataMessage and networking performance via targeted optimisation of hot construction/serialisation paths Version 2.0.3 and earlier ******************** See git history for pre-2.1.0 detail; summary superseded by this release. Version 2.0.0 Beta 3 (02/07/2014) ******************** Fix: Fixed PsyProbe sometimes not loading pages Fix: Since this is still in Beta there are more fixes than can be listed here Performance: Increased performance three-fold by optimising critical paths Feature: New PsyProbe 2.0 web interface now fully operational - Activity indicators for components, nodes and node computers - All data now auto-updates (selective switch-off) - Whiteboard dynamic message tables - Performance monitoring of nodes and components - Recent activities of all components - View all and active contexts and subscriptions - User manual activation of triggers and posts - Hover to view full message, click to open in new window Feature: Full system resource monitoring now operational with displays in PsyProbe Feature: PsyAPI now includes APIs for getting other module names, types, contexts Documentation: Added Psyclone 2.0 quickstart, whitepaper and presentation Version 2.0.0 Beta 2 (23/05/2014) ******************** Fix: Fixed multi-node stability problems Fix: Fixed memory leaks Fix: Since this is still in Beta there are more fixes than can be listed here Feature: Added external module support Feature: Added new PsyProbe 2.0 basic web interface Documentation: Added Psyclone 2.0 howto Licensing: Added LGPL to all Psyclone and BSD to all CMSDK files Version 2.0.0 Beta 1 (09/05/2014) ******************** Complete rewrite of all Psyclone source code, design and implementation