Changelog

All notable changes to Assay. Each release is available on GitHub Releases as pre-built binaries, Docker image, and crates.io package.

sysops 0.2.0 — 2026-05-20

Added

Changed

assay 0.16.5 — 2026-05-21

Fixed

assay 0.16.4 — 2026-05-19

Fixed

assay 0.16.3 — 2026-05-19

Added

Changed

sysops 0.1.6 — 2026-05-18

Added

assay 0.16.2 — 2026-05-12

Fixed

assay 0.16.1 — 2026-05-11

Fixed

Container image

assay 0.16.0 — 2026-05-11

🏗️ Container Registry (lite crane replacement)

📦 Tar archive support

☁️ AWS ECR support

Internal

[assay-vault 0.3.0] — 2026-05-11

assay 0.15.11 — 2026-05-11

Added

Known limits

sysops 0.1.5 — 2026-05-08

Added

Changed

References

sysops 0.1.4 — 2026-05-07

Added

Changed

0.15.10 — 2026-05-05

hostops 0.1.3 — 2026-05-04

Added

Changed

0.15.9 — 2026-05-04

Changed

hostops 0.1.2 — 2026-05-03

Added

Changed

Removed

0.15.7 — 2026-05-03

Added

0.15.5 — UNRELEASED

Added

[assay-engine 0.4.1] - 2026-04-29

[assay-domain 0.2.1] - 2026-04-28

[assay 0.15.4] - 2026-04-28

[assay 0.15.2] - 2026-04-27

[assay-engine 0.4.0 / assay-auth 0.3.0 / assay-vault 0.2.0] - 2026-04-27

CrateBump
assay-engine0.3.1 → 0.4.0
assay-auth0.2.2 → 0.3.0
assay-vault0.1.0 → 0.2.0
(others)unchanged

Breaking change (pre-1.0 minor bump). Adding the external_issuers field to AuthCtx and AuthConfig changes their shapes; per pre-1.0 semver convention the minor version is the breaking-change bump. assay-vault 0.2.0 rides along — its dep declaration on assay-auth had to update from "0.2" to "0.3" (the published assay-vault 0.1.0 couldn't be reused because its baked-in manifest pinned the old assay-auth, and there's no way to mutate a published crate). While doing it, every public config struct in all three crates is now marked #[non_exhaustive] so future field additions are non-breaking — AuthCtx, AuthConfig, EngineConfig, BackendConfig, ServerConfig, WorkflowConfig, AuthSessionConfig, AuthPasskeyConfig, AuthOidcProviderConfig, DashboardConfig, LoggingConfig, ExternalIssuerConfig, plus all 51 public structs/enums in assay-vault are now #[non_exhaustive] and all require Default::default() + field assignment for external construction. Pattern matches on BackendConfig and on assay-vault's enums (SealingMethod, VaultError, ShareTarget, ActiveKek, Parent) from outside the crate must include a wildcard arm.

Headline: JWT pass-through validation. The engine now accepts JWTs minted by an upstream OIDC provider (Hydra, Keycloak, Auth0, …) on incoming Authorization: Bearer ... requests without managing engine-side users. Each issuer's JWKS is discovered once, cached in memory, and refreshed in the background — handles upstream key rotation transparently. Restores the v0.12.1 --auth-issuer / --auth-audience behavior in TOML config form, with multi-issuer support added.

This is the integration shape every operator who already runs an IdP wanted: keep your existing identity stack, point assay-engine at it, accept JWTs forwarded by a trusted edge — no engine user table, no engine sessions, no schema migrations on the auth side, no double-auth in front of the engine. See site/pages/auth-pass-through.html for the architecture write-up.

Added

Changed

Why this matters

Every comparable auth stack — Ory Hydra, Keycloak, Auth0 SDKs — assumes you bring your own edge that validates JWTs and forwards. Few of them ship a single binary that does the validation natively, with JWKS caching + refresh, multi-issuer routing, and a sensible default config — without making you stand up the IdP itself. That's what this release adds. Combined with the engine's existing OIDC provider mode (assay-engine ALSO ships as an IdP), operators can mix and match: act as the IdP for some traffic, accept upstream JWTs for the rest, all behind one binary.

[assay-engine 0.3.1] - 2026-04-27

CrateBump
assay-engine0.3.0 → 0.3.1
(others)unchanged

Headline: engine.toml now expands ${VAR} and ${VAR:-default} env-var references at load time, so credentials and per-environment URLs can stay out of config files. Operators wiring the engine into Kubernetes Secret env vars, systemd EnvironmentFile=, or Compose environment: blocks no longer need an external rendering step.

Added

Changed

Internal

[assay 0.15.1] - 2026-04-27

CrateBump
assay0.15.0 → 0.15.1

Headline: native Linux observability and systemd control for assay scripts, plus native browser-shell capability. Three new Rust builtins (linux, cgroup, systemd), two new Lua stdlib modules (assay.cron, assay.system), one new PTY primitive (process.spawn_pty), one new http.serve response shape ({ws = function(conn) ... end} for server-side WebSocket upgrades), and an assay.shell umbrella that bridges the two. Operator dashboards, health-check scripts, host-introspection automation, and "Open Shell" buttons over xterm.js no longer fork a subprocess per refresh cycle or sit behind a separate websocket sidecar.

All additions are purely additive — no breaking changes, no migration shim needed. Closes #88.

Added — linux Rust builtin (/proc + /sys/... readers)

Linux-only. Backed by the procfs crate (0.17). Empty table on non-Linux.

linux.kernel()              -- {version, hostname, os_release, btime}
linux.uptime()              -- {uptime_secs, idle_secs}
linux.loadavg()             -- {one, five, fifteen, running, total, last_pid}
linux.cpu_stat()            -- /proc/stat aggregate row, jiffies
linux.cpu_stat_per_core()   -- per-CPU rows
linux.cpu_percent(prev, curr)
                            -- Lua-side delta math, no kernel call
linux.meminfo()             -- /proc/meminfo as bytes (procfs reports kB)
linux.netdev()              -- /proc/net/dev
linux.diskstats()           -- /proc/diskstats
linux.proc_stat(pid)        -- /proc/<pid>/stat
linux.proc_status(pid)      -- /proc/<pid>/status

Added — cgroup Rust builtin (cgroup v2 unified hierarchy)

Linux-only. Pure std::fs + small parsers; no new crate dep. Path canonicalisation + /sys/fs/cgroup/ prefix check before every read.

cgroup.version()            -- "v2" | "v1" | "hybrid"
cgroup.list(slice_path)     -- child cgroup directories
cgroup.cpu_stat(path)       -- cpu.stat parsed
cgroup.memory(path)         -- memory.{current,max,swap.*,peak,low,high}
                            -- + memory.events (oom, oom_kill).
                            -- "max" sentinel maps to Lua nil.
cgroup.io(path)             -- io.stat per device
cgroup.pids(path)           -- pids.{current, max}
cgroup.procs(path)          -- cgroup.procs (pid list)

Added — systemd Rust builtin (D-Bus + journal)

Linux-only. zbus 5 async client; one persistent system-bus connection per Lua VM. Stub table on non-Linux returns "Linux only" runtime errors.

-- Units (org.freedesktop.systemd1)
systemd.list_units(filter?), unit_status(name), is_active(name)
systemd.list_timers()
systemd.start, stop, restart, reload   -- return job object path

-- Machines (org.freedesktop.machine1)
systemd.list_machines(), machine_status(name)
systemd.machine_start, machine_poweroff, machine_reboot, machine_terminate

-- Journal
systemd.journal({unit?, machine?, since?, until?, lines?, priority?})
                            -- one-shot read via `journalctl --output=json`
systemd.journal_follow(opts, fn) -> handle
                            -- streaming follow via sd_journal_wait
                            -- (libsystemd.so.0 dlopened at runtime via
                            --  libloading; no libsystemd-dev needed).
                            -- handle:close() stops the stream; worst-case
                            -- shutdown latency 500 ms.

*UsecRealtime D-Bus values are exposed as integer microseconds since the epoch under *_realtime keys.

Added — assay.cron Lua stdlib (scheduled-job inspector)

Pure Lua — file walks of /etc/crontab, /etc/cron.d/*, /etc/cron.{hourly,daily,weekly,monthly}/*, /var/spool/cron/crontabs/*, plus a passthrough to systemd.list_timers(). 5/6-field crontab parsing with @reboot / @daily / @hourly / @yearly shorthand.

local cron = require("assay.cron")
cron.system_crontab()       -- /etc/crontab + /etc/cron.d/*
cron.user_crontabs()        -- per-user crontabs
cron.daily_dropins()        -- /etc/cron.{hourly,daily,weekly,monthly}/
cron.timers()               -- thin wrapper around systemd.list_timers()
cron.all()                  -- unified schedule list across every source

Added — assay.system Lua umbrella stdlib

Single require("assay.system") re-export of linux, cgroup, systemd, and assay.cron, plus convenience aggregates that span sub-modules:

local sys = require("assay.system")
sys.linux.cpu_stat()
sys.cgroup.memory(path)
sys.systemd.list_machines()
sys.cron.all()

sys.host_snapshot()         -- {cpu, mem, load, uptime, netdev, kernel}
sys.machine_snapshot(name)  -- {info, cgroup={cpu,memory,io,pids}, journal_tail}
sys.machines()              -- list_machines() with cgroup utilisation joined

Tests

15 new unit tests on Linux (5 in linux::tests, 10 in cgroup::tests) + 3 #[ignore]-gated journal_follow live-fire tests. Plus 5 D-Bus / journal tests in systemd::tests gated #[ignore] (require a running system bus); pass on a typical Linux box with --include-ignored.

Out of scope (reserved for v0.15.x follow-ups)

[assay 0.15.0 / assay-vault 0.1.0 / assay-engine 0.3.0 / assay-dashboard 0.3.0] - 2026-04-26

CrateBump
assay0.14.2 → 0.15.0
assay-vaultNEW → 0.1.0
assay-engine0.2.2 → 0.3.0
assay-dashboard0.2.1 → 0.3.0
assay-authunchanged
assay-workflowunchanged

Headline: assay-engine adds the vault module — KV v2, transit, dynamic credentials, Bitwarden-aligned vaults + collections + items, biscuit-attenuated share links, sealing (Shamir + Cloud KMS shape), audit forwarding, and the foundation for a Bitwarden-protocol compatibility shim. One static binary now covers Vault (HashiCorp / OpenBao), 1Password / Bitwarden self-host, Ory Kratos / Hydra / Keto, and Temporal — at +1.7 MB on the existing assay-engine binary.

See docs/migration-to-0.3.0.md for the full migration guide.

Added — assay-vault (new crate)

Added — HTTP

All routes mounted under /api/v1/vault/*, admin-key gated except GET /share/{token} (public — biscuit + revocation are the access controls). See docs/migration-to-0.3.0.md for the full route table.

Added — Lua stdlib

Added — assay-engine

Changed — HA failover (plan §S9)

engine.instances heartbeat tightened: 15s → 3s; stale cutoff: 60s → 10s. Worst-case failover detection is now ~10s vs ~60s. No config changes required; takes effect on next boot.

Migration

See docs/migration-to-0.3.0.md.

Out of scope (reserved for v0.3.x follow-ups)

[assay 0.14.2 / assay-auth 0.2.1 / assay-dashboard 0.2.1 / assay-engine 0.2.2] - 2026-04-26

CrateBump
assay0.14.1 → 0.14.2
assay-auth0.2.0 → 0.2.1
assay-dashboard0.2.0 → 0.2.1
assay-engine0.2.1 → 0.2.2

Fixed

Added

Changed

[assay 0.14.1 / assay-workflow 0.3.1 / assay-engine 0.2.1] - 2026-04-26

CrateBump
assay0.14.0 → 0.14.1
assay-workflow0.3.0 → 0.3.1
assay-engine0.2.0 → 0.2.1

Fixed

Added — stdlib

Added — Lua builtins

Changed

Migration

No breaking changes. See docs/migration-to-0.14.1.md.

Out of scope

[assay-engine 0.2.0] - 2026-04-25

Headline: assay-engine becomes a full Ory replacement + IdP, on top of the Temporal-replacement workflow engine that already shipped in v0.13.x. One static binary now covers Kratos (identity), Hydra (OIDC provider), Keto (Zanzibar/ReBAC) and Temporal (workflows) — plus capability tokens (biscuit) which Ory has nothing equivalent for. PostgreSQL 18 + SQLite, both first-class.

The umbrella v0.2.0 release rolls together the v0.1.2 engine-schemas refactor with the entire auth stack (plan 12 phases 4-8) and the docs/site refresh. It supersedes the v0.1.2 work that was in-flight on feature/engine-0.1.2-schemas — that PR was closed; this is the consolidated drop.

Active-development release — consumers roll with each bump, no dedicated migration guide. SQLite deployments delete ./data/ and let the new per-module-file layout populate from scratch. PG deployments get idempotent ALTER TABLE … SET SCHEMA … migrations applied automatically on boot.

Per-crate bumps:

CrateVersionNotes
assay0.13.1 → 0.14.0New Lua stdlib assay.auth.* wrappers (login/passkey/oidc/biscuit/zanzibar/users/sessions/oidc_clients)
assay-engine0.1.1 → 0.2.0Headline release. AuthCtx composition, engine.modules-driven boot, dashboard auth panes mounted, full /auth/* HTTP surface.
assay-workflow0.2.1 → 0.3.0All store queries schema-qualified (workflow.*); tracks assay-domain 0.2
assay-domain0.1.1 → 0.2.0New engine module hosts engine-core schema (events/lock/namespaces/modules/audit/instances/migrations)
assay-auth0.1.0 → 0.2.0First real content release — full module set
assay-dashboard0.1.0 → 0.2.0Auth admin SPA (Users / Sessions / OIDC clients / Upstream / Zanzibar / Keys / Audit)

Schema/attach storage model

Added — engine core (was the v0.1.2 scope)

Added — auth primitives (Kratos-equivalent identity)

Added — biscuit (capability tokens — assay differentiator vs Ory)

Added — Zanzibar (Keto-equivalent ReBAC)

Added — OIDC (client + provider; Hydra-equivalent IdP)

Added — Dashboard auth admin SPA

Mounted at /auth/console when auth module is enabled, served from assay-dashboard static assets:

Conditional render: SPA reads /api/v1/modules and renders auth panes only when auth is enabled.

Added — Lua stdlib assay.auth.* (justifies assay 0.14.0 bump)

crates/assay/stdlib/auth.lua exposes the new auth surface to Lua scripts:

assay.auth.login(email, password) / logout() / whoami()
assay.auth.passkey.{start_register, finish_register, start_auth, finish_auth}
assay.auth.oidc.{start, complete}
assay.auth.biscuit.{issue, verify, attenuate}     -- verify + attenuate are local
assay.auth.zanzibar.{check, expand, write}
assay.auth.users.{list, get, create, update, delete}
assay.auth.sessions.{list_for_user, revoke, revoke_all_for_user}
assay.auth.oidc_clients.{list, create, rotate_secret}

Schema rename (v0.13.1 → v0.2.0)

All v0.13.1 tables relocated into per-module schemas with the redundant prefix dropped:

v0.13.1 (public.*)v0.2.0 (schema-qualified)
engine_eventsengine.events
engine_lockengine.lock (SQLite path; PG uses pg_advisory_lock)
namespacesworkflow.namespaces
api_keysworkflow.api_keys
workflowsworkflow.workflows
workflow_eventsworkflow.events
workflow_activitiesworkflow.activities
workflow_timersworkflow.timers
workflow_signalsworkflow.signals
workflow_snapshotsworkflow.snapshots
workflow_schedulesworkflow.schedules
workflow_workersworkflow.workers

PG: idempotent migration block in assay-workflow runs ALTER TABLE … SET SCHEMA …; RENAME TO … for any v0.13.1 tables found in public; safe on fresh installs and already-migrated databases.

SQLite: rebuild from scratch (per active-dev convention).

Preserved (carried forward from v0.13.1)

Docs + website

Binary sizes (measured)

vs Ory: kratos + hydra + keto = ~30-45 MB combined, plus a separate dashboard you build yourself.

[0.13.1] - 2026-04-24

Engine-events outbox. The PL/pgSQL LISTEN/NOTIFY triggers and the lossy in-memory SSE broadcast are replaced by a Rust-managed CDC outbox (engine_events) that delivers durable realtime events to dashboards and cross-node subscribers. All state-mutating workflow methods now emit typed WorkflowBusEvent variants via the new EngineEventBus trait, which has PG + SQLite implementations. Dashboards reconnecting after a laptop sleep replay up to 3 days of missed events from a Last-Event-ID cursor; pre-retention gaps return HTTP 410 so the client can snapshot and resync.

Active-development release — consumers roll with each bump, no dedicated migration guide.

Per-crate bumps:

CrateVersionNotes
assay0.13.1Dep bump (assay-workflow 0.2.1)
assay-engine0.1.1Wires PG/SQLite bus + cleanup loop into run_with_store
assay-workflow0.2.1Typed WorkflowBusEvent emits; SSE rewrite; no triggers
assay-domain0.1.1EngineEventBus trait + PG/SQLite impls + events table

assay-auth, assay-dashboard, assay-lua unchanged.

Added

Changed

Removed

Fixed

Known gaps

[0.13.0] - 2026-04-22

The monolithic assay binary is decomposed into six crates. assay-lua becomes a pure Lua runtime and HTTP client; assay-engine becomes a standalone HTTP server that composes assay-workflow, assay-dashboard, and (in v0.14.0) assay-auth behind one port. SurrealDB is dropped entirely in favour of PostgreSQL 18 + SQLite, on the evidence of a measured 3× clean build time and 3× peak compile RAM with no capability gain over PG18 + pgvector + recursive CTEs. Auth primitives, the full OIDC provider, passkey, and Zanzibar ship in v0.14.0 — Phases 4–7 of .claude/plans/12-v0.13.0-execution.md — so this release is deliberately narrower than the original plan 12 scope. Full upgrade steps live in docs/migration-to-0.13.0.md.

Six crates go out together:

CrateVersionNew / Bumped
assay-lua0.13.0Bumped (runtime only)
assay-workflow0.2.0Bumped (breaking)
assay-domain0.1.0New
assay-auth0.1.0New (scaffold)
assay-dashboard0.1.0New
assay-engine0.1.0New

assay-workflow is the only breaking bump — the trait moved to assay-domain, WorkflowCtx<S> replaces Engine<S>, and backends are now feature-gated additive flags rather than unconditional compile. assay-auth is a scaffold only in this release; its real content ships in v0.14.0.

The root workspace no longer has a [package]; it's workspace-only. What used to be the top-level assay binary moved to crates/assay/ and publishes to crates.io as assay-lua. Every domain concern lives under crates/<name>/. assay-domain holds the shared WorkflowStore trait and DTO types so any crate can depend on the trait without pulling the whole workflow engine. assay-dashboard holds the HTML/JS/CSS assets that used to live inside assay-workflow, exposed through a thin axum router. The dashboard is now served only by assay-engine; the retired runtime dashboard is gone for good.

The new assay-engine binary is the operational heart: assay-engine serve --config engine.toml loads a TOML config, connects to PG18 or SQLite, runs migrations, and serves the workflow API plus the dashboard on one port. Backend selection is runtime-configurable via [backend] type = "postgres" | "sqlite", not a build-time feature switch — both drivers compile into the same binary by default. Example configs live in crates/assay-engine/examples/ and the crates/assay-engine/tests/engine_smoke.rs integration test proves the full pipeline end-to-end.

PostgreSQL 18 is the minimum supported version. Migrations use the PG18 uuidv7() built-in and the schema is laid out to take advantage of PG18 skip-scan composite indexes (which the Zanzibar tuple store in v0.14.0 will lean on). Consumers on older Postgres must upgrade before running 0.13.0 migrations.

The SurrealDB backend is removed everywhere — the backend-surrealdb Cargo feature, the surrealdb crate dependency, roughly 2400 lines of src/store/surrealdb/* impls, and four SurrealQL migration files are all gone. The measured cost was compile-time pain — 91 s → 281 s clean release build and 1.3 GB → 3.7 GB peak compile RAM — and no production value that PG18 plus pgvector plus recursive CTEs doesn't cover. The full measurement and rationale live in plan 12's revision log. There is no in-place data migration path from SurrealDB; move to PG18 or SQLite via a clean re-seed or a one-off replay script.

Embedding the workflow engine inside assay-lua is also retired. The runtime binary no longer depends on assay-workflow or sqlx, no longer accepts the assay serve command, and no longer runs an internal scheduler. Scripts that need workflow functionality keep using the same HTTP subcommands they used in 0.12 (assay workflow start / list / describe / …) — those commands were always HTTP clients and they are unchanged. The only difference is that the HTTP endpoint now has to be a separately deployed assay-engine instead of whatever assay serve was producing in-process. Operators pick the engine URL via $ASSAY_ENGINE_URL or --engine URL as before.

Library consumers who embedded assay-workflow as a crate need to update their imports. WorkflowStore lives in assay_domain now; DTOs like WorkflowRecord and WorkflowEvent live in assay_domain::types. The Engine<S> generic is gone — its role is merged into WorkflowCtx<S>, which is simultaneously the axum state and the orchestrator (Shape 2B from plan 12a Task 1.3 revised). Call sites go from Engine::<PostgresStore>::new(store) to WorkflowCtx::start(Arc::new(store)). Features are now additive, not mutually exclusive: backend-postgres and backend-sqlite can both compile into the same binary and the engine picks one at startup.

The WorkflowStore::subscribe_runnable / subscribe_tasks methods are now async and return the stream only after the underlying LISTEN has been registered on the server. The old shape returned a lazy async_stream that issued LISTEN on first poll, which let a caller drop notifications by calling pg_notify between constructing the stream and polling it. PostgresStore::from_pool(pool) is a new constructor for when the engine owns the pool and hands a clone to the workflow module, matching the plan-12 "shared pool" story.

The engine in 0.13.0 runs with AuthMode::no_auth() — there is no JWT or API-key gate on the workflow API in this release. Do not expose a 0.13.0 engine on the public internet without a network gatekeeper (Cloudflare Access, Tailscale, VPN, or similar). v0.14.0 wires the full IdP stack in and flips the default AuthMode to JWT validation against the engine's own OIDC provider.

The runtime workflow feature and its embedded-sqlx surface are gone from assay-lua's Cargo manifest. The redundant crates/assay/tests/workflow_store.rs test was deleted — the new crates/assay-workflow/tests/smoke_backends.rs covers the same ground against both backends and runs in CI. No behaviour loss.

Plan 12's revision log, written inline in the plan file, documents the SurrealDB drop decision with the measured evidence and documents the 0.13.0 → 0.14.0 scope split so future sessions don't relitigate either. A backend-parity matrix in the same plan spells out, for every workflow and authz capability, what differs between PG18 and SQLite so the trait-abstraction contract stays honest across the two backends.

[0.12.1] - 2026-04-19

Text-processing stdlib primitives + scratch-based image, so assay scripts don't need a shell in the container and the published image goes from ~25 MB back to ~10 MB.

Added

Changed

[0.12.0] - 2026-04-18

This release combines a major dashboard upgrade (Steps tab + step- action signal protocol + the AWE/consumer architectural-boundary documentation) with a substantial CI/CD overhaul (mise + moon + a checked-in Playwright e2e suite + the Rust 1.95 toolchain bump) and a new stdlib surface for orchestrating external processes.

Added

Changed

[0.11.15] - 2026-04-18

Changed

Cuts another ~40-60px of vertical space per expanded row on top of v0.11.14's id-header hide.

[0.11.14] - 2026-04-18

Fixed

Changed

Together the two-column restructure and the header-hide cut ~60px of vertical noise per expanded row while making the list view more scannable in the collapsed state.

[0.11.13] - 2026-04-17

Changed

Tests

[0.11.12] - 2026-04-17

Added

Changed

Fixed

Tests

[0.11.11] - 2026-04-17

Added

Tests

[0.11.10] - 2026-04-17

Added

Both changes close a gap surfaced by consumers building multi-tenant deployment pipelines on top of the engine (e.g. a platform-engineering namespace for promotions, a data-engineering namespace for backfills, both sharing one assay-serve instance). No engine changes — the engine already supported namespace on these endpoints; only the stdlib was missing.

Tests

[0.11.9] - 2026-04-17

Added

Changed

Tests

[0.11.8] - 2026-04-17

Changed

Internal

Tests

[0.11.7] - 2026-04-17

Added

Store

Changed

[0.11.6] - 2026-04-17

Fixed

Changed

Tests

[0.11.5] - 2026-04-17

Changed

Fixed

Docs

[0.11.4] - 2026-04-17

Added

Changed

Docs

[0.11.3] - 2026-04-16

Added

Changed

Fixed

Notes

[0.11.2] - 2026-04-16

Fixed

Notes

[0.11.1] - 2026-04-16

Added

Tests

Notes

[0.11.0] - 2026-04-15

Removed

Changed

[0.10.4] - 2026-04-12

Added

[0.10.3] - 2026-04-12

Added

[0.10.1] - 2026-04-12

Fixed

[0.10.0] - 2026-04-11

Added

Changed

[0.9.0] - 2026-04-11

Added

Changed

[0.8.4] - 2026-04-11

Added

Fixed

[0.8.3] - 2026-04-07

Added

Changed

[0.8.2] - 2026-04-07

Added

[0.8.1] - 2026-04-07

Fixed

[0.8.0] - 2026-04-07

Added

Theme

This is the identity and auth stack release. Assay now ships with a complete SDK for building OIDC-integrated apps on Ory: one app can handle Hydra login/consent challenges, query Keto permissions, and manage Kratos identities — all in idiomatic Lua with zero external dependencies beyond the existing assay binary.

[0.7.2] - 2026-04-07

Added

[0.7.1] - 2026-04-06

Changed

[0.7.0] - 2026-04-06

Added

Dependencies (temporal feature only)

[0.6.1] - 2026-04-06

Fixed

Added

Changed

[0.6.0] - 2026-04-05

Added

Architecture

[0.5.6] - 2026-04-03

Added

Fixed

[0.5.5] - 2026-03-13

Added

[0.5.4] - 2026-03-12

Fixed

[0.5.3] - 2026-03-12

Added

Fixed

[0.5.2] - 2026-03-11

Added

Fixed

[0.5.1] - 2026-02-23

Added

Changed

[0.5.0] - 2026-02-23

Added

Changed

[0.4.4] - 2026-02-20

Added

[0.4.3] - 2026-02-13

Added

Changed

[0.4.2] - 2026-02-13

Fixed

[0.4.1] - 2026-02-13

Fixed

[0.4.0] - 2026-02-13

Added

Fixed

[0.3.3] - 2026-02-12

Added

Fixed

[0.3.2] - 2026-02-11

Added

Fixed

[0.3.1] - 2026-02-11

[0.3.0] - 2026-02-11

First feature-complete release. Assay is now a general-purpose Lua runtime for Kubernetes — covering verification, scripting, automation, and lightweight web services in a single ~9 MB binary.

Added

Changed

[0.0.1] - 2026-02-09

Initial release. YAML-based check orchestration for ArgoCD PostSync verification.

Added