Skip to content

Commit acbbb25

Browse files
authored
chore(protocol): v0.6.28 — reconcile PluginKind drift (green protocol-drift CI) (#295)
* fix(protocol): reconcile two-way PluginKind drift (TASK-120 / BU-0) In-tree animus-plugin-protocol now mirrors the standalone enum exactly: adds the 5 missing v0.5 PluginKind variants (WorkflowRunner, Queue, DurableStore, MemoryStore, AgentRunner) + their PLUGIN_KIND_* consts + as_str/From<String> arms, copied verbatim from the standalone crate. With the standalone gaining WorkflowJournal (animus-protocol v0.1.27), the two PluginKind enums + const sets are now identical. - protocol-drift.yml: bump STANDALONE_TAG v0.1.13 -> v0.1.27 - protocol_drift.rs: trim expected_in_tree_only to the 3 standalone-ahead items (InitializeParams.init_extensions, InitializeResult.kind_capabilities, KindCapability) now that all former in-tree-only entries are reconciled - PROTOCOL_VERSION held at 1.0.0 (in-tree lacks the 1.1 kind-capability surface); documented + TODO'd for the future in-tree protocol sync * chore(release): v0.6.28 — reconcile PluginKind protocol drift (in-tree += 5 role kinds, STANDALONE_TAG v0.1.27, allowlist 24->3)
1 parent cae870e commit acbbb25

5 files changed

Lines changed: 96 additions & 58 deletions

File tree

.github/workflows/protocol-drift.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ jobs:
4747
# when a new standalone release ships; the in-tree crate is expected
4848
# to match the surface at this tag (modulo entries the test's
4949
# `expected_in_tree_only` allowlist documents as pending-release).
50-
STANDALONE_TAG: v0.1.13
50+
STANDALONE_TAG: v0.1.27
5151

5252
steps:
5353
- name: Checkout ao-cli (in-tree protocol)

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/animus-plugin-protocol/src/lib.rs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ use serde_json::Value;
3939
/// declares its own in [`InitializeParams::protocol_version`]. A plugin and
4040
/// host with the same major version are compatible. See `spec.md` for the
4141
/// full versioning policy.
42+
///
43+
/// Intentionally held at `1.0.0` even though the standalone crate advertises
44+
/// `1.1.0`: the minor bump there signals the additive kind-capability surface
45+
/// (`InitializeParams.init_extensions` / `InitializeResult.kind_capabilities` /
46+
/// `KindCapability`) that this in-tree crate does NOT yet implement (see the
47+
/// standalone-ahead entries in `tests/protocol_drift.rs`). Compatibility is
48+
/// major-version based and those fields are optional (serde-default), so a
49+
/// `1.0.0` in-tree host stays compatible. TODO: bump to `1.1.0` in the same
50+
/// in-tree protocol sync that absorbs the 1.1 surface.
4251
pub const PROTOCOL_VERSION: &str = "1.0.0";
4352

4453
/// Plugin kind for LLM provider plugins (Claude, Codex, Gemini, OpenAI-compat,
@@ -116,6 +125,45 @@ pub const PLUGIN_KIND_CONVERSATION_STORE: &str = "conversation_store";
116125
/// the `animus-journal-protocol` crate for the `journal/*` method family.
117126
pub const PLUGIN_KIND_WORKFLOW_JOURNAL: &str = "workflow_journal";
118127

128+
/// Plugin kind for workflow runner plugins (v0.5).
129+
///
130+
/// Workflow runners execute Animus workflow YAML by orchestrating phases,
131+
/// evaluating decision contracts, handling rework loops, and applying
132+
/// post-success actions. See `animus-workflow-runner-protocol` for the
133+
/// typed RPC surface (`workflow/execute`, `workflow/run_phase`).
134+
pub const PLUGIN_KIND_WORKFLOW_RUNNER: &str = "workflow_runner";
135+
136+
/// Plugin kind for queue backend plugins (v0.5).
137+
///
138+
/// Queue plugins own a per-project priority FIFO of `SubjectDispatch`
139+
/// envelopes awaiting scheduling. See `animus-queue-protocol` for the typed
140+
/// RPC surface (`queue/enqueue`, `queue/lease`, `queue/list`, etc.).
141+
pub const PLUGIN_KIND_QUEUE: &str = "queue";
142+
143+
/// Plugin kind for durable execution / step checkpointing plugins (v0.5).
144+
///
145+
/// Durable stores provide reservation-fenced step persistence so the daemon
146+
/// can recover from crashes without re-executing already-committed side
147+
/// effects. See `animus-durable-store-protocol` for the typed RPC surface
148+
/// (`durable/begin_step`, `durable/commit_step`, `durable/recover_in_flight`,
149+
/// etc.).
150+
pub const PLUGIN_KIND_DURABLE_STORE: &str = "durable_store";
151+
152+
/// Plugin kind for agent memory store plugins (v0.5).
153+
///
154+
/// Memory stores provide persistent semantic memory across runs / agents /
155+
/// tasks. See `animus-memory-store-protocol` for the typed RPC surface
156+
/// (`memory/put`, `memory/get`, `memory/query`, etc.).
157+
pub const PLUGIN_KIND_MEMORY_STORE: &str = "memory_store";
158+
159+
/// Plugin kind for the legacy agent-runner sidecar.
160+
///
161+
/// The agent-runner sidecar (and its `animus-agent-runner-protocol` crate)
162+
/// was removed in v0.5.3 — provider plugins now spawn and supervise the
163+
/// coding-agent CLIs end to end. This wire constant is retained only so an
164+
/// older `agent_runner`-kind manifest still parses to a known kind.
165+
pub const PLUGIN_KIND_AGENT_RUNNER: &str = "agent_runner";
166+
119167
/// Method name for the log-storage `log/entry` notification.
120168
///
121169
/// Emitted by any supervised plugin to forward a structured log entry to
@@ -179,6 +227,17 @@ pub enum PluginKind {
179227
WorkflowJournal,
180228
/// Generic custom plugin. See [`PLUGIN_KIND_CUSTOM`].
181229
Custom,
230+
/// Workflow runner plugin (v0.5). See [`PLUGIN_KIND_WORKFLOW_RUNNER`].
231+
WorkflowRunner,
232+
/// Queue backend plugin (v0.5). See [`PLUGIN_KIND_QUEUE`].
233+
Queue,
234+
/// Durable execution / step checkpointing plugin (v0.5).
235+
/// See [`PLUGIN_KIND_DURABLE_STORE`].
236+
DurableStore,
237+
/// Agent memory store plugin (v0.5). See [`PLUGIN_KIND_MEMORY_STORE`].
238+
MemoryStore,
239+
/// Agent-runner sidecar plugin (v0.5). See [`PLUGIN_KIND_AGENT_RUNNER`].
240+
AgentRunner,
182241
/// Any kind not understood by this crate version. Preserves the wire
183242
/// string so unknown roles round-trip and so hosts that recognize the
184243
/// role can still dispatch on the string.
@@ -199,6 +258,11 @@ impl PluginKind {
199258
PluginKind::ConversationStore => PLUGIN_KIND_CONVERSATION_STORE,
200259
PluginKind::WorkflowJournal => PLUGIN_KIND_WORKFLOW_JOURNAL,
201260
PluginKind::Custom => PLUGIN_KIND_CUSTOM,
261+
PluginKind::WorkflowRunner => PLUGIN_KIND_WORKFLOW_RUNNER,
262+
PluginKind::Queue => PLUGIN_KIND_QUEUE,
263+
PluginKind::DurableStore => PLUGIN_KIND_DURABLE_STORE,
264+
PluginKind::MemoryStore => PLUGIN_KIND_MEMORY_STORE,
265+
PluginKind::AgentRunner => PLUGIN_KIND_AGENT_RUNNER,
202266
PluginKind::Other(value) => value.as_str(),
203267
}
204268
}
@@ -232,6 +296,11 @@ impl From<String> for PluginKind {
232296
PLUGIN_KIND_CONVERSATION_STORE => PluginKind::ConversationStore,
233297
PLUGIN_KIND_WORKFLOW_JOURNAL => PluginKind::WorkflowJournal,
234298
PLUGIN_KIND_CUSTOM => PluginKind::Custom,
299+
PLUGIN_KIND_WORKFLOW_RUNNER => PluginKind::WorkflowRunner,
300+
PLUGIN_KIND_QUEUE => PluginKind::Queue,
301+
PLUGIN_KIND_DURABLE_STORE => PluginKind::DurableStore,
302+
PLUGIN_KIND_MEMORY_STORE => PluginKind::MemoryStore,
303+
PLUGIN_KIND_AGENT_RUNNER => PluginKind::AgentRunner,
235304
_ => PluginKind::Other(value),
236305
}
237306
}

crates/orchestrator-cli/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "orchestrator-cli"
3-
version = "0.6.27"
3+
version = "0.6.28"
44
edition = "2021"
55
license = "Elastic-2.0"
66
default-run = "animus"

crates/orchestrator-plugin-host/tests/protocol_drift.rs

Lines changed: 24 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -323,63 +323,32 @@ fn protocol_public_surface_does_not_drift_against_standalone() {
323323
let mut findings: Vec<DriftFinding> = Vec::new();
324324
diff_surfaces(&in_tree, &standalone, "", &mut findings);
325325

326-
// Filter out drift we *expect* between the in-tree and standalone crates
327-
// because the in-tree crate is a strict superset for a few well-known
328-
// additions that have not yet shipped as a standalone release. Each
329-
// entry MUST be paired with a tracking note so it isn't quietly carried
326+
// Filter out drift we *expect* between the in-tree and standalone crates.
327+
// Each entry MUST be paired with a tracking note so it isn't quietly carried
330328
// forever.
329+
//
330+
// As of TASK-120 / BU-0 (STANDALONE_TAG bumped to v0.1.27) the two
331+
// `PluginKind` enums and every other previously in-tree-only addition
332+
// (env-scrub, trigger surface, log-storage, conversation_store, the typed
333+
// enum mirrors, the v0.5 PluginKind variants) have been reconciled — the
334+
// standalone tag now contains them, so all the old in-tree-only entries are
335+
// dropped. The only remaining divergence is in the OTHER direction:
336+
// standalone v0.1.27 is AHEAD of the in-tree crate on a small set of
337+
// additions the kernel has not yet absorbed. They are wire-additive
338+
// (new optional fields + a new struct) so an in-tree host that ignores them
339+
// stays compatible; they are tracked here until a future in-tree protocol
340+
// sync pulls them in.
331341
let expected_in_tree_only: &[&str] = &[
332-
// Added in the in-tree crate post v0.1.1 to cover env-scrub + trigger
333-
// protocol surface. Slated for inclusion in the next standalone tag.
334-
"EnvRequirement",
335-
"TriggerWatchParams",
336-
"TriggerEvent",
337-
"TriggerAckParams",
338-
"PLUGIN_KIND_TASK_BACKEND",
339-
"TRIGGER_METHOD_WATCH",
340-
"TRIGGER_METHOD_EVENT",
341-
"TRIGGER_METHOD_ACK",
342-
// Added in the in-tree crate for the v0.4.0 log-storage plugin cut
343-
// (commit #1 of the three-commit sequence). Slated for inclusion in
344-
// the next standalone tag.
345-
"PLUGIN_KIND_LOG_STORAGE_BACKEND",
346-
"LOG_STORAGE_METHOD_ENTRY",
347-
"LOG_STORAGE_METHOD_TAIL",
348-
// Manifest.env_required + PluginCapabilities.projections — additions
349-
// covered by the next standalone release.
350-
"PluginManifest.env_required",
351-
"PluginManifest.notification_buffer_size",
352-
"PluginCapabilities.projections",
353-
// r-protocol/r1-type-audit (2026-05): typed enum mirrors for previously
354-
// stringly-typed fields. The wire shape is unchanged — these enums use
355-
// serde `from = "String", into = "String"` so older plugins / hosts
356-
// round-trip identically. Slated for inclusion in the next standalone
357-
// tag together with the matching `kind()` accessor on `PluginManifest`
358-
// / `PluginInfo` and the typed `TriggerEvent.action_hint` +
359-
// `TriggerAckParams.status` fields.
360-
"PluginKind",
361-
"TriggerActionHint",
362-
"TriggerAckStatus",
363-
// p3housekeeping/j2-pluginkind-variants (2026-05): typed
364-
// PluginKind variants for the two first-party plugin roles the
365-
// host already dispatches by raw string — `transport_backend`
366-
// (consumed by `ops_web.rs`) and `web_ui` (legacy
367-
// `partition_transport_plugins` path). The wire shape is
368-
// unchanged. TODO: drop these allowlist entries once the
369-
// standalone `launchapp-dev/animus-protocol` repo is bumped to
370-
// include both variants.
371-
"PluginKind.TransportBackend",
372-
"PluginKind.WebUi",
373-
"PLUGIN_KIND_TRANSPORT_BACKEND",
374-
"PLUGIN_KIND_WEB_UI",
375-
// v0.6.4 conversation_store plugin role (per-user + shared chat history).
376-
// The in-tree crate added the role + wire contract; it is ALREADY
377-
// published in the standalone repo at tag v0.1.20, but STANDALONE_TAG
378-
// here is still pinned to v0.1.13. Drop these two entries once
379-
// STANDALONE_TAG advances to >= v0.1.20 (the PluginKind.ConversationStore
380-
// variant is already covered by the blanket "PluginKind" entry above).
381-
"PLUGIN_KIND_CONVERSATION_STORE",
382-
"conversation_store",
342+
// Standalone-ahead (v0.1.27): kind-capability negotiation on the
343+
// handshake — `InitializeParams.init_extensions` (opaque host→plugin
344+
// extension map), `InitializeResult.kind_capabilities` (per-kind
345+
// capability declarations), and the `KindCapability` struct they
346+
// reference. Not yet mirrored in the in-tree crate. TODO: absorb into
347+
// `crates/animus-plugin-protocol` in a follow-up in-tree protocol sync,
348+
// then drop these entries.
349+
"InitializeParams.init_extensions",
350+
"InitializeResult.kind_capabilities",
351+
"KindCapability",
383352
];
384353

385354
let unexpected_findings: Vec<&DriftFinding> =

0 commit comments

Comments
 (0)