1.3.3 — 2026-10-11
Fixed
- Changed periodic Store-v2 checkpoints to capture the live active and terminal projections at an exact durable sequence frontier instead of replaying every old journal segment. Checkpoints can now run with active jobs, preserve concurrent mutations in the ordered tail, release their temporary ETS copy after ingestion, and retain the existing verified atomic publication path.
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.