Unreleased

1.3.2 — 2026-10-10

Fixed

  • Made segment rollover constant-time with respect to retained history by replacing foreground semantic replay with pinned identity, exact-size, CRC, and successor-header validation. Durable file and directory sync barriers remain unchanged.

1.3.1 — 2026-10-10

Added

  • Added configurable strict-durability group commit for concurrent enqueue requests via group_commit_interval_ms and standalone TAY_GROUP_COMMIT_INTERVAL_MS, including batch telemetry, fault/shutdown coverage, and a seven-interval throughput/latency benchmark recipe.
  • Added standalone TAY_DEFAULT_QUEUE_CONCURRENCY configuration instead of a hard-coded execution limit of 10 for the default queue.
  • Added standalone TAY_CALLER_TIMEOUT_MS configuration and preserved a bounded reason in HTTP unknown_outcome responses for diagnosis.
  • Added optional periodic Store-v2 semantic checkpoints through compaction: [checkpoint_interval: ...] and standalone TAY_CHECKPOINT_INTERVAL_MS. Checkpoints publish a verified snapshot plus ordered tail without blocking normal preparation-time admission, skip unchanged state, defer while active jobs exist, and recover from the durable sequence frontier. Standalone enables them every 60 seconds by default; 0 explicitly disables them.
  • Made every Overview job-status card navigate to the Jobs page with its state filter selected, including keyboard focus and visible hover/focus feedback.
  • Released tay-client 1.3.0 with retries and backoff support on TayHTTPWorker.task; decorator retry settings now also act as defaults for Task.enqueue and can be overridden per submission.

Changed

  • Split Engine configuration validation into named, thematic validators and replaced unexplained numeric limits with documented module attributes.
  • Defined zero Dashboard/API terminal retention as a one-shot full terminal-history compaction; active jobs remain protected and the durable future retention is clamped to the one-hour minimum.
  • Decoupled tay-client releases from Tay versions. The release helper and PyPI workflow now skip an unchanged Python client and require its independent version to increase only when clients/python/ changes.

Fixed

  • Kept the live active-memory charge ledger across online checkpoint adoption, made retained-byte charging stable across Event-v1 and Store-v2 projection fields, and fail closed on negative or divergent active accounting.
  • Made enqueue wait through the short fenced checkpoint switch instead of returning unavailable, bounded by the configured caller timeout.
  • Added an idle full-GC pass for the Engine and Writer after the active workload drains, releasing transient process heaps and binary references retained by a large burst.
  • Included the HTTP error code in Python ServerError messages when Tay does not provide a human-readable reason, while retaining the structured code and details attributes.
  • Aligned the OCI health-check startup grace period with Tay's 15-minute recovery deadline so large valid histories are not declared unhealthy while replay is still in progress.
  • Kept the selected Dashboard theme stable across LiveView refreshes and made status cards use the complete dark palette during system-theme fallback.

1.3.0 — 2026-10-09

Changed

  • Made Event v2 the production semantic implementation while preserving all six frozen Event-v1 lifecycle schemas and literal bytes. The obsolete Event v1 facade has been removed; runtime replay works entirely through Event v2.
  • Reserved and validated Event-v2 schema-2 types 7 through 10 for future durable schedule registration, advancement, cancellation, and successful result recording. Runtime emission and recovery projection are not enabled in this release.
  • Added pull-request and main-branch CI for the Elixir and Python suites, and made unsafe symlinked test data roots fail fast.
  • Corrected the operations documentation for online compaction.

1.2.0 — 2026-10-08

Added

  • Allowed TAY_MAX_STATE_BYTES to use integer decimal or binary size suffixes, such as 5GB or 5GiB, while preserving plain-byte values.

1.1.1 — 2026-10-08

Fixed

  • Restored spacing between Dashboard card grids and the explanatory text that follows them.

1.1.0 — 2026-10-08

Changed

  • Made Dashboard terminology and inline explanations understandable without prior Erlang/BEAM knowledge, including job states, runtime memory, active-job safeguards, and durable storage.
  • Replaced the separate active-state byte and value-node limits with one max_state_bytes budget. The estimate now uses the job's flat BEAM heap shape, machine word size, retained canonical encoding, and binary payload bytes; the former max_state_nodes option remains accepted but ignored for 1.x configuration compatibility.
  • Displayed byte values in the most readable binary unit, including KiB for sub-MiB values and GiB for large limits.

Fixed

  • Preserved the expanded Storage files section across live data refreshes.

1.0.0 — 2026-09-30

Added

  • Released the stable Tay 1.0 engine, Python client, standalone OCI image, and optional LiveView dashboard.
  • Stabilized the versioned storage formats, executor protocol, recovery behavior, and documented compatibility contracts established during the 1.0.0 release-candidate series.

Changed

  • Promoted the validated 1.0 operating profile from release candidate to the stable 1.x release line.

1.0.0-rc.9 — 2026-09-30

Changed

  • Removed active-job and terminal-history count limits. Both Dashboard counters now show current counts without a maximum, and neither count can reject admission or trigger pressure compaction.
  • Kept terminal cleanup governed exclusively by the configured time retention; active payload byte and value-node safeguards remain in place.
  • Made a successful Dashboard compaction persist its selected terminal retention in Store-v2 and override the startup environment on later restarts.
  • Ran Dashboard-triggered compaction asynchronously so the LiveView remains responsive while jobs continue to be accepted and executed.
  • Buffered source-segment inspection during compaction preparation to avoid a native storage round trip for every record.

Fixed

  • Kept automatic compaction estimates available when persisted terminal retention is infinite.

1.0.0-rc.8 — 2026-09-30

Fixed

  • Preserved the durable availability-order frontier across online compaction so concurrent inserts can be replayed after expired terminal jobs are removed.
  • Kept Store-v2 manifests backward-compatible while authenticating the allocator frontier for newly compacted epochs.

1.0.0-rc.7 — 2026-09-30

Fixed

  • Allowed online compaction to replay epochs containing multiple valid post-manifest source rotations instead of rejecting them as source_segments_missing.
  • Made compaction retries publish successfully after an earlier preparation failure rotated the live tail while preserving the authoritative epoch.

1.0.0-rc.6 — 2026-09-30

Fixed

  • Synchronized Engine's physical segment frontier with Writer's source rotation before background compaction admits further mutations.
  • Prevented valid post-rotation receipts from being rejected as invalid_writer_receipt, which previously revoked the live generation while compaction was preparing its candidate.
  • Preserved fail-open behavior after a preparation failure even when online compaction had first rotated a non-empty active tail.

1.0.0-rc.5 — 2026-09-30

Fixed

  • Replayed Store-v2 segments through a bounded chunk cache instead of issuing native-owner calls for every record, keeping Writer admission responsive while online compaction prepares its candidate.
  • Aborted failed pre-switch candidates without poisoning the authoritative Writer or retiring the live Engine generation.
  • Preserved the existing generation and returned lifecycle state to ready when a background compaction builder fails before the atomic switch.

1.0.0-rc.4 — 2026-09-30

Fixed

  • Moved online-compaction source recovery out of the Engine mailbox loop so large terminal histories no longer block job admission and execution during the preparing phase.
  • Replayed immutable Store-v2 segments directly in the background compaction builder instead of first materializing and copying the complete job map in Engine at the start of preparation.
  • Released transient recovery and compaction heaps in the processes that own them, preventing terminal-history recovery memory from remaining allocated after activation or compaction.
  • Supported online compaction when the current Store-v2 tail is empty without racing concurrent appends.

1.0.0-rc.3 — 2026-09-29

Fixed

  • Kept terminal job payloads in the disk-backed projection while serving job pages through a compact ordered inspection index.
  • Loaded only the terminal jobs selected for the current cursor page instead of folding and repeatedly sorting the complete terminal history.
  • Released the temporary recovery heap before the Engine enters its steady-state loop.
  • Clarified that Dashboard state-capacity counters describe active-job admission limits rather than measured runtime memory.

1.0.0-rc.2 — 2026-09-29

Fixed

  • Throttled and coalesced Dashboard refreshes under transition-heavy workloads.
  • Kept Dashboard filter controls and cursor pagination stable during live refreshes.
  • Preserved HTTP enqueue rejection diagnostics, including capacity reasons.

1.0.0-rc.1 — 2026-09-29

Added

  • Added ergonomic Python task decorators with stable automatic or explicit public names, local registry lookup, argument serialization through task.enqueue(), duplicate-name protection, and synchronous/asynchronous handler execution.
  • Added a production idempotency guide for at-least-once jobs and financial operations.
  • Added a repeatable Tay 1.0 readiness audit harness with explicit PASS/FAIL/SKIP/UNKNOWN classification and isolated release artifacts.

Fixed

  • Passed the parent test build's complete dependency code path to independent BEAM VMs so whole-VM crash tests can start every Tay application dependency.
  • Corrected the Python dependency audit to inspect the fully resolved input without misclassifying command-line or environment failures as vulnerabilities.

Changed

  • Declared the documented single-node, single-writer contracts as the Tay 1.0 release-candidate surface. Record v1, STORE v1, Segment v1, Event v1, and the existing fail-closed recovery policy remain unchanged.

0.15.2 — 2026-09-27

Changed

  • Renamed the HTTP worker lifecycle methods to register() and serve_forever() to make explicit that registration alone does not process jobs. Kept start() and run() as deprecated compatibility aliases.

0.15.1 — 2026-09-27

Fixed

  • Make the HTTP-only health test probe a listening TCP port without starting a production-durability Store on the CI runner's unsupported /tmp filesystem. Production standalone durability remains strict :sync.

0.15.0 — 2026-09-27

Changed

  • Added mTLS-capable remote HTTP workers with long polling, execution acknowledgements, bounded results, cancellation events, and session expiry.
  • Allow standalone HTTP-only operation with TAY_SOCKET_PATH=off; the local Unix socket remains available when local workers are desired.
  • Added Python TayHTTPWorker for remote task execution and kept the local socket client available. Named the Python HTTP response and worker limits.
  • Merged the dashboard into the single tay Hex package and moved its release host under standalone/; removed the separate dashboard package.

0.14.0 — 2026-09-27

Changed

  • Replaced the gRPC/Go gateway with an optional Bandit HTTP/JSON producer API in the Elixir Engine; Cowboy and cowlib are not dependencies.
  • Added the Python HTTP/JSON producer client with mTLS support and consolidated the container examples into one Compose file.

0.13.1 — 2026-09-26

Fixed

  • Corrected Python client import ordering and formatting so the tagged source passes its PyPI publication checks.
  • Made optional gRPC and PKCS#12 dependency checks explicit at module scope.

0.13.0 — 2026-09-26

Added

  • Added an opt-in gRPC producer API for enqueue, status, cancellation, and result retrieval.
  • Added direct mTLS support for non-loopback gRPC listeners and Python clients, including a single PKCS#12 bundle option in the Python SDK.

Fixed

  • Enabled the dashboard endpoint in its HTTP test configuration and refreshed nested dependency locks for the new Tay gRPC dependencies.

0.12.0 — 2026-09-25

Added

  • Added online Store-v2 compaction with explicit compacting/preparing and compacting/switching lifecycle phases.
  • Added regression coverage proving admission and job execution continue while a replacement epoch is built in the background.
  • Added TAY_TERMINAL_RETENTION duration configuration for the standalone runtime, including minute, hour, and day forms such as 30m, 24h, and 7d.
  • Bundled the optional dashboard into the single tay OCI image, enabled with TAY_ENABLE_DASHBOARD=true.

Changed

  • Store-v2 compaction now rotates to a frozen frontier, builds its candidate in a monitored background process, journals concurrent durable mutations, and catches them up behind an atomic publication fence without restarting the Engine.
  • The first Store-v1 to Store-v2 adoption remains an explicit draining migrating operation because the frozen v1 format has no safe online catch-up boundary.
  • The dashboard reports compaction and migration as storage-maintenance states instead of presenting normal compaction as crash recovery.
  • Container publication now produces only ghcr.io/andriisydorenko1904/tay; the separate tay-dashboard image is retired.

0.11.3 — 2026-09-25

Changed

  • Added a sustained-ingress regression test proving that a capacity-16 external executor refills a queue to its concurrency limit of 10 while producers continuously enqueue without pauses.
  • Added one-command local benchmark profiles for lifecycle throughput, schedule lag under load, cold recovery, storage rotation and replay.

Fixed

  • Prevented sustained enqueue traffic from filling the Engine mailbox ahead of executor completions and queue demand. Client admission remains unchanged, while a guardian-owned FIFO now delivers one mutation at a time to the already-serialized durable Writer and yields between append boundaries.
  • Fixed benchmark JSON output for tuple-valued status fields such as terminal retention and canonicalized macOS /tmp paths for native storage safety.

0.11.2 — 2026-09-25

Changed

  • Python clients now retain successful schedule declarations and replay them during every listener reconnect before advertising worker capacity or reporting the connection as ready.
  • Scheduled occurrences now use deterministic job IDs and remain pending while admission is unavailable instead of being silently dropped under pressure.

Fixed

  • Restored cron and interval declarations automatically after compaction or an Engine restart while the declaring Python client remains alive.
  • Prevented one-shot schedule ticks from disappearing when active-state capacity is temporarily exhausted.

0.11.1 — 2026-09-25

Changed

  • Automatic compaction now defers while active jobs exist, keeping ordinary admission available during sustained workloads.
  • Terminal-count pressure now compacts to an 80% low-water mark instead of the exact configured maximum, preventing restart churn after each completion.
  • The dashboard now explains a busy lifecycle-operation slot, displays unknown capacity instead of false zeroes during recovery, and refreshes automatically when the Engine becomes ready again.

Fixed

  • Prevented terminal-history pressure from repeatedly taking Tay unavailable while a large active workload was still being processed.
  • Prevented a freshly loaded dashboard from remaining permanently empty after mounting during the compaction restart window.

0.11.0 — 2026-09-25

Added

  • Added a configurable max_terminal_jobs safety bound and standalone TAY_MAX_JOBS, TAY_MAX_STATE_BYTES, TAY_MAX_STATE_NODES, and TAY_MAX_TERMINAL_JOBS settings.
  • Added dashboard runtime-memory and active/terminal capacity diagnostics.

Changed

  • Split runtime state into a hot private-ETS projection for active jobs and a disposable disk-backed projection for terminal inspection history.
  • Made active admission limits apply only to actionable work; completed, cancelled, and discarded jobs no longer consume hot job/byte/node capacity, including after recovery.
  • Kept filtered statistics, queues, job lookup, retry, and bidirectional pagination available across both projections.

Fixed

  • Prevented large completed/discarded histories from permanently rejecting new jobs with retained_nodes or retained_jobs.
  • Added pressure-triggered compaction that retains the newest bounded terminal history without waiting for normal age, size, ratio, or cooldown gates.

0.10.0 — 2026-09-24

Added

  • Added a bounded catalog of the 128 newest canonical storage segments to the Engine status snapshot.
  • Added a collapsible dashboard table with each segment's canonical filename, active/sealed state, size, record count, and sequence range.
  • Added bounded free, claimed, reserved, and submitted client-slot counts to the Engine status snapshot.
  • Added a backward-compatible machine-readable capacity reason to Protocol v1 error responses and preserved it in Python ServerError.details.
  • Added deploy-helper.sh to publish the version-matched container images and Python client through their GitHub Actions workflows.

Changed

  • Moved normal command replies to the lifecycle Guardian so it releases the exact submitted permit before making success or error visible to the caller.
  • Expanded the project README with clearer architecture, installation, and deployment guidance.

Fixed

  • Fixed fast sequential producers transiently exhausting client_slots because successful replies could previously race ahead of permit release.

0.9.9 — 2026-09-24

Added

  • Added canonical history size in MiB, segment count, and configured terminal retention to the dashboard Overview page.
  • Added an explicit retention-hours control to manual dashboard compaction.
  • Exposed the configured compaction terminal retention in the bounded Engine status snapshot.

Changed

  • Manual dashboard compaction now reports the selected retention alongside the number of removed and retained jobs and reclaimed bytes.
  • Clarified that retention is time-based rather than a disk quota and that the displayed canonical history excludes temporary compaction headroom.

0.9.8 — 2026-09-24

Added

  • Added a light/dark dashboard theme that follows the operating-system setting by default and can be overridden with a persistent theme control.
  • Added state-specific colors throughout job, queue, and overview displays.
  • Added a confirmation-protected manual compaction action on the Overview page with a human-readable completion summary.

Changed

  • Replaced raw diagnostic maps with readable outcome titles and explanations; compact version/code data remains available under Technical details.
  • Removed the redundant Apply filters button because LiveView applies state, queue, and partial worker filters as they change.

0.9.7 — 2026-09-24

Added

  • Added exact filtered job totals and opaque previous/next/last cursors to the public inspection response.
  • Added complete dashboard navigation for first, previous, next, and last pages, including current/total page and visible/total job counts.

Changed

  • Made filtered cursor pages contain matching jobs up to the requested limit, including sparse partial-worker matches.
  • Kept version-one job cursors readable while emitting the bidirectional version-two cursor format.

Fixed

  • Fixed the dashboard's one-way pagination, which previously provided no way to return to earlier pages or jump to the final page.

0.9.6 — 2026-09-23

Changed

  • Gave dashboard package publication its own committed lock file so switching from the local Tay checkout to the Hex dependency no longer mutates the development lock.
  • Required Tay 0.9.5 or newer for dashboard partial worker-key filtering while allowing dashboard releases to version independently from the core package.

0.9.5 — 2026-09-23

Added

  • Added partial worker-key filtering to the inspection API and dashboard while preserving cursor/filter binding.

Fixed

  • Made stable schedule declarations idempotent so periodic reconciliation no longer resets interval timers or triggers a job on every reconciliation pass.

0.9.4 — 2026-09-23

Fixed

  • Included the JSON codec required by Phoenix LiveView in the standalone dashboard release, preventing WebSocket joins from crashing after upgrade.
  • Parsed URL-encoded query parameters in the standalone endpoint so filters and cursor links also work during static and non-JavaScript navigation.

0.9.3 — 2026-09-23

Added

  • Added dashboard version, lifecycle context, attempt semantics, and readable diagnostic-code descriptions to job details.

Fixed

  • Fixed LiveView origin validation behind Docker port publishing and reverse proxies while retaining same-origin protection.
  • Made job filters usable with both live events and ordinary GET submission, restored no-JavaScript cursor navigation, and exposed page position.
  • Prevented executor connection send failures from being misclassified as protocol error codes and crashing the connection process.

0.9.2 — 2026-09-23

Fixed

  • Fixed standalone dashboard LiveView connections when accessed through local loopback aliases such as 127.0.0.1, restoring interactive job filters.
  • Changed job cursor pagination to use LiveView patch navigation and added regression coverage for distinct pages and filtered results.

0.9.1 — 2026-09-23

Added

  • Added the dashboard-enabled OCI distribution with one Tay Engine, the Executor Protocol Unix socket, and a self-contained Phoenix LiveView UI.
  • Added a Compose example, non-root/read-only runtime hardening, Engine and HTTP smoke coverage, multi-architecture GHCR publishing, and complete deployment documentation.
  • Kept built-in HTTP Basic authentication optional and disabled by default; deployments may enable it with a paired username/password or rely on their private network, loopback binding, VPN, or trusted ingress boundary.

0.9.0 — 2026-09-23

Added

  • Added an official minimal standalone OTP release and Debian-slim production image for non-Elixir Executor Protocol v1 clients, without changing the Hex package or embedded startup contract.
  • Added strict runtime environment parsing, Engine-plus-UDS readiness checks, non-root/read-only container support, a generic Python worker Compose example, release/container lifecycle tests, and stable/prerelease-aware GHCR publishing.

0.8.1 — 2026-09-22

Added

  • Added the opt-in Engine option initialize: :if_missing for embedding applications that need first-start creation of a genuinely missing store.
  • Kept the default existing-only startup model and fail-closed recovery: an existing, corrupt, partial, unsupported, inaccessible, or busy store is never reinitialized, repaired, replaced, truncated, or used as a bootstrap signal.
  • Added an atomic native ownership operation that creates the owner lock only when it creates the final storage root, preventing Engine-level TOCTOU checks.

0.8.0 — 2026-09-22

Added

  • Added the stable, bounded public inspection API: cursor-paginated job listing, incremental state statistics, and public queue runtime snapshots.
  • Added generic payload-bounded job-transition and queue-control telemetry.
  • Added the separately published optional tay_dashboard Phoenix LiveView package with overview, job filtering/details, retry/cancel, queue controls, live refreshes, host-router integration, and explicit authentication guidance.
  • Preserved all frozen durable storage formats and kept Phoenix, LiveView, Plug, HTML, and JavaScript dependencies out of the core tay package.

0.7.1 — 2026-09-22

Fixed

  • Fixed a circular GenServer.call deadlock between executor dispatch and completion on connections with capacity greater than one. Outbound delivery is now mailbox-ordered without synchronously blocking the executor server; durable-start ordering, completion acknowledgements, disconnect recovery, reservation cleanup and at-least-once execution semantics are preserved.
  • Added a deterministic capacity-two dispatch/completion overlap regression test and a concurrent multi-capacity stress test.

0.7.0 — 2026-09-21

Added

  • Executor Protocol v1 now has automatic, cross-language local socket discovery: explicit path, TAY_SOCKET_PATH, XDG runtime, TMPDIR, then per-UID /tmp. Normal Engines and Tay() therefore connect without socket configuration; automatic directories are private and executor_socket: nil is the explicit listener opt-out. Stale cleanup now verifies the Unix socket file type before unlinking and refuses arbitrary filesystem objects.
  • Added an opt-in, Unix-domain-socket-only Executor Protocol v1 listener with bounded framed JSON, explicit hello/register/capacity lifecycle, per-task dispatch selection, durable enqueue/status/cancel bridging, timeout fencing, disconnect recovery and bounded live-generation result retention.
  • Added the separately packaged, stdlib-only clients/python SDK. It supports producer, embedded and dedicated worker modes, task decorators, reconnecting task registration, JSON validation, bounded result/error reporting and the tay-worker entry point.
  • Preserved the frozen Record/Segment/Event v1 format. Result values are not invented as Event-v1 fields: only completion is durable, while successful values are retained up to executor_max_results in the current listener generation. Durable periodic scheduling and custom retry policies remain deferred.
  • Centralized the immutable Event-v1 retry delay/jitter constants so all retry producers and interval checks use the same frozen policy.

0.5.0 — first public preview

Added

  • Durable single-node job core: frozen Record v1 and Segment/STORE v1 framing, canonical Event v1 semantics, an authoritative append-only log, bounded admission, same-ID insertion reconciliation and disposable ETS projections.
  • Supervised execution lifecycle: scheduling, automatic bounded retries, revision-checked cancellation/manual retry, queue pause/resume, drain and explicit fresh-generation stop/restart. Worker effects are at-least-once; neither exactly-once external effects nor multi-node execution is supported.
  • Fail-closed recovery: complete contiguous understood events replay even when prior caller acknowledgements are unknown. Torn, corrupt or unsupported history preserves evidence and refuses writable activation; no automatic tail repair, truncation or partial-state publication is provided.
  • Qualification: unchanged binary/Event fixtures, macOS development and validated Linux/Btrfs strict-sync ordinary suites, ASan/UBSan, independent crash/race and cold-restore tests, detached consumer releases, 10,000-job reconstruction, 1 GiB physical recovery, 300-segment tests and the measured benchmark scenarios. The R5 profile is finite and target validation is required; see compatibility and limits.
  • Limitations: no hardware-independent power-loss certification, automatic repair, live backup, retention/compaction, distributed execution or arbitrary workload/OS/filesystem support. Phase 11 snapshots/retention/compaction and Phase 12 orchestration/uniqueness remain deferred.

Earlier v0.1.0–v0.4.0 Git tags mark development milestones, not prior public Hex releases. See compatibility and operations for the supported release boundary.