[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6AC2WGC091TYSE940VNE3X1":3,"skill-same:01M6AC2WGC091TYSE940VNE3X1":53},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":25,"linkOnly":26,"markdownContent":27,"markdownBody":28,"frontMatter":29,"refName":30,"commitSha":31,"skillDirectory":32,"forksCount":33,"repositoryHtmlUrl":34,"repositoryHomepageUrl":35,"ownerHtmlUrl":36,"ownerBlogUrl":37,"ownerDescription":6,"updatedAt":38,"install":39,"resources":52},"01M6AC2WGC091TYSE940VNE3X1","debug",null,"Investigate stuck runs and execution failures by tracing Symphony and Codex logs with issue\u002Fsession identifiers; use when runs stall, retry repeatedly, or fail unexpectedly.","openai\u002Fsymphony","openai","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F14957082?v=4","01M6AC29YGCR4S2NTJFV0G8B81","OpenAI","01M6AC2S7WQ2QFC2KVMSGBVNVZ",28003,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fsymphony\u002Fblob\u002Fmain\u002F.codex\u002Fskills\u002Fdebug\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[5,24],"codex","2026-11-10 10:12:30",false,"---\nname: debug\ndescription:\n  Investigate stuck runs and execution failures by tracing Symphony and Codex\n  logs with issue\u002Fsession identifiers; use when runs stall, retry repeatedly, or\n  fail unexpectedly.\n---\n\n# Debug\n\n## Goals\n\n- Find why a run is stuck, retrying, or failing.\n- Correlate Linear issue identity to a Codex session quickly.\n- Read the right logs in the right order to isolate root cause.\n\n## Log Sources\n\n- Primary runtime log: `log\u002Fsymphony.log`\n  - Default comes from `SymphonyElixir.LogFile` (`log\u002Fsymphony.log`).\n  - Includes orchestrator, agent runner, and Codex app-server lifecycle logs.\n- Rotated runtime logs: `log\u002Fsymphony.log*`\n  - Check these when the relevant run is older.\n\n## Correlation Keys\n\n- `issue_identifier`: human ticket key (example: `MT-625`)\n- `issue_id`: Linear UUID (stable internal ID)\n- `session_id`: Codex thread-turn pair (`\u003Cthread_id>-\u003Cturn_id>`)\n\n`elixir\u002Fdocs\u002Flogging.md` requires these fields for issue\u002Fsession lifecycle logs. Use\nthem as your join keys during debugging.\n\n## Quick Triage (Stuck Run)\n\n1. Confirm scheduler\u002Fworker symptoms for the ticket.\n2. Find recent lines for the ticket (`issue_identifier` first).\n3. Extract `session_id` from matching lines.\n4. Trace that `session_id` across start, stream, completion\u002Ffailure, and stall\n   handling logs.\n5. Decide class of failure: timeout\u002Fstall, app-server startup failure, turn\n   failure, or orchestrator retry loop.\n\n## Commands\n\n```bash\n# 1) Narrow by ticket key (fastest entry point)\nrg -n \"issue_identifier=MT-625\" log\u002Fsymphony.log*\n\n# 2) If needed, narrow by Linear UUID\nrg -n \"issue_id=\u003Clinear-uuid>\" log\u002Fsymphony.log*\n\n# 3) Pull session IDs seen for that ticket\nrg -o \"session_id=[^ ;]+\" log\u002Fsymphony.log* | sort -u\n\n# 4) Trace one session end-to-end\nrg -n \"session_id=\u003Cthread>-\u003Cturn>\" log\u002Fsymphony.log*\n\n# 5) Focus on stuck\u002Fretry signals\nrg -n \"Issue stalled|scheduling retry|turn_timeout|turn_failed|Codex session failed|Codex session ended with error\" log\u002Fsymphony.log*\n```\n\n## Investigation Flow\n\n1. Locate the ticket slice:\n    - Search by `issue_identifier=\u003CKEY>`.\n    - If noise is high, add `issue_id=\u003CUUID>`.\n2. Establish timeline:\n    - Identify first `Codex session started ... session_id=...`.\n    - Follow with `Codex session completed`, `ended with error`, or worker exit\n      lines.\n3. Classify the problem:\n    - Stall loop: `Issue stalled ... restarting with backoff`.\n    - App-server startup: `Codex session failed ...`.\n    - Turn execution failure: `turn_failed`, `turn_cancelled`, `turn_timeout`, or\n      `ended with error`.\n    - Worker crash: `Agent task exited ... reason=...`.\n4. Validate scope:\n    - Check whether failures are isolated to one issue\u002Fsession or repeating across\n      multiple tickets.\n5. Capture evidence:\n    - Save key log lines with timestamps, `issue_identifier`, `issue_id`, and\n      `session_id`.\n    - Record probable root cause and the exact failing stage.\n\n## Reading Codex Session Logs\n\nIn Symphony, Codex session diagnostics are emitted into `log\u002Fsymphony.log` and\nkeyed by `session_id`. Read them as a lifecycle:\n\n1. `Codex session started ... session_id=...`\n2. Session stream\u002Flifecycle events for the same `session_id`\n3. Terminal event:\n    - `Codex session completed ...`, or\n    - `Codex session ended with error ...`, or\n    - `Issue stalled ... restarting with backoff`\n\nFor one specific session investigation, keep the trace narrow:\n\n1. Capture one `session_id` for the ticket.\n2. Build a timestamped slice for only that session:\n    - `rg -n \"session_id=\u003Cthread>-\u003Cturn>\" log\u002Fsymphony.log*`\n3. Mark the exact failing stage:\n    - Startup failure before stream events (`Codex session failed ...`).\n    - Turn\u002Fruntime failure after stream events (`turn_*` \u002F `ended with error`).\n    - Stall recovery (`Issue stalled ... restarting with backoff`).\n4. Pair findings with `issue_identifier` and `issue_id` from nearby lines to\n   confirm you are not mixing concurrent retries.\n\nAlways pair session findings with `issue_identifier`\u002F`issue_id` to avoid mixing\nconcurrent runs.\n\n## Notes\n\n- Prefer `rg` over `grep` for speed on large logs.\n- Check rotated logs (`log\u002Fsymphony.log*`) before concluding data is missing.\n- If required context fields are missing in new log statements, align with\n  `elixir\u002Fdocs\u002Flogging.md` conventions.\n","# Debug\n\n## Goals\n\n- Find why a run is stuck, retrying, or failing.\n- Correlate Linear issue identity to a Codex session quickly.\n- Read the right logs in the right order to isolate root cause.\n\n## Log Sources\n\n- Primary runtime log: `log\u002Fsymphony.log`\n  - Default comes from `SymphonyElixir.LogFile` (`log\u002Fsymphony.log`).\n  - Includes orchestrator, agent runner, and Codex app-server lifecycle logs.\n- Rotated runtime logs: `log\u002Fsymphony.log*`\n  - Check these when the relevant run is older.\n\n## Correlation Keys\n\n- `issue_identifier`: human ticket key (example: `MT-625`)\n- `issue_id`: Linear UUID (stable internal ID)\n- `session_id`: Codex thread-turn pair (`\u003Cthread_id>-\u003Cturn_id>`)\n\n`elixir\u002Fdocs\u002Flogging.md` requires these fields for issue\u002Fsession lifecycle logs. Use\nthem as your join keys during debugging.\n\n## Quick Triage (Stuck Run)\n\n1. Confirm scheduler\u002Fworker symptoms for the ticket.\n2. Find recent lines for the ticket (`issue_identifier` first).\n3. Extract `session_id` from matching lines.\n4. Trace that `session_id` across start, stream, completion\u002Ffailure, and stall\n   handling logs.\n5. Decide class of failure: timeout\u002Fstall, app-server startup failure, turn\n   failure, or orchestrator retry loop.\n\n## Commands\n\n```bash\n# 1) Narrow by ticket key (fastest entry point)\nrg -n \"issue_identifier=MT-625\" log\u002Fsymphony.log*\n\n# 2) If needed, narrow by Linear UUID\nrg -n \"issue_id=\u003Clinear-uuid>\" log\u002Fsymphony.log*\n\n# 3) Pull session IDs seen for that ticket\nrg -o \"session_id=[^ ;]+\" log\u002Fsymphony.log* | sort -u\n\n# 4) Trace one session end-to-end\nrg -n \"session_id=\u003Cthread>-\u003Cturn>\" log\u002Fsymphony.log*\n\n# 5) Focus on stuck\u002Fretry signals\nrg -n \"Issue stalled|scheduling retry|turn_timeout|turn_failed|Codex session failed|Codex session ended with error\" log\u002Fsymphony.log*\n```\n\n## Investigation Flow\n\n1. Locate the ticket slice:\n    - Search by `issue_identifier=\u003CKEY>`.\n    - If noise is high, add `issue_id=\u003CUUID>`.\n2. Establish timeline:\n    - Identify first `Codex session started ... session_id=...`.\n    - Follow with `Codex session completed`, `ended with error`, or worker exit\n      lines.\n3. Classify the problem:\n    - Stall loop: `Issue stalled ... restarting with backoff`.\n    - App-server startup: `Codex session failed ...`.\n    - Turn execution failure: `turn_failed`, `turn_cancelled`, `turn_timeout`, or\n      `ended with error`.\n    - Worker crash: `Agent task exited ... reason=...`.\n4. Validate scope:\n    - Check whether failures are isolated to one issue\u002Fsession or repeating across\n      multiple tickets.\n5. Capture evidence:\n    - Save key log lines with timestamps, `issue_identifier`, `issue_id`, and\n      `session_id`.\n    - Record probable root cause and the exact failing stage.\n\n## Reading Codex Session Logs\n\nIn Symphony, Codex session diagnostics are emitted into `log\u002Fsymphony.log` and\nkeyed by `session_id`. Read them as a lifecycle:\n\n1. `Codex session started ... session_id=...`\n2. Session stream\u002Flifecycle events for the same `session_id`\n3. Terminal event:\n    - `Codex session completed ...`, or\n    - `Codex session ended with error ...`, or\n    - `Issue stalled ... restarting with backoff`\n\nFor one specific session investigation, keep the trace narrow:\n\n1. Capture one `session_id` for the ticket.\n2. Build a timestamped slice for only that session:\n    - `rg -n \"session_id=\u003Cthread>-\u003Cturn>\" log\u002Fsymphony.log*`\n3. Mark the exact failing stage:\n    - Startup failure before stream events (`Codex session failed ...`).\n    - Turn\u002Fruntime failure after stream events (`turn_*` \u002F `ended with error`).\n    - Stall recovery (`Issue stalled ... restarting with backoff`).\n4. Pair findings with `issue_identifier` and `issue_id` from nearby lines to\n   confirm you are not mixing concurrent retries.\n\nAlways pair session findings with `issue_identifier`\u002F`issue_id` to avoid mixing\nconcurrent runs.\n\n## Notes\n\n- Prefer `rg` over `grep` for speed on large logs.\n- Check rotated logs (`log\u002Fsymphony.log*`) before concluding data is missing.\n- If required context fields are missing in new log statements, align with\n  `elixir\u002Fdocs\u002Flogging.md` conventions.\n",{"name":5,"description":7},"main","be10a1b79df723d6d7612b5651c8522704dafb2e",".codex\u002Fskills\u002Fdebug",2889,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fsymphony","https:\u002F\u002Fopenai.com\u002Findex\u002Fopen-source-codex-orchestration-symphony\u002F","https:\u002F\u002Fgithub.com\u002Fopenai","https:\u002F\u002Fopenai.com\u002F","2026-09-16 06:14:59",{"source":8,"skillName":5,"commands":40,"prompt":50,"zipAvailable":51},[41,44,47],{"tool":42,"command":43},"npx","npx skills add openai\u002Fsymphony --skill debug",{"tool":45,"command":46},"bunx","bunx skills add openai\u002Fsymphony --skill debug",{"tool":48,"command":49},"pnpm","pnpm dlx skills add openai\u002Fsymphony --skill debug","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fopenai\u002Fsymphony\u002Fblob\u002Fmain\u002F.codex\u002Fskills\u002Fdebug\u002FSKILL.md",true,[],[54,63,75,84,91,99],{"skillNo":55,"name":56,"nameZh":6,"description":57,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":58,"categories":59,"keywords":60,"publishedAt":25},"01M6AC34AEWQ2BK7683S9X9TBG","release","Cut a Symphony release by bumping the committed version, landing it, tagging the merged commit, and verifying the Burrito release workflow. Use when asked to release, tag, or retag Symphony.","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fsymphony\u002Fblob\u002Fmain\u002F.codex\u002Fskills\u002Frelease\u002FSKILL.md",[],[56,61,62],"commit","workflow",{"skillNo":64,"name":65,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":69,"publishedAt":25},"01M6AC32PHM4E28BRWM03H61A3","push","Push current branch changes to origin and create or update the corresponding pull request; use when asked to push, publish updates, or create pull request.","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fsymphony\u002Fblob\u002Fmain\u002F.codex\u002Fskills\u002Fpush\u002FSKILL.md",[],[65,70,71,72,73,74],"pull","update","create","pull request","create pull request",{"skillNo":76,"name":70,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":25},"01M6AC3117P8HTY7VRDJR0WHKJ","Pull latest origin\u002Fmain into the current local branch and resolve merge conflicts (aka update-branch). Use when Codex needs to sync a feature branch with origin, perform a merge-based update (not rebase), and guide conflict resolution best practices.","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fsymphony\u002Fblob\u002Fmain\u002F.codex\u002Fskills\u002Fpull\u002FSKILL.md",[],[70,81,82,71,83,24],"sync","best practices","merge",{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":25},"01M6AC2ZANQQK8D1H01CB25BT4","linear","Use Symphony's `linear_graphql` client tool for raw Linear GraphQL\noperations such as comment editing and upload flows.","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fsymphony\u002Fblob\u002Fmain\u002F.codex\u002Fskills\u002Flinear\u002FSKILL.md",[],[86],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":25},"01M6AC2XX3Z4NEEYM5S37JWEGN","land","Land a PR by monitoring conflicts, resolving them, waiting for checks, and squash-merging when green; use when asked to land, merge, or shepherd a PR to completion.","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fsymphony\u002Fblob\u002Fmain\u002F.codex\u002Fskills\u002Fland\u002FSKILL.md",[],[93,98,83],"pr",{"skillNo":100,"name":61,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":25},"01M6AC2V1NHHM48NEPKJPWG3GE","Create a well-formed git commit from current changes using session history for rationale and summary; use when asked to commit, prepare a commit message, or finalize staged work.","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fsymphony\u002Fblob\u002Fmain\u002F.codex\u002Fskills\u002Fcommit\u002FSKILL.md",[],[61,105,106,72,107,108],"commit message","git","git commit","prepare"]