用途:排查 Symphony/Codex 运行卡住、反复重试或执行失败的问题,并快速把 Linear 工单与 Codex 会话关联起来,按正确顺序读日志以隔离根因。
日志来源:主运行日志 log/symphony.log,默认来自 SymphonyElixir.LogFile,包含编排器、代理运行器和 Codex app-server 生命周期日志;历史运行可查看轮转日志 log/symphony.log*。
关联键:issue_identifier 为人工工单键(如 MT-625);issue_id 为 Linear UUID;session_id 为 Codex 线程-轮次对(<thread_id>-<turn_id>)。这些字段由 symphony/elixir/docs/logging.md 定义,作为调试连接键。
快速分诊(卡住运行):确认该工单的调度器/worker 症状;用 issue_identifier 找最近日志行;提取匹配行的 session_id;跨启动、流、完成/失败与停滞处理日志追踪该 session_id;判定失败类别:超时/停滞、app-server 启动失败、轮次失败或编排器重试循环。
常用命令(保持原样):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_identifier 定位工单切片,噪声大时叠加 issue_id;建立时间线,从 Codex session started 到 completed、ended with error 或 worker exit;分类问题为停滞循环、app-server 启动失败、轮次执行失败或 worker 崩溃;检查失败是单工单还是多工单重复;保存带时间戳、issue_identifier、issue_id、session_id 的关键日志作为证据并记录可能根因与确切失败阶段。
读取 Codex 会话日志时按生命周期理解:开始、流/生命周期事件、终止事件。单会话调查保持窄范围,先捕获一个 session_id,再构建该会话的时间戳切片,标出确切失败阶段(流事件前的启动失败、流事件后的轮次/运行时失败、停滞恢复)。会话结论始终与 issue_identifier/issue_id 配对,避免混入并发重试。
限制与注意:优先用 rg 而非 grep 以提升大日志速度;在判定数据缺失前先检查轮转日志;若新日志缺少必要上下文字段,需对齐 elixir/docs/logging.md 约定。未提供安装方式、平台、收费或其他功能信息。