debug

작성자: openai

Symphony와 Codex를 추적하여 중단된 실행 및 실행 실패를 조사합니다.

npx skills add https://github.com/openai/symphony --skill debug

Debug

Goals

  • Find why a run is stuck, retrying, or failing.
  • Correlate Linear issue identity to a Codex session quickly.
  • Read the right logs in the right order to isolate root cause.

Log Sources

  • Primary runtime log: log/symphony.log
    • Default comes from SymphonyElixir.LogFile (log/symphony.log).
    • Includes orchestrator, agent runner, and Codex app-server 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: Linear UUID (stable internal ID)
  • session_id: Codex thread-turn pair (<thread_id>-<turn_id>)

elixir/docs/logging.md requires these fields for issue/session lifecycle logs. Use them as your join keys during debugging.

Quick Triage (Stuck Run)

  1. Confirm scheduler/worker symptoms for the ticket.
  2. Find recent lines for the ticket (issue_identifier first).
  3. Extract session_id from matching lines.
  4. Trace that session_id across start, stream, completion/failure, and stall handling logs.
  5. Decide class of failure: timeout/stall, app-server startup failure, turn failure, or orchestrator retry loop.

Commands

# 1) Narrow by ticket key (fastest entry point)
rg -n "issue_identifier=MT-625" log/symphony.log*

# 2) If needed, narrow by Linear UUID
rg -n "issue_id=<linear-uuid>" log/symphony.log*

# 3) Pull session IDs seen for that ticket
rg -o "session_id=[^ ;]+" log/symphony.log* | sort -u

# 4) Trace one session end-to-end
rg -n "session_id=<thread>-<turn>" log/symphony.log*

# 5) Focus on stuck/retry signals
rg -n "Issue stalled|scheduling retry|turn_timeout|turn_failed|Codex session failed|Codex session ended with error" log/symphony.log*

Investigation Flow

  1. Locate the ticket slice:
    • Search by issue_identifier=<KEY>.
    • If noise is high, add issue_id=<UUID>.
  2. Establish timeline:
    • Identify first Codex session started ... session_id=....
    • Follow with Codex session completed, ended with error, or worker exit lines.
  3. Classify the problem:
    • Stall loop: Issue stalled ... restarting with backoff.
    • App-server startup: Codex session failed ....
    • Turn execution failure: turn_failed, turn_cancelled, turn_timeout, or ended with error.
    • Worker crash: Agent task exited ... reason=....
  4. Validate scope:
    • Check whether failures are isolated to one issue/session or repeating across multiple tickets.
  5. 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 Codex Session Logs

In Symphony, Codex session diagnostics are emitted into log/symphony.log and keyed by session_id. Read them as a lifecycle:

  1. Codex session started ... session_id=...
  2. Session stream/lifecycle events for the same session_id
  3. Terminal event:
    • Codex session completed ..., or
    • Codex session ended with error ..., or
    • Issue stalled ... restarting with backoff

For one specific session investigation, keep the trace narrow:

  1. Capture one session_id for the ticket.
  2. Build a timestamped slice for only that session:
    • rg -n "session_id=<thread>-<turn>" log/symphony.log*
  3. Mark the exact failing stage:
    • Startup failure before stream events (Codex session failed ...).
    • Turn/runtime failure after stream events (turn_* / ended with error).
    • Stall recovery (Issue stalled ... restarting with backoff).
  4. 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, align with elixir/docs/logging.md conventions.

openai의 다른 스킬

release
openai
커밋된 버전을 올리고, 이를 반영하고, 병합된 커밋에 태그를 단 후, Burrito 릴리스 워크플로우를 검증하여 Symphony 릴리스를 진행합니다. 다음과 같이 요청받았을 때 사용합니다…
signing-entitlements
openai
macOS 앱의 서명, 자격, 강화된 런타임 및 Gatekeeper 문제를 검사합니다. 코드 서명 실패, 누락된 자격 등을 진단하라는 요청을 받을 때 사용하세요.
building-ai-agent-on-cloudflare
openai
Cloudflare에서 Agents SDK를 사용하여 상태 관리, 실시간 WebSockets, 예약 작업, 도구 통합, 채팅을 통해 AI 에이전트를 구축합니다…
epigraphdb-skill
openai
온톨로지, 문헌, MR, 유전자-약물 및 지원 경로 증거에 대한 간결한 EpiGraphDB API 요청을 제출합니다. 사용자가 간결한 EpiGraphDB 요약을 원할 때 사용하세요.
runtime-behavior-probe
openai
런타임 동작 조사를 계획하고 실행하며, 임시 프로브 스크립트, 검증 매트릭스, 상태 제어, 결과 우선 보고서를 사용합니다. 다음 경우에만 사용하세요…
deep-security-scan
openai
사용자가 심층적이고, 철저하며, 다중 패스 또는 변동성을 줄이는 저장소 전체 또는 범위가 지정된 경로의 Codex Security 스캔을 요청할 때 사용합니다. 반복적으로 독립적인…
define-security-policy
openai
저장소 또는 구성 요소에 대한 SECURITY.md 지침을 정의, 검토 또는 업데이트합니다. 사용자가 Codex Security가 검토해야 할 대상과 범위를 벗어나는 항목을 명확히 하려 할 때 사용합니다…
validation
openai
Codex가 보안 스캔의 검증 단계에 이미 있거나 사용자가 하나 이상의 후보 보안 결과를 판별하도록 명시적으로 요청할 때 사용합니다…