Release Protocol v0.7.0-rc.12 - #5
Conversation
Additive, back-compat protocol fields for owner-scoped schedule dispatch: - WorkflowSchedule gains optional owner_id + claims. When owner_id is set the daemon scheduler mints a system Actor for that user_id and runs the scheduled workflow as the owner (config-authored trust boundary). - SubjectDispatch gains optional actor (+ with_actor builder) so the daemon relays the minted identity to the workflow runner. Both fields are serde-optional and omitted from the wire when empty, so older peers continue to deserialize unchanged.
…) + workflow_journal kind v0.7 plugin-composition: a single plugin can advertise/serve multiple kinds via plugin_kinds (on PluginManifest + PluginInfo) with a serves_kind() helper; plugin_kind stays the primary/legacy kind (empty plugin_kinds = single-kind, back-compat). Also adds PLUGIN_KIND_WORKFLOW_JOURNAL + PluginKind::WorkflowJournal to close the drift with ao-cli's in-tree copy (which had the const; this repo is now the single source ao-cli git-deps). Schema re-emitted.
…0.7)
- animus-plugin-protocol: add PLUGIN_KIND_ENVIRONMENT + PluginKind::Environment
(additive, mirrors workflow_journal); bump to 0.1.17
- new crate animus-environment-protocol: environment/{prepare,exec,exec_stream,
teardown} method consts, PrepareRequest/Response, EnvironmentSpec, RepoRef,
EnvironmentHandle, HarnessCommand, ExecRequest/Response, ExecNotification
(server-streaming, mirrors provider AgentNotification), TeardownRequest/Response
- animus-config-protocol: add Workspace/WorkspaceRepo, EnvironmentRouting/Rule/
Match config types + workflow/phase environment+workspace fields + WorkflowConfig
workspaces/environment_routing; wired through YAML parse/serialize; bump to 0.1.1
- regenerate schemas (plugin-protocol, new environment-protocol, config-protocol)
- unbreak animus-plugin-runtime + plugin-protocol test: add plugin_kinds field to
PluginManifest/PluginInfo constructors (pre-existing multi-kind commit breakage)
…onfig) Distinguishes config acquired from an installed config_source plugin (e.g. animus-config-postgres) from real on-disk YAML. Additive variant; serializes as "plugin". Lets the kernel stop mislabeling plugin-sourced config as source=yaml. See TASK-177. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…l need) (#2) A workflow run may now carry NO subject. SubjectDispatch, WorkflowRunInput, and OrchestratorWorkflow hold Option<SubjectRef>: absent in Rust (None), omitted from the wire (skip_serializing_if). Older payloads always carried a subject, so deserialize stays backward-tolerant (present -> Some). - SubjectDispatch: subject becomes Option; add subjectless() constructor and subject() accessor; subject_id / subject_kind / subject_key now return Option; task_id / requirement_id / schedule_id delegate through the Option. - WorkflowRunInput: subject becomes Option; add subjectless() constructor; subject / subject_id / subject_kind return Option. to_workflow_run_input maps a None dispatch subject to a subjectless run input. - OrchestratorWorkflow: subject becomes Option; drop the default_workflow_subject_ref empty-task sentinel default. - Regenerate queue + workflow-runner JSON schemas (subject drops out of the SubjectDispatch required set). Regen also catches up prior actor-field drift in those two crates. This lets ao-cli represent a genuinely subjectless run instead of the custom-kind adhoc:<nanos> sentinel.
…keys (#3) Add an optional verdict_key field to PhaseDecision so an agent or command phase can emit a custom verdict string (e.g. needs-research) that is not one of the built-in advance/rework/skip/fail values. The raw key is carried verbatim so the workflow executor can route it through the phase on_verdict map to an arbitrary target phase. Additive and backward compatible (serde default, skipped when None); built-in verdicts leave it None. Supports TASK-207 (extensible decision keys + conditional routing).
… field (#4) Add PluginManifest.supports_mcp: Option<bool> so a plugin DECLARES whether it consumes host-injected MCP servers, instead of the kernel hardcoding per-tool MCP behavior in a name table (REQUIREMENT-039 / TASK-277). - animus-plugin-protocol 0.1.18: new optional field, serde default + skip_serializing_if so absent = undeclared (back-compat). PROTOCOL_VERSION 1.1.0 -> 1.2.0 (backward-compatible minor). Round-trip tests + regenerated JSON schema + spec.md 8.2. - animus-plugin-runtime 0.2.2: Plugin::supports_mcp(bool) builder for Rust authors. provider_main emits None (auto-map from ProviderCapabilities.mcp deferred: it defaults false and would regress providers on the default). Proof-of-pattern field for the wider REQUIREMENT-039 cleanup (launch template, permission-mode flag, reasoning-effort, default model). Fleet must repin to the new protocol tag once cut.
…tion (REQ-052)
The remote-animus session method: the parent dispatches a SUBJECT to the
environment's own in-container animus instead of relaying a raw provider CLI.
- METHOD_ENVIRONMENT_EXEC_SESSION ('environment/exec_session') + ExecSessionRequest
{handle, subject_id, workflow_ref?, dispatch_input?} + ExecSessionResponse
{workflow_id?, status}.
- NOTIFICATION_ENVIRONMENT_JOURNAL ('environment/journal') + a Journal variant on
ExecNotification carrying a forwarded journal event (event_kind, phase_id?,
status?, ts, payload, terminal), with method()/payload() arms.
- export_schema: register the two new request/response types; schemas regenerated
(ExecSessionRequest/Response.json + ExecNotification.json Journal variant).
Canonical wire source for the codegen chain (plugin-sdk-ts types generate from
these schemas). build + tests + clippy clean.
REQUIREMENT-052 / TASK-457.
…-id) When the delegating parent sets workflow_id, the node MUST execute INTO that already-bootstrapped run (resume-existing) rather than mint its own, so exactly one journal row exists per dispatch and the node's transcript lands on the id the portal reads. Optional + serde default/skip: old plugins ignore it and old runners send None (legacy: node mints its own id) — mixed-version safe.
Add METHOD_ENVIRONMENT_LIST/GET/TEARDOWN_NODE/REAP + EnvironmentNode descriptor + ListNodes/GetNode/TeardownNode/Reap Request/Response structs, register them in the schema exporter, regenerate JSON schemas. Mirrors the animus-environment-base TS surface so the kernel EnvironmentClient + 'animus environment' CLI speak the same shapes. TASK-807.
…-id line The one-id session line (rc.8/rc.9) diverged from the workflow-list-total line (which rc.7 tracks) and lacked WorkflowListRequest.workflow_ref + WorkflowListResponse.total that ao-cli consumes. Merge those fields onto this line so a single tag (rc.11) is a superset both the daemon (needs total) and the runner (needs exec_session) can pin — lets ao-cli import the canonical env node- management types from animus-environment-protocol instead of local mirrors. Additive (Option + serde default); wire-compatible. TASK-807.
# Conflicts: # animus-plugin-protocol/Cargo.toml
There was a problem hiding this comment.
VERDICT: CHANGES REQUESTED
.github/workflows/ci.yml:46— the required formatting gate runscargo fmt --all -- --check, and the PR'scargo fmtcheck on head765f8eb1fd419d3bc4c105c3e2d1f5b0f60d68d2completed withfailure. REQUIRED CHANGE: runcargo fmt --allon this branch and commit every resulting Rust source change so the workspace matches rustfmt; do not weaken or remove the formatting gate. Verify withcargo fmt --all -- --check; it must exit 0, and the GitHubcargo fmtcheck must report success on the new head SHA.
What is good: the release PR clearly documents its intended protocol additions and validation commands, keeps the application contracts in a dedicated crate, commits generated cross-language schemas, and preserves the existing workspace-wide check/test/clippy/fmt CI structure.
There was a problem hiding this comment.
VERDICT: APPROVE
No blocking findings. The release rollup is internally coherent: it adds the application-facing and actor-aware wire contracts, commits the corresponding generated schemas and scalar limits, updates workspace/package metadata, and preserves the compatibility story documented in the changelog. The changes are broad but match the release PR’s stated coordinated scope rather than appearing to be an off-base recreation.
Validation is green on head bc4d0d6a793d3459a9f7c7b98b6ac165aed8bb48: cargo check, cargo test, cargo clippy, and cargo fmt all completed successfully. The generated-contract coverage and explicit compatibility documentation are particularly good.
What changed
Why
CLI rc.30, Portal, and Arena require one immutable Protocol source with identical application contracts and no workstation paths or split protocol revisions.
Validation
cargo check --workspace --all-targetscargo test --workspacecargo clippy --workspace --all-targets -- -D warnings