Run your first authenticated agent journey
Marc Sterling, a director at Austin-based private equity firm Vantis Equity, needs to oversee an acquisition on-site in Shanghai. He uses Tourfedia's corporate travel management platform to organize his trip from Austin (AUS) to Shanghai (PVG).
Run AAC: two tenants, one reservation made from a fresh machine with the public Docker Compose demo. Vantis Equity's trip-planner delegates to Tourfedia's booking agent. You will register both tenants, run their agents and sidecars, verify a signed receipt, and inspect the execution graph.
The example application creates a reservation result; supplier integration and payment are omitted for clarity. The approval is simulated. A 30-minute limit bounds delegated authority, not a price hold.
Before you start
Use macOS or Linux with a Bash-compatible shell, Git, Python 3.11 or later
with venv and pip, and Docker with Compose and Buildx. Start the Docker
engine. Keep the machine's clock synchronized and its public CA store current.
Allow outbound HTTPS to GitHub, PyPI, Docker Hub, GHCR and the
AAC stage endpoints.
You need a browser for interactive GitHub sign-in and real contact email addresses.
The same human can own both tenants; a contact email does not select the sign-in account.
The steps below create the tenants and prepare credentials. AAC assigns the trust domains; you do not need to own DNS, provision a CA or run Valkey for this local example. Docker keeps each agent/sidecar pair's loopback private and places the pairs on an isolated network without publishing host ports.
| Public component | How it is supplied |
|---|---|
| AAC CLI | Install it in your host virtual environment; includes aac and aeg; ./demo prepare freezes the run selection |
| AAC sidecar | Compose pulls the selected immutable image |
| Trust anchor publisher / Python package | Compose runs the publisher image for each tenant |
| aac-invoke-auth | Supplied inside the example application image |
| Python image, Uvicorn and HTTPX | Supplied inside the application image; host Python is also needed for CLI setup |
No minimum production sizing or fixed first-run duration is implied. Image and package downloads, sign-in and local build speed affect elapsed time. Measure registration-to-verified-result separately from cached start/run time.
1. Install AAC CLI and prepare the example
Install AAC CLI
Install aac-cli from PyPI in a virtual
environment. The package supplies both aac and aeg; its PyPI page also
contains installation and usage documentation.
python3 -m venv .aac-tools
. .aac-tools/bin/activate
python -m pip install --upgrade aac-cli
aac --version
aeg --version
Prepare the Docker Compose example
Keep that virtual environment active, then download and prepare the example:
git clone https://github.com/CascadeAuth/aac-compose-demo.git
cd aac-compose-demo
./demo prepare
mkdir -p .local
export AAC_CLI_HOME="$PWD/.local/aac"
cp config/trip-planner.yaml .local/trip-planner.yaml
cp config/booking.yaml .local/booking.yaml
Keep this environment variable in each terminal used for the demo. It gives the demo its own CLI home and leaves your other profiles alone.
These are operator-authored inputs, supplied explicitly with
--agent-config. The CLI alone generates keys, certificates, publisher
configuration, compose.env and sidecar-config.yaml. Never hand-edit those
generated outputs or consume the private record.json schema.
The inputs select Basic in-memory replay protection with dev_mode: false.
Development-issued certificates do not require development exceptions.
Each pair shares its own loopback interface; the sidecars communicate over a
private Docker network using HTTPS names trip-planner and booking.
No host ports are published.
./demo prepare resolves the current stable AAC package releases from PyPI and the
sidecar from the published release record, then resolves exact container digests.
It saves .local/components.json and installs the selected CLI in your active
virtual environment. Subsequent starts and maintenance reuse that file; they
never silently change a running demo. To start a new run with newer components,
stop the demo, retain the old receipt, and move the selection file aside before
running ./demo prepare again. There is no mutable sidecar latest tag.
Outcome: the released CLI is installed, component versions/digests are frozen for this run, and each agent has an editable input file. Keep using this shell.
2. Register your developer tenant accounts
Set your real contact addresses:
export VANTIS_CONTACT='you+vantis@example.com'
export TOURFEDIA_CONTACT='you+tourfedia@example.com'
aac init \
--profile vantis \
--agent trip-planner \
--agent-config .local/trip-planner.yaml \
--layout container \
--admin-url https://api.stage.cascadeauth.dev \
--data-plane-url https://api.stage.cascadeauth.dev \
--trust-url https://trust.stage.cascadeauth.dev \
--idp github \
--display-name 'Vantis Equity Demo' \
--contact "$VANTIS_CONTACT"
aac init \
--profile tourfedia \
--agent booking \
--agent-config .local/booking.yaml \
--layout container \
--admin-url https://api.stage.cascadeauth.dev \
--data-plane-url https://api.stage.cascadeauth.dev \
--trust-url https://trust.stage.cascadeauth.dev \
--idp github \
--display-name 'Tourfedia Demo' \
--contact "$TOURFEDIA_CONTACT"
Run interactively and acknowledge each permanent tenant registration. There
are two sign-ins per tenant: registration and administration. Use the same
GitHub account for both sign-ins of that tenant. A rerun reuses its registration;
it does not create another tenant. Noninteractive registration additionally
requires the explicit --create-tenant acknowledgement.
The assigned domains come from AAC; owning tourfedia.com is not a trust-domain
binding. Empty peer configuration is intentional during initial registration.
Outcome: two tenant IDs and AAC-assigned domains, registered workloads, separate keys/certificates and generated container configuration. The CLI creates development PKI for this example; it does not qualify these identities for production. The agent runs application policy, its sidecar verifies/delegates authority, and its tenant's publisher publishes public roots and CA certificates.
For enterprise registration, use the CLI user guide and its enterprise IdP ceremony before preparing your own workloads.
3. Connect the two peers
Read the registered facts through supported CLI status output:
aac agent status --agent trip-planner --output json > .local/vantis-status.json
aac agent status --agent booking --output json > .local/tourfedia-status.json
VANTIS_TENANT=$(aac agent status --agent trip-planner --field tenant-id)
VANTIS_DOMAIN=$(aac agent status --agent trip-planner --field hosted-trust-domain)
VANTIS_ID=$(aac agent status --agent trip-planner --field workload-spiffe-id)
TOURFEDIA_TENANT=$(aac agent status --agent booking --field tenant-id)
TOURFEDIA_DOMAIN=$(aac agent status --agent booking --field hosted-trust-domain)
TOURFEDIA_ID=$(aac agent status --agent booking --field workload-spiffe-id)
Append these sections once to the input copies. The peer's public CA
path is an explicit trust choice; no private key is exchanged.
ca.crt is the peer's public CA certificate, the same anchor it publishes
through AAC. In a real deployment the peer supplies that public certificate;
reading it from the other agent's local directory is a convenience of running
both tenants on one machine, not a requirement to access a peer's private files.
cat >> .local/trip-planner.yaml <<EOF
trust_anchors:
tenant_ids: [$TOURFEDIA_TENANT]
spiffe_bundles:
trust_domains: [$TOURFEDIA_DOMAIN]
https_trust:
ca_files: ["$AAC_CLI_HOME/agents/booking/agent/ca.crt"]
destinations:
tourfedia:
url: https://booking:9443/v1/agent/receive
audience_pattern: $TOURFEDIA_ID
valid_for: +30m
timeout_ms: 10000
EOF
cat >> .local/booking.yaml <<EOF
trust_anchors:
tenant_ids: [$VANTIS_TENANT]
spiffe_bundles:
trust_domains: [$VANTIS_DOMAIN]
https_trust:
ca_files: ["$AAC_CLI_HOME/agents/trip-planner/agent/ca.crt"]
EOF
aac init --profile vantis --agent trip-planner --agent-config .local/trip-planner.yaml
aac init --profile tourfedia --agent booking --agent-config .local/booking.yaml
These three trust settings have different jobs: verify tenant root signatures,
verify workload certificates, and verify outbound HTTPS connections.
The destination names the exact registered booking identity. The initial
class supplies valid_for: +2h; the destination supplies +30m.
Dynamic amounts come only from the application. Released native chain starts
refuse conflicting class/request values and any request-supplied
valid_until.
Outcome: each sidecar knows the other tenant's public trust and the planner has an explicit booking destination. If interrupted, inspect your input copies: do not append duplicate YAML sections. Rerun the final init commands to apply the completed inputs while preserving the existing identities.
4. Run and verify the reservation
./demo up
./demo run
Startup builds the application image, starts the pairs and publishers, and waits for readiness and public trust publication. The normal run reserves at $8,000 under the simulated $10,000 approval. It waits up to 30 seconds for correlated completion; missing evidence or failure exits nonzero.
Success: output includes the actual task/root IDs, reservation and signed
receipt, with terminal_attestation_verification: verified. An HTTP 200 or a
dispatched acknowledgement alone does not establish this result.
The demo also supplies fare-change and fresh-authority exercises and refusal exercises. They start separate attempts; a new authorization does not widen an old chain.
5. List, select and render an execution
Each successful run saves its mint response under .runs/, prints the actual
evidence paths and a complete render command. For discovery, list both agents'
local files in the same shell:
PLANNER_STATE="$AAC_CLI_HOME/agents/trip-planner/state"
BOOKING_STATE="$AAC_CLI_HOME/agents/booking/state"
aeg list \
--events "$PLANNER_STATE/telemetry.jsonl" \
--events "$BOOKING_STATE/telemetry.jsonl" \
--actions "$PLANNER_STATE/actions.jsonl" \
--actions "$BOOKING_STATE/actions.jsonl" \
--since 24h \
--output table
Choose the root ID for the attempt you want. Replace ROOT_ID below with that
listed value, or use the complete command printed by the demo for its saved
mint response. Do not combine attempts just because they share an order number.
aeg render \
--events "$PLANNER_STATE/telemetry.jsonl" \
--events "$BOOKING_STATE/telemetry.jsonl" \
--actions "$PLANNER_STATE/actions.jsonl" \
--actions "$BOOKING_STATE/actions.jsonl" \
--root-token-id ROOT_ID \
--output .runs/selected.html
Open .runs/selected.html in a browser; it is self-contained and needs no web
server. Inspect nodes for identities, narrowing, actions and receipt evidence.
Add --profile vantis to list/render with authorized central metadata, or use
only that profile for central observations. Local files are never uploaded.
Missing partner evidence is labeled as partial; a business-action record is
not itself a verified receipt. See Execution graphs
for source modes, filtering, pagination and interpretation.
6. Stop the example and keep your evidence
./demo down
This removes local containers/network while retaining .local/ credentials,
the CLI home, component receipt and .runs/ evidence. Tenant registrations
are permanent; deleting a local profile does not delete a tenant. Protect
retained keys and use the supported lifecycle commands to retire test workloads.
For later work, reactivate .venv and set the same AAC_CLI_HOME; follow the
demo's refresh and renewal procedure.
Troubleshooting your first run
| Symptom | Next action |
|---|---|
| Docker or Compose unavailable | Start Docker and check docker compose version and docker buildx version |
| Registration/sign-in interrupted | Rerun the same init command with the same CLI home/profile; use the same account for both sign-ins of that tenant |
| Startup waits for trust | Check aac agent status --agent trip-planner --remote and aac agent status --agent booking --remote; confirm publishers are running and the expected public CA/root is visible |
| Peer TLS or identity refusal | Check the explicit peer public-CA paths, domain and workload ID in the input YAML; apply it again through init |
| Expired certificate | Follow the demo's renewal procedure; refresh peer public trust if the CA changed |
| No verified receipt or missing graph evidence | Keep the failed output and actual task/root IDs; inspect both agents' retained evidence. Do not count readiness or an empty graph as success |
See operations and error codes for focused diagnosis. Never resolve a refusal by disabling authentication, identity validation or replay checks.
What AAC is for
AAC carries delegated authority between agents with workload identity, local verification and auditable receipts. Applications retain their business policy. The authority and integration reference explains chains, receipts, predicates, pairing and the separate A2A example.
Deploy beyond the example
The local example uses Basic replay with ordinary security checks enabled. Basic retains duplicates within one running process, loses history on restart and does not coordinate replicas of the same receiving identity. Use Shared durable with the qualified authenticated-TLS Valkey deployment when you need retained replay history or replica coordination; it never falls back to Basic.
Retained A2A dispatch results are a separate mechanism for safe retries across restart. They are not the replay cache or ordinary audit logs. The native reservation demo does not qualify production A2A storage or delivery guarantees.
For one tenant with many agents, use the production journey and 100-agent role table. Tenant setup happens once; workloads, identities and pairing secrets belong to each agent. Supplied-certificate setup uses your own issuer. Publisher ownership is one root-set writer per tenant and one SPIFFE-bundle writer per active binding; hosted and custom domains may use separate processes without competing writers.
References
| Need | Public reference |
|---|---|
| Tenant and agent deployment, concrete ingress/PKI/storage requirements | Deployment |
| Keys, certificates, pairing secrets and custody | Keys and certificates |
| CLI user journeys and generated command reference | CLI documentation |
| Protocol and optional A2A integration | Integration |
| Diagnostics, audit, credential lifecycle and rollback | Operations |
| Verify a container or audit artifacts — optional; standalone installation | Artifacts |
Configuration and workflow state
The configuration reference explains accepted settings and how authority, business payloads and retained state differ. Use the CLI to apply changes to managed agent inputs.
Beta boundary and contact
The sidecar is public developer-beta software under the
AAC Sidecar Developer Beta Binary License 1.0.
Read the third-party notices.
For support contact support@cascadeauth.com; license questions:
legal@cascadeauth.com. No production support/SLA is implied.
This beta is for evaluation and integration development, not production or
safety-critical use. Python companions retain their own licenses.
Current installation examples select AAC Sidecar v0.4.4 from
docker.io/cascadeauth/aac-sidecar:v0.4.4; the published component record and
each run's selection retain exact version/digest provenance.