| name | debug |
| description | Investigate stuck runs and execution failures by tracing Symphony agent-provider logs with issue/session identifiers; use when runs stall, retry repeatedly, or fail unexpectedly. |
Debug
Goals
- Find why a run is stuck, retrying, or failing.
- Correlate tracker issue identity to an agent-provider session quickly.
- Read the right logs in the right order to isolate root cause.
Log Sources
- Primary runtime log:
log/symphony.log
- This is the default runtime log path unless the deployment configures a
different one.
- Includes orchestrator, agent runner, and agent-provider lifecycle logs.
- Rotated runtime logs:
log/symphony.log*
- Check these when the relevant run is older.
Correlation Keys
issue_identifier: human ticket key (example: MT-625)
issue_id: tracker-native internal ID
session_id: provider-neutral agent session identifier; exact format is
provider-owned
thread_id: optional provider-native thread/conversation identifier
turn_id: optional provider-native turn/message identifier
The structured logging contract uses these fields for issue/session lifecycle
logs. Use session_id as the primary cross-provider join key during
debugging. Use thread_id and turn_id only as narrowing keys when a provider
emits them; do not assume any provider-specific composite shape is portable.
Quick Triage (Stuck Run)
- Confirm scheduler/worker symptoms for the ticket.
- Find recent lines for the ticket (
issue_identifier first).
- Extract
session_id from matching lines.
- Trace that
session_id across start, stream, completion/failure, and stall
handling logs.
- Decide class of failure: timeout/stall, app-server startup failure, turn
failure, or orchestrator retry loop.
Commands
rg -n "issue_identifier=MT-625" log/symphony.log*
rg -n "issue_id=<tracker-id>" log/symphony.log*
rg -n "issue_identifier=MT-625" log/symphony.log* | rg -o "session_id=[^ ;]+" | sort -u
rg -n "session_id=<session-id>" log/symphony.log*
rg -n "Issue stalled|scheduling retry|turn_timeout|turn_failed|session failed|session ended with error" log/symphony.log*
Investigation Flow
- Locate the ticket slice:
- Search by
issue_identifier=<KEY>.
- If noise is high, add
issue_id=<UUID>.
- Establish timeline:
- Identify the first provider lifecycle line with
session_id=....
- If startup fails before
session_id is emitted, pivot on run_id and
provider-native fields such as thread_id when present.
- Follow with provider completion,
ended with error, or worker exit
lines.
- Classify the problem:
- Stall loop:
Issue stalled ... restarting with backoff.
- Provider startup:
session failed ....
- Turn execution failure:
turn_failed, turn_cancelled, turn_timeout, or
ended with error.
- Worker crash:
Agent task exited ... reason=....
- Validate scope:
- Check whether failures are isolated to one issue/session or repeating across
multiple tickets.
- Capture evidence:
- Save key log lines with timestamps,
issue_identifier, issue_id, and
session_id.
- Record probable root cause and the exact failing stage.
Reading Agent-Provider Session Logs
In Symphony, agent-provider session diagnostics are emitted into
log/symphony.log. Once known, session_id is the provider-neutral key for the
session trace. Read the lifecycle as:
- Provider session or turn start line with
session_id=...
- Session stream/lifecycle events for the same
session_id
- Terminal event:
- provider session completed, or
- provider session ended with error, or
Issue stalled ... restarting with backoff
For one specific session investigation, keep the trace narrow:
- Capture one
session_id for the ticket.
- Build a timestamped slice for only that session:
rg -n "session_id=<session-id>" log/symphony.log*
- Mark the exact failing stage:
- Startup failure before stream events (
session failed ...).
- Turn/runtime failure after stream events (
turn_* / ended with error).
- Stall recovery (
Issue stalled ... restarting with backoff).
- Pair findings with
issue_identifier and issue_id from nearby lines to
confirm you are not mixing concurrent retries.
Always pair session findings with issue_identifier/issue_id to avoid mixing
concurrent runs.
Notes
- Prefer
rg over grep for speed on large logs.
- Check rotated logs (
log/symphony.log*) before concluding data is missing.
- If required context fields are missing in new log statements, include
issue_identifier, issue_id, and session_id consistently.