--- title: 'triggers' description: 'List the trigger links of a running agent installation, and see which ones may start themselves' position: 27 --- # stackbone triggers > `stackbone triggers` targets a **running agent installation**. With no > `--agent` it runs against the local-dev installation linked to the current > project, so `stackbone dev` must be running. See > [target resolution](/docs/cli/reference/conventions#target-resolution). > Every verb accepts `--json` and emits the > [standard envelope](/docs/cli/reference/conventions#json-output). Read the **trigger links** of the targeted installation. A trigger link connects a connector trigger to a workflow: each event the trigger delivers starts a run of that workflow. You create and edit links on the Triggers screen in Studio. This command only reads them. | Command | Purpose | | ----------------------------------------------------- | -------------------------------------------------------------------------- | | [`stackbone triggers list`](#stackbone-triggers-list) | List every link, and show a warning under each link that may start itself. | ## stackbone triggers list List every trigger link: its id, whether it is on or off, the connector and trigger it reads, and the workflow it starts. | Flag | Type | Description | | --------- | ------ | ------------------------------------------------------------- | | `--agent` | string | Installation id to target. Defaults to the local-dev install. | ```text 3f2a9c1e-5b7d-4e8a-9c0f-1a2b3c4d5e6f on gmail · new-email → reply-to-email warning: This link may start itself: a run it started wrote back through "gmail" (send_email) without asking isOwnEcho, so if the trigger delivers that write, the workflow runs again. Open the step with `if (await isOwnEcho('gmail', )) return;`. 8d4f0b6a-1e33-4a71-9c2e-9b1c7f423f6a off linear · updated_issue → triage ``` ### The echo-loop warning A workflow that answers a trigger by writing back through the same connection can cause the event that trigger reads. The workflow then starts itself again. [`isOwnEcho`](/docs/home/features/trigger-events#when-your-workflow-writes-back-through-the-same-connection) stops that loop. The `warning:` line shows when a run that the link started did all of these things in the last hour: - It called an operation on the link's own connector, and the call named an `echoPath`. - It did not call `isOwnEcho` for that connector. The warning names the connector and the operation of the most recent such write. A link shows one warning, however many runs made such a write. A link that is off shows none. The warning says the link **may** start itself. The box sees the shape of a loop, not the object the write changed: a file written to a folder the trigger does not watch makes no loop, and still gets the warning. A call that names no `echoPath` counts as a read and raises nothing. To clear the warning, call `isOwnEcho` for that connector before the write. A run that called it is not counted, whatever the guard answered. The warning goes away when no run in the last hour wrote without the guard. The same warning shows as a banner on the trigger's page in Studio. **JSON payload** ```jsonc { "schema_version": 1, "items": [ { "id": "3f2a9c1e-5b7d-4e8a-9c0f-1a2b3c4d5e6f", "connector": "gmail", "trigger": "new-email", "workflowName": "reply-to-email", "enabled": true, "activity": { "firedCount": 12, // ...the rest of the link's activity "echoLoop": { "connector": "gmail", "operation": "send_email", "runId": "4c8d2e17-9a0b-4f3c-8e6d-7b5a1c2d3e4f", "at": "2026-06-01T10:05:00Z", } /* or null */, }, }, ], } ``` `echoLoop.runId` is the run that made the most recent unguarded write. Open it with [`stackbone runs get`](/docs/cli/reference/runs#stackbone-runs-get).