From 2aeaa88fba71162206b5f08f5bda4f0150247e4f Mon Sep 17 00:00:00 2001 From: Ompragash Date: Tue, 28 Jul 2026 11:08:41 +0530 Subject: [PATCH] release agentctl 0.3.0 with workflow API v1 --- Cargo.lock | 16 +- Cargo.toml | 2 +- Containerfile | 2 +- README.md | 2 +- SECURITY.md | 4 +- crates/agentctl-cli/Cargo.toml | 12 +- crates/agentctl-cli/src/main.rs | 8 +- crates/agentctl-cli/src/packs.rs | 26 +-- crates/agentctl-core/src/compiler.rs | 68 +++---- crates/agentctl-core/src/dsl.rs | 18 +- crates/agentctl-core/src/pack.rs | 4 +- crates/agentctl-observability/Cargo.toml | 2 +- crates/agentctl-protocols/Cargo.toml | 6 +- crates/agentctl-protocols/src/lib.rs | 4 +- crates/agentctl-providers/Cargo.toml | 2 +- crates/agentctl-runtime/Cargo.toml | 6 +- crates/agentctl-runtime/src/lib.rs | 172 +++++++++--------- crates/agentctl-runtime/src/process.rs | 2 +- crates/agentctl-store/Cargo.toml | 2 +- crates/agentctl-store/src/lib.rs | 6 +- docs/COMPATIBILITY.md | 15 +- docs/CONTAINER.md | 16 +- docs/DSL.md | 6 +- docs/LIMITATIONS.md | 7 +- docs/PRODUCT.md | 15 +- docs/RELEASE_PROCESS.md | 9 +- docs/architecture/DIAGRAMS.md | 3 +- docs/execution/STATUS.md | 2 +- docs/generated/CLI.md | 4 +- docs/guides/CI_CD.md | 2 +- docs/guides/INSTALLATION.md | 5 +- docs/guides/SECRET_REFERENCES.md | 2 +- docs/guides/TROUBLESHOOTING.md | 3 +- docs/guides/WORKFLOW_AUTHORING.md | 2 +- docs/reference/YAML.md | 2 +- docs/research/selective-repair.md | 2 +- examples/README.md | 6 +- examples/acceptance/mock-tool/workflow.yaml | 2 +- examples/dataflow/README.md | 4 +- examples/docs/ci-quality-gate/workflow.yaml | 2 +- examples/docs/provider-portability/fake.yaml | 2 +- .../docs/provider-portability/openai.yaml | 2 +- examples/docs/release-readiness/workflow.yaml | 2 +- examples/docs/scheduled-review/workflow.yaml | 2 +- .../durable-pipeline-repaired.yaml | 2 +- .../durable-pipeline.yaml | 2 +- .../live-composite.yaml | 2 +- .../operational-workflow.yaml | 2 +- examples/openai-live/workflow.yaml | 2 +- examples/prompt-cache/README.md | 2 +- .../repaired.workflow.yaml | 2 +- .../source.workflow.yaml | 2 +- examples/v1/a2a.yaml | 2 +- examples/v1/agentctl.pack.lock | 10 +- examples/v1/anthropic-live.yaml | 2 +- examples/v1/approval.yaml | 2 +- examples/v1/capability-failure.yaml | 2 +- examples/v1/check-diff.yaml | 2 +- examples/v1/compensation.yaml | 2 +- examples/v1/condition.yaml | 2 +- examples/v1/crash-resume.yaml | 2 +- examples/v1/dataflow.yaml | 2 +- examples/v1/dependency.pack | 2 +- examples/v1/example.pack.yaml | 2 +- examples/v1/fake-provider.yaml | 2 +- examples/v1/google-live.yaml | 2 +- examples/v1/hello.yaml | 2 +- examples/v1/long-term-memory.yaml | 2 +- examples/v1/loop.yaml | 2 +- examples/v1/matrix.yaml | 2 +- examples/v1/mcp.yaml | 2 +- examples/v1/openai-live.yaml | 2 +- examples/v1/parallel.yaml | 2 +- examples/v1/policy-denial.yaml | 2 +- examples/v1/process-isolation.yaml | 2 +- examples/v1/resource-budget.yaml | 2 +- examples/v1/reusable-pack.yaml | 2 +- examples/v1/router.yaml | 2 +- examples/v1/secret-reference.yaml | 2 +- examples/v1/streaming.yaml | 2 +- examples/v1/structured-handoff.yaml | 2 +- examples/v1/subworkflow.yaml | 2 +- examples/v1/working-memory.yaml | 2 +- fuzz/Cargo.lock | 10 +- fuzz/Cargo.toml | 6 +- workflow.yaml | 2 +- xtask/src/acceptance.rs | 62 +++---- 87 files changed, 345 insertions(+), 302 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c3c216f..bc67da3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -46,7 +46,7 @@ dependencies = [ [[package]] name = "agentctl-cli" -version = "0.2.0" +version = "0.3.0" dependencies = [ "agentctl-core", "agentctl-observability", @@ -76,7 +76,7 @@ dependencies = [ [[package]] name = "agentctl-core" -version = "0.2.0" +version = "0.3.0" dependencies = [ "async-trait", "chrono", @@ -100,7 +100,7 @@ dependencies = [ [[package]] name = "agentctl-observability" -version = "0.2.0" +version = "0.3.0" dependencies = [ "agentctl-core", "chrono", @@ -111,7 +111,7 @@ dependencies = [ [[package]] name = "agentctl-protocols" -version = "0.2.0" +version = "0.3.0" dependencies = [ "agentctl-core", "agentctl-runtime", @@ -135,7 +135,7 @@ dependencies = [ [[package]] name = "agentctl-providers" -version = "0.2.0" +version = "0.3.0" dependencies = [ "agentctl-core", "async-trait", @@ -152,7 +152,7 @@ dependencies = [ [[package]] name = "agentctl-runtime" -version = "0.2.0" +version = "0.3.0" dependencies = [ "agentctl-core", "agentctl-observability", @@ -177,7 +177,7 @@ dependencies = [ [[package]] name = "agentctl-store" -version = "0.2.0" +version = "0.3.0" dependencies = [ "aes-gcm", "agentctl-core", @@ -3676,7 +3676,7 @@ dependencies = [ [[package]] name = "xtask" -version = "0.2.0" +version = "0.3.0" dependencies = [ "anyhow", "base64", diff --git a/Cargo.toml b/Cargo.toml index 7a517af..42bd950 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ resolver = "2" exclude = ["fuzz"] [workspace.package] -version = "0.2.0" +version = "0.3.0" edition = "2024" rust-version = "1.88" license = "Apache-2.0" diff --git a/Containerfile b/Containerfile index 10c63bd..261cce6 100644 --- a/Containerfile +++ b/Containerfile @@ -18,7 +18,7 @@ RUN --mount=type=secret,id=agentctl_ca,required=false \ cargo build --release --locked -p agentctl-cli FROM gcr.io/distroless/cc-debian12:nonroot -ARG AGENTCTL_VERSION=0.2.0 +ARG AGENTCTL_VERSION=0.3.0 LABEL org.opencontainers.image.title="agentctl" \ org.opencontainers.image.description="Deterministic control plane for policy-constrained agentic automation" \ org.opencontainers.image.version="${AGENTCTL_VERSION}" \ diff --git a/README.md b/README.md index fc4edc1..9bd746f 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ For a tool-using credential-free journey, copy `examples/acceptance/mock-tool` t ## Workflow ```yaml -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: hello diff --git a/SECURITY.md b/SECURITY.md index 9824701..9febea9 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,7 +2,9 @@ ## Supported line -The current supported development line is the `agentctl.dev/v1alpha1` release-candidate source on the default branch. There is no stable v1 release or long-term support promise yet. +The current supported release line is agentctl `0.3` with workflow API +`agentctl.dev/v1`. The workflow API is stable; the CLI and crates remain +pre-1.0 and do not carry a long-term support promise. ## Report a vulnerability privately diff --git a/crates/agentctl-cli/Cargo.toml b/crates/agentctl-cli/Cargo.toml index e6e7ba9..f29d6e5 100644 --- a/crates/agentctl-cli/Cargo.toml +++ b/crates/agentctl-cli/Cargo.toml @@ -16,12 +16,12 @@ name = "agentctl" path = "src/main.rs" [dependencies] -agentctl-core = { version = "0.2.0", path = "../agentctl-core" } -agentctl-observability = { version = "0.2.0", path = "../agentctl-observability" } -agentctl-protocols = { version = "0.2.0", path = "../agentctl-protocols" } -agentctl-providers = { version = "0.2.0", path = "../agentctl-providers" } -agentctl-runtime = { version = "0.2.0", path = "../agentctl-runtime" } -agentctl-store = { version = "0.2.0", path = "../agentctl-store" } +agentctl-core = { version = "0.3.0", path = "../agentctl-core" } +agentctl-observability = { version = "0.3.0", path = "../agentctl-observability" } +agentctl-protocols = { version = "0.3.0", path = "../agentctl-protocols" } +agentctl-providers = { version = "0.3.0", path = "../agentctl-providers" } +agentctl-runtime = { version = "0.3.0", path = "../agentctl-runtime" } +agentctl-store = { version = "0.3.0", path = "../agentctl-store" } anyhow.workspace = true clap.workspace = true clap_complete.workspace = true diff --git a/crates/agentctl-cli/src/main.rs b/crates/agentctl-cli/src/main.rs index 1d937ad..3936d8d 100644 --- a/crates/agentctl-cli/src/main.rs +++ b/crates/agentctl-cli/src/main.rs @@ -131,7 +131,7 @@ enum Command { Auth(AuthArgs), /// Print or write the generated workflow JSON Schema. Schema(SchemaArgs), - /// Translate an unversioned TypeScript-era workflow into v1alpha1. + /// Translate an unversioned TypeScript-era workflow into workflow API v1. Migrate(MigrateArgs), /// Inspect and verify a local reusable pack. Packs(PackArgs), @@ -3578,7 +3578,7 @@ mod tests { .expect("secret file"); let reachable = parse_workflow( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: reachable-secret } spec: @@ -3639,7 +3639,7 @@ spec: let unused = parse_workflow( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: unused-secret } spec: @@ -3669,7 +3669,7 @@ spec: .expect("embedding secret"); let memory_only = parse_workflow( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: memory-secret } spec: diff --git a/crates/agentctl-cli/src/packs.rs b/crates/agentctl-cli/src/packs.rs index 0e63d5e..f3c85b9 100644 --- a/crates/agentctl-cli/src/packs.rs +++ b/crates/agentctl-cli/src/packs.rs @@ -895,7 +895,7 @@ mod tests { let path = directory.join("workflow.yaml"); let source = format!( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: {{ name: pack-test }} spec: @@ -925,7 +925,7 @@ spec: apiVersion: agentctl.dev/pack/v1alpha1 name: example.dependency version: 1.2.0 -agentctl: ">=0.2.0, <1.0.0" +agentctl: ">=0.3.0, <1.0.0" actions: assign: { kind: builtin.assign } "#, @@ -936,7 +936,7 @@ actions: apiVersion: agentctl.dev/pack/v1alpha1 name: example.root version: 2.0.0 -agentctl: ">=0.2.0, <1.0.0" +agentctl: ">=0.3.0, <1.0.0" dependencies: example.dependency: version: "^1.0" @@ -983,7 +983,7 @@ actions: apiVersion: agentctl.dev/pack/v1alpha1 name: example.a version: 1.0.0 -agentctl: ">=0.2.0, <1.0.0" +agentctl: ">=0.3.0, <1.0.0" dependencies: example.b: version: "1" @@ -998,7 +998,7 @@ actions: apiVersion: agentctl.dev/pack/v1alpha1 name: example.b version: 1.0.0 -agentctl: ">=0.2.0, <1.0.0" +agentctl: ">=0.3.0, <1.0.0" dependencies: example.a: version: "1" @@ -1019,7 +1019,7 @@ dependencies: apiVersion: agentctl.dev/pack/v1alpha1 name: example.b version: 1.0.0 -agentctl: ">=0.2.0, <1.0.0" +agentctl: ">=0.3.0, <1.0.0" dependencies: example.shared: version: "1" @@ -1028,11 +1028,11 @@ dependencies: ); write( &directory.path().join("shared-one.pack.yaml"), - "apiVersion: agentctl.dev/pack/v1alpha1\nname: example.shared\nversion: 1.0.0\nagentctl: \">=0.2.0, <1.0.0\"\n", + "apiVersion: agentctl.dev/pack/v1alpha1\nname: example.shared\nversion: 1.0.0\nagentctl: \">=0.3.0, <1.0.0\"\n", ); write( &directory.path().join("shared-two.pack.yaml"), - "apiVersion: agentctl.dev/pack/v1alpha1\nname: example.shared\nversion: 2.0.0\nagentctl: \">=0.2.0, <1.0.0\"\n", + "apiVersion: agentctl.dev/pack/v1alpha1\nname: example.shared\nversion: 2.0.0\nagentctl: \">=0.3.0, <1.0.0\"\n", ); write( &directory.path().join("c.pack.yaml"), @@ -1040,7 +1040,7 @@ dependencies: apiVersion: agentctl.dev/pack/v1alpha1 name: example.c version: 1.0.0 -agentctl: ">=0.2.0, <1.0.0" +agentctl: ">=0.3.0, <1.0.0" dependencies: example.shared: version: "2" @@ -1066,7 +1066,7 @@ dependencies: apiVersion: agentctl.dev/pack/v1alpha1 name: example.root version: 1.0.0 -agentctl: ">=0.2.0, <1.0.0" +agentctl: ">=0.3.0, <1.0.0" actions: assign: { kind: builtin.assign } "#, @@ -1114,7 +1114,7 @@ actions: apiVersion: agentctl.dev/pack/v1alpha1 name: example.root version: 1.0.0 -agentctl: ">=0.2.0, <1.0.0" +agentctl: ">=0.3.0, <1.0.0" actions: assign: kind: builtin.shell.exec @@ -1144,7 +1144,7 @@ actions: git_status(["init", "-q"], &repository).expect("git init"); write( &repository.join("agentctl.pack.yaml"), - "apiVersion: agentctl.dev/pack/v1alpha1\nname: example.root\nversion: 1.0.0\nagentctl: \">=0.2.0, <1.0.0\"\nactions:\n assign: { kind: builtin.assign }\n", + "apiVersion: agentctl.dev/pack/v1alpha1\nname: example.root\nversion: 1.0.0\nagentctl: \">=0.3.0, <1.0.0\"\nactions:\n assign: { kind: builtin.assign }\n", ); git_status(["add", "agentctl.pack.yaml"], &repository).expect("git add"); let status = Command::new("git") @@ -1263,7 +1263,7 @@ actions: .expect("gzip") } - let manifest = b"apiVersion: agentctl.dev/pack/v1alpha1\nname: example.root\nversion: 1.0.0\nagentctl: \">=0.2.0, <1.0.0\"\nactions:\n assign: { kind: builtin.assign }\n"; + let manifest = b"apiVersion: agentctl.dev/pack/v1alpha1\nname: example.root\nversion: 1.0.0\nagentctl: \">=0.3.0, <1.0.0\"\nactions:\n assign: { kind: builtin.assign }\n"; let archive = archive_with_manifest(manifest); let integrity = digest_bytes(&archive); let listener = TcpListener::bind("127.0.0.1:0").expect("listener"); diff --git a/crates/agentctl-core/src/compiler.rs b/crates/agentctl-core/src/compiler.rs index fd824e4..e8d979f 100644 --- a/crates/agentctl-core/src/compiler.rs +++ b/crates/agentctl-core/src/compiler.rs @@ -2893,7 +2893,7 @@ mod tests { fn stable_order_uses_declaration_order_for_ready_tasks() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: ordering } spec: @@ -2912,7 +2912,7 @@ spec: #[test] fn resource_budget_plan_counts_expansion_and_loop_bounds() { let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: budget-plan } spec: @@ -2952,7 +2952,7 @@ spec: fn versioned_custom_pricing_enables_cost_limits() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: priced } spec: @@ -2988,7 +2988,7 @@ spec: let digest = "0".repeat(64); let workflow = parse(&format!( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: {{ name: isolation-plan }} spec: @@ -3032,7 +3032,7 @@ spec: fn foreach_and_matrix_expand_to_stable_children_and_aggregates() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: expansion } spec: @@ -3103,7 +3103,7 @@ spec: fn expansion_bounds_and_binding_collisions_are_rejected() { let too_many = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: expansion-bound } spec: @@ -3124,7 +3124,7 @@ spec: let collision = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: expansion-collision } spec: @@ -3149,7 +3149,7 @@ spec: fn bounded_loop_expands_to_stable_sequential_iteration_tasks() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: bounded-loop } spec: @@ -3217,7 +3217,7 @@ spec: for (loop_definition, expected) in invalid { let source = format!( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: {{ name: invalid-loop }} spec: @@ -3241,7 +3241,7 @@ spec: let collision = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: invalid-loop-collision } spec: @@ -3265,7 +3265,7 @@ spec: let existing_when = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: invalid-loop-when } spec: @@ -3288,7 +3288,7 @@ spec: let binding_collision = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: invalid-loop-binding } spec: @@ -3313,7 +3313,7 @@ spec: fn subworkflow_compiles_to_typed_namespaced_boundaries() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: subworkflow } spec: @@ -3396,7 +3396,7 @@ spec: fn subworkflow_rejects_cycles_and_invalid_versions() { let cycle = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: subworkflow-cycle } spec: @@ -3423,7 +3423,7 @@ spec: let invalid = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: invalid-version } spec: @@ -3445,7 +3445,7 @@ spec: let output_override = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: output-override } spec: @@ -3473,7 +3473,7 @@ spec: fn subworkflow_working_memory_is_namespaced_per_invocation() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: isolated-subworkflows } spec: @@ -3505,7 +3505,7 @@ spec: fn compensation_is_explicit_effectful_and_part_of_the_plan() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: compensation } spec: @@ -3540,7 +3540,7 @@ spec: let invalid = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: invalid-compensation } spec: @@ -3567,7 +3567,7 @@ spec: let expanded = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: expanded-compensation } spec: @@ -3598,7 +3598,7 @@ spec: fn typed_router_cases_compile_to_explicit_destination_guards() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: typed-router } spec: @@ -3640,7 +3640,7 @@ spec: fn router_rejects_ambiguous_cases_and_implicit_dependencies() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: invalid-router } spec: @@ -3681,7 +3681,7 @@ spec: fn parallel_memory_writes_are_inferred_and_conflicts_are_rejected() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: parallel-conflict } spec: @@ -3706,7 +3706,7 @@ spec: fn ordered_or_disjoint_parallel_memory_writes_compile() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: parallel-memory } spec: @@ -3728,7 +3728,7 @@ spec: #[test] fn templated_memory_key_requires_declared_write_set() { let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: dynamic-memory-key } spec: @@ -3760,7 +3760,7 @@ spec: fn additive_parallel_plan_fields_preserve_old_sequential_plans() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: old-plan } spec: @@ -3788,7 +3788,7 @@ spec: fn rejects_cycle() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: cycle } spec: @@ -3807,7 +3807,7 @@ spec: fn accepts_stateless_openai_continuation_for_tool_using_agents() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: stateless-tools } spec: @@ -3852,7 +3852,7 @@ spec: fn rejects_hidden_team_orchestration_with_migration_guidance() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: hidden-team } spec: @@ -3872,7 +3872,7 @@ spec: fn streaming_is_explicit_and_provider_capability_checked() { let fake = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: streaming } spec: @@ -3908,7 +3908,7 @@ spec: fn rejects_invalid_task_and_agent_output_contracts() { let workflow = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: invalid-output-contracts } spec: @@ -3944,7 +3944,7 @@ spec: fn semantic_memory_bounds_and_promotion_writes_are_compiled() { let valid = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: memory } spec: @@ -3980,7 +3980,7 @@ spec: let openai_without_model = parse( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: memory } spec: @@ -4018,7 +4018,7 @@ spec: }) .collect::(); let source = format!( - "apiVersion: agentctl.dev/v1alpha1\nkind: Workflow\nmetadata: {{ name: property }}\nspec:\n actions:\n assign: {{ kind: builtin.assign }}\n tasks:{tasks}\n" + "apiVersion: agentctl.dev/v1\nkind: Workflow\nmetadata: {{ name: property }}\nspec:\n actions:\n assign: {{ kind: builtin.assign }}\n tasks:{tasks}\n" ); let workflow = parse(&source); let first = compile(&workflow, "property.yaml").expect("compile"); diff --git a/crates/agentctl-core/src/dsl.rs b/crates/agentctl-core/src/dsl.rs index b3d17c7..b8fcfc0 100644 --- a/crates/agentctl-core/src/dsl.rs +++ b/crates/agentctl-core/src/dsl.rs @@ -8,7 +8,7 @@ use serde_json::Value; use crate::diagnostic::{Diagnostic, DiagnosticCode, Severity}; use crate::pack::{PackSignature, PackSource}; -pub const API_VERSION: &str = "agentctl.dev/v1alpha1"; +pub const API_VERSION: &str = "agentctl.dev/v1"; pub type JsonMap = BTreeMap; @@ -2015,7 +2015,7 @@ mod tests { use super::*; const MINIMAL: &str = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: hello @@ -2037,6 +2037,18 @@ spec: assert!(!outcome.migrated_legacy); } + #[test] + fn rejects_retired_v1alpha1_workflow() { + let source = MINIMAL.replace("agentctl.dev/v1", "agentctl.dev/v1alpha1"); + let diagnostics = parse_workflow(&source, "old.yaml").expect_err("retired API"); + assert_eq!(diagnostics[0].code, DiagnosticCode::UnsupportedVersion); + assert_eq!(diagnostics[0].path.as_deref(), Some("apiVersion")); + assert_eq!( + diagnostics[0].help.as_deref(), + Some("use `agentctl.dev/v1`") + ); + } + #[test] fn rejects_unknown_fields_with_location_and_path() { let source = MINIMAL.replace(" name: hello", " name: hello\n surprise: true"); @@ -2278,7 +2290,7 @@ spec: for max_iterations in [0, MAX_LOOP_ITERATIONS + 1] { let source = format!( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: {{ name: invalid-loop-bound }} spec: diff --git a/crates/agentctl-core/src/pack.rs b/crates/agentctl-core/src/pack.rs index e621815..b623f3c 100644 --- a/crates/agentctl-core/src/pack.rs +++ b/crates/agentctl-core/src/pack.rs @@ -506,7 +506,7 @@ mod tests { #[test] fn validates_manifest_identity_and_compatibility() { let manifest: PackManifest = serde_yaml_ng::from_str( - "apiVersion: agentctl.dev/pack/v1alpha1\nname: example.utility\nversion: 1.0.0\nagentctl: '>=0.2.0, <1.0.0'\n", + "apiVersion: agentctl.dev/pack/v1alpha1\nname: example.utility\nversion: 1.0.0\nagentctl: '>=0.3.0, <1.0.0'\n", ) .expect("manifest"); manifest.validate().expect("valid manifest"); @@ -519,7 +519,7 @@ mod tests { #[test] fn rejects_unreasonable_pack_process_output_limit() { let manifest: PackManifest = serde_yaml_ng::from_str( - "apiVersion: agentctl.dev/pack/v1alpha1\nname: example.utility\nversion: 1.0.0\nagentctl: '>=0.2.0, <1.0.0'\nactions:\n noisy:\n kind: builtin.shell.exec\n command: sh\n stdoutLimitBytes: 16777217\n", + "apiVersion: agentctl.dev/pack/v1alpha1\nname: example.utility\nversion: 1.0.0\nagentctl: '>=0.3.0, <1.0.0'\nactions:\n noisy:\n kind: builtin.shell.exec\n command: sh\n stdoutLimitBytes: 16777217\n", ) .expect("manifest"); assert!(matches!(manifest.validate(), Err(PackError::Invalid(_)))); diff --git a/crates/agentctl-observability/Cargo.toml b/crates/agentctl-observability/Cargo.toml index f1c78e8..b1f27d6 100644 --- a/crates/agentctl-observability/Cargo.toml +++ b/crates/agentctl-observability/Cargo.toml @@ -10,7 +10,7 @@ repository.workspace = true readme.workspace = true [dependencies] -agentctl-core = { version = "0.2.0", path = "../agentctl-core" } +agentctl-core = { version = "0.3.0", path = "../agentctl-core" } chrono.workspace = true opentelemetry.workspace = true serde.workspace = true diff --git a/crates/agentctl-protocols/Cargo.toml b/crates/agentctl-protocols/Cargo.toml index 216856b..dfe3156 100644 --- a/crates/agentctl-protocols/Cargo.toml +++ b/crates/agentctl-protocols/Cargo.toml @@ -10,8 +10,8 @@ repository.workspace = true readme.workspace = true [dependencies] -agentctl-core = { version = "0.2.0", path = "../agentctl-core" } -agentctl-runtime = { version = "0.2.0", path = "../agentctl-runtime" } +agentctl-core = { version = "0.3.0", path = "../agentctl-core" } +agentctl-runtime = { version = "0.3.0", path = "../agentctl-runtime" } async-trait.workspace = true base64.workspace = true chrono.workspace = true @@ -27,7 +27,7 @@ tokio-util.workspace = true url.workspace = true [dev-dependencies] -agentctl-store = { version = "0.2.0", path = "../agentctl-store" } +agentctl-store = { version = "0.3.0", path = "../agentctl-store" } tempfile.workspace = true wiremock.workspace = true diff --git a/crates/agentctl-protocols/src/lib.rs b/crates/agentctl-protocols/src/lib.rs index 4a6b154..d6f4696 100644 --- a/crates/agentctl-protocols/src/lib.rs +++ b/crates/agentctl-protocols/src/lib.rs @@ -2765,7 +2765,7 @@ mod tests { ProtocolActionHandler::new(BTreeMap::new(), BTreeMap::from([("local".into(), client)])); let workflow = agentctl_core::dsl::parse_workflow( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: protocol-continuation } spec: @@ -2919,7 +2919,7 @@ spec: ProtocolActionHandler::new(BTreeMap::new(), BTreeMap::from([("local".into(), client)])); let workflow = agentctl_core::dsl::parse_workflow( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: ambiguous-a2a } spec: diff --git a/crates/agentctl-providers/Cargo.toml b/crates/agentctl-providers/Cargo.toml index 129fbde..6092178 100644 --- a/crates/agentctl-providers/Cargo.toml +++ b/crates/agentctl-providers/Cargo.toml @@ -10,7 +10,7 @@ repository.workspace = true readme.workspace = true [dependencies] -agentctl-core = { version = "0.2.0", path = "../agentctl-core" } +agentctl-core = { version = "0.3.0", path = "../agentctl-core" } async-trait.workspace = true futures-util.workspace = true reqwest.workspace = true diff --git a/crates/agentctl-runtime/Cargo.toml b/crates/agentctl-runtime/Cargo.toml index b07a738..aed6de8 100644 --- a/crates/agentctl-runtime/Cargo.toml +++ b/crates/agentctl-runtime/Cargo.toml @@ -10,9 +10,9 @@ repository.workspace = true readme.workspace = true [dependencies] -agentctl-core = { version = "0.2.0", path = "../agentctl-core" } -agentctl-observability = { version = "0.2.0", path = "../agentctl-observability" } -agentctl-store = { version = "0.2.0", path = "../agentctl-store" } +agentctl-core = { version = "0.3.0", path = "../agentctl-core" } +agentctl-observability = { version = "0.3.0", path = "../agentctl-observability" } +agentctl-store = { version = "0.3.0", path = "../agentctl-store" } async-trait.workspace = true chrono.workspace = true futures-util.workspace = true diff --git a/crates/agentctl-runtime/src/lib.rs b/crates/agentctl-runtime/src/lib.rs index c3bae67..a6b2df1 100644 --- a/crates/agentctl-runtime/src/lib.rs +++ b/crates/agentctl-runtime/src/lib.rs @@ -10401,7 +10401,7 @@ mod tests { .with_registry(RuntimeRegistry::default().with_provider("fake", provider.clone())); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: request-budget } spec: @@ -10458,7 +10458,7 @@ spec: ); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: token-budget } spec: @@ -10506,7 +10506,7 @@ spec: fn custom_pricing_reconciles_token_classes_and_prefers_provider_cost() { let (workflow, _) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: custom-pricing } spec: @@ -10557,7 +10557,7 @@ spec: let (unpriced_workflow, _) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: unpriced } spec: @@ -10594,7 +10594,7 @@ spec: ); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: tool-budget } spec: @@ -10660,7 +10660,7 @@ spec: let runtime = runtime(store.clone(), directory.path()); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: process-budget } spec: @@ -10719,7 +10719,7 @@ spec: let runtime = runtime(store.clone(), directory.path()); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: artifact-budget } spec: @@ -10779,7 +10779,7 @@ spec: .with_registry(RuntimeRegistry::default().with_provider("fake", provider.clone())); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: wall-budget } spec: @@ -10847,7 +10847,7 @@ spec: .with_ids(Arc::new(SequenceIds::default())); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: resumed-wall-budget } spec: @@ -10917,7 +10917,7 @@ spec: .with_registry(RuntimeRegistry::default().with_provider("fake", provider.clone())); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: parallel-overlap } spec: @@ -10970,7 +10970,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: parallel-memory } spec: @@ -11021,7 +11021,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: parallel-write-declaration } spec: @@ -11068,7 +11068,7 @@ spec: .with_registry(RuntimeRegistry::default().with_provider("fake", provider.clone())); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: parallel-cancellation } spec: @@ -11127,7 +11127,7 @@ spec: ); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: parallel-failure } spec: @@ -11183,7 +11183,7 @@ spec: ); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: parallel-continue } spec: @@ -11226,7 +11226,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: parallel-approvals } spec: @@ -11294,7 +11294,7 @@ spec: .with_registry(RuntimeRegistry::default().with_provider("fake", provider.clone())); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: parallel-retry } spec: @@ -11359,7 +11359,7 @@ spec: .with_registry(RuntimeRegistry::default().with_external_actions(handler.clone())); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: continued-a2a } spec: @@ -11473,7 +11473,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let runtime = runtime(store.clone(), directory.path()); let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: parallel-repair } spec: @@ -11542,7 +11542,7 @@ spec: fn repair_fingerprints_include_tool_definitions_and_resolved_task_variables() { let directory = tempdir().expect("tempdir"); let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: fingerprint-repair } spec: @@ -11623,7 +11623,7 @@ spec: uncertain: bool, ) -> EffectRequest { let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: reconciled-resume } spec: @@ -11887,7 +11887,7 @@ spec: let directory = tempdir().expect("tempdir"); let store = SqliteStore::open_memory().expect("store"); let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: reconciliation-policy } spec: @@ -12028,7 +12028,7 @@ spec: .with_ids(Arc::new(SequenceIds::default())) .with_registry(RuntimeRegistry::default().with_provider("fake", provider.clone())); let source_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: selective-repair } spec: @@ -12268,7 +12268,7 @@ spec: .with_tool("echo", tool.clone()), ); let source_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: repair-tool-reuse } spec: @@ -12382,7 +12382,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let runtime = runtime(store.clone(), directory.path()); let source_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: branch-repair } spec: @@ -12540,7 +12540,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let runtime = runtime(store.clone(), directory.path()); let source_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: effect-repair } spec: @@ -12660,7 +12660,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let runtime = runtime(store.clone(), directory.path()); let source_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: reused-effect-repair } spec: @@ -12751,7 +12751,7 @@ spec: .with_ids(Arc::new(SequenceIds::default())) .with_registry(RuntimeRegistry::default().with_provider("fake", provider)); let source_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: prompt-repair } spec: @@ -12817,7 +12817,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let runtime = runtime(store.clone(), directory.path()); let source_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: memory-repair } spec: @@ -12889,7 +12889,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let runtime = runtime(store.clone(), directory.path()); let source_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: artifact-repair } spec: @@ -13024,7 +13024,7 @@ spec: let store = SqliteStore::open(&database).expect("store"); let runtime = runtime(store.clone(), directory.path()); let source_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: legacy-upgrade } spec: @@ -13134,7 +13134,7 @@ spec: let store = SqliteStore::open(&database).expect("store"); let runtime = runtime(store, directory.path()); let source_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: legacy-missing-proof } spec: @@ -13193,7 +13193,7 @@ spec: .with_ids(Arc::new(SequenceIds::default())) .with_registry(RuntimeRegistry::default().with_provider("fake", provider.clone())); let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: terminal-retry } spec: @@ -13318,7 +13318,7 @@ spec: RuntimeRegistry::default().with_provider("fake", Arc::new(PromptEchoProvider)), ); let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: retry-plan-diagnostics } spec: @@ -13382,7 +13382,7 @@ spec: .with_registry(RuntimeRegistry::default().with_provider("fake", provider.clone())); let (workflow, compiled) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: foreach-retry } spec: @@ -13524,7 +13524,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let runtime = runtime(store.clone(), directory.path()); let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: retry-planning } spec: @@ -13653,7 +13653,7 @@ spec: let store = SqliteStore::open(&database).expect("store"); let runtime = runtime(store, directory.path()); let source_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: corrupt-output-repair } spec: @@ -13749,7 +13749,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let runtime = runtime(store.clone(), directory.path()); let source_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: graph-repair } spec: @@ -13764,7 +13764,7 @@ spec: - { id: combine, uses: "action:assign", needs: [left, right], with: { value: combined } } "#; let target_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: graph-repair } spec: @@ -13847,7 +13847,7 @@ spec: })); let successful_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: restart-successful } spec: @@ -13899,7 +13899,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let runtime = runtime(store.clone(), directory.path()); let source_yaml = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: effect-safety } spec: @@ -14002,7 +14002,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: dataflow } spec: @@ -14046,7 +14046,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let runtime = runtime(store.clone(), directory.path()); let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: typed-routing } spec: @@ -14206,7 +14206,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let runtime = runtime(store.clone(), directory.path()); let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: bounded-loop } spec: @@ -14372,7 +14372,7 @@ spec: let runtime = runtime(store.clone(), directory.path()); let (zero_workflow, zero_plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: zero-loop } spec: @@ -14409,7 +14409,7 @@ spec: let (one_workflow, one_plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: one-loop } spec: @@ -14446,7 +14446,7 @@ spec: let (bound_workflow, bound_plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: exhausted-loop } spec: @@ -14503,7 +14503,7 @@ spec: .with_registry(RuntimeRegistry::default().with_provider("fake", provider.clone())); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: loop-effect-cancellation } spec: @@ -14567,7 +14567,7 @@ spec: let runtime = runtime(store.clone(), directory.path()); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: subworkflow-runtime } spec: @@ -14724,7 +14724,7 @@ spec: let runtime = runtime(store.clone(), directory.path()); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: subworkflow-artifact } spec: @@ -14778,7 +14778,7 @@ spec: let (failed_workflow, failed_plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: subworkflow-failure } spec: @@ -14818,7 +14818,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: output-contract } spec: @@ -14868,7 +14868,7 @@ spec: RuntimeRegistry::default().with_provider("fake", Arc::new(PromptEchoProvider)); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: task-vars } spec: @@ -14930,7 +14930,7 @@ spec: .expect("oversized fixture"); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: bounded-read } spec: @@ -14970,7 +14970,7 @@ spec: let directory = tempdir().expect("tempdir"); std::fs::create_dir(directory.path().join("out")).expect("out dir"); let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: write } spec: @@ -15059,7 +15059,7 @@ spec: std::fs::create_dir(directory.path().join("out")).expect("out dir"); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: ci-safety } spec: @@ -15095,7 +15095,7 @@ spec: .with_trace_sink(traces.clone()); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: provider } spec: @@ -15154,7 +15154,7 @@ spec: .with_stream_event_sink(observer.clone()); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: bounded-stream } spec: @@ -15229,7 +15229,7 @@ spec: .with_registry(RuntimeRegistry::default().with_provider("fake", provider.clone())); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: interrupted-stream } spec: @@ -15275,7 +15275,7 @@ spec: .with_registry(RuntimeRegistry::default().with_provider("fake", provider.clone())); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: cancelled-stream } spec: @@ -15328,7 +15328,7 @@ spec: async fn recorded_replay_never_calls_provider_or_tool_executor() { let directory = tempdir().expect("tempdir"); let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: replay-tools } spec: @@ -15443,7 +15443,7 @@ spec: async fn stateless_tool_continuation_survives_pause_resume_and_recorded_replay() { let directory = tempdir().expect("tempdir"); let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: stateless-resume } spec: @@ -15560,7 +15560,7 @@ spec: let runtime = runtime(store.clone(), directory.path()); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: paused-replay } spec: @@ -15593,7 +15593,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: cancel } spec: @@ -15626,7 +15626,7 @@ spec: let store = SqliteStore::open_memory().expect("store"); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: retry-cancel } spec: @@ -15672,7 +15672,7 @@ spec: async fn agent_tool_loop_validates_tool_output_before_model_continuation() { let directory = tempdir().expect("tempdir"); let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: tools } spec: @@ -15748,7 +15748,7 @@ spec: let directory = tempdir().expect("tempdir"); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: denied-tool } spec: @@ -15801,7 +15801,7 @@ spec: async fn tool_timeout_and_cancellation_are_bounded_and_durable() { let directory = tempdir().expect("tempdir"); let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: tool-bounds } spec: @@ -15930,7 +15930,7 @@ spec: let directory = tempdir().expect("tempdir"); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: process-timeout } spec: @@ -15984,7 +15984,7 @@ spec: .expect("AGENTCTL_TEST_CONTAINER_RUNTIME"); let (workflow, plan) = compile_fixture(&format!( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: {{ name: container-isolation-live }} spec: @@ -16038,7 +16038,7 @@ spec: let secret = std::env::var("PATH").expect("PATH"); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: process-output-limit } spec: @@ -16111,7 +16111,7 @@ spec: .expect("secret file"); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: process-secret-redaction } spec: @@ -16220,7 +16220,7 @@ esac .expect("extension permissions"); let source = format!( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: {{ name: process-extension }} spec: @@ -16322,7 +16322,7 @@ fi .expect("extension permissions"); let source = format!( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: {{ name: bad-process-extension }} spec: @@ -16404,7 +16404,7 @@ esac let source_for = |behavior: &str, timeout: u64| { format!( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: {{ name: bounded-{behavior} }} spec: @@ -16492,7 +16492,7 @@ spec: let directory = tempdir().expect("tempdir"); let mut workflow = parse_workflow( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: packed-process-output-limit } spec: @@ -16512,7 +16512,7 @@ spec: "apiVersion": "agentctl.dev/pack/v1alpha1", "name": "example.utility", "version": "1.0.0", - "agentctl": ">=0.2.0, <1.0.0", + "agentctl": ">=0.3.0, <1.0.0", "actions": { "noisy": { "kind": "builtin.shell.exec", @@ -16561,7 +16561,7 @@ spec: let marker = directory.path().join("started"); let source = format!( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: {{ name: process-cancellation }} spec: @@ -16624,7 +16624,7 @@ spec: let runtime = runtime(store.clone(), directory.path()); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: compensation } spec: @@ -16786,7 +16786,7 @@ spec: let runtime = runtime(store.clone(), directory.path()); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: partial-compensation } spec: @@ -16893,7 +16893,7 @@ spec: let runtime = runtime(store.clone(), directory.path()); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: uncertain-compensation } spec: @@ -17012,7 +17012,7 @@ spec: let runtime = runtime(store.clone(), directory.path()); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: cancelled-compensation } spec: @@ -17082,7 +17082,7 @@ spec: let runtime = runtime(store.clone(), directory.path()); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: automatic-compensation } spec: @@ -17138,7 +17138,7 @@ spec: let runtime = runtime(store.clone(), directory.path()); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: compensation-approval } spec: @@ -17235,7 +17235,7 @@ spec: let runtime = runtime(store.clone(), directory.path()); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: reconciled-compensation } spec: @@ -17339,7 +17339,7 @@ spec: .with_ids(Arc::new(SequenceIds::default())); let (workflow, plan) = compile_fixture( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: semantic-memory } spec: diff --git a/crates/agentctl-runtime/src/process.rs b/crates/agentctl-runtime/src/process.rs index 0a9f317..0778880 100644 --- a/crates/agentctl-runtime/src/process.rs +++ b/crates/agentctl-runtime/src/process.rs @@ -696,7 +696,7 @@ mod tests { fn container_action() -> ActionDefinition { let source = format!( r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: {{ name: container-command }} spec: diff --git a/crates/agentctl-store/Cargo.toml b/crates/agentctl-store/Cargo.toml index 6c92b2b..72ec719 100644 --- a/crates/agentctl-store/Cargo.toml +++ b/crates/agentctl-store/Cargo.toml @@ -11,7 +11,7 @@ readme.workspace = true [dependencies] aes-gcm.workspace = true -agentctl-core = { version = "0.2.0", path = "../agentctl-core" } +agentctl-core = { version = "0.3.0", path = "../agentctl-core" } base64.workspace = true chrono.workspace = true fs2.workspace = true diff --git a/crates/agentctl-store/src/lib.rs b/crates/agentctl-store/src/lib.rs index cd9b68b..02792f9 100644 --- a/crates/agentctl-store/src/lib.rs +++ b/crates/agentctl-store/src/lib.rs @@ -6544,7 +6544,7 @@ mod tests { fn fixture() -> (Value, CompiledPlan) { let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: store } spec: @@ -6610,7 +6610,7 @@ spec: #[test] fn budget_reservations_are_atomic_idempotent_and_reconcile_actual_usage() { let source = r#" -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: budget-store } spec: @@ -7974,7 +7974,7 @@ spec: (run_id, runtime_state_version, workflow_digest, workflow_schema_version, plan_digest, plan_format_version, workflow_json, plan_json, inputs_json, working_memory_json, state, mode, cancellation_requested, created_at, updated_at) - VALUES ('retained', 1, 'workflow', 'agentctl.dev/v1alpha1', 'plan', 1, + VALUES ('retained', 1, 'workflow', 'agentctl.dev/v1', 'plan', 1, '{}', '{}', '{}', '{}', 'running', 'execute', 0, ?1, ?1)", [&now], ) diff --git a/docs/COMPATIBILITY.md b/docs/COMPATIBILITY.md index c0f30d8..5481ce7 100644 --- a/docs/COMPATIBILITY.md +++ b/docs/COMPATIBILITY.md @@ -6,6 +6,12 @@ Declaration-order scheduling among ready tasks, `needs` dataflow, exact typed te ## Migrated +Agentctl 0.3 promotes the workflow document identifier from +`agentctl.dev/v1alpha1` to `agentctl.dev/v1` without changing the document +shape. Update the `apiVersion` line before upgrading; the retired identifier is +rejected with an explicit diagnostic. The separate pack-manifest identifier +remains `agentctl.dev/pack/v1alpha1`. + Unversioned `playbook:` YAML can be translated by `agentctl migrate`; `modules` become `actions`, `module:x` becomes `action:x`, heuristic agents map to the fake provider, and core memory/policy fields are normalized. Rust JSON output is a stable `agentctl.dev/cli/v1` envelope rather than the prototype JSONL/YAML mixture. The additive JSONL mode uses the same versioned envelopes for bounded progress and a final result. The production executable and runtime are Rust. ## Intentionally changed @@ -46,10 +52,11 @@ guess security-sensitive intent. ## Separate product decisions A public pack registry, in-process plugin ABI, and general A2A resubmission are -not compatibility promises for v1alpha1. Pack lock v1, the bounded process -protocol v1, and source/trust policy are additive. MCP reconnect is bounded by -explicit idempotency and schema stability. A2A continuation observes only a -persisted task ID. Bounded loops, namespaced sub-workflows, explicit +not part of the workflow API v1 compatibility promise. Pack lock v1, the +bounded process protocol v1, and source/trust policy are additive. MCP +reconnect is bounded by explicit idempotency and schema stability. A2A +continuation observes only a persisted task ID. Bounded loops, namespaced +sub-workflows, explicit source-linked compensation, graph-native structured handoffs, durable streaming, and protocol continuation records are additive; hidden or model-controlled orchestration is intentionally unsupported. diff --git a/docs/CONTAINER.md b/docs/CONTAINER.md index 3e6d209..da71eac 100644 --- a/docs/CONTAINER.md +++ b/docs/CONTAINER.md @@ -76,7 +76,7 @@ docker run --rm --read-only --user 65532:65532 \ --mount type=bind,src="$PWD/state",dst=/state \ --mount type=bind,src="$PWD/artifacts",dst=/artifacts \ --env OPENAI_API_KEY \ - ghcr.io/OWNER/agentctl:0.2.0 \ + ghcr.io/OWNER/agentctl:0.3.0 \ run /config/workflow.yaml --workspace /workspace --db /state/runtime.db \ --input reportPath=/artifacts/report.txt --timeout-seconds 600 \ --output json --color never @@ -96,7 +96,7 @@ docker run --rm --read-only --user 65532:65532 \ --mount type=bind,src="$PWD/workspace",dst=/workspace,readonly \ --mount type=bind,src="$PWD/state",dst=/state \ --mount type=bind,src="$PWD/openai.key",dst=/run/secrets/openai,readonly \ - ghcr.io/OWNER/agentctl:0.2.0 \ + ghcr.io/OWNER/agentctl:0.3.0 \ run /config/workflow.yaml --workspace /workspace --db /state/runtime.db \ --output json --color never ``` @@ -111,7 +111,7 @@ docker run --rm --read-only --user 65532:65532 --network none \ --mount type=bind,src="$PWD/config",dst=/config,readonly \ --mount type=bind,src="$PWD/workspace",dst=/workspace,readonly \ --mount type=bind,src="$PWD/state",dst=/state \ - ghcr.io/OWNER/agentctl:0.2.0 \ + ghcr.io/OWNER/agentctl:0.3.0 \ repair /config/repaired.yaml SOURCE_RUN_ID --from failed_task --plan \ --workspace /workspace --db /state/runtime.db --output json --color never ``` @@ -140,7 +140,7 @@ jobs: --mount type=bind,src="$GITHUB_WORKSPACE",dst=/workspace,readonly \ --mount type=bind,src="$GITHUB_WORKSPACE/.agentctl-state",dst=/state \ --mount type=bind,src="$GITHUB_WORKSPACE/artifacts",dst=/artifacts \ - --env OPENAI_API_KEY ghcr.io/OWNER/agentctl:0.2.0 \ + --env OPENAI_API_KEY ghcr.io/OWNER/agentctl:0.3.0 \ run /config/workflow.yaml --workspace /workspace --db /state/runtime.db \ --input reportPath=/artifacts/report.txt --timeout-seconds 600 \ --output json --color never @@ -165,7 +165,7 @@ This syntax assumes a runner configured with Docker CLI access to the host daemo agentctl: image: docker:27-cli variables: - AGENTCTL_IMAGE: ghcr.io/OWNER/agentctl:0.2.0 + AGENTCTL_IMAGE: ghcr.io/OWNER/agentctl:0.3.0 before_script: - mkdir -p .agentctl-state artifacts && chmod 0777 .agentctl-state artifacts script: @@ -208,7 +208,7 @@ pipeline { --mount type=bind,src="$WORKSPACE",dst=/workspace,readonly \ --mount type=bind,src="$WORKSPACE/.agentctl-state",dst=/state \ --mount type=bind,src="$WORKSPACE/artifacts",dst=/artifacts \ - --env OPENAI_API_KEY ghcr.io/OWNER/agentctl:0.2.0 \ + --env OPENAI_API_KEY ghcr.io/OWNER/agentctl:0.3.0 \ run /config/workflow.yaml --workspace /workspace --db /state/runtime.db \ --input reportPath=/artifacts/report.txt --timeout-seconds 600 \ --output json --color never @@ -249,7 +249,7 @@ The runner needs Docker CLI/socket access and four workspace directories. The se --mount type=bind,src=/harness,dst=/workspace,readonly \ --mount type=bind,src=/harness/.agentctl-state,dst=/state \ --mount type=bind,src=/harness/artifacts,dst=/artifacts \ - --env OPENAI_API_KEY ghcr.io/OWNER/agentctl:0.2.0 \ + --env OPENAI_API_KEY ghcr.io/OWNER/agentctl:0.3.0 \ run /config/workflow.yaml --workspace /workspace --db /state/runtime.db \ --input reportPath=/artifacts/report.txt --timeout-seconds 600 \ --output json --color never @@ -288,7 +288,7 @@ spec: fsGroup: 65532 containers: - name: agentctl - image: ghcr.io/OWNER/agentctl:0.2.0 + image: ghcr.io/OWNER/agentctl:0.3.0 args: - run - /config/workflow.yaml diff --git a/docs/DSL.md b/docs/DSL.md index 2c843b9..5300d6d 100644 --- a/docs/DSL.md +++ b/docs/DSL.md @@ -1,6 +1,6 @@ # Workflow DSL -The current document version is `agentctl.dev/v1alpha1`, with `kind: Workflow`. The generated, authoritative JSON Schema is [`schemas/workflow.schema.json`](../schemas/workflow.schema.json). YAML documents are limited to 1 MiB and reject unknown fields. +The current document version is `agentctl.dev/v1`, with `kind: Workflow`. The generated, authoritative JSON Schema is [`schemas/workflow.schema.json`](../schemas/workflow.schema.json). YAML documents are limited to 1 MiB and reject unknown fields. `metadata` contains the name, description, and labels. `spec` contains typed inputs/outputs; providers; bounded agents; actions; tool contracts; reusable sub-workflows; compensation policy; ordered tasks; policy; memory; MCP servers; A2A peers; packs; runtime; and output settings. A task `uses` `action:`, `agent:`, `workflow:`, or the pure `router` construct. Tasks declare `needs`, optional bounded `foreach`, `matrix`, or `loop` expansion, optional working-memory `memoryWrites`, an optional `when`, local `vars`, typed `with` input, optional `outputSchema`, retry, timeout, failure behavior, and an optional effectful `compensate` action. @@ -86,4 +86,6 @@ budgets](guides/RESOURCE_BUDGETS.md). The parser translates a limited unversioned `playbook:` document and emits a migration warning. Use `agentctl migrate old.yaml --write new.yaml`. Legacy pack-backed, MCP, A2A, provider-specific, and broad module configurations need manual migration; see [Migrating from TypeScript](MIGRATING_FROM_TYPESCRIPT.md). -Not implemented in v1alpha1: `finally`, handlers, or event triggers. Parallelism is expressed by independent graph tasks rather than a separate parallel-group construct. +Not implemented in workflow API v1: `finally`, handlers, or event triggers. +Parallelism is expressed by independent graph tasks rather than a separate +parallel-group construct. diff --git a/docs/LIMITATIONS.md b/docs/LIMITATIONS.md index d2b2118..10be404 100644 --- a/docs/LIMITATIONS.md +++ b/docs/LIMITATIONS.md @@ -13,7 +13,8 @@ and OCI journeys. The local container build has a secure optional CA secret path, and exact-head pull-request gates execute Linux x64, hosted macOS arm64, Windows x64, container, security, package, and SBOM validation without provider credentials. Exact run and artifact digests belong to the independent -candidate report. This is a `v1alpha1` framework candidate, not stable v1.0. +candidate report. Version 0.3 publishes workflow API `agentctl.dev/v1`; the CLI +and crates remain pre-1.0 and do not imply long-term support. ## Required hardening completed for this release @@ -57,7 +58,9 @@ These are extension points, not incomplete core runtime behavior: ## Current operational limits -- The document API is `v1alpha1`; pin the binary/image version and validate before upgrading. +- The document API is `agentctl.dev/v1`. Pin the binary or image version and + validate before upgrading because runtime, provider, and storage contracts + have independent versions. - Parallel scheduling is local to one run and process, bounded at 64 tasks, and defaults to sequential execution. Working-memory conflicts fail compilation, but tasks that target the same external resource still require explicit `needs` ordering or that system's concurrency controls. Separate runs also require external overlap controls when effects must not overlap. - Run budgets are optional. Provider input tokens and future token classes are estimated conservatively before dispatch; actual provider usage is diff --git a/docs/PRODUCT.md b/docs/PRODUCT.md index 74ebf1e..ce8bde2 100644 --- a/docs/PRODUCT.md +++ b/docs/PRODUCT.md @@ -26,9 +26,18 @@ Workflow and pack authors are trusted to request work, but their requests remain ## Compatibility and maturity -The current document API is `agentctl.dev/v1alpha1`; breaking changes may occur with explicit diagnostics and migration support. Machine output, plan, effects, runtime state, checkpoints, database schema, audit events, and protocol continuation all carry independent versions. Deprecations are documented for at least one compatibility window; incompatible durable state fails explicitly. - -Version 0.2 is a production-oriented alpha with executable evidence for the stated local, scheduled, and generic-container journeys. The workflow schema remains `v1alpha1`, so callers must pin the binary/image version. A stable release requires a frozen v1 workflow schema, accumulated cross-platform CI history, documented long-horizon database upgrade support, expanded compatibility fixtures, and a security review of any newly added executor. +The current document API is `agentctl.dev/v1`. Additive compatible changes may +extend it; incompatible workflow changes require a new document API version and +explicit migration diagnostics. Machine output, plan, effects, runtime state, +checkpoints, database schema, audit events, and protocol continuation all carry +independent versions. Deprecations are documented for at least one compatibility +window; incompatible durable state fails explicitly. + +Version 0.3 freezes the workflow schema as `agentctl.dev/v1` and has executable +evidence for the stated local, scheduled, and generic-container journeys. The +CLI and crates remain pre-1.0, so callers must still pin the binary or image +version for runtime, provider, and storage behavior outside the workflow +document contract. ## Differentiation diff --git a/docs/RELEASE_PROCESS.md b/docs/RELEASE_PROCESS.md index 9cdb4a8..3c0bd28 100644 --- a/docs/RELEASE_PROCESS.md +++ b/docs/RELEASE_PROCESS.md @@ -1,6 +1,7 @@ # Release process -This process applies to the `agentctl.dev/v1alpha1` release candidate. A release is not approved from local evidence alone. +This process applies to agentctl releases carrying workflow API +`agentctl.dev/v1`. A release is not approved from local evidence alone. ## Required hosted checks @@ -73,6 +74,6 @@ For the candidate workflow run: ## Release decision -Promote an exact commit to a framework candidate only after it has all required -hosted checks and artifacts. Stable `v1.0` remains outside this `v1alpha1` -gate. +Promote an exact commit only after it has all required hosted checks and +artifacts. Shipping workflow API `agentctl.dev/v1` does not imply a 1.0 CLI, +crate, storage, provider, or long-term-support contract. diff --git a/docs/architecture/DIAGRAMS.md b/docs/architecture/DIAGRAMS.md index 8ddef3f..8e67f21 100644 --- a/docs/architecture/DIAGRAMS.md +++ b/docs/architecture/DIAGRAMS.md @@ -1,6 +1,7 @@ # Architecture diagrams -These diagrams explain implemented `v1alpha1` behavior. Each diagram is paired with text so the relationship is available when Mermaid cannot render. +These diagrams explain implemented workflow API v1 behavior. Each diagram is +paired with text so the relationship is available when Mermaid cannot render. ## High-level system architecture diff --git a/docs/execution/STATUS.md b/docs/execution/STATUS.md index 3f72369..a484c53 100644 --- a/docs/execution/STATUS.md +++ b/docs/execution/STATUS.md @@ -43,7 +43,7 @@ SBOM validation without provider credentials. `agentctl` is a schedulable local runtime, not an external scheduler or distributed control plane. The workflow document API is versioned -`v1alpha1`. One run may execute +`agentctl.dev/v1`. One run may execute bounded independent tasks concurrently with deterministic plan-order commits; cross-run and cross-host overlap remains external. Provider, filesystem, process, and network policy is not an OS sandbox. At-most-once external work diff --git a/docs/generated/CLI.md b/docs/generated/CLI.md index 3bf12ae..d16649b 100644 --- a/docs/generated/CLI.md +++ b/docs/generated/CLI.md @@ -27,7 +27,7 @@ Commands: providers Inspect provider capabilities or run the opt-in OpenAI smoke auth Check configured secret references without revealing values schema Print or write the generated workflow JSON Schema - migrate Translate an unversioned TypeScript-era workflow into v1alpha1 + migrate Translate an unversioned TypeScript-era workflow into workflow API v1 packs Inspect and verify a local reusable pack artifacts Inspect, verify, export, or collect durable artifacts db Inspect the runtime database @@ -713,7 +713,7 @@ Options: ## `agentctl migrate` ```text -Translate an unversioned TypeScript-era workflow into v1alpha1 +Translate an unversioned TypeScript-era workflow into workflow API v1 Usage: agentctl migrate [OPTIONS] diff --git a/docs/guides/CI_CD.md b/docs/guides/CI_CD.md index 903bf95..aa5a015 100644 --- a/docs/guides/CI_CD.md +++ b/docs/guides/CI_CD.md @@ -27,7 +27,7 @@ docker run --rm --read-only --user 65532:65532 \ --mount type=bind,src="$PWD",dst=/workspace,readonly \ --mount type=bind,src="$PWD/.agentctl-state",dst=/state \ --mount type=bind,src="$PWD/artifacts",dst=/artifacts \ - ghcr.io/OWNER/agentctl:0.2.0 \ + ghcr.io/OWNER/agentctl:0.3.0 \ run /config/workflow.yaml --workspace /workspace \ --db /state/runtime.db --output json --color never ``` diff --git a/docs/guides/INSTALLATION.md b/docs/guides/INSTALLATION.md index dca6c3b..7ee0cfb 100644 --- a/docs/guides/INSTALLATION.md +++ b/docs/guides/INSTALLATION.md @@ -1,6 +1,7 @@ # Install agentctl -This guide installs the `v1alpha1` Rust CLI from crates.io, reviewed source, or a locally built OCI image. +This guide installs the agentctl 0.3 Rust CLI with workflow API v1 from +crates.io, reviewed source, or a locally built OCI image. ## Prerequisites @@ -70,7 +71,7 @@ Expected evidence includes `valid: hello`, task order `greet`, and `FullyPredict ## Upgrade safely -The workflow API is `agentctl.dev/v1alpha1`. Pin the CLI or image version, read [compatibility](../COMPATIBILITY.md) and [limitations](../LIMITATIONS.md), back up the SQLite database with its WAL files, then validate workflows before replacing a binary. `agentctl update` explains supported update paths but does not modify the installation. +The workflow API is `agentctl.dev/v1`. Pin the CLI or image version, read [compatibility](../COMPATIBILITY.md) and [limitations](../LIMITATIONS.md), back up the SQLite database with its WAL files, then validate workflows before replacing a binary. `agentctl update` explains supported update paths but does not modify the installation. ## Next step diff --git a/docs/guides/SECRET_REFERENCES.md b/docs/guides/SECRET_REFERENCES.md index 060128b..5f3b1b7 100644 --- a/docs/guides/SECRET_REFERENCES.md +++ b/docs/guides/SECRET_REFERENCES.md @@ -104,7 +104,7 @@ docker run --rm --read-only --user 65532:65532 \ --mount type=bind,src="$PWD/workspace",dst=/workspace,readonly \ --mount type=bind,src="$PWD/state",dst=/state \ --mount type=bind,src="$PWD/openai.key",dst=/run/secrets/openai,readonly \ - ghcr.io/OWNER/agentctl:0.2.0 \ + ghcr.io/OWNER/agentctl:0.3.0 \ run /config/workflow.yaml --workspace /workspace \ --db /state/runtime.db --output json --color never ``` diff --git a/docs/guides/TROUBLESHOOTING.md b/docs/guides/TROUBLESHOOTING.md index 535f349..28c0382 100644 --- a/docs/guides/TROUBLESHOOTING.md +++ b/docs/guides/TROUBLESHOOTING.md @@ -22,7 +22,8 @@ The path separates pre-run validation from durable runtime failures. An uncertai **Symptom:** `check`, `plan`, or `run` reports invalid YAML, a missing reference, unsupported capability, or bad template. -**Likely cause:** The strict `v1alpha1` schema rejected a field or the compiler could not prove the graph and capabilities. +**Likely cause:** The strict workflow API v1 schema rejected a field or the +compiler could not prove the graph and capabilities. **Diagnose:** diff --git a/docs/guides/WORKFLOW_AUTHORING.md b/docs/guides/WORKFLOW_AUTHORING.md index 3b46904..4a827a0 100644 --- a/docs/guides/WORKFLOW_AUTHORING.md +++ b/docs/guides/WORKFLOW_AUTHORING.md @@ -7,7 +7,7 @@ This guide teaches the YAML model in the order you need it. The generated JSON S Every document has a strict versioned envelope: ```yaml -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: repository-check diff --git a/docs/reference/YAML.md b/docs/reference/YAML.md index ced474f..f82179e 100644 --- a/docs/reference/YAML.md +++ b/docs/reference/YAML.md @@ -6,7 +6,7 @@ The generated [workflow JSON Schema](../../schemas/workflow.schema.json) is auth | Field | Required | Meaning | | --- | --- | --- | -| `apiVersion` | yes | Must be `agentctl.dev/v1alpha1`. | +| `apiVersion` | yes | Must be `agentctl.dev/v1`. | | `kind` | yes | Must be `Workflow`. | | `metadata.name` | yes | Stable human-readable workflow name. | | `metadata.description` | no | Short purpose. | diff --git a/docs/research/selective-repair.md b/docs/research/selective-repair.md index 61d7b74..4f9d973 100644 --- a/docs/research/selective-repair.md +++ b/docs/research/selective-repair.md @@ -1,6 +1,6 @@ # Selective repair research -Status: implemented for `agentctl` v1alpha1. Reviewed against primary material on 2026-07-23. +Status: implemented for `agentctl` workflow API v1. Reviewed against primary material on 2026-07-23. Selective repair is a new execution from a task boundary, not history replay. The design borrows narrow safety patterns from workflow engines and build systems without adopting their execution models. diff --git a/examples/README.md b/examples/README.md index 2f02c33..e038f05 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,4 +2,8 @@ The supported Rust workflow API examples are in [`v1/`](v1/README.md). The documentation acceptance journeys are in [`docs/`](docs/README.md). The two-agent live selective-repair journey is in [`selective-repair-openai/`](selective-repair-openai/README.md). -Other example directories at this level describe the retired TypeScript playbook format and remain only as migration fixtures. They are not accepted by the current `agentctl.dev/v1alpha1` compiler. Do not use their commands as current CLI guidance; use the [migration guide](../docs/MIGRATING_FROM_TYPESCRIPT.md) to translate them. +Other example directories at this level describe the retired TypeScript +playbook format and remain only as migration fixtures. They are not accepted +by the current `agentctl.dev/v1` compiler. Do not use their commands as current +CLI guidance; use the +[migration guide](../docs/MIGRATING_FROM_TYPESCRIPT.md) to translate them. diff --git a/examples/acceptance/mock-tool/workflow.yaml b/examples/acceptance/mock-tool/workflow.yaml index ff6d5d4..36bc906 100644 --- a/examples/acceptance/mock-tool/workflow.yaml +++ b/examples/acceptance/mock-tool/workflow.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: acceptance-mock-tool diff --git a/examples/dataflow/README.md b/examples/dataflow/README.md index 49578a9..b4d34bc 100644 --- a/examples/dataflow/README.md +++ b/examples/dataflow/README.md @@ -2,4 +2,6 @@ This directory is a migration fixture for the retired TypeScript playbook format. The current Rust CLI does not accept `mission.playbook.yaml`. -Use [`../v1/dataflow.yaml`](../v1/dataflow.yaml) for the supported `agentctl.dev/v1alpha1` example of scalar and structured task-output propagation, templates, dependencies, and deterministic assertions. +Use [`../v1/dataflow.yaml`](../v1/dataflow.yaml) for the supported +`agentctl.dev/v1` example of scalar and structured task-output propagation, +templates, dependencies, and deterministic assertions. diff --git a/examples/docs/ci-quality-gate/workflow.yaml b/examples/docs/ci-quality-gate/workflow.yaml index 5b0a19c..8294a72 100644 --- a/examples/docs/ci-quality-gate/workflow.yaml +++ b/examples/docs/ci-quality-gate/workflow.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: ci-quality-gate diff --git a/examples/docs/provider-portability/fake.yaml b/examples/docs/provider-portability/fake.yaml index 014514b..77894d8 100644 --- a/examples/docs/provider-portability/fake.yaml +++ b/examples/docs/provider-portability/fake.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: portable-summary-fake diff --git a/examples/docs/provider-portability/openai.yaml b/examples/docs/provider-portability/openai.yaml index 94722d2..c4e67fe 100644 --- a/examples/docs/provider-portability/openai.yaml +++ b/examples/docs/provider-portability/openai.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: portable-summary-openai diff --git a/examples/docs/release-readiness/workflow.yaml b/examples/docs/release-readiness/workflow.yaml index 602c53c..9a7a993 100644 --- a/examples/docs/release-readiness/workflow.yaml +++ b/examples/docs/release-readiness/workflow.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: release-readiness diff --git a/examples/docs/scheduled-review/workflow.yaml b/examples/docs/scheduled-review/workflow.yaml index 5b7fbaa..335eaa0 100644 --- a/examples/docs/scheduled-review/workflow.yaml +++ b/examples/docs/scheduled-review/workflow.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: scheduled-operational-review diff --git a/examples/framework-completeness/durable-pipeline-repaired.yaml b/examples/framework-completeness/durable-pipeline-repaired.yaml index 0ee0307..41688f5 100644 --- a/examples/framework-completeness/durable-pipeline-repaired.yaml +++ b/examples/framework-completeness/durable-pipeline-repaired.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: durable-composite-pipeline diff --git a/examples/framework-completeness/durable-pipeline.yaml b/examples/framework-completeness/durable-pipeline.yaml index 95ed2a2..fcf8217 100644 --- a/examples/framework-completeness/durable-pipeline.yaml +++ b/examples/framework-completeness/durable-pipeline.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: durable-composite-pipeline diff --git a/examples/framework-completeness/live-composite.yaml b/examples/framework-completeness/live-composite.yaml index 5df9943..aa5f21a 100644 --- a/examples/framework-completeness/live-composite.yaml +++ b/examples/framework-completeness/live-composite.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: live-framework-composite diff --git a/examples/framework-completeness/operational-workflow.yaml b/examples/framework-completeness/operational-workflow.yaml index 06da50b..a9891a9 100644 --- a/examples/framework-completeness/operational-workflow.yaml +++ b/examples/framework-completeness/operational-workflow.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: operational-composite diff --git a/examples/openai-live/workflow.yaml b/examples/openai-live/workflow.yaml index 1c908c1..b9abbd2 100644 --- a/examples/openai-live/workflow.yaml +++ b/examples/openai-live/workflow.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: openai-live-tool-acceptance diff --git a/examples/prompt-cache/README.md b/examples/prompt-cache/README.md index bd3f23e..22bb27f 100644 --- a/examples/prompt-cache/README.md +++ b/examples/prompt-cache/README.md @@ -2,4 +2,4 @@ This directory is a migration fixture for the retired TypeScript playbook and CLI. Its mock server and `mission.playbook.yaml` are not a supported current workflow. -The current API exposes prompt-cache capability and usage fields through provider configuration, durable provider records, and observability. Consult the generated schema and [provider capability matrix](../../docs/reference/MATRICES.md), then validate any new `agentctl.dev/v1alpha1` workflow with `agentctl check` before running it. +The current API exposes prompt-cache capability and usage fields through provider configuration, durable provider records, and observability. Consult the generated schema and [provider capability matrix](../../docs/reference/MATRICES.md), then validate any new `agentctl.dev/v1` workflow with `agentctl check` before running it. diff --git a/examples/selective-repair-openai/repaired.workflow.yaml b/examples/selective-repair-openai/repaired.workflow.yaml index f3cecb3..f2d53f0 100644 --- a/examples/selective-repair-openai/repaired.workflow.yaml +++ b/examples/selective-repair-openai/repaired.workflow.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: selective-repair-openai diff --git a/examples/selective-repair-openai/source.workflow.yaml b/examples/selective-repair-openai/source.workflow.yaml index 4664b93..ba61ce7 100644 --- a/examples/selective-repair-openai/source.workflow.yaml +++ b/examples/selective-repair-openai/source.workflow.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: selective-repair-openai diff --git a/examples/v1/a2a.yaml b/examples/v1/a2a.yaml index bb7ed92..3c4de76 100644 --- a/examples/v1/a2a.yaml +++ b/examples/v1/a2a.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: a2a-delegation diff --git a/examples/v1/agentctl.pack.lock b/examples/v1/agentctl.pack.lock index b60b290..a3fb2ca 100644 --- a/examples/v1/agentctl.pack.lock +++ b/examples/v1/agentctl.pack.lock @@ -1,12 +1,12 @@ apiVersion: agentctl.dev/pack-lock/v1 -agentctl: 0.2.0 +agentctl: 0.3.0 packs: - name: example.base version: 1.1.0 source: path: dependency.pack - integrity: sha256:5ccb960b223cf554d98e6b7b0188c3093745fc2336fb99f45d2c9b1585cdf310 - compatibility: '>=0.2.0, <1.0.0' + integrity: sha256:c5f1a5189e7aa88f596a410d8942bbe56c8b99f284a8a62c2081c3c92678aa07 + compatibility: '>=0.3.0, <1.0.0' dependencies: {} trust: status: unsigned @@ -14,8 +14,8 @@ packs: version: 1.0.0 source: path: example.pack.yaml - integrity: sha256:365a88e8a0e9aceec06b51c1b1a3af49aa59bd7f82bd5cc9e5088d51ae4e1afe - compatibility: '>=0.2.0, <1.0.0' + integrity: sha256:65daf10190d2d9d2f9fad622f650667f8e412340cb6aaba7307940b5c20ec294 + compatibility: '>=0.3.0, <1.0.0' dependencies: example.base: 1.1.0 trust: diff --git a/examples/v1/anthropic-live.yaml b/examples/v1/anthropic-live.yaml index 4d0b9e8..e227421 100644 --- a/examples/v1/anthropic-live.yaml +++ b/examples/v1/anthropic-live.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: anthropic-live } spec: diff --git a/examples/v1/approval.yaml b/examples/v1/approval.yaml index 1a94628..c377b03 100644 --- a/examples/v1/approval.yaml +++ b/examples/v1/approval.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: approval-gated-write diff --git a/examples/v1/capability-failure.yaml b/examples/v1/capability-failure.yaml index 9887335..abff78b 100644 --- a/examples/v1/capability-failure.yaml +++ b/examples/v1/capability-failure.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: capability-failure diff --git a/examples/v1/check-diff.yaml b/examples/v1/check-diff.yaml index 3c6d536..f6a9f9b 100644 --- a/examples/v1/check-diff.yaml +++ b/examples/v1/check-diff.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: check-diff diff --git a/examples/v1/compensation.yaml b/examples/v1/compensation.yaml index 10db1bc..b348da9 100644 --- a/examples/v1/compensation.yaml +++ b/examples/v1/compensation.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: compensation diff --git a/examples/v1/condition.yaml b/examples/v1/condition.yaml index 26ef2f9..7127f0b 100644 --- a/examples/v1/condition.yaml +++ b/examples/v1/condition.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: condition diff --git a/examples/v1/crash-resume.yaml b/examples/v1/crash-resume.yaml index c521175..4a4f13b 100644 --- a/examples/v1/crash-resume.yaml +++ b/examples/v1/crash-resume.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: crash-resume diff --git a/examples/v1/dataflow.yaml b/examples/v1/dataflow.yaml index 453679b..e0f7e55 100644 --- a/examples/v1/dataflow.yaml +++ b/examples/v1/dataflow.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: typed-dataflow diff --git a/examples/v1/dependency.pack b/examples/v1/dependency.pack index bc3d9f2..bfcf71c 100644 --- a/examples/v1/dependency.pack +++ b/examples/v1/dependency.pack @@ -1,7 +1,7 @@ apiVersion: agentctl.dev/pack/v1alpha1 name: example.base version: 1.1.0 -agentctl: ">=0.2.0, <1.0.0" +agentctl: ">=0.3.0, <1.0.0" actions: assign: kind: builtin.assign diff --git a/examples/v1/example.pack.yaml b/examples/v1/example.pack.yaml index 6f622db..07236a0 100644 --- a/examples/v1/example.pack.yaml +++ b/examples/v1/example.pack.yaml @@ -1,7 +1,7 @@ apiVersion: agentctl.dev/pack/v1alpha1 name: example.utility version: 1.0.0 -agentctl: ">=0.2.0, <1.0.0" +agentctl: ">=0.3.0, <1.0.0" dependencies: example.base: version: "^1.0" diff --git a/examples/v1/fake-provider.yaml b/examples/v1/fake-provider.yaml index cbc6663..9a3c8d2 100644 --- a/examples/v1/fake-provider.yaml +++ b/examples/v1/fake-provider.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: fake-provider diff --git a/examples/v1/google-live.yaml b/examples/v1/google-live.yaml index ebfefcb..e9c0353 100644 --- a/examples/v1/google-live.yaml +++ b/examples/v1/google-live.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: google-live } spec: diff --git a/examples/v1/hello.yaml b/examples/v1/hello.yaml index 9c5c302..d0ed287 100644 --- a/examples/v1/hello.yaml +++ b/examples/v1/hello.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: hello diff --git a/examples/v1/long-term-memory.yaml b/examples/v1/long-term-memory.yaml index 8b64968..5d0c8e4 100644 --- a/examples/v1/long-term-memory.yaml +++ b/examples/v1/long-term-memory.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: long-term-memory diff --git a/examples/v1/loop.yaml b/examples/v1/loop.yaml index 9e8fd90..a90aa55 100644 --- a/examples/v1/loop.yaml +++ b/examples/v1/loop.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: bounded-loop diff --git a/examples/v1/matrix.yaml b/examples/v1/matrix.yaml index 294a377..4ff11e4 100644 --- a/examples/v1/matrix.yaml +++ b/examples/v1/matrix.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: bounded-matrix diff --git a/examples/v1/mcp.yaml b/examples/v1/mcp.yaml index 49b6c2f..72becc2 100644 --- a/examples/v1/mcp.yaml +++ b/examples/v1/mcp.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: mcp-tool diff --git a/examples/v1/openai-live.yaml b/examples/v1/openai-live.yaml index afb3004..9ed85b7 100644 --- a/examples/v1/openai-live.yaml +++ b/examples/v1/openai-live.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: openai-live diff --git a/examples/v1/parallel.yaml b/examples/v1/parallel.yaml index 0b598f2..e05d8de 100644 --- a/examples/v1/parallel.yaml +++ b/examples/v1/parallel.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: deterministic-parallel diff --git a/examples/v1/policy-denial.yaml b/examples/v1/policy-denial.yaml index ec894d3..a7815dd 100644 --- a/examples/v1/policy-denial.yaml +++ b/examples/v1/policy-denial.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: policy-denial diff --git a/examples/v1/process-isolation.yaml b/examples/v1/process-isolation.yaml index a32366d..4a0acea 100644 --- a/examples/v1/process-isolation.yaml +++ b/examples/v1/process-isolation.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: process-isolation diff --git a/examples/v1/resource-budget.yaml b/examples/v1/resource-budget.yaml index 1fb53cb..f5cc612 100644 --- a/examples/v1/resource-budget.yaml +++ b/examples/v1/resource-budget.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: resource-budget diff --git a/examples/v1/reusable-pack.yaml b/examples/v1/reusable-pack.yaml index 2adf1b0..b8113cb 100644 --- a/examples/v1/reusable-pack.yaml +++ b/examples/v1/reusable-pack.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: reusable-pack diff --git a/examples/v1/router.yaml b/examples/v1/router.yaml index 8d13e5e..f006dbe 100644 --- a/examples/v1/router.yaml +++ b/examples/v1/router.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: typed-router diff --git a/examples/v1/secret-reference.yaml b/examples/v1/secret-reference.yaml index 4b39f36..ae78524 100644 --- a/examples/v1/secret-reference.yaml +++ b/examples/v1/secret-reference.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: secret-reference diff --git a/examples/v1/streaming.yaml b/examples/v1/streaming.yaml index b59e025..24f7a20 100644 --- a/examples/v1/streaming.yaml +++ b/examples/v1/streaming.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: durable-streaming diff --git a/examples/v1/structured-handoff.yaml b/examples/v1/structured-handoff.yaml index ddc44b1..61d1727 100644 --- a/examples/v1/structured-handoff.yaml +++ b/examples/v1/structured-handoff.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: structured-handoff diff --git a/examples/v1/subworkflow.yaml b/examples/v1/subworkflow.yaml index 33139c7..2ab31a9 100644 --- a/examples/v1/subworkflow.yaml +++ b/examples/v1/subworkflow.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: reusable-sub-workflow diff --git a/examples/v1/working-memory.yaml b/examples/v1/working-memory.yaml index 8aadf63..1d21389 100644 --- a/examples/v1/working-memory.yaml +++ b/examples/v1/working-memory.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: working-memory diff --git a/fuzz/Cargo.lock b/fuzz/Cargo.lock index d128025..a3e221a 100644 --- a/fuzz/Cargo.lock +++ b/fuzz/Cargo.lock @@ -40,7 +40,7 @@ dependencies = [ [[package]] name = "agentctl-core" -version = "0.2.0" +version = "0.3.0" dependencies = [ "async-trait", "chrono", @@ -73,7 +73,7 @@ dependencies = [ [[package]] name = "agentctl-observability" -version = "0.2.0" +version = "0.3.0" dependencies = [ "agentctl-core", "chrono", @@ -84,7 +84,7 @@ dependencies = [ [[package]] name = "agentctl-protocols" -version = "0.2.0" +version = "0.3.0" dependencies = [ "agentctl-core", "agentctl-runtime", @@ -105,7 +105,7 @@ dependencies = [ [[package]] name = "agentctl-runtime" -version = "0.2.0" +version = "0.3.0" dependencies = [ "agentctl-core", "agentctl-observability", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "agentctl-store" -version = "0.2.0" +version = "0.3.0" dependencies = [ "aes-gcm", "agentctl-core", diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 4d5ee1d..83da6af 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -9,9 +9,9 @@ rust-version = "1.88" cargo-fuzz = true [dependencies] -agentctl-core = { version = "0.2.0", path = "../crates/agentctl-core" } -agentctl-protocols = { version = "0.2.0", path = "../crates/agentctl-protocols" } -agentctl-store = { version = "0.2.0", path = "../crates/agentctl-store" } +agentctl-core = { version = "0.3.0", path = "../crates/agentctl-core" } +agentctl-protocols = { version = "0.3.0", path = "../crates/agentctl-protocols" } +agentctl-store = { version = "0.3.0", path = "../crates/agentctl-store" } libfuzzer-sys = "0.4" serde_json = "1" diff --git a/workflow.yaml b/workflow.yaml index ff6d5d4..36bc906 100644 --- a/workflow.yaml +++ b/workflow.yaml @@ -1,4 +1,4 @@ -apiVersion: agentctl.dev/v1alpha1 +apiVersion: agentctl.dev/v1 kind: Workflow metadata: name: acceptance-mock-tool diff --git a/xtask/src/acceptance.rs b/xtask/src/acceptance.rs index 2f923e1..4cbcc1b 100644 --- a/xtask/src/acceptance.rs +++ b/xtask/src/acceptance.rs @@ -1244,7 +1244,7 @@ pub fn run(root: &Path) -> Result<()> { let secret_workflow = secret_workspace.join("workflow.yaml"); let binary_path = path(&binary)?; let secret_document = serde_json::json!({ - "apiVersion": "agentctl.dev/v1alpha1", + "apiVersion": "agentctl.dev/v1", "kind": "Workflow", "metadata": {"name": "secret-providers"}, "spec": { @@ -2133,7 +2133,7 @@ pub fn run(root: &Path) -> Result<()> { r#"apiVersion: agentctl.dev/pack/v1alpha1 name: example.extension version: 1.0.0 -agentctl: ">=0.2.0, <1.0.0" +agentctl: ">=0.3.0, <1.0.0" actions: transform: kind: extension.process @@ -2158,7 +2158,7 @@ actions: let extension_workflow = pack_workspace.join("workflow.yaml"); let workflow_source = |allow_unsigned_process: bool| { format!( - r#"apiVersion: agentctl.dev/v1alpha1 + r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: {{ name: process-extension-acceptance }} spec: @@ -4964,9 +4964,7 @@ fn collect_openai_workflows( Some("yaml" | "yml") ) { let source = fs::read_to_string(&path)?; - if source.contains("apiVersion: agentctl.dev/v1alpha1") - && source.contains("kind: openai") - { + if source.contains("apiVersion: agentctl.dev/v1") && source.contains("kind: openai") { output.insert( path.strip_prefix(root) .context("OpenAI example outside repository")? @@ -5580,7 +5578,7 @@ fn copy_example(root: &Path, source: &str, destination: &Path) -> Result<()> { fn deterministic_workflow(name: &str, uses: &str, input: &str) -> String { format!( - "apiVersion: agentctl.dev/v1alpha1\nkind: Workflow\nmetadata: {{ name: {name} }}\nspec:\n tasks:\n - id: task\n uses: {uses}\n with: {input}\n" + "apiVersion: agentctl.dev/v1\nkind: Workflow\nmetadata: {{ name: {name} }}\nspec:\n tasks:\n - id: task\n uses: {uses}\n with: {input}\n" ) } @@ -5596,7 +5594,7 @@ fn agent_workflow(name: &str, option: &str, tool: &str, extra_option: &str) -> S format!(" providerOptions:\n {option}\n {extra_option}\n") }; format!( - "apiVersion: agentctl.dev/v1alpha1\nkind: Workflow\nmetadata: {{ name: {name} }}\nspec:\n providers:\n fake: {{ kind: fake }}\n{tool} agents:\n worker:\n provider: fake\n model: scripted\n instructions: complete the fixture\n{tools} maxTurns: 2\n maxToolCalls: 1\n timeoutSeconds: 1\n{provider_options} tasks:\n - id: work\n uses: agent:worker\n retry: {{ maxAttempts: 1 }}\n with: {{ prompt: hello }}\n" + "apiVersion: agentctl.dev/v1\nkind: Workflow\nmetadata: {{ name: {name} }}\nspec:\n providers:\n fake: {{ kind: fake }}\n{tool} agents:\n worker:\n provider: fake\n model: scripted\n instructions: complete the fixture\n{tools} maxTurns: 2\n maxToolCalls: 1\n timeoutSeconds: 1\n{provider_options} tasks:\n - id: work\n uses: agent:worker\n retry: {{ maxAttempts: 1 }}\n with: {{ prompt: hello }}\n" ) } @@ -5652,7 +5650,7 @@ fn mismatched_echo_tool() -> &'static str { fn read_tool_workflow(name: &str, file: &str) -> String { format!( - r#"apiVersion: agentctl.dev/v1alpha1 + r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: {{ name: {name} }} spec: @@ -6055,7 +6053,7 @@ fn container_signal_acceptance(engine: &Path, root: &Path) -> Result<()> { Ok(()) } -const APPROVAL_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const APPROVAL_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: approval } spec: @@ -6071,7 +6069,7 @@ spec: with: { path: artifacts/approved.txt, content: approved } "#; -const CONFIRMED_BEFORE_APPROVAL_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const CONFIRMED_BEFORE_APPROVAL_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: confirmed-before-approval } spec: @@ -6098,7 +6096,7 @@ spec: with: { path: artifacts/confirmed.txt, content: confirmed } "#; -const RETRY_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const RETRY_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: retry } spec: @@ -6120,7 +6118,7 @@ spec: "#; #[cfg(not(windows))] -const TERMINAL_RETRY_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const TERMINAL_RETRY_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: terminal-retry } spec: @@ -6148,7 +6146,7 @@ spec: "#; #[cfg(windows)] -const TERMINAL_RETRY_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const TERMINAL_RETRY_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: terminal-retry } spec: @@ -6175,7 +6173,7 @@ spec: with: { value: recovered } "#; -const OPENAI_AUTH_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const OPENAI_AUTH_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: missing-auth } spec: @@ -6194,7 +6192,7 @@ spec: with: { prompt: hello } "#; -const OPENAI_RESOURCE_BUDGET_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const OPENAI_RESOURCE_BUDGET_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: live-resource-budget } spec: @@ -6222,7 +6220,7 @@ spec: - { id: second, uses: "agent:worker", needs: [first], with: { prompt: Reply now. } } "#; -const OPENAI_STATELESS_TOOL_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const OPENAI_STATELESS_TOOL_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: stateless-tools } spec: @@ -6258,7 +6256,7 @@ spec: tasks: [{ id: work, uses: "agent:worker" }] "#; -const INPUTS_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const INPUTS_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: inputs } spec: @@ -6274,7 +6272,7 @@ spec: with: { name: "${{ inputs.name }}", count: "${{ inputs.count }}" } "#; -const TRAVERSAL_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const TRAVERSAL_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: traversal } spec: @@ -6290,7 +6288,7 @@ spec: with: { path: ../escaped.txt, content: blocked } "#; -const SELECTIVE_REPAIR_SOURCE_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const SELECTIVE_REPAIR_SOURCE_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: selective-repair-acceptance } spec: @@ -6313,7 +6311,7 @@ spec: with: { value: repaired } "#; -const SELECTIVE_REPAIR_TARGET_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const SELECTIVE_REPAIR_TARGET_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: selective-repair-acceptance } spec: @@ -6337,7 +6335,7 @@ spec: "#; #[cfg(unix)] -const UNCERTAIN_REPAIR_SOURCE_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const UNCERTAIN_REPAIR_SOURCE_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: uncertain-repair-acceptance } spec: @@ -6355,7 +6353,7 @@ spec: "#; #[cfg(unix)] -const UNCERTAIN_REPAIR_TARGET_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const UNCERTAIN_REPAIR_TARGET_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: uncertain-repair-acceptance } spec: @@ -6368,7 +6366,7 @@ spec: - { id: work, uses: "action:assign", with: { recovered: true } } "#; -const COMPENSATION_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const COMPENSATION_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: compensation-acceptance } spec: @@ -6396,7 +6394,7 @@ spec: with: { that: false, message: expected acceptance failure } "#; -const PROTOCOL_MCP_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const PROTOCOL_MCP_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: mcp-resilience-acceptance } spec: @@ -6426,7 +6424,7 @@ spec: arguments: { value: safe } "#; -const PROTOCOL_A2A_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const PROTOCOL_A2A_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: a2a-resilience-acceptance } spec: @@ -6469,7 +6467,7 @@ spec: value: "${{ tasks.delegate.output.id }}" "#; -const NETWORK_PRIVATE_DENIED_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const NETWORK_PRIVATE_DENIED_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: network-private-denied } spec: @@ -6494,7 +6492,7 @@ spec: arguments: {} "#; -const CONTAINER_ISOLATION_UNAVAILABLE_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const CONTAINER_ISOLATION_UNAVAILABLE_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: container-isolation-unavailable } spec: @@ -6514,7 +6512,7 @@ spec: uses: action:isolated "#; -const RESOURCE_BUDGET_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const RESOURCE_BUDGET_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: resource-budget } spec: @@ -6535,7 +6533,7 @@ spec: - { id: second, uses: "agent:worker", needs: [first], with: { prompt: second } } "#; -const CONTAINER_MOCK_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const CONTAINER_MOCK_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: container-mock } spec: @@ -6596,7 +6594,7 @@ spec: with: { path: "${{ inputs.reportPath }}", content: "${{ tasks.inspect.output.text }}" } "#; -const CONTAINER_SIGNAL_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const CONTAINER_SIGNAL_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: container-signal } spec: @@ -6614,7 +6612,7 @@ spec: with: { prompt: wait } "#; -const CONTAINER_LIVE_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1alpha1 +const CONTAINER_LIVE_WORKFLOW: &str = r#"apiVersion: agentctl.dev/v1 kind: Workflow metadata: { name: container-openai-live } spec: