Create your account
Set up your organization's AI control plane.
or
Already have an account? Sign in
Welcome back
Sign in to your control plane.
or
Set up Cascade
Connect your agents. Say what they may never do. Give them real work, and see what actually changed. Open any step for the details.
1
Connect your agents
Cascade discovers them from your registry, with versions, owners and declared capabilities
expand_more

If your organization publishes agents to Google Agent Registry, Cascade reads them there. Nothing is hardcoded, and an agent approved tomorrow is usable the same day.

CASCADE_AGENT_REGISTRY=google
GOOGLE_CLOUD_PROJECT=your-project

An agent reaches Cascade over MCP, or over REST if it has no MCP client:

{
  "mcpServers": {
    "cascade": {
      "command": "cascade-mcp",
      "args": ["--repo", "/path/to/your/repo"]
    }
  }
}

Work is routed by capability, never by agent name. You state a goal; Cascade asks the registry who is entitled to each part of it.

2
Say what each agent may never do
A denial outranks any grant, so reaching past it is a security event rather than a surprise
expand_more
Refund Agent  v2.1   owner: finance@yourorg.com

  can       payments.read
            payments.refund

  cannot    customer.delete
            communication.send

Cannot is not the same as leaving a capability out. Absent means nobody has said. Cannot means somebody said no, and no grant anywhere overrides it.

Thresholds and business rules sit alongside it in plain YAML, evaluated with no model in the decision path:

- id: refund-threshold
  when:    { action: issue_refund, amount: { gt: 20000 } }
  then:    require_approval
  because: "Refunds over 20,000 need a named approver"

Your live boundary is on Fleet › Capabilities, and your rules on Control › Policies.

3
Connect your systems
Agents never touch them directly. Cascade holds the boundary in between
expand_more

A system reaches Cascade through an adapter, which declares for each tool whether its effect can be taken back. That declaration is what decides whether work runs unattended, waits for a person, or can be undone at all.

Operations     connected     candidate and payment records
Suppliers      connected     verification, contracts, inventory
Communications connected     messages, irreversible once sent

Your ERP       adapter       write one, and the same boundary applies

Three adapters ship with Cascade, over synthetic systems so nothing here touches real records. The runtime knows nothing about candidates, suppliers or refunds: it knows actions, reversibility and capability, which is why the same boundary works over a payments provider and a git repository.

4
Give it real work
Plan, dispatch, rehearse, decide. Every action gets one of three answers
expand_more

State a goal in the operator's words on Operations › Goals, or post one:

curl -X POST /api/goal \
  -H "Authorization: Bearer $CASCADE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"goal": "Onboard Acme as an approved supplier"}'

Each agent works in its own copy of your world. Cascade reads what actually changed there, not what the agent said it would do, and answers per action:

COMMIT   safe and recoverable, so it becomes real now
GATE     cannot be taken back, so a named person decides
BLOCK    breaks a capability, a policy, or a proven rule

Running agents needs Vertex AI credentials on the server. Without them a goal is accepted and the run fails.

5
See what happened, and undo it
Every decision recorded before execution, with who asked and why it went that way
expand_more
247 actions judged
  231  committed          nobody was interrupted
   11  refused            with the rule and the evidence
    5  awaiting approval  nothing has happened yet

each carries  the agent and its version, who asked,
              the capability, what actually changed,
              the rule evaluated, and the decision

The ledger is written before execution, so a crash leaves a decision with no effect, never an effect with no decision. To reverse a goal, use Roll back, or:

curl -X POST /api/goal/GOAL_ID/rollback \
  -H "Authorization: Bearer $CASCADE_TOKEN"

Rollback replays each action's inverse in reverse order. Anything that could not be undone is reported as such, never quietly counted as reversed.

You can reopen this from the docs at any time.

SHADOW MODE -- Nothing is being blocked
Not connected
dark_mode
notifications
–
Every consequential change your agents attempt passes through here first.
demo workspace
Start work
What would you like your agents to accomplish?
State the outcome, not the steps. Cascade asks the registry which approved agents hold each capability the goal needs, runs their work in isolation, and decides what any of it is allowed to change.
Agents
–
discovered from your registry
Decisions
–
every verdict, not only refusals
Systems
–
connected, behind the boundary
Awaiting you
–
nothing is waiting
account_tree
Departments
grouped from what the fleet published
bolt
Recent actions
Live
  • Waiting for the API.
monitor_heart
System health
  • Policy engineOK
  • Ledger writerOK
  • Rollback storeOK
  • Approval queue–
  • Agent registry–
donut_small
Verdicts
across every goal run here
No goals have run yet.
–
extension
Capability map
–
CapabilityStatusHeld byDenied toProvided by
Waiting for the API.
upload
What we would send
–
Only proven precedents travel. A declared one is somebody's authority inside this company and carries none outside it; forwarding an imported one would launder a rule through a second organization that never proved it either.

File paths, record keys, commit hashes and commit subjects stay home. None of it is needed to re-prove a rule elsewhere, and all of it describes the inside of a company.
download
What arrived
–
Nothing that arrives is a rule. It is a hypothesis, and it enters quarantine where it can enforce nothing. The only way out is to replay the check that came with it against our own history, where it has to fail before our remediation and pass after, exactly as a locally mined candidate must.

A rule that cannot tell our two states apart is discarded, however well it worked at the company that sent it.
Agent› capability› isolated fork› diff› policy and invariants› commit, gate or block› the system
undo
Why reversibility decides everything

Reversible. The exact prior state is restorable. Runs unattended, and is safe to retry after a conflict.

Compensable. The effect is offset rather than erased. Runs unattended, and the compensation is recorded instead of pretending nothing happened.

Irreversible. No way back. Deferred to the end of a plan, gated on a named person, and never optimistically retried.

A tool that declares nothing is treated as irreversible. The conservative default means a tool nobody thought about carefully ends up in front of a human rather than out the door.

target
Run a goal
Work is discovered by capability, never assigned by name
history
Recent goals
GoalOutcomeCommittedGatedRefusedWhen
No goals yet.
code
Run the code agent
Changes source in a git worktree fork, guarded by mined precedents

This edits a repository. To put your business agents to work, use Goals instead.

play_circle
All runs
Today
Run IDAgentActionsOutcomeDurationStarted
Waiting for the API.
bolt
Action log
ActionRunVerdictReversibilityPolicy firedTime
Waiting for the API.
receipt_long
Ledger entries
Written before execution
EntryActionEntityChangeRunCommitted at
Waiting for the API.
history
Rollback detail
Select a run to see its compensation steps
StepEntityBeforeAfter (restored)Rev
Waiting for the API.
Cascade architecture

Nothing on these is aspirational. Every service named is reported live by /api/healthz, and every ADK primitive named is imported somewhere in src/cascade.

Google Agent Platform
registry · identity · memory · armor · traces
arrow_forward
Cascade
rehearse · diff · decide
arrow_forward
Your systems
what agents actually change
cloud_done
Google Agent Platform
–
database
Systems agents act on
reversibility is declared per tool, and the boundary reads it

Everything marked SANDBOX is a demonstration surface, not a connected system of record. Each one is reached through an adapter, so the same boundary works against a real ERP or payment provider without the runtime knowing the difference.

api
API endpoint
BACKEND URL
Points to your FastAPI Cascade server. For Cloud Run, use your service URL.
# Start the local dev server
cd /path/to/cascade
uvicorn server:app --reload --port 8000
cloud
Google Cloud Run
Deploy the Cascade backend to Cloud Run in one command. The frontend deploys to Firebase Hosting automatically.
# Deploy backend to Cloud Run
gcloud run deploy cascade-api \
  --source . \
  --region us-central1 \
  --allow-unauthenticated

# Deploy frontend to Firebase
firebase deploy --only hosting