Steer on Traza Cloud
Steering is the engine’s live runs, nudges and run topology, with Traza Cloud’s reach added: every project at once, your phone, your Slack. The engine side is in its Steer guide.
Mission Control
The organization’s Live page lists the runs working right now in every project, and each project has its own. A row is a run’s state in the run guard: the step it is on (or the tool it is about to call, when a pre-call check named it), its steps, cost and tokens, its guard verdict and reasons, its pending nudges, its foresight, and a small graph of its agents. Rows update as runs change.
A run is live while its last activity is recent: a span arriving, or a pre-call check that names its next step. Reading a run’s verdict does not keep it live, so a dashboard polling a run cannot.
Runs in progress come first. A run with no activity for 30 seconds moves below them, dimmed, as idle or finished: the live view cannot tell a finished run from a paused one, so it says both, and the run leaves the board when its last activity falls out of the live window (15 minutes by default). A run its guard stopped stays with the runs in progress until someone approves it or the window passes. The board shows a page of cards at a time, with Show more for the rest; its filters and search cover every live run, not just the cards on screen.
Each row has three actions:
| Action | What happens on the engine |
|---|---|
| Nudge | Queues advice (words for the agent) or a block (a veto of its next step), delivered at its next pre-call check |
| Kill | Pulls the kill switch: POST /v1/fuses/runs/{run}/trip. The run stays stopped until someone resets it |
| Approve to continue | Resets the run, with a grant that raises its limits so it can go on |
Your role in the organization decides which actions you see.
The same live view is in the API, with a read or full key:
curl -s https://api.trazadb.com/v1/runs/live -H "Authorization: Bearer $TRAZA_API_KEY"
# As server-sent events: a snapshot, then one event per changed run
curl -sN https://api.trazadb.com/v1/runs/live/stream -H "Authorization: Bearer $TRAZA_API_KEY"
Nudges
A nudge is delivered once, in the nudges field of the run’s next
pre-call check that names a step ("next": {...}; the Claude Code hook pack
and both SDKs always send it). advice leaves the verdict to the guard;
block answers that check stop with the message as its first reason, and
every other check of the run in the two seconds after, so a batch of tool
calls is refused together. A block trips nothing: after the hold the run is
judged as usual. A check that names no step is a verdict read, and never takes
a nudge.
Queue nudges from Mission Control, a push notification or Slack, or from your
own automation with a full key. A message is 1 to 4,096 bytes, waits at
most 7 days (an hour by default), and a run holds at most 32 pending nudges.
Keep personal data out of them, as you would out of a kill switch reason.
# Queue one (kind: advice or block; ttl_seconds optional, default 3600)
curl -s https://api.trazadb.com/v1/runs/sess-42/nudges \
-H "Authorization: Bearer $TRAZA_API_KEY" \
-d '{"message": "Hold refunds over $500 for a human.", "kind": "block", "ttl_seconds": 600}'
# A run's nudges, each pending, delivered or expired
curl -s https://api.trazadb.com/v1/runs/sess-42/nudges -H "Authorization: Bearer $TRAZA_API_KEY"
Both POST /v1/runs/{run}/nudges and GET /v1/runs/{run}/nudges take a
full key; ingest and read keys reach neither (403). A nudge is text an
agent will act on, so give full keys only to automation you would let
instruct your agents. A nudge queued with a key is that key’s act: the agent
gets the text as written, and only nudges queued from the console, a
notification or Slack are in your organization’s audit log, with the member
who sent them. The list takes a full key too, because a read key is what
an agent or an MCP client usually holds, and an agent hears its nudges
through its check, not by reading the queue.
Your agent hears nudges only if it checks before its steps. In Python:
import os, httpx
def before_step(run_id: str, tool: str | None = None) -> None:
r = httpx.post(
"https://api.trazadb.com/v1/fuses/check",
headers={"Authorization": f"Bearer {os.environ['TRAZA_API_KEY']}"},
json={"run": run_id, "next": {"tool": tool} if tool else {}},
timeout=5,
)
r.raise_for_status()
verdict = r.json()
for nudge in verdict.get("nudges", []):
print(f"queued in Traza ({nudge['kind']}): {nudge['message']}") # hand it to your agent
if verdict["verdict"] == "stop":
raise RuntimeError("; ".join(verdict["reasons"]))
Any key can ask the check. The key that receives nudges should be the agent’s
alone: whoever sends next for a run takes its nudges.
On your phone
The console installs as an app (a web app; no app store): use your browser’s
Install or Add to Home Screen. Under Alerts, add a push
destination on each device you want to reach, and the browser asks once for
permission. Rules can then send a run stopped by a fuse, a run whose
foresight reaches likely_failure, and quota events to it.
A notification carries Approve, Kill and Open. Each button holds a one-time token bound to you, the run and the action, which expires after 15 minutes and works once. A press that never reached the run’s cell can be tried again; once the cell may have acted, the button is spent even if its answer was lost (the notification then says so, and opening the run shows where it stands), so one press never acts twice. Nudge… opens the run in the app with the nudge box focused. Notifications go through your browser vendor’s push service with the payload encrypted for your device; the app caches no telemetry offline.
In Slack
Install the Traza app for your organization from Alerts → Slack. Fuse and foresight alerts then arrive as messages with Approve, Kill and Nudge… (which opens a box for the message). The first time you press one, Slack asks you to link your Slack account to your Traza account; after that, each press is checked against your role before anything reaches the engine, and the message is updated in place to say who did what. Slack alerts need a plan with Slack alerts (pricing).
Claude Code
The engine’s hook pack puts the pre-call check in front of every Claude Code
tool call, delivering nudges and refusing calls on a stop; run the importer
beside it so the session is a live run. See
Claude Code and Codex.
Topology and ping-pong
GET /v1/runs/{run}/topology returns a run’s agents, who delegated to whom,
the handoff sequence and its cycles. A policy’s max_handoff_cycles stops a
run whose agents keep handing control straight back to each other:
curl -s https://api.trazadb.com/v1/fuses/policies \
-H "Authorization: Bearer $TRAZA_API_KEY" \
-d '{"name": "support", "match": {"service": "support-app"},
"limits": {"max_handoff_cycles": 2, "max_cost_usd": 2.0}, "action": "stop"}'
Cycles count named agents only: set gen_ai.agent.name on your agents’ steps.