Version 2.2.0 (22/08/2026)
********************
Feature: Builders — a first-class declarative bake pipeline. A Recipe now carries a stable string RecipeID identity end-to-end, and every bake message carries five correlation entries so a bake can be tracked and correlated across the system. The bake stream is split into clean, typed channels — per-kind bake OUTPUT types (Bake.Start/Status/Success/...) and per-verb control types (BakeControl.Cancel/Restart/Pause/...) — with the recipe title carried as a data entry rather than baked into the type name
Feature: Builders — bake lifecycle and blue-edit control. A .status stream carries progress-only acknowledgements and a .data stream carries lossless, sequence-numbered payload with gap-detection (a missing sequence is a hard error, not silent loss), a bounded reassembly buffer and per-batch acks. Recipe blue-edit knobs allow interactive control of a running bake. Control semantics enforce an issued-by allow-list, a monotonic control sequence, and cancel-supersedes-pause ordering; an interactive step honours fail|pause|skip on timeout
Feature: Supervisor — an automatic Startup Supervisor now owns single-node bring-up as a Root-space crank. A <supervisor> PsySpec element creates a Root-crank Supervisor (previously a no-op); the Supervisor mints a Recipe ID, sends the recipe to the target node, streams .status/.data back, and drives PAUSE/START control with acks. The legacy procID==0 Supervisor fan-out and registry have been dissolved in favour of a proper Root-space component identity
Feature: Supervisor — SystemStatus and creation ownership. The node broadcasts Psyclone.SystemStatus on a 5-second cadence and the Supervisor auto-subscribes; single-node component creation is now owned by the Startup Supervisor, and Psyclone.Ready fires only after all components have actually been created. A node-level heartbeat and the documented .data/.status message cadences are implemented, with unregister now draining in-flight dispatches for a clean teardown
Feature: Multi-node bring-up — Psyclone now brings up a distributed model across multiple OS-process nodes. bringUpSpec is multi-node-aware (groups components by node=, defers unknown nodes), routes Psyclone.Builder.* to the target node's processMessage, and forwards cross-node recipes; an external-space host is treated as an idempotent skip on re-entry. Cross-node bring-up includes ID-reservation adoption ordering, context ID-clash tie-break, SYNC_COMPONENT_INFO confirmation and cross-node triggergroup join forwarding
Feature: New self-checking multi-node test harness — test=psymulti runs three real OS-process nodes under Supervisor orchestration, alongside test=psytest and test=psylong, wired through a test= CLI dispatch
Feature: .data and heartbeat .status are now streamed during a long <cli> step (no extra thread), so a long-running external step reports progress live rather than going dark until completion
Fix: Broke a type-ID sync livelock and a type-level id-sync hard-fail on concurrent multi-node bring-up (don't hard-fail on confirm-after-negotiation)
Fix: Fixed multi-node join races and crashes — a cross-node recipe-forward double-free, a 50ms sweep timer-thread stampede segfault, an empty-tag network registration for untagged join members, and a node-join race/crash surfaced by test=psymulti
Fix: Fixed a builder_golden SEGV — guard a NULL monitoring pointer in deliverTriggerMessage and drain the SystemStatus beat on teardown
Fix: Fixed StartupSupervisor crank shutdown — broke a shutdown spin when the strangler defaults were flipped on
Fix: Eagerly create external-space host modules before the Startup Supervisor deferral, so external hosts exist when the SS expects them
Fix: Examples — unique crank names for per-node RetrieveTest modules (fixes a multi-node shutdown hang), and the ExternalModules helper now honours its launch port instead of a hardcoded 10000
Fix: External-module launches are now routed through CMSDK NewProcessEx for a single, consistent cross-platform launch path
Build: Bumped the CMSDK submodule pointer to pick up the shared-memory cleanup, launcher-thread and Windows-portability fixes
Docs: Documented Builder and Supervisor across the Psyclone User Guide, System Guide and the Psyclone LLM guide; added a docs.html landing page (User Guide / System Guide picker)

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 <triggergroup> 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=<file> %-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=<name>` (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<long> vs vector<long long> 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
