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_msand standaloneTAY_GROUP_COMMIT_INTERVAL_MS, including batch telemetry, fault/shutdown coverage, and a seven-interval throughput/latency benchmark recipe. - Added standalone
TAY_DEFAULT_QUEUE_CONCURRENCYconfiguration instead of a hard-coded execution limit of 10 for thedefaultqueue. - Added standalone
TAY_CALLER_TIMEOUT_MSconfiguration and preserved a bounded reason in HTTPunknown_outcomeresponses for diagnosis. - Added optional periodic Store-v2 semantic checkpoints through
compaction: [checkpoint_interval: ...]and standaloneTAY_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;0explicitly 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-client1.3.0 withretriesandbackoffsupport onTayHTTPWorker.task; decorator retry settings now also act as defaults forTask.enqueueand 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-clientreleases from Tay versions. The release helper and PyPI workflow now skip an unchanged Python client and require its independent version to increase only whenclients/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
ServerErrormessages when Tay does not provide a human-readable reason, while retaining the structuredcodeanddetailsattributes. - 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_BYTESto use integer decimal or binary size suffixes, such as5GBor5GiB, 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_bytesbudget. The estimate now uses the job's flat BEAM heap shape, machine word size, retained canonical encoding, and binary payload bytes; the formermax_state_nodesoption 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
readywhen 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()andserve_forever()to make explicit that registration alone does not process jobs. Keptstart()andrun()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
/tmpfilesystem. 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
TayHTTPWorkerfor remote task execution and kept the local socket client available. Named the Python HTTP response and worker limits. - Merged the dashboard into the single
tayHex package and moved its release host understandalone/; 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/preparingandcompacting/switchinglifecycle phases. - Added regression coverage proving admission and job execution continue while a replacement epoch is built in the background.
- Added
TAY_TERMINAL_RETENTIONduration configuration for the standalone runtime, including minute, hour, and day forms such as30m,24h, and7d. - Bundled the optional dashboard into the single
tayOCI image, enabled withTAY_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
migratingoperation 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 separatetay-dashboardimage 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
/tmppaths 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_jobssafety bound and standaloneTAY_MAX_JOBS,TAY_MAX_STATE_BYTES,TAY_MAX_STATE_NODES, andTAY_MAX_TERMINAL_JOBSsettings. - 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_nodesorretained_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, andsubmittedclient-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.shto 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_slotsbecause 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_missingfor 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_dashboardPhoenix 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
taypackage.
0.7.1 — 2026-09-22
Fixed
- Fixed a circular
GenServer.calldeadlock 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 andTay()therefore connect without socket configuration; automatic directories are private andexecutor_socket: nilis 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/pythonSDK. It supports producer, embedded and dedicated worker modes, task decorators, reconnecting task registration, JSON validation, bounded result/error reporting and thetay-workerentry 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_resultsin 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.