[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7EXGWAS130ZNJRGQMPFX441":3,"skill-same:01M7EXGWAS130ZNJRGQMPFX441":47},{"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":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":6,"ownerHtmlUrl":30,"ownerBlogUrl":6,"ownerDescription":31,"updatedAt":32,"install":33,"resources":46},"01M7EXGWAS130ZNJRGQMPFX441","bug-triage",null,"Triage bugs reported in chat\u002Fissues, search for duplicates, file or update GitHub issues with full context, and push fix PRs.","lza6\u002FArmor-piercing-system-prompts","lza6","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F128880206?v=4","01M7EB3K7WPX5T28EJ2NVHE6EG","Chinese-tingfeng","01M7EB3K97E1KQ16QWKJMFNGX8",11,"MIT","https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F05-技能与代理开发\u002Fbug-triage\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: bug-triage\ndescription: Triage bugs reported in chat\u002Fissues, search for duplicates, file or update GitHub issues with full context, and push fix PRs.\ntrigger: User reports a bug, or asks to triage\u002Ffile an issue for a reported problem.\n---\n\n# Bug Triage Skill\n\nTriage bugs into well-structured GitHub issues on the correct upstream repo.\n\n## 1. Pre-flight\n\n- **Pull latest code:** `git pull origin main`. Stale code = bad triage.\n- **Target repo:** Always file on the **current repo** (`Untrivial-ai\u002Fagent-orchestrator`), not forks.\n- **Record source:** chat URL, reporter name, attachments.\n\n## 2. Gather Context\n\n### 2a. Extract the report\n\n| Source | How to gather |\n|--------|---------------|\n| **Discord\u002FSlack thread** | Read full thread. Extract: reporter name, original description (the thread starter, not whoever tagged you), screenshots, follow-ups |\n| **GitHub issue** | `gh issue view \u003Cnumber> --repo \u003Crepo> --json body,comments` |\n| **Live observation** | Pull live state via observability tools |\n\n### 2b. Minimum viable report gate\n\nBefore tracing code, verify the report has enough substance:\n\n**Required (ALL):** what happened, where (page\u002Fcommand\u002Ffeature), when (after upgrade? first time?)\n\n**Required (2 of 4):** OS\u002Fshell\u002Fruntime, AO version (`ao --version`), reproducibility (consistent vs intermittent), reproduction steps\n\nIf insufficient, ask:\n> \"I'd like to triage this but need more info: (1) **What happened?** (error\u002Fbehavior), (2) **Where?** (page\u002Fcommand), (3) **When did it start?**, (4) **How to reproduce?**\"\n\n### 2c. Local diagnostics (if bug is on same machine)\n\nGather everything yourself before asking the reporter:\n\n```bash\n# Environment\nao --version && node --version && echo $SHELL && uname -a\ncat agent-orchestrator.yaml\ncat ~\u002F.agent-orchestrator\u002Frunning.json\n\n# Process health\npm2 status\ntmux list-sessions\nlsof -i :3000\n\n# AO event log — structured timeline\nao events list --limit 50                          # recent events\nao events list --session ao-5 --limit 100          # filter by session\nao events list --log-level error --since 1h        # errors only\nao events search \"spawn failed\"                    # full-text search\nao events stats                                    # counts by kind\u002Fsource\n\n# Session state files\ncat ~\u002F.agent-orchestrator\u002Fprojects\u002F*\u002Fsessions\u002F*.json | python3 -m json.tool\n```\n\nEvent kinds: `session.spawned`, `session.spawn_failed`, `session.killed`, `lifecycle.transition`, `ci.failing`, `review.pending`, `runtime.probe_failed`, `agent.process_probe_failed`, `reaction.escalated`, `lifecycle.poll_failed`. Sources: `lifecycle`, `session-manager`, `api`, `runtime`, `agent`, `reaction`.\n\n**Try the reproduction steps.** Running the actual command is worth 100 lines of code tracing.\n\n## 3. Investigate\n\n### 3a. Trace the code path\n\n**Always trace the actual code** — don't surface-level diagnose. [#1129](https:\u002F\u002Fgithub.com\u002FUntrivial-ai\u002Fagent-orchestrator\u002Fissues\u002F1129) looked like a simple `ao stop` issue but was actually a session lineage\u002Fcascade problem.\n\n```bash\ngit fetch origin main && git log --oneline origin\u002Fmain -5   # current HEAD\n# Record the commit hash you're analyzing against\n```\n\n**Git archaeology** — find which commits introduced\u002Fremoved specific code:\n```bash\ngit log --oneline -S 'exact-string' -- \u003Cfile>\ngit show \u003Csha> -- \u003Cfile> | grep -B 5 -A 10 'pattern'\n```\nExample: [#1391](https:\u002F\u002Fgithub.com\u002FUntrivial-ai\u002Fagent-orchestrator\u002Fissues\u002F1391) traced a mobile layout break to a `display: flex` → `display: grid` change.\n\n**Research upstream dependencies** (xterm, node-pty, React, etc.) — check installed vs latest version, search their GitHub issues, check changelogs. Root cause is often upstream.\n\n### 3b. Cross-platform check\n\nAO runs on **Windows, macOS, Linux** as first-class targets. If env info indicates Windows (or is unknown), check for these patterns:\n\n- **Path separators** — hardcoded `\u002F` or `\\` breaks cross-platform\n- **Shell syntax** — PowerShell lacks `&&`, `$VAR`, `$(cat ...)`, `\u002Fdev\u002Fnull`, here-docs\n- **`process.platform === \"win32\"` inline** — must use `isWindows()` from `@aoagents\u002Fao-core`\n- **`process.kill(-pid)`** — POSIX-only; use `killProcessTree()`\n- **Named pipes vs Unix sockets** — Windows uses `\\\\.\\pipe\\ao-pty-\u003Cid>`\n- **`localhost`** — Windows resolves to `::1` first, causing ~21s stalls on IPv4-only servers\n- **NTFS case-insensitivity** — use `pathsEqual()`, not `===`\n- **ConPTY orphans** — can trigger WER dialogs if pty-host not shut down cooperatively\n- **`.cmd` shim resolution** — needs `shell: true` for `PATHEXT` lookup\n\nKey files: `packages\u002Fcore\u002Fsrc\u002Fplatform.ts`, `docs\u002FCROSS_PLATFORM.md`, `packages\u002Fplugins\u002Fruntime-process\u002F`, `packages\u002Fcli\u002Fsrc\u002Flib\u002Fpath-equality.ts`\n\n### 3c. Stop-and-ask triggers\n\nStop and ask for more info if:\n- **3 failed hypotheses** — traced 3 code paths, none explain it\n- **Root cause is upstream** — file with upstream reference, don't guess a local fix\n- **UI-only bug** and you can't screenshot — ask reporter to describe\n- **Can't reproduce** — ask for different config\u002Fsequence\n\n## 4. Search for Duplicates\n\nSearch with multiple strategies, always using `--state all` (closed bugs regress):\n\n```bash\ngh issue list --repo \u003Crepo> --state all --search \"\u003Csymptom>\"\ngh issue list --repo \u003Crepo> --state all --search \"\u003Ccomponent-name>\"\ngh issue list --repo \u003Crepo> --state all --search \"\u003Cerror-message>\"\ngh pr list --repo \u003Crepo> --state all --search \"\u003Ckeywords>\"\n```\n\n### Duplicate found → comment on existing issue\n\n```bash\ngh issue comment \u003Cnumber> --repo \u003Crepo> --body \"$(cat \u003C\u003C'EOF'\n## New Report\n**Reported by:** @\u003Creporter> in [chat](\u003Curl>)\n**Date:** \u003CYYYY-MM-DD> | **Checkout:** `\u003Ccommit-hash>`\n\u003Ccontext, differences from original, screenshots>\nEOF\n)\"\n```\n\n### No duplicate → file new issue (next section)\n\n## 5. File New Issue\n\n### 5a. Pre-submission checklist\n\n- [ ] Reporter attribution correct (original reporter, not who tagged you)\n- [ ] Commit hash recorded\n- [ ] AO version recorded\n- [ ] Root cause confidence scored (see 5c)\n- [ ] Related issues cross-linked\n- [ ] Reproduction steps are concrete\n- [ ] Screenshots uploaded with real URLs (see 5b)\n\n### 5b. Upload screenshots\n\n**⛔ NEVER use placeholder URLs.** Upload BEFORE creating the issue. ([#1151](https:\u002F\u002Fgithub.com\u002FUntrivial-ai\u002Fagent-orchestrator\u002Fissues\u002F1151) RCA on this pattern.)\n\n```bash\nSLUG=\"descriptive-slug\"\n# Create asset branch\ngh api -X POST repos\u002F\u003Crepo>\u002Fgit\u002Frefs \\\n  -f ref=\"refs\u002Fheads\u002Fissue-assets-${SLUG}\" \\\n  -f sha=$(git rev-parse origin\u002Fmain)\n\n# Upload (portable base64)\nIMG_B64=$(base64 \u003C \u002Fpath\u002Fto\u002Fscreenshot.png | tr -d '\\n')\ngh api -X PUT \"repos\u002F\u003Crepo>\u002Fcontents\u002F.issue-assets\u002F${SLUG}\u002Fname.png\" \\\n  -f message=\"chore: upload screenshot\" \\\n  -f content=\"$IMG_B64\" \\\n  -f branch=\"issue-assets-${SLUG}\"\n# Use: ![screenshot](https:\u002F\u002Fraw.githubusercontent.com\u002F\u003Crepo>\u002Fissue-assets-\u003Cslug>\u002F.issue-assets\u002F\u003Cfile>)\n```\n\n### 5c. Create the issue\n\n```bash\ngh issue create --repo \u003Crepo> --title \"\u003Ctitle>\" --body \"$(cat \u003C\u003C'EOF'\n## Bug\n\u003Csummary>\n\n**Source:** \u003Curl> | **Reported by:** @\u003Creporter> | **Analyzed against:** `\u003Chash>`\n**Confidence:** High\u002FMedium\u002FLow\n\n## Reproduction\n1. \u003Cstep>\n\n## Root Cause\n\u003Cfile paths, line numbers, explanation>\n\n## Fix\n\u003Csuggested approach>\n\n## Impact\n- \u003Ceffects>\nEOF\n)\"\n```\n\n### 5d. Label and prioritize\n\n```bash\ngh issue edit \u003Cnumber> --repo \u003Crepo> --add-label \"bug\"\n```\n\n| Priority label | Criteria |\n|----------------|----------|\n| `priority: critical` | Data loss, security, system down |\n| `priority: high` | Core feature broken, no workaround |\n| `priority: medium` | Feature degraded, workaround exists |\n| `priority: low` | Cosmetic, edge case |\n\n**Confidence scoring** (include in issue body):\n\n| Level | Meaning | Extra labels |\n|-------|---------|-------------|\n| **High** | Traced exact code path, specific lines, mechanism explained | `bug` only |\n| **Medium** | Strong hypothesis but unconfirmed | `bug`, `to-explore` |\n| **Low** | Can't trace, multiple conflicting theories | `bug`, `to-reproduce` |\n\nExample: [PR #1608](https:\u002F\u002Fgithub.com\u002FUntrivial-ai\u002Fagent-orchestrator\u002Fpull\u002F1608) was diagnosed High as xterm v6 issue — real cause was a `=` prefix on tmux `set-option`. Should have been Medium.\n\n**All available labels:** `priority: critical\u002Fhigh\u002Fmedium\u002Flow`, `bug`, `enhancement`, `good-first-issue`, `to-reproduce`, `to-explore`. No others (no `p0`, `p1`, etc.).\n\n### 5e. Cross-link related issues\n\nSearch by subsystem and add a `## Related` section to the issue body:\n```\n## Related\n- [#1020](url) — stale session blocking ao start (same subsystem)\n- [#1035](url) — same race condition\n```\n\n### 5f. Push a fix PR (always attempt)\n\n- **Trivial fix:** Push immediately.\n- **Complex fix:** Note in issue, suggest spawning an agent.\n- **Unclear fix:** Don't push a guess. Document and flag.\n\n```bash\nOLD_STRING='\u003Cold>' NEW_STRING='\u003Cnew>' \\\npython3 skills\u002Fbug-triage\u002Fscripts\u002Fpush_fix_to_github.py \\\n  \u003Cowner\u002Frepo> fix\u002Fslug path\u002Fto\u002Ffile.tsx \\\n  \"fix(scope): commit msg\" \"fix(scope): PR title\" \\\n  \"Fixes #\u003Cn>\n\n## Summary\n\u003Cwhat changed>\n\n## Test\n\u003Chow to verify>\"\n```\n\nThe script reads from GitHub API, applies one replacement, pushes, opens PR — no local checkout needed. **Verify `OLD_STRING` matches GitHub first:** `gh api repos\u002F\u003Crepo>\u002Fcontents\u002F\u003Cpath>?ref=main -q '.content' | python3 -c \"import base64,sys; sys.stdout.buffer.write(base64.b64decode(sys.stdin.read()))\"`\n\n**Multiple edits to same file:** The push script does one replacement per run. For multiple changes, use a Python script to read from the branch (`gh api` + `base64.b64decode`), apply all replacements, then push via `gh api -X PUT` with the updated SHA.\n\n### 5g. Report back\n\nIssue URL, PR URL (if created), labels, root cause summary, whether fix agent was suggested.\n\n---\n\n## Appendix\n\n### A. Subsystem Quick Reference\n\n| Subsystem | Collect | Key files |\n|-----------|---------|-----------|\n| **CLI** (`ao start\u002Fstop\u002Fspawn`) | Config YAML, install method, version, OS | `packages\u002Fcli\u002Fsrc\u002Fcommands\u002F` |\n| **Web UI** | Screenshot, browser, viewport | `packages\u002Fweb\u002Fsrc\u002Fcomponents\u002F`, `globals.css` |\n| **Terminal** | Runtime type, tmux version, shell | `DirectTerminal.tsx`, `useXtermTerminal.ts` |\n| **Lifecycle** | State transitions, session IDs | `core\u002Fsrc\u002Flifecycle-manager.ts`, `core\u002Fsrc\u002Flifecycle-state.ts` |\n| **Sessions** | Session ID, spawn config, runtime | `core\u002Fsrc\u002Fsession-manager.ts` |\n| **Plugins** | Plugin name, agent version | `packages\u002Fplugins\u002F\u003Cagent>\u002F` |\n| **Config** | YAML contents, project path | `packages\u002Fcore\u002Fsrc\u002Fconfig.ts` |\n\n**Misrouting patterns:**\n- Terminal bugs → tmux (runtime-tmux) vs xterm (web) vs PTY (runtime-process\u002FWindows). Trace where bytes flow.\n- \"Session stuck\" → lifecycle state machine vs agent process vs runtime connection.\n- \"Config not saving\" → config loading (c12) vs project registration (running-state.ts) vs YAML write (permissions).\n\n### B. Remote Code Inspection (no local clone)\n\n```bash\ngh api repos\u002F{owner}\u002F{repo}\u002Fgit\u002Ftrees\u002Fmain?recursive=1 --jq '.tree[].path'    # list files\ngh api repos\u002F{owner}\u002F{repo}\u002Fcontents\u002F{path} --jq '.content' | python3 -c \"import base64,sys; sys.stdout.buffer.write(base64.b64decode(sys.stdin.read()))\"  # read file\ngh search code \"term\" --repo {owner}\u002F{repo} --json path --jq '.[].path'        # search code\ngh api \"repos\u002F{owner}\u002F{repo}\u002Fcommits?path={path}&per_page=10\" --jq '.[] | \"\\(.sha[0:8]) \\(.commit.message | split(\"\\n\")[0])\"'  # file history\n```\n\n### C. NPM Package Regression Diffing\n\nDiff **published** packages (not local builds) when regression follows an upgrade:\n\n```bash\nmkdir -p \u002Ftmp\u002Fao-diff\u002F{v1,v2}\ncurl -sL https:\u002F\u002Fregistry.npmjs.org\u002F@scope\u002Fpkg\u002F-\u002Fpkg-OLD.tgz | tar xz -C \u002Ftmp\u002Fao-diff\u002Fv1\ncurl -sL https:\u002F\u002Fregistry.npmjs.org\u002F@scope\u002Fpkg\u002F-\u002Fpkg-NEW.tgz | tar xz -C \u002Ftmp\u002Fao-diff\u002Fv2\ndiff -rq \u002Ftmp\u002Fao-diff\u002Fv1\u002Fpackage\u002F \u002Ftmp\u002Fao-diff\u002Fv2\u002Fpackage\u002F\n```\n\nExample: [PR #1608](https:\u002F\u002Fgithub.com\u002FUntrivial-ai\u002Fagent-orchestrator\u002Fpull\u002F1608) — source analysis led to wrong theories, npm diff showed the only change was a `=` prefix on tmux `set-option`.\n\n## Formatting Rules\n\n- **Linkify all issue\u002FPR refs:** `[#123](https:\u002F\u002Fgithub.com\u002FUntrivial-ai\u002Fagent-orchestrator\u002Fissues\u002F123)`, `[PR #456](url)`. Never bare `#123`.\n\n## Pitfalls\n\n- **Reporter ≠ person who tagged you.** Always attribute to the original reporter.\n- **Record the commit hash** you analyzed — code changes fast.\n- **GitHub issue is mandatory** — every triaged bug gets one, even if fix is trivial.\n- **`gh api --jq .content` truncates large files** (>~100KB). Use local git instead.\n- **Push script arg limits** — long commit messages hit `OSError: Argument list too long`. Use a Python script with JSON payloads instead.\n- **`OLD_STRING` must match GitHub byte-for-byte** — local code may differ from `origin\u002Fmain`.\n- **New fields on shared TS interfaces MUST be optional** (`field?: Type`). Downstream `Partial\u003CX>` spreads break on required fields. Example: [PR #1523](https:\u002F\u002Fgithub.com\u002FUntrivial-ai\u002Fagent-orchestrator\u002Fpull\u002F1523).\n","# Bug Triage Skill\n\nTriage bugs into well-structured GitHub issues on the correct upstream repo.\n\n## 1. Pre-flight\n\n- **Pull latest code:** `git pull origin main`. Stale code = bad triage.\n- **Target repo:** Always file on the **current repo** (`Untrivial-ai\u002Fagent-orchestrator`), not forks.\n- **Record source:** chat URL, reporter name, attachments.\n\n## 2. Gather Context\n\n### 2a. Extract the report\n\n| Source | How to gather |\n|--------|---------------|\n| **Discord\u002FSlack thread** | Read full thread. Extract: reporter name, original description (the thread starter, not whoever tagged you), screenshots, follow-ups |\n| **GitHub issue** | `gh issue view \u003Cnumber> --repo \u003Crepo> --json body,comments` |\n| **Live observation** | Pull live state via observability tools |\n\n### 2b. Minimum viable report gate\n\nBefore tracing code, verify the report has enough substance:\n\n**Required (ALL):** what happened, where (page\u002Fcommand\u002Ffeature), when (after upgrade? first time?)\n\n**Required (2 of 4):** OS\u002Fshell\u002Fruntime, AO version (`ao --version`), reproducibility (consistent vs intermittent), reproduction steps\n\nIf insufficient, ask:\n> \"I'd like to triage this but need more info: (1) **What happened?** (error\u002Fbehavior), (2) **Where?** (page\u002Fcommand), (3) **When did it start?**, (4) **How to reproduce?**\"\n\n### 2c. Local diagnostics (if bug is on same machine)\n\nGather everything yourself before asking the reporter:\n\n```bash\n# Environment\nao --version && node --version && echo $SHELL && uname -a\ncat agent-orchestrator.yaml\ncat ~\u002F.agent-orchestrator\u002Frunning.json\n\n# Process health\npm2 status\ntmux list-sessions\nlsof -i :3000\n\n# AO event log — structured timeline\nao events list --limit 50                          # recent events\nao events list --session ao-5 --limit 100          # filter by session\nao events list --log-level error --since 1h        # errors only\nao events search \"spawn failed\"                    # full-text search\nao events stats                                    # counts by kind\u002Fsource\n\n# Session state files\ncat ~\u002F.agent-orchestrator\u002Fprojects\u002F*\u002Fsessions\u002F*.json | python3 -m json.tool\n```\n\nEvent kinds: `session.spawned`, `session.spawn_failed`, `session.killed`, `lifecycle.transition`, `ci.failing`, `review.pending`, `runtime.probe_failed`, `agent.process_probe_failed`, `reaction.escalated`, `lifecycle.poll_failed`. Sources: `lifecycle`, `session-manager`, `api`, `runtime`, `agent`, `reaction`.\n\n**Try the reproduction steps.** Running the actual command is worth 100 lines of code tracing.\n\n## 3. Investigate\n\n### 3a. Trace the code path\n\n**Always trace the actual code** — don't surface-level diagnose. [#1129](https:\u002F\u002Fgithub.com\u002FUntrivial-ai\u002Fagent-orchestrator\u002Fissues\u002F1129) looked like a simple `ao stop` issue but was actually a session lineage\u002Fcascade problem.\n\n```bash\ngit fetch origin main && git log --oneline origin\u002Fmain -5   # current HEAD\n# Record the commit hash you're analyzing against\n```\n\n**Git archaeology** — find which commits introduced\u002Fremoved specific code:\n```bash\ngit log --oneline -S 'exact-string' -- \u003Cfile>\ngit show \u003Csha> -- \u003Cfile> | grep -B 5 -A 10 'pattern'\n```\nExample: [#1391](https:\u002F\u002Fgithub.com\u002FUntrivial-ai\u002Fagent-orchestrator\u002Fissues\u002F1391) traced a mobile layout break to a `display: flex` → `display: grid` change.\n\n**Research upstream dependencies** (xterm, node-pty, React, etc.) — check installed vs latest version, search their GitHub issues, check changelogs. Root cause is often upstream.\n\n### 3b. Cross-platform check\n\nAO runs on **Windows, macOS, Linux** as first-class targets. If env info indicates Windows (or is unknown), check for these patterns:\n\n- **Path separators** — hardcoded `\u002F` or `\\` breaks cross-platform\n- **Shell syntax** — PowerShell lacks `&&`, `$VAR`, `$(cat ...)`, `\u002Fdev\u002Fnull`, here-docs\n- **`process.platform === \"win32\"` inline** — must use `isWindows()` from `@aoagents\u002Fao-core`\n- **`process.kill(-pid)`** — POSIX-only; use `killProcessTree()`\n- **Named pipes vs Unix sockets** — Windows uses `\\\\.\\pipe\\ao-pty-\u003Cid>`\n- **`localhost`** — Windows resolves to `::1` first, causing ~21s stalls on IPv4-only servers\n- **NTFS case-insensitivity** — use `pathsEqual()`, not `===`\n- **ConPTY orphans** — can trigger WER dialogs if pty-host not shut down cooperatively\n- **`.cmd` shim resolution** — needs `shell: true` for `PATHEXT` lookup\n\nKey files: `packages\u002Fcore\u002Fsrc\u002Fplatform.ts`, `docs\u002FCROSS_PLATFORM.md`, `packages\u002Fplugins\u002Fruntime-process\u002F`, `packages\u002Fcli\u002Fsrc\u002Flib\u002Fpath-equality.ts`\n\n### 3c. Stop-and-ask triggers\n\nStop and ask for more info if:\n- **3 failed hypotheses** — traced 3 code paths, none explain it\n- **Root cause is upstream** — file with upstream reference, don't guess a local fix\n- **UI-only bug** and you can't screenshot — ask reporter to describe\n- **Can't reproduce** — ask for different config\u002Fsequence\n\n## 4. Search for Duplicates\n\nSearch with multiple strategies, always using `--state all` (closed bugs regress):\n\n```bash\ngh issue list --repo \u003Crepo> --state all --search \"\u003Csymptom>\"\ngh issue list --repo \u003Crepo> --state all --search \"\u003Ccomponent-name>\"\ngh issue list --repo \u003Crepo> --state all --search \"\u003Cerror-message>\"\ngh pr list --repo \u003Crepo> --state all --search \"\u003Ckeywords>\"\n```\n\n### Duplicate found → comment on existing issue\n\n```bash\ngh issue comment \u003Cnumber> --repo \u003Crepo> --body \"$(cat \u003C\u003C'EOF'\n## New Report\n**Reported by:** @\u003Creporter> in [chat](\u003Curl>)\n**Date:** \u003CYYYY-MM-DD> | **Checkout:** `\u003Ccommit-hash>`\n\u003Ccontext, differences from original, screenshots>\nEOF\n)\"\n```\n\n### No duplicate → file new issue (next section)\n\n## 5. File New Issue\n\n### 5a. Pre-submission checklist\n\n- [ ] Reporter attribution correct (original reporter, not who tagged you)\n- [ ] Commit hash recorded\n- [ ] AO version recorded\n- [ ] Root cause confidence scored (see 5c)\n- [ ] Related issues cross-linked\n- [ ] Reproduction steps are concrete\n- [ ] Screenshots uploaded with real URLs (see 5b)\n\n### 5b. Upload screenshots\n\n**⛔ NEVER use placeholder URLs.** Upload BEFORE creating the issue. ([#1151](https:\u002F\u002Fgithub.com\u002FUntrivial-ai\u002Fagent-orchestrator\u002Fissues\u002F1151) RCA on this pattern.)\n\n```bash\nSLUG=\"descriptive-slug\"\n# Create asset branch\ngh api -X POST repos\u002F\u003Crepo>\u002Fgit\u002Frefs \\\n  -f ref=\"refs\u002Fheads\u002Fissue-assets-${SLUG}\" \\\n  -f sha=$(git rev-parse origin\u002Fmain)\n\n# Upload (portable base64)\nIMG_B64=$(base64 \u003C \u002Fpath\u002Fto\u002Fscreenshot.png | tr -d '\\n')\ngh api -X PUT \"repos\u002F\u003Crepo>\u002Fcontents\u002F.issue-assets\u002F${SLUG}\u002Fname.png\" \\\n  -f message=\"chore: upload screenshot\" \\\n  -f content=\"$IMG_B64\" \\\n  -f branch=\"issue-assets-${SLUG}\"\n# Use: ![screenshot](https:\u002F\u002Fraw.githubusercontent.com\u002F\u003Crepo>\u002Fissue-assets-\u003Cslug>\u002F.issue-assets\u002F\u003Cfile>)\n```\n\n### 5c. Create the issue\n\n```bash\ngh issue create --repo \u003Crepo> --title \"\u003Ctitle>\" --body \"$(cat \u003C\u003C'EOF'\n## Bug\n\u003Csummary>\n\n**Source:** \u003Curl> | **Reported by:** @\u003Creporter> | **Analyzed against:** `\u003Chash>`\n**Confidence:** High\u002FMedium\u002FLow\n\n## Reproduction\n1. \u003Cstep>\n\n## Root Cause\n\u003Cfile paths, line numbers, explanation>\n\n## Fix\n\u003Csuggested approach>\n\n## Impact\n- \u003Ceffects>\nEOF\n)\"\n```\n\n### 5d. Label and prioritize\n\n```bash\ngh issue edit \u003Cnumber> --repo \u003Crepo> --add-label \"bug\"\n```\n\n| Priority label | Criteria |\n|----------------|----------|\n| `priority: critical` | Data loss, security, system down |\n| `priority: high` | Core feature broken, no workaround |\n| `priority: medium` | Feature degraded, workaround exists |\n| `priority: low` | Cosmetic, edge case |\n\n**Confidence scoring** (include in issue body):\n\n| Level | Meaning | Extra labels |\n|-------|---------|-------------|\n| **High** | Traced exact code path, specific lines, mechanism explained | `bug` only |\n| **Medium** | Strong hypothesis but unconfirmed | `bug`, `to-explore` |\n| **Low** | Can't trace, multiple conflicting theories | `bug`, `to-reproduce` |\n\nExample: [PR #1608](https:\u002F\u002Fgithub.com\u002FUntrivial-ai\u002Fagent-orchestrator\u002Fpull\u002F1608) was diagnosed High as xterm v6 issue — real cause was a `=` prefix on tmux `set-option`. Should have been Medium.\n\n**All available labels:** `priority: critical\u002Fhigh\u002Fmedium\u002Flow`, `bug`, `enhancement`, `good-first-issue`, `to-reproduce`, `to-explore`. No others (no `p0`, `p1`, etc.).\n\n### 5e. Cross-link related issues\n\nSearch by subsystem and add a `## Related` section to the issue body:\n```\n## Related\n- [#1020](url) — stale session blocking ao start (same subsystem)\n- [#1035](url) — same race condition\n```\n\n### 5f. Push a fix PR (always attempt)\n\n- **Trivial fix:** Push immediately.\n- **Complex fix:** Note in issue, suggest spawning an agent.\n- **Unclear fix:** Don't push a guess. Document and flag.\n\n```bash\nOLD_STRING='\u003Cold>' NEW_STRING='\u003Cnew>' \\\npython3 skills\u002Fbug-triage\u002Fscripts\u002Fpush_fix_to_github.py \\\n  \u003Cowner\u002Frepo> fix\u002Fslug path\u002Fto\u002Ffile.tsx \\\n  \"fix(scope): commit msg\" \"fix(scope): PR title\" \\\n  \"Fixes #\u003Cn>\n\n## Summary\n\u003Cwhat changed>\n\n## Test\n\u003Chow to verify>\"\n```\n\nThe script reads from GitHub API, applies one replacement, pushes, opens PR — no local checkout needed. **Verify `OLD_STRING` matches GitHub first:** `gh api repos\u002F\u003Crepo>\u002Fcontents\u002F\u003Cpath>?ref=main -q '.content' | python3 -c \"import base64,sys; sys.stdout.buffer.write(base64.b64decode(sys.stdin.read()))\"`\n\n**Multiple edits to same file:** The push script does one replacement per run. For multiple changes, use a Python script to read from the branch (`gh api` + `base64.b64decode`), apply all replacements, then push via `gh api -X PUT` with the updated SHA.\n\n### 5g. Report back\n\nIssue URL, PR URL (if created), labels, root cause summary, whether fix agent was suggested.\n\n---\n\n## Appendix\n\n### A. Subsystem Quick Reference\n\n| Subsystem | Collect | Key files |\n|-----------|---------|-----------|\n| **CLI** (`ao start\u002Fstop\u002Fspawn`) | Config YAML, install method, version, OS | `packages\u002Fcli\u002Fsrc\u002Fcommands\u002F` |\n| **Web UI** | Screenshot, browser, viewport | `packages\u002Fweb\u002Fsrc\u002Fcomponents\u002F`, `globals.css` |\n| **Terminal** | Runtime type, tmux version, shell | `DirectTerminal.tsx`, `useXtermTerminal.ts` |\n| **Lifecycle** | State transitions, session IDs | `core\u002Fsrc\u002Flifecycle-manager.ts`, `core\u002Fsrc\u002Flifecycle-state.ts` |\n| **Sessions** | Session ID, spawn config, runtime | `core\u002Fsrc\u002Fsession-manager.ts` |\n| **Plugins** | Plugin name, agent version | `packages\u002Fplugins\u002F\u003Cagent>\u002F` |\n| **Config** | YAML contents, project path | `packages\u002Fcore\u002Fsrc\u002Fconfig.ts` |\n\n**Misrouting patterns:**\n- Terminal bugs → tmux (runtime-tmux) vs xterm (web) vs PTY (runtime-process\u002FWindows). Trace where bytes flow.\n- \"Session stuck\" → lifecycle state machine vs agent process vs runtime connection.\n- \"Config not saving\" → config loading (c12) vs project registration (running-state.ts) vs YAML write (permissions).\n\n### B. Remote Code Inspection (no local clone)\n\n```bash\ngh api repos\u002F{owner}\u002F{repo}\u002Fgit\u002Ftrees\u002Fmain?recursive=1 --jq '.tree[].path'    # list files\ngh api repos\u002F{owner}\u002F{repo}\u002Fcontents\u002F{path} --jq '.content' | python3 -c \"import base64,sys; sys.stdout.buffer.write(base64.b64decode(sys.stdin.read()))\"  # read file\ngh search code \"term\" --repo {owner}\u002F{repo} --json path --jq '.[].path'        # search code\ngh api \"repos\u002F{owner}\u002F{repo}\u002Fcommits?path={path}&per_page=10\" --jq '.[] | \"\\(.sha[0:8]) \\(.commit.message | split(\"\\n\")[0])\"'  # file history\n```\n\n### C. NPM Package Regression Diffing\n\nDiff **published** packages (not local builds) when regression follows an upgrade:\n\n```bash\nmkdir -p \u002Ftmp\u002Fao-diff\u002F{v1,v2}\ncurl -sL https:\u002F\u002Fregistry.npmjs.org\u002F@scope\u002Fpkg\u002F-\u002Fpkg-OLD.tgz | tar xz -C \u002Ftmp\u002Fao-diff\u002Fv1\ncurl -sL https:\u002F\u002Fregistry.npmjs.org\u002F@scope\u002Fpkg\u002F-\u002Fpkg-NEW.tgz | tar xz -C \u002Ftmp\u002Fao-diff\u002Fv2\ndiff -rq \u002Ftmp\u002Fao-diff\u002Fv1\u002Fpackage\u002F \u002Ftmp\u002Fao-diff\u002Fv2\u002Fpackage\u002F\n```\n\nExample: [PR #1608](https:\u002F\u002Fgithub.com\u002FUntrivial-ai\u002Fagent-orchestrator\u002Fpull\u002F1608) — source analysis led to wrong theories, npm diff showed the only change was a `=` prefix on tmux `set-option`.\n\n## Formatting Rules\n\n- **Linkify all issue\u002FPR refs:** `[#123](https:\u002F\u002Fgithub.com\u002FUntrivial-ai\u002Fagent-orchestrator\u002Fissues\u002F123)`, `[PR #456](url)`. Never bare `#123`.\n\n## Pitfalls\n\n- **Reporter ≠ person who tagged you.** Always attribute to the original reporter.\n- **Record the commit hash** you analyzed — code changes fast.\n- **GitHub issue is mandatory** — every triaged bug gets one, even if fix is trivial.\n- **`gh api --jq .content` truncates large files** (>~100KB). Use local git instead.\n- **Push script arg limits** — long commit messages hit `OSError: Argument list too long`. Use a Python script with JSON payloads instead.\n- **`OLD_STRING` must match GitHub byte-for-byte** — local code may differ from `origin\u002Fmain`.\n- **New fields on shared TS interfaces MUST be optional** (`field?: Type`). Downstream `Partial\u003CX>` spreads break on required fields. Example: [PR #1523](https:\u002F\u002Fgithub.com\u002FUntrivial-ai\u002Fagent-orchestrator\u002Fpull\u002F1523).\n",{"name":5,"trigger":24,"description":7},"User reports a bug, or asks to triage\u002Ffile an issue for a reported problem.","main","d69096e239f2a89aabc2cd078c47664a9d3b1e11","05-技能与代理开发\u002Fbug-triage",3,"https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts","https:\u002F\u002Fgithub.com\u002Flza6","个人vx：Tf00798\r\n个人✈：@TFGY999","2026-10-08 14:29:22",{"source":8,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add lza6\u002FArmor-piercing-system-prompts --skill bug-triage",{"tool":39,"command":40},"bunx","bunx skills add lza6\u002FArmor-piercing-system-prompts --skill bug-triage",{"tool":42,"command":43},"pnpm","pnpm dlx skills add lza6\u002FArmor-piercing-system-prompts --skill bug-triage","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F05-技能与代理开发\u002Fbug-triage\u002FSKILL.md",true,[],[48,55,62,69,77,84],{"skillNo":49,"name":50,"nameZh":6,"description":51,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":52,"categories":53,"keywords":54,"publishedAt":19},"01M7EXRM12046G0GM1WGMMFXCN","ci-cd-and-automation","Automates CI\u002FCD pipeline setup. Use when setting up or modifying build and deployment pipelines. Use when you need to automate quality gates, configure test runners in CI, or establish deployment strategies.","https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F05-技能与代理开发\u002Fci-cd-and-automation\u002FSKILL.md",[],[],{"skillNo":56,"name":57,"nameZh":6,"description":58,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":59,"categories":60,"keywords":61,"publishedAt":19},"01M7EXRFYYSJ3Y15AGPDDEWWQD","chrome-devtools","Uses Chrome DevTools via MCP for efficient debugging, troubleshooting and browser automation. Use when debugging web pages, automating browser interactions, analyzing performance, or inspecting network requests. This skill does not apply to `--slim` mode (MCP configuration).","https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F05-技能与代理开发\u002Fchrome-devtools\u002FSKILL.md",[],[],{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":68,"publishedAt":19},"01M7EXR6EYPE4X5X1BTAE6QJRV","chrome-cdp","Drive a real Chrome via the Chrome DevTools Protocol (CDP). Ensures a\ndebuggable Chrome is running (launching it if needed) so the agent can\nnavigate, read page content, inspect the DOM, run JavaScript, and take\nscreenshots — without the user typing any launch command. Includes a\nfirst-class \"review a live running app\" flow: point Chrome at the app under\ndevelopment and inspect\u002Fscreenshot the REAL page (what a static-artifact tool\ncannot do). Backed by Glimpse and the chrome-devtools MCP server. Use when\nasked to \"use chrome\", \"open chrome\", \"drive my browser\", \"read the page in\nchrome\", \"review the running app\", \"screenshot the app\", or \"\u002Fchrome-cdp\".","https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F05-技能与代理开发\u002Fchrome-cdp\u002FSKILL.md",[],[],{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":73,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":19},"01M7EXR1Y7E79KQKG4J798XGH6","check-identity-pack","Run an AFP 100-point or AUSTRAC safe-harbour identity check over a set of documents, and report exactly what's missing. Use when the user asks to check identity documents, verify someone's ID for onboarding, or assess whether a document pack satisfies Australian identity requirements.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F05-技能与代理开发\u002Fcheck-identity-pack\u002FSKILL.md",[],[],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":19},"01M7EXQXW7C7PGREJW9ZZTZ16H","changelog","Auto-generates a changelog from git commits, sprint data, and design documents. Produces both internal and player-facing versions.","https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F05-技能与代理开发\u002Fchangelog\u002FSKILL.md",[],[],{"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":19},"01M7EXQMH2ZME3ANN8Q8MEWPFB","cellxgene-census","Query the CZ CELLxGENE Census programmatically for versioned public single-cell and spatial transcriptomics data. Use when you need population-scale cell metadata, gene expression slices, Census summary counts, source H5AD URIs\u002Fdownloads, embeddings, spatial Census data, or reference atlas comparisons across organisms, tissues, diseases, assays, and cell types. For analyzing your own local single-cell data use scanpy, anndata, or scvi-tools.","https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F05-技能与代理开发\u002Fcellxgene-census\u002FSKILL.md",[],[]]