用途:当 Symphony 运行出现停滞、反复重试或执行失败时,本技能帮助定位运行卡住、重试或失败的原因,并将 Linear issue 身份快速关联到 Codex 会话,按正确顺序阅读日志以隔离根因。
日志来源:主运行日志为 log/symphony.log,默认来自 SymphonyElixir.LogFile,包含 orchestrator、agent runner 及 Codex app-server 生命周期日志;历史运行可查看轮转日志 log/symphony.log*。
关联键:issue_identifier(人类工单键,如 MT-625)、issue_id(Linear UUID)、session_id(Codex 线程-回合对,格式为 <thread_id>-<turn_id>),作为调试时的连接键。
快速分诊流程:确认工单的调度/worker 症状;按 issue_identifier 查找最近日志行;提取匹配行中的 session_id;沿该 session_id 追踪启动、流、完成/失败与停滞处理日志;判定失败类别(超时/停滞、app-server 启动失败、回合失败或 orchestrator 重试循环)。
常用命令:rg -n "issue_identifier=MT-625" log/symphony.log*;rg -n "issue_id=<linear-uuid>" log/symphony.log*;rg -o "session_id=[^ ;]+" log/symphony.log* | sort -u;rg -n "session_id=<thread>-<turn>" log/symphony.log*;rg -n "Issue stalled|scheduling retry|turn_timeout|turn_failed|Codex session failed|Codex session ended with error" log/symphony.log*。
调查流程:按工单切片定位,必要时叠加 issue_id 降噪;建立时间线,从首个 Codex session started 到 completed、ended with error 或 worker exit;分类问题(停滞循环、app-server 启动失败、回合执行失败、worker 崩溃);验证影响范围是否局限于单一 issue/session;记录带时间戳、issue_identifier、issue_id 与 session_id 的关键日志行及失败阶段。
读取 Codex 会话日志:按生命周期阅读同一 session_id 的启动、流/生命周期事件与终态事件,保持追踪狭窄并始终与 issue_identifier/issue_id 配对,避免混淆并发重试。
注意:大日志优先用 rg 而非 grep;先检查轮转日志再下结论;若新日志缺少必要上下文字段,需遵循 elixir/docs/logging.md 约定。