> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rotascale.com/llms.txt
> Use this file to discover all available pages before exploring further.

# AWS Strands

> Govern AWS Strands with one line: watch_strands wraps a Strands agent, and every model call, tool call and retrieval lands on the trajectory.

AWS Strands.

```python theme={"system"}
from rotascale.middleware import watch_strands

agent = watch_strands(my_strands_agent)
```

That is the whole integration. From here every call the client makes is recorded
on the open trajectory.

## What is distinctive

Reads the agent's **tool manifest** at wrap time and reports it as provenance. That is what lets a clearance bind to the tools an agent can reach, so gaining one voids it — see [certification](/concepts/certification).

## In context

```python theme={"system"}
from rotascale import Rotascale

client = Rotascale()
agent = client.agent("refund-bot")

with client.witness(agent) as trajectory:
    trajectory.authorize(GRANT, {"tools": ["issue_refund"]}, amount_minor=4_500)
    # ... your AWS Strands calls here, already wrapped ...
```

The `witness` block opens the trajectory and closes it on exit, including when
the body raises — an episode that ended badly is exactly the one worth having a
record of.

## Recording without content

```python theme={"system"}
watch_strands(agent, capture_content=False)
```

Shape and metadata only: model, latency, token counts, tool names. No prompt or
response text. The governed facts are unchanged.

<Tip>
  Authority is never asked for by an adapter. It stays an explicit
  `trajectory.authorize(...)` call, so importing a middleware can never become a
  spend decision. See [authorise an action](/guides/authorise-an-action).
</Tip>
