Skip to content

Releases: launchapp-dev/animus-cli

v0.5.4 — delete agent-runner sidecar; auto-update + opt-in metrics

Choose a tag to compare

@Shooksie Shooksie released this 05 Jun 17:41

Highlights

~10,000 LOC net surface-shrink by deleting the agent-runner sidecar after recognizing it was vestigial post-plugin-extraction. Provider plugins (claude/codex/gemini/opencode) handle CLI invocation; animus agent run is reimplemented as a thin client over SessionBackendResolver.

Major changes

  • agent-runner sidecar deleted. ~8000 LOC removed; animus agent {run,status,cancel,control} now dispatches directly to provider plugins via the existing plugin host. The Unix-socket bridge, runner_helpers supervisor, lockfile, and shared-secret auth are gone. The published animus-agent-runner-protocol crate is marked deprecated.
  • animus runner restart-stats removed. No more sidecar to restart.
  • DaemonHealth schema: new provider_plugins_healthy: bool field; legacy runner_connected/runner_pid kept for wire back-compat (always false/None).
  • animus agent control returns unavailable (exit code 5) under the provider-only model.

Added

  • animus self update — configurable auto-update with four modes (off / notify / prompt / auto), channel filtering (stable / prerelease), atomic same-directory binary swap. Env: ANIMUS_AUTO_UPDATE_MODE, ANIMUS_AUTO_UPDATE_DISABLE.
  • animus metrics — opt-in anonymous event counters with first-run prompt. Hard opt-in; closed-enum events with bounded tag types; no code/paths/repos/prompts ever in the payload. Env kill-switch: ANIMUS_METRICS_DISABLE=1. Default endpoint is a placeholder pending product confirmation.
  • system_prompt_file on AgentProfile — load the system prompt from an external UTF-8 file (resolved relative to source YAML). Inlined verbatim at compile time.
  • HTTP MCP servers in workflow YAMLmcp_servers: entries can declare transport: http + url: so workflows can reach remote MCPs (e.g. Robinhood's hosted MCP) without bridge scripts.

Infrastructure

  • Rust toolchain pinned to 1.96.0 via rust-toolchain.toml.

See CHANGELOG.md for the full diff.

v0.5.3 — surface-shrink: 17 → 12 crates

Choose a tag to compare

@Shooksie Shooksie released this 03 Jun 20:32

Changelog - v0.5.3

Release Date

2026-06-03

Overview

v0.5.3 is a pure surface-shrink release. Workspace shrinks from 17 → 12 crates across v0.5.2 + v0.5.3 (the in-tree oai-runner extraction lived in v0.5.2; the orchestrator-git-ops delete + three folds land in v0.5.3 as the cleanup wave). The kernel is now mostly CLI + daemon + plugin-host + core + config + a small support tail.

Per Sami's coding philosophy ("clean smaller surfaces are easier and smaller surfaces that can be made bulletproof or hot swapped"), every change here is net-shrink, no behavior change.


Surface-shrinks landed

Delete orchestrator-git-ops (1472 LOC)

The crate had zero Rust consumers — only its own Cargo.toml referenced it. The docs claimed it "owns git automation helpers" but no code imported it; actual worktree management lives in animus-workflow-runner-default (out-of-tree plugin) and the daemon dispatch path. Pure delete.

Extract in-tree oai-runner (5483 LOC)

crates/oai-runner/ was the standalone OpenAI-compatible agentic runner binary. launchapp-dev/animus-provider-oai-agent v0.1.3 already ships the same code wrapped in the stdio plugin protocol, plus a separate animus-oai-runner release archive. The in-tree crate became redundant when the plugin was published.

  • Pinned animus-provider-oai-agent v0.1.3 in default-install.json + plugin_registry::DEFAULT_OAI_AGENT_PLUGINS (constant already existed).
  • New resolve_oai_runner_binary() helper in orchestrator-core::runtime_contract: searches $ANIMUS_OAI_RUNNER_BIN~/.animus/plugins/animus-provider-oai-agent/bin/animus-oai-runner → legacy flat path → $PATH.
  • agent-runtime-config.v2.json cleared the hardcoded "executable": "animus-oai-runner" so the resolver kicks in.
  • Stripped animus-oai-runner from .cargo/config.toml, Dockerfile, .github/workflows/release.yml, scripts/install.sh (legacy archive support kept for upgraders).

Known v0.6+ gap: animus plugin install is currently single-binary-per-plugin. The plugin's release ships TWO archives (animus-provider-oai-agent-*.tar.gz + animus-oai-runner-*.tar.gz); only the first is pulled by animus plugin install launchapp-dev/animus-provider-oai-agent. After install, the animus-oai-runner binary is NOT on disk. v0.6 will add multi-binary plugin install support OR publish animus-oai-runner as its own repo. Existing operators may need a manual install in the interim.

Fold orchestrator-providersorchestrator-core::subject_adapter (2006 LOC)

The crate was misnamed (not "providers" — provider plugins live out-of-tree). 73% of it was subject_adapter.rs (subject backend routing trait + impl); 11% was the git project adapter; 9% was the builtin project adapter. Only orchestrator-core depended on it. Folded as a sub-module:

  • subject_adapter.rscrates/orchestrator-core/src/subject_adapter/adapter.rs
  • git.rscrates/orchestrator-core/src/subject_adapter/git.rs
  • builtin.rscrates/orchestrator-core/src/subject_adapter/builtin.rs
  • lib.rscrates/orchestrator-core/src/subject_adapter/mod.rs

2 callers updated: orchestrator-core itself + animus-runtime-shared::ensure_execution_cwd. Known v0.6+ follow-up: subject_adapter::TaskServiceApi and services::TaskServiceApi now coexist in orchestrator-core (identically named); disambiguation via as Provider... aliases preserved. Worth a rename pass.

Fold orchestrator-storeorchestrator-core::store (180 LOC)

Trivial — 180 LOC of persistence primitives, smaller than most files in the kernel. Folded into orchestrator-core/src/store/mod.rs. tempfile dep promoted from dev-only to prod in orchestrator-core (the store helpers use it in production paths). 2 callers updated: orchestrator-core + animus-runtime-shared.

Fold orchestrator-session-hostorchestrator-plugin-host::session (2406 LOC)

The crate's own lib.rs docstring said "Host-side glue that wires the upstream SessionBackend trait to the Animus STDIO plugin protocol" — literally plugin-host glue. All 5 source files (incl. plugin_supervisor.rs and session_backend_resolver.rs) folded under crates/orchestrator-plugin-host/src/session/.

  • 6 import sites updated across agent-runner, orchestrator-cli, orchestrator-daemon-runtime.
  • animus-session-backend, orchestrator-logging, async-trait, uuid (+ rt-multi-thread tokio feature) absorbed into plugin-host's deps.
  • Re-exports inside session/mod.rs preserve the old top-level surface; consumers use orchestrator_plugin_host::session::... (no top-level plugin-host re-export — keeps the namespace boundary visible).

Codex round 1 P2 fix (main loop)

  • docs/architecture/crate-map.md claimed "13 crates" and still listed orchestrator-session-host as a current crate. Fixed: "12 crates" + removed the stale row; consolidated the description into the orchestrator-plugin-host row.

Codex round 1: 0 P1, 1 P2 (fixed inline).


Numbers

  • Workspace members: v0.5.0: 17 → v0.5.1: 17 → v0.5.2: 15 → v0.5.3: 12.
  • Net LOC delta on main vs v0.5.2: ~−1700 (the folds are roughly LOC-neutral as moves; the wins come from deleted Cargo.toml + README files and tightened doc tables).
  • ao-cli tests: 1774 passing (down from 1917 at v0.5.1; the delta reflects the deleted in-tree oai-runner tests + the deleted store + providers test modules). 6 pre-existing testkit-binary failures unchanged. 11 ignored.
  • Codex rounds on main merge: 1 → 0 P1, 1 P2 (fixed inline).

Architectural shape after v0.5.3

The remaining 12 crates, grouped:

Core (5): orchestrator-cli, orchestrator-core (with the folded subject_adapter + store modules), orchestrator-config, orchestrator-daemon-runtime, agent-runner

Plugin foundation (4): orchestrator-plugin-host (with the folded session module), animus-plugin-protocol, animus-plugin-runtime, animus-runtime-shared

Support (3): orchestrator-notifications, orchestrator-logging, protocol

That's the "glue" shape Sami's coding philosophy was after — the kernel is CLI + daemon + plugin host + core. Everything else is a plugin (out-of-tree) or shared infrastructure consumed by both kernel and plugins.


🚧 v0.6 carry-forwards from this release

  • Multi-binary plugin install. Today animus plugin install is single-binary; the OAI agent plugin ships two binaries (animus-provider-oai-agent + animus-oai-runner). v0.6 should add multi-binary install support OR animus-oai-runner should be published as its own repo.
  • Subject adapter trait rename. subject_adapter::TaskServiceApi / services::TaskServiceApi collide in orchestrator-core post-fold. The as Provider... aliases work today; a clean rename would close the disambiguation surface.
  • Standalone launchapp-dev/animus-runtime-shared repo needs Cargo.toml updated when this ships: drop the orchestrator-store git dep — fsync_rename now lives under orchestrator_core::store::fsync_rename.
  • orchestrator-notifications extraction (1.5k LOC) — could be a notifier plugin (the symmetric inverse of triggers). Not done in v0.5.3.
  • agent-runner extraction to a runner plugin (10.5k LOC) — biggest single-crate move; would mirror the workflow-runner-v2animus-workflow-runner-default swap in v0.5.1. Architectural cleanup; deferred.

Upgrade

animus daemon stop
curl -fsSL https://raw.githubusercontent.com/launchapp-dev/animus-cli/main/scripts/install.sh | bash
animus plugin install-defaults --include-subjects --include-transports
# OAI users: also install the agent plugin
animus plugin install launchapp-dev/animus-provider-oai-agent
animus daemon preflight
animus daemon start --autonomous

v0.5.1 — surface-shrink release

Choose a tag to compare

@Shooksie Shooksie released this 03 Jun 17:23

Changelog - v0.5.1

Release Date

2026-06-03

Overview

v0.5.1 ships 8 surface-shrinking moves that close every v0.6 item flagged during the v0.5 series and rationalize the surfaces v0.5 introduced. Four parallel sub-agents (ALPHA, BETA, GAMMA, DELTA) landed cleanly via worktree isolation; codex caught 2 P1s in the merged result that fold-in rounds had missed; both fixed. Net: ~10 days of deferred work shipped in one cycle, reviewer-clean.

This release follows the "clean smaller surfaces" coding philosophy: prefer surface-shrink over feature-grow, replace mocks with concrete impls, collapse dual implementations, delete dead paths.


Architectural changes

Recording layer — production-grade replay (ALPHA, items 1+4+6)

  • Real DurableStoreClient. Replaced MockDurableStore with DbosDurableStoreClient — the production-facing impl that discovers the durable_store plugin via orchestrator_plugin_host::discover_by_kind, runs the standard initialize handshake with project_binding, and maps the fence trait to durable/begin_workflow_run / durable/begin_step / durable/commit_step / durable/abandon_step / durable/query_run. MockDurableStore relegated to #[cfg(test)] mod test_doubles. The load-bearing differentiation is now live: durable workflow retries consume the prior decision instead of re-calling the model.
  • Out-of-boundary tool side-effect re-assertion (Option B). New DecisionEvent::ToolSideEffect { name, assertion } variant with typed SideEffectAssertion::{FileExists, FileAbsent, Unknown} (#[serde(other)] on Unknown so v0.6 can add variants). Replay never re-executes side-effecting tools; instead, drive_replay asserts the recorded post-condition. Mismatches raise ReplayDivergenceError, surfaced to the operator as AgentRunEvent::Error. Preserves determinism while catching divergence.
  • Long-term decision-log compaction. New sweeper module: archives older than 24h get zstd-compressed to .jsonl.bak.zst; archives older than 7 days (configurable via ANIMUS_DECISION_LOG_EXPIRY_DAYS) get deleted. ReplaySource::open transparently decompresses. Wired into the daemon's startup_cleanup block — no new background task.

Reattach completeness — Unix + Windows on one abstraction (BETA, items 2+7)

  • decisions.jsonl auto-discovery on reattach. AgentSpawnRecord gains decisions_jsonl_path: Option<String> and last_consumed_offset: u64 (both #[serde(default)] for backward compatibility). New replay_gap_from_spawn_record(record, ...) auto-derives the path. The daemon pre-allocates agent_session_id via the new ANIMUS_AGENT_RUN_ID env var; older runners that ignore it still work — gap-replay degrades to Ok(None).
  • Cross-platform reattach via interprocess. Collapsed the cfg(unix)-only daemon socket code AND the runner's Unix-only set_write_timeout hack into ONE cross-platform implementation. Unix uses domain sockets; Windows uses named pipes; both round-trip through local_socket_name_for which auto-detects via a path-separator predicate. try_reattach signature changed from &Path to &str. ReattachConnection no longer cfg(unix)-gated.
  • Bounded runner broadcast. Per-reader writer thread fed by a mpsc::sync_channel(256). A wedged reader trips try_send → Full → drop instantly, never blocking the runner's emit path. Cross-platform replacement for the Unix-only set_write_timeout hack.

Queue protocol — head-of-line preemption (GAMMA, item 3)

  • animus-queue-protocol v0.3.0: QueueLeaseRequest gains exclude_subjects: Option<Vec<SubjectId>> (backward-compatible default None). The queue plugin skips entries whose subject is excluded; they stay in Pending for a later lease.
  • animus-queue-default v0.3.0: implements the filter; 4 new tests including a HoL regression guard.
  • ao-cli daemon: snapshots process_manager.active_subject_ids() and passes them as exclude_subjects at lease time. Deleted the release_pending-as-HoL-workaround code path (~40 LOC removed). call_queue_release_pending retained in plugin_clients.rs for two real use cases: (1) within-batch duplicate subjects in one lease batch (different workflow_refs), (2) genuine "leased but cannot handle" scenarios.

Cleanups + setsid (DELTA, items 5+8)

  • config_context sparse-override gap closed. New builtin_runtime_config() OnceLock helper; fallback wired into phase_capabilities, phase_output_contract, phase_decision_contract, phase_output_json_schema. Cross-contamination guards prevent custom output_contract from inheriting builtin output_json_schema and vice versa. The Phase B codex P2 deferral is closed.
  • current_ao_command sibling-binary lookup removed. Dropped the sibling discovery from runtime_contract; the canonical surface is the memory_mcp_stdio_command init-extension (round-1 fold-in). ProcessManager::spawn_workflow_runner exports ANIMUS_HOST_CLI_PATH=current_exe() so the daemon's direct-spawn path works without a sibling binary.
  • Manual-phase ignored test deleted. approve_manual_phase_continues_non_terminal_workflow — its assertion exercised the deleted in-tree workflow runner; coverage moved to pack conformance. Test count regularized at 1917 (was 1900 v0.5.0, 11 ignored now from 14).
  • Full setsid hardening. New scoped #[allow(unsafe_code)] set_session_id_on_spawn helper in process_manager.rs (one function, ~10 LOC, one-line WHY comment). Replaces process_group(0) with the stronger setsid() — runner survives terminal hangups too, not just SIGTERM to the daemon pgid. libc dep added. New test asserts new POSIX session.

Codex round 1 P1 fixes (main loop)

  • daemon_task_dispatch.rs: GAMMA's within-batch dedupe deleted too much. When queue/lease returns multiple Pending entries for the same subject (different workflow_refs) in one batch, the duplicates should release_pending, not completion(CANCELLED). Fixed: within-batch duplicates now release back to Pending; old-plugin fallback to completion(CANCELLED) only when release_pending returns method-not-found.
  • dbos_client.rs: lock-inversion between shutdown and ensure_workflow_run. Fixed: both functions now take host BEFORE init (consistent order); the init reset happens inside the host critical section so a racing step can't re-init on the old host before shutdown swaps it.

Codex round 3: 0 P1 / 0 P2 / 0 P3 on the merged + fixed v0.5.1 state.


Surface-shrink wins (deletes ranked by impact)

  • ALPHA: MockDurableStore moved out of production API into #[cfg(test)].
  • BETA: cfg(unix)-only socket code AND set_write_timeout hack collapsed into one interprocess-backed impl.
  • BETA: build_record deleted (canonical constructor is build_record_with_decisions).
  • BETA: try_reattach signature &Path → &str — drops path-vs-name confusion.
  • GAMMA: ~40 LOC release_pending-as-HoL-workaround DELETED from daemon dispatch (net −19 LOC in ao-cli for this item).
  • GAMMA: protocol change is one parameter extension on existing QueueLeaseRequest, not a new method.
  • DELTA: approve_manual_phase_continues_non_terminal_workflow (#[ignore]'d, dead test) DELETED.
  • DELTA: 2 TODO(codex-p2) markers DELETED (config_context + runtime_contract).
  • DELTA: runtime_contract::current_ao_command sibling-binary discovery DELETED.

Out-of-tree releases

  • animus-protocolv0.5.3 (commit 6b114186) — animus-queue-protocol 0.2.0 → 0.3.0 with exclude_subjects.
  • animus-queue-defaultv0.3.0 (commit 5f12e7db) — implements exclude_subjects filter.

📊 Numbers

  • Total LOC delta on main: +2978 / −878 across 25 files (most additions are tests + new modules).
  • ao-cli tests: 1917 passing (was 1900 at v0.5.0), 6 pre-existing testkit-binary failures (unchanged), 11 ignored (was 14 — net −3 from DELTA's cleanup).
  • Codex rounds: 3 rounds on the final merged main, ending 0 P1 / 0 P2 / 0 P3. (Sub-agents could not run codex inside worktrees; main loop ran it.)
  • Out-of-tree plugin test totals: +4 in animus-queue-default (now 25), +2 in animus-queue-protocol (now 5).
  • Surface-shrinks: 9 explicit deletes (see "Surface-shrink wins" above).

⚠️ Breaking changes

  • animus-queue-protocol 0.2.0 → 0.3.0 — new optional field on QueueLeaseRequest. Backward-compatible at the wire level (old clients omitting the field work identically to today), but the type signature changed. Third-party plugins consuming the protocol must bump their dep.
  • animus-queue-default v0.2.0 → v0.3.0 — install with animus plugin install launchapp-dev/animus-queue-default@v0.3.0 or rerun animus plugin install-defaults. The daemon's default-install.json pin is bumped automatically.
  • AgentSpawnRecord gains two fields. Older record files (without the fields) parse cleanly via #[serde(default)]; older daemons reading newer records ignore unknown fields. The wire is forward-compatible.
  • current_ao_command sibling-binary fallback removed. Standalone plugin deployments that relied on a sibling animus binary now must use the memory_mcp_stdio_command init-extension or the ANIMUS_HOST_CLI_PATH env var (which the daemon sets automatically).

🚧 v0.6 roadmap (small carry-forwards)

  • Live-socket last_consumed_offset write-back (BETA gap): events between gap-replay and crash get re-emitted on next reattach (duplicates per affected workflow).
  • Built-in tool classification for side-effect assertions (ALPHA gap): producers currently opt in per-call.
  • Side-effect kinds beyond file_exists/file_absent (process exit codes, network endpoint reachability, env-var equality).
  • Graceful per-orphan shutdown for ReattachConnection (drop currently detaches but doesn't kill the rea...
Read more

v0.5.0 — kernel + flavors

Choose a tag to compare

@Shooksie Shooksie released this 02 Jun 11:24

Changelog - v0.5.0

Release Date

2026-06-02

Overview

v0.5.0 ships the kernel + flavors architecture: a Rust daemon kernel plus a curated bundle of out-of-tree plugins that own workflow execution, queues, durable steps, and memory. The daemon's role narrows to scheduling + plugin orchestration; everything else is plugin-replaceable.

This release is the culmination of 5 fold-in rounds, 120 codex review passes, and a substantial cargo-graph reshuffle. The architectural surface area is materially smaller and the plugin ecosystem is materially larger.


Architecture: kernel + flavors

The daemon is the kernel. Plugins implement four new roles at the protocol level:

The daemon refuses to start when any required role is unsatisfied. animus daemon preflight reports missing roles with actionable animus plugin install ... commands. animus daemon start --auto-install installs recommended defaults on the fly.

See docs/architecture/kernel-and-flavors.md for the product/discipline architecture.


✨ Features

Four new plugin kinds at the protocol level (animus-protocol v0.5.1)

  • New animus-workflow-runner-protocol with workflow/execute, workflow/run_phase (now carries mcp_config), workflow/events subscription, paused/pending wire vocabulary.
  • New animus-queue-protocol with atomic queue/lease + queue/release_pending(entry_id, reason) (Assigned → Pending transition that returns work to the queue without canceling it).
  • New animus-durable-store-protocol with step/begin + step/complete + step/abort + diagnostics; PRIOR_ERROR is terminal for idempotency_key across plugin restarts.
  • New animus-memory-store-protocol with semantic memory/put / memory/get / memory/search over graph-scoped storage.
  • Extended animus-plugin-protocol with init_extensions.project_binding + memory_mcp_stdio_command so plugins can reach the daemon's MCP sidecar.

Generic plugin authoring shell (animus-plugin-runtime v0.2.0)

  • New Plugin::new() builder + register_method! macro that any plugin kind can use to skip rolling its own stdio dispatch loop. Notifier handle for fan-out; MethodContext with keep_cancellation() for streaming subscriptions; multi-line frame parsing; protocol-major compatibility check; shutdown drains in-flight requests.

Workflow execution

  • Daemon-restart-survivable agent reattach. The runner subprocess now binds a Unix socket as a server; the daemon connects as a client and can reconnect after restart. process_group(0) isolates the runner from daemon SIGTERM. Stalled-reader 100ms write timeout prevents the runner from blocking on dead daemons. Multi-daemon simultaneous attach via broadcaster.
  • LLM-decision recording at the agent-runner level. Every prompt, response chunk, tool call, and tool result is captured to ~/.animus/<scope>/runs/<run_id>/decisions.jsonl. Three durability modes (FlushOnly, FsyncPerEvent, FsyncEveryN(8) default). Replay-from-log mode (ANIMUS_REPLAY_SESSION env var) for tests/dev determinism — tool-result replay prevents re-execution of side-effecting tools.
  • Daemon startup orphan-scan. Detects in-flight agents from prior daemon runs via per-agent JSON records. PID-identity verification via ps -p matches recorded binary basename, so PID reuse doesn't produce false orphans.
  • Daemon-side reattach gap reconstruction. Race-safe tail reader replays decisions.jsonl events emitted during the daemon gap to subscribers.
  • Workflow-runner v0.4.1 consumes mcp_config in workflow/run_phase; emits paused / pending wire vocabulary.

Subject backends

  • All subject operations route through SubjectRouter to installed subject_backend plugins. The in-tree InTreeTaskSubjectBackend / InTreeRequirementsSubjectBackend adapters and their kill-switch env vars (ANIMUS_DAEMON_DISABLE_BUILTIN_TASK_ADAPTER, etc.) are gone. Install launchapp-dev/animus-subject-default (kind=task) and animus-subject-requirements (kind=requirement).

Daemon control surface

  • Queue verbs over the daemon's control socket (CLI → daemon over Unix socket → queue plugin RPC) now forward to the queue plugin instead of returning NotSupported. Anchored reorder (Front/Back/Before/After), idempotent enqueue, NotFound/InvalidRequest/Unavailable error mapping.

Configuration

  • Workflow YAML supports ${VAR} env-var interpolation for non-secret config (URLs, team IDs, feature flags), with ${VAR:-default} and ${VAR:?error} fallback shapes; substitution happens before YAML parsing.

Plugin kill-switches

  • ANIMUS_DAEMON_DISABLE_TRIGGERS=1 — skip trigger plugin supervisor (interrupts in-progress restart backoff)
  • ANIMUS_DAEMON_DISABLE_SUBJECT_PLUGINS=1 — skip subject plugin discovery
  • ANIMUS_PROVIDER_DISABLE_PLUGIN removed — there is no in-tree provider fallback anymore

🧹 Cleanup

Workflow runtime deduplicated

  • New crate launchapp-dev/animus-runtime-shared v0.1.1 — shared workflow runtime modules consumed by both the daemon and the workflow_runner plugin. Single source of truth; the duplicated ~2K LOC between in-tree and the plugin is gone.
  • crates/workflow-runner-v2/ deleted entirely (~14k LOC). 21 ao-cli consumer files migrated to animus_runtime_shared::*.
  • Plugin v0.4.1 consumes the published shared crate via git tag; no path-dep release blocker.

In-tree fallbacks removed

  • Daemon-side workflow runner + queue fallback paths surgically removed (~1055 LOC). Plugins are hard-required by preflight; the daemon refuses to start without them.
  • Subject type duplicate removed; in-tree animus-subject-protocol mirror crate deleted; CI protocol-drift gate retired.

Kind-based plugin discovery

  • orchestrator_plugin_host::discover_by_kind(project_root, kind) filters installed plugins by manifest plugin_kind. The daemon's workflow runner resolver does kind-based discovery first, falling back to hard-coded binary names for legacy installs.

🔧 Hardening

Durable store (animus-step-durable-dbos v0.2.0)

  • Cross-IPC idempotency: NFC normalization + control-char rejection + line-separator-before-trim + 512-byte cap. Legacy-spelling lookup bridge with array_position sort prevents stale-row shadowing.
  • Schema sync: _animus_durable_store_schema table records expected version; on-startup validation; forward canonicalization migration. durable/diagnostics JSON-RPC method exposes drift + row counts.
  • Reservation expiry: 30s sweeper reclaims orphaned reservations; late commits hard-fail with RESERVATION_EXPIRED.
  • PRIOR_ERROR is terminal for idempotency_key across plugin restarts; tested with 5-way concurrent replay race.

Queue (animus-queue-default v0.2.0)

  • Atomic queue/lease path adopted by the daemon. queue/release_pending(entry_id, reason) returns Assigned → Pending without canceling work.

Memory (animus-memory-zep)

  • Exhaustive memory/get via graph.episode.getByGraphId (no longer bounded-page search-based; misses under heavy-episode scopes are fixed).
  • Metadata-round-trip scopeFromGraphId with filter-leak guard.

📊 Cumulative numbers

  • 120 codex review passes across the v0.5 arc: 6 protocol-design + 38 Wave 1–4 implementation + 76 across 5 P2 fold-in rounds. Every released artifact ended at 0 P1.
  • 18 standalone plugin repos under launchapp-dev — protocol, four providers, five subject backends, two transports, web UI, two triggers, log storage, conformance testkit, release automation, plugin template, shared runtime, and four reference plugins for the new plugin kinds.
  • 443 plugin-side tests across the seven v0.5 artifacts (queue, Zep, DBOS, workflow_runner, runtime-shared, plugin-runtime, animus-protocol workspace).
  • 1880 ao-cli tests passing, 6 pre-existing testkit-binary failures (unrelated).

📦 Workspace inventory

The ao-cli workspace shrinks from 18 → 17 members in v0.5 (workflow-runner-v2 deleted, animus-runtime-shared added):

agent-runner, animus-plugin-protocol, animus-plugin-runtime, animus-runtime-shared, oai-runner, orchestrator-cli, orchestrator-config, orchestrator-core, orchestrator-daemon-runtime, orchestrator-git-ops, orchestrator-logging, orchestrator-notifications, orchestrator-plugin-host, orchestrator-providers, orchestrator-session-host, orchestrator-store, protocol.


🚧 v0.6 roadmap (deferred from v0.5)

  • Real DurableStoreClient wiring against the DBOS plugin RPC (v0.5 shipped the trait + MockDurableStore).
  • Daemon-side per-agent decisions.jsonl auto-discovery on reattach (v0.5 shipped the explicit-path primitive).
  • Out-of-boundary tool side-effect re-assertion on replay.
  • Long-term decision-log compaction (zstd compression + 7-day expiry of completed logs).
  • Queue protocol — Assigned head-of-line blocking under FIFO + low headroom.
  • config_context::RuntimeConfigContext::load sparse-override gap.
  • runtime_contract::current_ao_command sibling-binary lookup for standalone plugin installs.
  • Re-architect approve_manual_phase_continues_non_terminal_workflow against the plugin path.
  • Subject SubjectDispatchExt cleanup.
  • workflow/events/poll real-time streaming (protocol spec defer...
Read more

v0.4.20

Choose a tag to compare

@github-actions github-actions released this 31 May 15:02

Full Changelog: v0.4.19...v0.4.20

v0.4.19

Choose a tag to compare

@github-actions github-actions released this 29 May 19:18

Full Changelog: v0.4.18...v0.4.19

v0.4.18

Choose a tag to compare

@github-actions github-actions released this 29 May 18:40

Full Changelog: v0.4.17...v0.4.18

v0.4.17

Choose a tag to compare

@github-actions github-actions released this 29 May 01:05

Full Changelog: v0.4.16...v0.4.17

v0.4.16

Choose a tag to compare

@github-actions github-actions released this 28 May 20:11

Full Changelog: v0.4.15...v0.4.16

v0.4.15

Choose a tag to compare

@github-actions github-actions released this 28 May 16:53

Full Changelog: v0.4.14...v0.4.15