Releases: launchapp-dev/animus-cli
Release list
v0.5.4 — delete agent-runner sidecar; auto-update + opt-in metrics
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-runnersidecar 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_helperssupervisor, lockfile, and shared-secret auth are gone. The publishedanimus-agent-runner-protocolcrate is marked deprecated.animus runner restart-statsremoved. No more sidecar to restart.DaemonHealthschema: newprovider_plugins_healthy: boolfield; legacyrunner_connected/runner_pidkept for wire back-compat (alwaysfalse/None).animus agent controlreturnsunavailable(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_fileon 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 YAML —
mcp_servers:entries can declaretransport: 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
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-agentv0.1.3 indefault-install.json+plugin_registry::DEFAULT_OAI_AGENT_PLUGINS(constant already existed). - New
resolve_oai_runner_binary()helper inorchestrator-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.jsoncleared the hardcoded"executable": "animus-oai-runner"so the resolver kicks in.- Stripped
animus-oai-runnerfrom.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-providers → orchestrator-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.rs→crates/orchestrator-core/src/subject_adapter/adapter.rsgit.rs→crates/orchestrator-core/src/subject_adapter/git.rsbuiltin.rs→crates/orchestrator-core/src/subject_adapter/builtin.rslib.rs→crates/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-store → orchestrator-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-host → orchestrator-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-threadtokio feature) absorbed into plugin-host's deps.- Re-exports inside
session/mod.rspreserve the old top-level surface; consumers useorchestrator_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.mdclaimed "13 crates" and still listedorchestrator-session-hostas a current crate. Fixed: "12 crates" + removed the stale row; consolidated the description into theorchestrator-plugin-hostrow.
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 installis single-binary; the OAI agent plugin ships two binaries (animus-provider-oai-agent+animus-oai-runner). v0.6 should add multi-binary install support ORanimus-oai-runnershould be published as its own repo. - Subject adapter trait rename.
subject_adapter::TaskServiceApi/services::TaskServiceApicollide inorchestrator-corepost-fold. Theas Provider...aliases work today; a clean rename would close the disambiguation surface. - Standalone
launchapp-dev/animus-runtime-sharedrepo needs Cargo.toml updated when this ships: drop theorchestrator-storegit dep —fsync_renamenow lives underorchestrator_core::store::fsync_rename. orchestrator-notificationsextraction (1.5k LOC) — could be anotifierplugin (the symmetric inverse of triggers). Not done in v0.5.3.agent-runnerextraction to a runner plugin (10.5k LOC) — biggest single-crate move; would mirror theworkflow-runner-v2→animus-workflow-runner-defaultswap 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 --autonomousv0.5.1 — surface-shrink release
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. ReplacedMockDurableStorewithDbosDurableStoreClient— the production-facing impl that discovers thedurable_storeplugin viaorchestrator_plugin_host::discover_by_kind, runs the standard initialize handshake withproject_binding, and maps the fence trait todurable/begin_workflow_run/durable/begin_step/durable/commit_step/durable/abandon_step/durable/query_run.MockDurableStorerelegated 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 typedSideEffectAssertion::{FileExists, FileAbsent, Unknown}(#[serde(other)]onUnknownso v0.6 can add variants). Replay never re-executes side-effecting tools; instead,drive_replayasserts the recorded post-condition. Mismatches raiseReplayDivergenceError, surfaced to the operator asAgentRunEvent::Error. Preserves determinism while catching divergence. - Long-term decision-log compaction. New
sweepermodule: archives older than 24h getzstd-compressed to.jsonl.bak.zst; archives older than 7 days (configurable viaANIMUS_DECISION_LOG_EXPIRY_DAYS) get deleted.ReplaySource::opentransparently decompresses. Wired into the daemon'sstartup_cleanupblock — no new background task.
Reattach completeness — Unix + Windows on one abstraction (BETA, items 2+7)
decisions.jsonlauto-discovery on reattach.AgentSpawnRecordgainsdecisions_jsonl_path: Option<String>andlast_consumed_offset: u64(both#[serde(default)]for backward compatibility). Newreplay_gap_from_spawn_record(record, ...)auto-derives the path. The daemon pre-allocatesagent_session_idvia the newANIMUS_AGENT_RUN_IDenv var; older runners that ignore it still work — gap-replay degrades toOk(None).- Cross-platform reattach via
interprocess. Collapsed the cfg(unix)-only daemon socket code AND the runner's Unix-onlyset_write_timeouthack into ONE cross-platform implementation. Unix uses domain sockets; Windows uses named pipes; both round-trip throughlocal_socket_name_forwhich auto-detects via a path-separator predicate.try_reattachsignature changed from&Pathto&str.ReattachConnectionno longercfg(unix)-gated. - Bounded runner broadcast. Per-reader writer thread fed by a
mpsc::sync_channel(256). A wedged reader tripstry_send → Full → dropinstantly, never blocking the runner's emit path. Cross-platform replacement for the Unix-onlyset_write_timeouthack.
Queue protocol — head-of-line preemption (GAMMA, item 3)
animus-queue-protocolv0.3.0:QueueLeaseRequestgainsexclude_subjects: Option<Vec<SubjectId>>(backward-compatible defaultNone). The queue plugin skips entries whose subject is excluded; they stay inPendingfor a later lease.animus-queue-defaultv0.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 asexclude_subjectsat lease time. Deleted therelease_pending-as-HoL-workaround code path (~40 LOC removed).call_queue_release_pendingretained inplugin_clients.rsfor two real use cases: (1) within-batch duplicate subjects in one lease batch (differentworkflow_refs), (2) genuine "leased but cannot handle" scenarios.
Cleanups + setsid (DELTA, items 5+8)
config_contextsparse-override gap closed. Newbuiltin_runtime_config()OnceLockhelper; fallback wired intophase_capabilities,phase_output_contract,phase_decision_contract,phase_output_json_schema. Cross-contamination guards prevent customoutput_contractfrom inheriting builtinoutput_json_schemaand vice versa. The Phase B codex P2 deferral is closed.current_ao_commandsibling-binary lookup removed. Dropped the sibling discovery fromruntime_contract; the canonical surface is thememory_mcp_stdio_commandinit-extension (round-1 fold-in).ProcessManager::spawn_workflow_runnerexportsANIMUS_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_spawnhelper inprocess_manager.rs(one function, ~10 LOC, one-line WHY comment). Replacesprocess_group(0)with the strongersetsid()— runner survives terminal hangups too, not just SIGTERM to the daemon pgid.libcdep 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. Whenqueue/leasereturns multiple Pending entries for the same subject (differentworkflow_refs) in one batch, the duplicates shouldrelease_pending, notcompletion(CANCELLED). Fixed: within-batch duplicates now release back to Pending; old-plugin fallback tocompletion(CANCELLED)only whenrelease_pendingreturns method-not-found.dbos_client.rs: lock-inversion betweenshutdownandensure_workflow_run. Fixed: both functions now takehostBEFOREinit(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:
MockDurableStoremoved out of production API into#[cfg(test)]. - BETA:
cfg(unix)-only socket code ANDset_write_timeouthack collapsed into oneinterprocess-backed impl. - BETA:
build_recorddeleted (canonical constructor isbuild_record_with_decisions). - BETA:
try_reattachsignature&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_commandsibling-binary discovery DELETED.
Out-of-tree releases
animus-protocol→v0.5.3(commit6b114186) —animus-queue-protocol0.2.0 → 0.3.0 withexclude_subjects.animus-queue-default→v0.3.0(commit5f12e7db) — implementsexclude_subjectsfilter.
📊 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-protocol0.2.0 → 0.3.0 — new optional field onQueueLeaseRequest. 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-defaultv0.2.0 → v0.3.0 — install withanimus plugin install launchapp-dev/animus-queue-default@v0.3.0or rerunanimus plugin install-defaults. The daemon'sdefault-install.jsonpin is bumped automatically.AgentSpawnRecordgains 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_commandsibling-binary fallback removed. Standalone plugin deployments that relied on a siblinganimusbinary now must use thememory_mcp_stdio_commandinit-extension or theANIMUS_HOST_CLI_PATHenv var (which the daemon sets automatically).
🚧 v0.6 roadmap (small carry-forwards)
- Live-socket
last_consumed_offsetwrite-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...
v0.5.0 — kernel + flavors
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:
workflow_runner— runs workflow phases (animus-workflow-runner-default is the reference)queue— durable subject dispatch queue (animus-queue-default)durable_store— Postgres-backed step fence (animus-step-durable-dbos)memory_store— semantic memory with graph scopes (animus-memory-zep)
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-protocolwithworkflow/execute,workflow/run_phase(now carriesmcp_config),workflow/eventssubscription,paused/pendingwire vocabulary. - New
animus-queue-protocolwith atomicqueue/lease+queue/release_pending(entry_id, reason)(Assigned → Pending transition that returns work to the queue without canceling it). - New
animus-durable-store-protocolwithstep/begin+step/complete+step/abort+ diagnostics; PRIOR_ERROR is terminal for idempotency_key across plugin restarts. - New
animus-memory-store-protocolwith semanticmemory/put/memory/get/memory/searchover graph-scoped storage. - Extended
animus-plugin-protocolwithinit_extensions.project_binding+memory_mcp_stdio_commandso 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;MethodContextwithkeep_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_SESSIONenv 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 -pmatches 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_configinworkflow/run_phase; emitspaused/pendingwire vocabulary.
Subject backends
- All subject operations route through
SubjectRouterto installedsubject_backendplugins. The in-treeInTreeTaskSubjectBackend/InTreeRequirementsSubjectBackendadapters and their kill-switch env vars (ANIMUS_DAEMON_DISABLE_BUILTIN_TASK_ADAPTER, etc.) are gone. Installlaunchapp-dev/animus-subject-default(kind=task) andanimus-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 discoveryANIMUS_PROVIDER_DISABLE_PLUGINremoved — there is no in-tree provider fallback anymore
🧹 Cleanup
Workflow runtime deduplicated
- New crate
launchapp-dev/animus-runtime-sharedv0.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 toanimus_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-protocolmirror crate deleted; CI protocol-drift gate retired.
Kind-based plugin discovery
orchestrator_plugin_host::discover_by_kind(project_root, kind)filters installed plugins by manifestplugin_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_positionsort prevents stale-row shadowing. - Schema sync:
_animus_durable_store_schematable records expected version; on-startup validation; forward canonicalization migration.durable/diagnosticsJSON-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/leasepath adopted by the daemon.queue/release_pending(entry_id, reason)returns Assigned → Pending without canceling work.
Memory (animus-memory-zep)
- Exhaustive
memory/getviagraph.episode.getByGraphId(no longer bounded-page search-based; misses under heavy-episode scopes are fixed). - Metadata-round-trip
scopeFromGraphIdwith 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
DurableStoreClientwiring against the DBOS plugin RPC (v0.5 shipped the trait +MockDurableStore). - Daemon-side per-agent
decisions.jsonlauto-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::loadsparse-override gap.runtime_contract::current_ao_commandsibling-binary lookup for standalone plugin installs.- Re-architect
approve_manual_phase_continues_non_terminal_workflowagainst the plugin path. - Subject
SubjectDispatchExtcleanup. workflow/events/pollreal-time streaming (protocol spec defer...