Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 9 additions & 9 deletions QUICKSTART.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ If you are using a standalone ACS artifact kit before packages are published, in
| SDK | Artifact-only install |
| --- | --- |
| Rust | Extract `agent_control_specification_core-*.crate`, `agent_control_specification-*.crate`, and any integration crates you need such as `agent_control_specification_openai-*.crate`, `agent_control_specification_mcp-*.crate`, or `agent_control_specification_rig-*.crate`, then add `[patch.crates-io]` entries pointing to the extracted directories. |
| Python | `python -m pip install "$ACS_KIT"/artifacts/agent_control_specification-0.3.0b0-*.whl` |
| Node | `npm install "$ACS_KIT"/artifacts/agent-control-specification-0.3.0-beta.0.tgz "$ACS_KIT"/artifacts/agent-control-specification-opa-linux-x64-0.3.0-beta.0.tgz` |
| .NET | `dotnet add package AgentControlSpecification --version 0.3.0-beta.0 --source "$ACS_KIT/artifacts"` |
| Generator | `python -m pip install "$ACS_KIT"/artifacts/acs_generator-0.3.0b0-py3-none-any.whl` |
| Python | `python -m pip install "$ACS_KIT"/artifacts/agent_control_specification-0.3.1b0-*.whl` |
| Node | `npm install "$ACS_KIT"/artifacts/agent-control-specification-0.3.1-beta.0.tgz "$ACS_KIT"/artifacts/agent-control-specification-opa-linux-x64-0.3.1-beta.0.tgz` |
| .NET | `dotnet add package AgentControlSpecification --version 0.3.1-beta.0 --source "$ACS_KIT/artifacts"` |
| Generator | `python -m pip install "$ACS_KIT"/artifacts/acs_generator-0.3.1b0-py3-none-any.whl` |
| C ABI | Compile against `"$ACS_KIT"/artifacts/include/agent_control_specification.h` and link or load `"$ACS_KIT"/artifacts/libagent_control_specification_core.so`. |

Python artifact installs may resolve third party wheel dependencies from your configured package index unless the kit also includes a Python dependency wheelhouse. Use `--no-index --find-links "$ACS_KIT/artifacts"` only with kits that contain that dependency closure.
Expand All @@ -48,7 +48,7 @@ Python artifact installs may resolve third party wheel dependencies from your co
A manifest binds named policies to intervention points. The smallest useful manifest declares one Rego policy and guards one point. Save this as `manifest.yaml` next to your host.

```yaml
agent_control_specification_version: "0.3.0-beta"
agent_control_specification_version: "0.3.1-beta"
metadata:
name: "my-agent"
policies:
Expand Down Expand Up @@ -230,10 +230,10 @@ For an artifact-only kit, validate the installed package from a temporary host p

| SDK | Artifact-only smoke check |
| --- | --- |
| Rust | `mkdir crates && for c in agent_control_specification_core agent_control_specification agent_control_specification_openai agent_control_specification_mcp agent_control_specification_rig; do tar -xzf "$ACS_KIT"/artifacts/$c-0.3.0-beta.0.crate -C crates 2>/dev/null || true; done`, then point `[patch.crates-io]` at the extracted `crates/<name>-0.3.0-beta.0` directories before `cargo check` |
| Python | `python -m venv .venv && .venv/bin/python -m pip install "$ACS_KIT"/artifacts/agent_control_specification-0.3.0b0-*.whl && .venv/bin/python -c "import agent_control_specification as acs; print(acs.AgentControl)"` |
| Node | `npm init -y && npm install "$ACS_KIT"/artifacts/agent-control-specification-0.3.0-beta.0.tgz "$ACS_KIT"/artifacts/agent-control-specification-opa-linux-x64-0.3.0-beta.0.tgz && node -e "const acs=require('agent-control-specification'); console.log(typeof acs.AgentControl)"` |
| .NET | `dotnet new console -n AcsSmoke && cd AcsSmoke && dotnet add package AgentControlSpecification --version 0.3.0-beta.0 --source "$ACS_KIT/artifacts" && dotnet build` |
| Rust | `mkdir crates && for c in agent_control_specification_core agent_control_specification agent_control_specification_openai agent_control_specification_mcp agent_control_specification_rig; do tar -xzf "$ACS_KIT"/artifacts/$c-0.3.1-beta.0.crate -C crates 2>/dev/null || true; done`, then point `[patch.crates-io]` at the extracted `crates/<name>-0.3.1-beta.0` directories before `cargo check` |
| Python | `python -m venv .venv && .venv/bin/python -m pip install "$ACS_KIT"/artifacts/agent_control_specification-0.3.1b0-*.whl && .venv/bin/python -c "import agent_control_specification as acs; print(acs.AgentControl)"` |
| Node | `npm init -y && npm install "$ACS_KIT"/artifacts/agent-control-specification-0.3.1-beta.0.tgz "$ACS_KIT"/artifacts/agent-control-specification-opa-linux-x64-0.3.1-beta.0.tgz && node -e "const acs=require('agent-control-specification'); console.log(typeof acs.AgentControl)"` |
| .NET | `dotnet new console -n AcsSmoke && cd AcsSmoke && dotnet add package AgentControlSpecification --version 0.3.1-beta.0 --source "$ACS_KIT/artifacts" && dotnet build` |


## Guided generator init
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ Input → Model → Tool Call → Tool Result → Output
## Example

```yaml
agent_control_specification_version: "0.3.0-beta"
agent_control_specification_version: "0.3.1-beta"
metadata:
name: email-agent
policies:
Expand Down Expand Up @@ -82,7 +82,7 @@ tools:
| Item | Value |
| --- | --- |
| Status | Beta and draft |
| Specification version | `0.3.0-beta` |
| Specification version | `0.3.1-beta` |
| Normative spec | [`spec/SPECIFICATION.md`](spec/SPECIFICATION.md) |
| Threat model | [`docs/security-model.md`](docs/security-model.md) |

Expand Down Expand Up @@ -145,7 +145,7 @@ This example is reduced from repository checkout path `examples/ifc_agent`. It u
`manifest.yaml`

```yaml
agent_control_specification_version: "0.3.0-beta"
agent_control_specification_version: "0.3.1-beta"
metadata:
name: "ifc-agent"
policies:
Expand Down Expand Up @@ -247,7 +247,7 @@ In a repository checkout, run the `ifc_agent` example with Cargo to verify the c

| Block | Meaning |
| --- | --- |
| `agent_control_specification_version` | Non empty version string. The current spec describes `0.3.0-beta`. |
| `agent_control_specification_version` | Non empty version string. The current spec describes `0.3.1-beta`. |
| `metadata` | Free form manifest metadata. |
| `extends` | Ordered parent manifest paths or HTTPS URLs merged before the child manifest. |
| `policies` | Named policy definitions. Supported types are `rego`, `test`, and `custom`. |
Expand Down
6 changes: 3 additions & 3 deletions RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Agent Control Specification ships four SDK packages from one source tree. A rele

## Versioning

All SDK and companion packages release together under one version so a given version means the same core across every ecosystem. Bump the version in each package manifest and keep `scripts/check_package_metadata.py` passing, since it asserts package names and versions agree. Python package metadata uses the PEP 440 equivalent for prerelease versions, such as `0.3.0b0` for `0.3.0-beta.0`. The specification document carries its own contract version in `spec/SPECIFICATION.md`, which moves independently of the package version.
All SDK and companion packages release together under one version so a given version means the same core across every ecosystem. Bump the version in each package manifest and keep `scripts/check_package_metadata.py` passing, since it asserts package names and versions agree. Python package metadata uses the PEP 440 equivalent for prerelease versions, such as `0.3.1b0` for `0.3.1-beta.0`. The specification document carries its own contract version in `spec/SPECIFICATION.md`, which moves independently of the package version.

## Step 1. Verify the source

Expand All @@ -35,7 +35,7 @@ gh workflow run release-artifacts.yml
```

```bash
export ACS_VERSION=0.3.0-beta.0
export ACS_VERSION=0.3.1-beta.0
git tag -a "v${ACS_VERSION}" -m "v${ACS_VERSION}"
git push origin "v${ACS_VERSION}"
```
Expand Down Expand Up @@ -79,7 +79,7 @@ Publish all four packages for a version or none. A partial release leaves ecosys
Create the GitHub Release for the tag and attach the build artifacts so users can verify what was published.

```bash
export ACS_VERSION=0.3.0-beta.0
export ACS_VERSION=0.3.1-beta.0
gh release create "v${ACS_VERSION}" --generate-notes
gh run download <run-id> -D dist/release-artifacts
gh release upload "v${ACS_VERSION}" dist/release-artifacts/**/*
Expand Down
2 changes: 1 addition & 1 deletion benchmarks/agentdojo/manifest.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
agent_control_specification_version: "0.3.0-beta"
agent_control_specification_version: "0.3.1-beta"
metadata:
name: acs-agentdojo-benchmark
version: "0.1.0"
Expand Down
2 changes: 1 addition & 1 deletion core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "agent_control_specification_core"
version = "0.3.0-beta.0"
version = "0.3.1-beta.0"
edition = "2021"
rust-version = "1.85"
description = "Stateless Rust core for Agent Control Specification"
Expand Down
6 changes: 3 additions & 3 deletions core/benches/evaluation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use serde_json::{json, Value};
use std::hint::black_box;

const BASE_MANIFEST: &str = r#"
agent_control_specification_version: "0.3.0-beta"
agent_control_specification_version: "0.3.1-beta"
metadata:
name: perf-harness
policies:
Expand Down Expand Up @@ -35,7 +35,7 @@ tools:
"#;

const MID_MANIFEST: &str = r#"
agent_control_specification_version: "0.3.0-beta"
agent_control_specification_version: "0.3.1-beta"
metadata:
name: perf-harness
policies:
Expand All @@ -55,7 +55,7 @@ tools:
"#;

const CHILD_MANIFEST: &str = r#"
agent_control_specification_version: "0.3.0-beta"
agent_control_specification_version: "0.3.1-beta"
metadata:
name: perf-harness
policies:
Expand Down
18 changes: 9 additions & 9 deletions core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ mod tests {

#[test]
fn validates_closed_intervention_point_names_and_tool_intervention_point_constraints() {
let unknown_intervention_point = r#"agent_control_specification_version: 0.3.0-beta
let unknown_intervention_point = r#"agent_control_specification_version: 0.3.1-beta
policies:
test_policy:
type: test
Expand All @@ -243,7 +243,7 @@ intervention_points:
"runtime_error:manifest_invalid"
);

let invalid_tool_name_from = r#"agent_control_specification_version: 0.3.0-beta
let invalid_tool_name_from = r#"agent_control_specification_version: 0.3.1-beta
policies:
test_policy:
type: test
Expand All @@ -265,7 +265,7 @@ intervention_points:
#[test]
fn unknown_tool_fails_closed() {
let manifest = manifest(
r#"agent_control_specification_version: 0.3.0-beta
r#"agent_control_specification_version: 0.3.1-beta
policies:
test_policy:
type: test
Expand Down Expand Up @@ -317,7 +317,7 @@ intervention_points:
#[test]
fn evaluate_only_validates_effects_without_applying_them() {
let manifest = manifest(
r#"agent_control_specification_version: 0.3.0-beta
r#"agent_control_specification_version: 0.3.1-beta
policies:
test_policy:
type: test
Expand Down Expand Up @@ -353,7 +353,7 @@ intervention_points:
#[test]
fn enforce_applies_policy_target_only_effects() {
let manifest = manifest(
r#"agent_control_specification_version: 0.3.0-beta
r#"agent_control_specification_version: 0.3.1-beta
policies:
test_policy:
type: test
Expand Down Expand Up @@ -403,7 +403,7 @@ intervention_points:
#[test]
fn replace_effect_can_transform_policy_target_to_json_null() {
let manifest = manifest(
r#"agent_control_specification_version: 0.3.0-beta
r#"agent_control_specification_version: 0.3.1-beta
policies:
test_policy:
type: test
Expand Down Expand Up @@ -434,7 +434,7 @@ intervention_points:
#[test]
fn annotation_dispatch_runs_before_policy_and_finalizes_policy_input() {
let manifest = manifest(
r#"agent_control_specification_version: 0.3.0-beta
r#"agent_control_specification_version: 0.3.1-beta
policies:
test_policy:
type: test
Expand Down Expand Up @@ -484,7 +484,7 @@ annotators:
#[test]
fn dispatcher_panics_fail_closed_without_poisoning_runtime_reuse() {
let annotated_manifest = manifest(
r#"agent_control_specification_version: 0.3.0-beta
r#"agent_control_specification_version: 0.3.1-beta
policies:
test_policy:
type: test
Expand Down Expand Up @@ -528,7 +528,7 @@ annotators:
assert_eq!(second_annotation.verdict.decision, Decision::Allow);

let policy_manifest = manifest(
r#"agent_control_specification_version: 0.3.0-beta
r#"agent_control_specification_version: 0.3.1-beta
policies:
test_policy:
type: test
Expand Down
22 changes: 11 additions & 11 deletions core/src/manifest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1203,7 +1203,7 @@ mod tests {
}

fn base_manifest() -> &'static str {
r#"agent_control_specification_version: 0.3.0-beta
r#"agent_control_specification_version: 0.3.1-beta
policies:
p:
type: test
Expand Down Expand Up @@ -1252,7 +1252,7 @@ intervention_points:
fn extends_allows_annotation_only_point_overlay() {
let base = root_path(
"annotation-only-base.yaml",
r#"agent_control_specification_version: 0.3.0-beta
r#"agent_control_specification_version: 0.3.1-beta
metadata:
name: base
policies:
Expand All @@ -1274,7 +1274,7 @@ intervention_points:
let overlay = root_path(
"annotation-only-overlay.yaml",
&format!(
r#"agent_control_specification_version: 0.3.0-beta
r#"agent_control_specification_version: 0.3.1-beta
extends:
- {}
annotators:
Expand Down Expand Up @@ -1457,7 +1457,7 @@ intervention_points:
let path = root_path(
"https-string.yaml",
&format!(
"agent_control_specification_version: 0.3.0-beta\nextends:\n - {url}\nmetadata:\n name: child\n"
"agent_control_specification_version: 0.3.1-beta\nextends:\n - {url}\nmetadata:\n name: child\n"
),
);

Expand All @@ -1476,7 +1476,7 @@ intervention_points:
let path = root_path(
"https-integrity.yaml",
&format!(
"agent_control_specification_version: 0.3.0-beta\nextends:\n - url: {url}\n integrity: {}\n",
"agent_control_specification_version: 0.3.1-beta\nextends:\n - url: {url}\n integrity: {}\n",
sri(&body)
),
);
Expand All @@ -1494,7 +1494,7 @@ intervention_points:
let path = root_path(
"https-bad-sha.yaml",
&format!(
"agent_control_specification_version: 0.3.0-beta\nextends:\n - url: {url}\n sha256: {}\n",
"agent_control_specification_version: 0.3.1-beta\nextends:\n - url: {url}\n sha256: {}\n",
"00".repeat(32)
),
);
Expand All @@ -1513,7 +1513,7 @@ intervention_points:
] {
let path = root_path(
name,
&format!("agent_control_specification_version: 0.3.0-beta\nextends:\n - {url}\n"),
&format!("agent_control_specification_version: 0.3.1-beta\nextends:\n - {url}\n"),
);
let error =
load_with_fetcher(&path, MockFetcher::new(BTreeMap::new()), Limits::default())
Expand All @@ -1527,11 +1527,11 @@ intervention_points:
fn url_extends_detects_url_cycles() {
let url = "https://policy.example/cycle.yaml";
let body =
format!("agent_control_specification_version: 0.3.0-beta\nextends:\n - {url}\n");
format!("agent_control_specification_version: 0.3.1-beta\nextends:\n - {url}\n");
let fetcher = MockFetcher::new(BTreeMap::from([(url.to_string(), body.into_bytes())]));
let path = root_path(
"https-cycle.yaml",
&format!("agent_control_specification_version: 0.3.0-beta\nextends:\n - {url}\n"),
&format!("agent_control_specification_version: 0.3.1-beta\nextends:\n - {url}\n"),
);

let error = load_with_fetcher(&path, fetcher, Limits::default()).unwrap_err();
Expand All @@ -1546,7 +1546,7 @@ intervention_points:
let fetcher = MockFetcher::new(BTreeMap::from([(url.to_string(), b"abcdef".to_vec())]));
let path = root_path(
"https-large.yaml",
&format!("agent_control_specification_version: 0.3.0-beta\nextends:\n - {url}\n"),
&format!("agent_control_specification_version: 0.3.1-beta\nextends:\n - {url}\n"),
);

let error = load_with_fetcher(
Expand All @@ -1570,7 +1570,7 @@ intervention_points:
let path = root_path(
"https-duplicate.yaml",
&format!(
"agent_control_specification_version: 0.3.0-beta\nextends:\n - {url}\n - {url}\n"
"agent_control_specification_version: 0.3.1-beta\nextends:\n - {url}\n - {url}\n"
),
);

Expand Down
Loading
Loading