[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C347CBY5NE8EVJ9SWG5M18":3,"skill-same:01M6C347CBY5NE8EVJ9SWG5M18":83},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":51,"linkOnly":52,"markdownContent":53,"markdownBody":54,"frontMatter":55,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":6,"ownerHtmlUrl":61,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":62,"install":63,"resources":76},"01M6C347CBY5NE8EVJ9SWG5M18","cmux-find-workspace-by-topic",null,"Find the cmux workspace hosting a given topic (e.g. \"agy\", \"bq\", \"lvl\"), AND any meta-question about cmux workspace finding\u002Fsteering confusion. Trigger phrases: \"find the cmux workspace for X\", \"which cmux tab is doing X\", \"find the [topic] workspace\", \"locate the X cmux workspace\", \"what cmux surface is on X\", \"w:misc - X\", \"improve hermes confusion with cmux workspace finding\", \"skillify cmux workspace routing\", \"audit cmux workflow\", \"review cmux skills\", \"hermes doesn't find the right workspace\". Solves the recurring confusion where the cmux shim points at a stale dev CLI \u002F wrong socket and Hermes doesn't find the workspace that's actually in a different live session. Always start with the multi-socket probe + keyword grep — do NOT trust `cmux list-workspaces` from the default shim. Load this skill BEFORE any 'find a workspace by topic' task AND before any meta audit of cmux workflows (load cmux parent + cmux-mcp-server-options in the same chain).","jleechanorg\u002Fjleechan-skills","jleechanorg","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F221404966?v=4","01M6C1VJ99XG950X1DWPEBCBGX","01M6C1VJDK5YVDNT3362RT5WSB",6,"MIT","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002Fhermes\u002Fskills\u002Fcmux-find-workspace-by-topic\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50],"cmux","cmux find workspace by topic","workspace","find","grep","mcp-server","socket","which","chain","default","bq","workspaces","session","recurring","question","MCP","improve","Meta","start","server","audit","dev","routing","skillify","workflows","workflow","cli","review","2026-11-10 10:12:30",false,"---\nname: cmux-find-workspace-by-topic\ndescription: \"Find the cmux workspace hosting a given topic (e.g. \\\"agy\\\", \\\"bq\\\", \\\"lvl\\\"), AND any meta-question about cmux workspace finding\u002Fsteering confusion. Trigger phrases: \\\"find the cmux workspace for X\\\", \\\"which cmux tab is doing X\\\", \\\"find the [topic] workspace\\\", \\\"locate the X cmux workspace\\\", \\\"what cmux surface is on X\\\", \\\"w:misc - X\\\", \\\"improve hermes confusion with cmux workspace finding\\\", \\\"skillify cmux workspace routing\\\", \\\"audit cmux workflow\\\", \\\"review cmux skills\\\", \\\"hermes doesn't find the right workspace\\\". Solves the recurring confusion where the cmux shim points at a stale dev CLI \u002F wrong socket and Hermes doesn't find the workspace that's actually in a different live session. Always start with the multi-socket probe + keyword grep — do NOT trust `cmux list-workspaces` from the default shim. Load this skill BEFORE any 'find a workspace by topic' task AND before any meta audit of cmux workflows (load cmux parent + cmux-mcp-server-options in the same chain).\"\n---\n\n## ⚠️ Submit Discipline (MANDATORY — read this before every cmux steer)\n\n`cmux send` does **NOT** press Enter. This is the #1 recurring cmux failure mode\n(verified 2026-07-16: user explicitly flagged \"you always forget to send\" after the\nfable iOS pivot bootstrap). The **4-step ritual** below is a hard contract for every\nsend to a cmux surface. Skip ANY step and the message sits in the input buffer\nwithout ever reaching the agent.\n\n### The 4-step ritual\n\n```bash\n# STEP 1 — Type the text. OK response only proves socket acceptance, NOT submission.\ncmux send --workspace workspace:N --surface surface:M \"your message\"\n\n# STEP 2 — Press Enter. send does NOT auto-press Enter.\ncmux send-key --workspace workspace:N --surface surface:M enter\n\n# STEP 3 — Wait 5-15 seconds for the agent to start processing.\nsleep 8\n\n# STEP 4 — Verify with churning label (THE ONLY definitive proof).\ncmux capture-pane --workspace workspace:N --surface surface:M --lines 25\n# Look for one of:\n#   - \"Working (Xs • esc to interrupt)\"\n#   - \"Forming… (Xs · thinking)\"\n#   - \"Precipitating… (Xs · ↓ tokens)\"\n#   - \"Brewed \u002F Churned \u002F Cooked for Xm\"\n# If you see ANY active churning label → SUBMITTED.\n# If the text is still sitting at the ❯ prompt → NOT submitted, repeat step 2.\n# If \"Stopped\" \u002F \"Done\" \u002F nothing → no churn, investigate.\n```\n\n### ⚠️ Output Contract — typed text + terminal response (MANDATORY)\n\nEvery reply that reports a `cmux send` action MUST include, in the same reply:\n\n1. **The exact text that was typed** — verbatim copy of the string passed to `cmux send`.\n2. **The cmux terminal response** — verbatim transcript of what `cmux capture-pane` \u002F\n   `cmux read-screen` returned AFTER the `cmux send-key enter` settle window\n   (typically 5-15s). Specifically, the agent's first action after absorption.\n3. **Submission status** — explicit verdict: \"submitted (churning label X)\",\n   \"not submitted (text still at ❯ prompt)\", or \"blocked (no churn, retried N times)\".\n\n**Treat as not working until we see a response.** A reply that does NOT include\nboth the typed text AND a terminal response is invalid evidence that the\nsteer landed. The operator cannot distinguish a successful send from a failed\nsend that left text in the input buffer.\n\nCanonical contract + echo-back template: `~\u002F.hermes\u002Fskills\u002Fcmux\u002Freferences\u002Foutput-contract-mandatory.md`.\n\n### ⚠️ LLM-Provenance Caveat (MANDATORY footer)\n\nEvery reply that quotes cmux output, terminal text, or agent actions produced\nby another LLM (the worker agent OR the assistant's own synthesis of agent\noutput) MUST end with this verbatim footer:\n\n> *This was generated from another LLM and not the actual user, so feel free\n> to push back if you disagree and we can discuss.*\n\nFull caveat rules + scope: `~\u002F.hermes\u002Fskills\u002Fcmux\u002Freferences\u002Foutput-contract-mandatory.md` § \"LLM-Provenance Caveat\".\n\n### Echo-back proof (MANDATORY)\n\nEvery cmux steering action MUST be followed by an **echo-back proof** in the same\nturn or the immediate next turn to your operator (Slack thread, terminal reply,\nor whichever channel triggered the steer). The proof MUST follow the template\nin `~\u002F.hermes\u002Fskills\u002Fcmux\u002Freferences\u002Foutput-contract-mandatory.md` and include\nthe typed text + terminal response + submission status, not just the\nchurning label.\n\n> ◀ sent to surface:55 (LEFT\u002Fclaudec) at \u003CHH:MM:SS PT> — 4-step ritual complete;\n> churning label \"Forming… 9s · ↓ 4.9k tokens\" confirmed via capture-pane.\n\n**Banned** (these are the failure modes the user keeps flagging):\n- \"I sent the message\" (no Enter proof)\n- \"The agent should have received it\" (no churning label)\n- `cmux send` with no follow-up `cmux send-key enter`\n- Sending to a surface that hasn't been focused (the global focus may be on a\n  different workspace; use the raw RPC `surface.focus` if needed)\n\n### Worktree-pointer strategy for long briefs\n\nFor task briefs >200 chars (e.g. orchestrating iOS app pivot, multi-PR review),\ndo NOT paste the full text into the input. Write the brief to a file in the\nagent's cwd (e.g. `.cmux-\u003Ctask>-brief.md`) and send a 1-2 line pointer. This\navoids the autocompleter contamination pitfall where shell-style tokens inside\nlong text trigger tab completion mid-stream.\n\n### Canonical reference\n\nFull recipe + edge cases + the 2026-06-25 worked example live at:\n`~\u002F.hermes\u002Fskills\u002Fcmux\u002Freferences\u002Fsend-submit-proof-2026-06-25.md`\n\nThis rule was added 2026-07-16 after the fable iOS pivot bootstrap surfaced\n\"you always forget to send\" \u002F \"make sure you press submit and the work starts\non the cmux input\" (Slack ts 1784185650.528089). Apply it uniformly to every\ncmux-touching skill.\n\n# Find the cmux Workspace for a Topic\n\nThe single most common cmux task from the gateway: user names a topic (`agy`, `bq logging`, `cost`, `mobile load`, etc.) and you need to find the cmux workspace hosting it. This is harder than it looks because **multiple live cmux sessions can coexist** (prod + dev), the `~\u002F.local\u002Fbin\u002Fcmux` shim points at **one** of them, and the workspace you want is often in the other one.\n\n**Verified pattern, 2026-06-25 (agy workspace search):** the shim's hardcoded default was `\u002Ftmp\u002Fcmux-debug-fix-agy-hook-deny.sock` (a dead dev CLI). The actual `agy` workspace lived in `\u002Fprivate\u002Ftmp\u002Fcmux-debug-may-18.sock` (a different live dev session). Without the multi-socket probe, the workspace was invisible.\n\n## The 3-step recipe (always run, always in this order)\n\n### Step 1 — Probe all candidate cmux sockets\n\nThe shim (`~\u002F.local\u002Fbin\u002Fcmux`) may be pointed at a dead build or the wrong session. **Enumerate ALL live sockets** before trusting any single `cmux \u003Cverb>` call:\n\n```bash\nfor s in \u002Ftmp\u002Fcmux*.sock \u002Fprivate\u002Ftmp\u002Fcmux*.sock \\\n         ~\u002F.local\u002Fstate\u002Fcmux\u002Fcmux.sock; do\n  if [ -S \"$s\" ]; then\n    r=$(printf '{\"id\":\"q\",\"method\":\"ping\",\"params\":{}}\\n' | nc -U -w 2 \"$s\" 2>&1)\n    [ -n \"$r\" ] && echo \"LIVE: $s → $r\" | head -c 200\n  fi\ndone\n# Also check pointer files — cmux writes its preferred socket path here\ncat \u002Ftmp\u002Fcmux-last-socket-path 2>\u002Fdev\u002Fnull\nls $HOME\u002F.local\u002Fstate\u002Fcmux\u002F*-last-socket-path 2>\u002Fdev\u002Fnull\n# Each pointer references a build-date-suffixed socket like cmux-debug-may-18.sock\n```\n\nOutput: usually 1-2 LIVE entries (prod `cmux.sock` + one debug `cmux-debug-*.sock`). If the shim's default socket isn't in the LIVE list, the shim is pointing at a dead build.\n\n**Full diagnostic + the multi-app probe recipe (unattended-safe):** `cmux\u002FSKILL.md` § \"Two cmux sessions can be live at the same time\" and `references\u002Fmulti-app-socket-probe-recipe-2026-06-24.md`.\n\n### Step 2 — Grep the workspace list of EVERY live session for the topic keyword\n\n```bash\nfor s in \u002Ftmp\u002Fcmux-debug-*.sock \u002Fprivate\u002Ftmp\u002Fcmux-debug-*.sock \\\n         ~\u002F.local\u002Fstate\u002Fcmux\u002Fcmux.sock; do\n  if [ -S \"$s\" ]; then\n    echo \"=== $s ===\"\n    # `workspace list` is the canonical alias; `list-workspaces` works too\n    cmux --socket \"$s\" workspace list 2>\u002Fdev\u002Fnull \\\n      | grep -iE \"\u003Ckeyword>\" \\\n      || echo \"  (no match)\"\n  fi\ndone\n# Topic keyword → match against the TITLE column (after the workspace ref), not the ref itself.\n# E.g. for \"agy\", expect a match like:\n#   workspace:72  w: misc - agy\n```\n\nOutput: a `workspace:N` + human title for each live session that has the topic. If exactly one match: that's the workspace. If multiple matches across sessions: the user has two live cmux apps hosting the same topic — pick the one with the active surface (`[selected]` in `cmux tree --all`).\n\n### Step 3 — Discover the focused surface and read its screen\n\nOnce you have `workspace:N`:\n\n```bash\nSOCK=\u003Cthe socket that returned the match>\ncmux --socket \"$SOCK\" list-pane-surfaces --workspace=workspace:N\n# Look for the leading `*` → that's the focused surface (the one to steer\u002Fread).\n# Then:\ncmux --socket \"$SOCK\" read-screen --workspace=workspace:N \\\n  --surface=surface:M --lines 40\n# Or for a surface that's NOT the focused one, use the focus-then-read recipe\n# in cmux\u002FSKILL.md § \"Reading a Non-Focused Surface\" — `read-screen` ignores\n# non-focused refs.\n```\n\n## What to do when no workspace matches\n\nIf step 2 returns \"no match\" in every live session:\n\n1. **The work may exist in a worktree with no cmux surface driving it.** Check:\n   ```bash\n   git -C $HOME\u002Fprojects\u002F\u003Crepo> worktree list\n   for wt in $(git -C $HOME\u002Fprojects\u002F\u003Crepo> worktree list --porcelain \\\n               | awk '\u002F^worktree\u002F {print $2}'); do\n     branch=$(git -C \"$wt\" branch --show-current 2>\u002Fdev\u002Fnull)\n     echo \"$wt → $branch\"\n   done | grep -iE \"\u003Ctopic-keywords>\"\n   ```\n2. **Search the user's recent PRs and Slack history** for the topic — the workspace may have been closed since the work landed.\n3. **Report the gap explicitly:** \"No live cmux workspace matches `\u003Ckeyword>`. The work is in `\u003Cwt>` on branch `\u003Cbranch>` with no cmux surface, OR the workspace was closed.\"\n\nDon't fabricate a workspace. Don't grep harder hoping to find one. Report the gap.\n\n## Common trap — the user's name doesn't match the workspace title\n\nThe user says \"find the **agy** workspace.\" The actual cmux title is \"**w: misc - agy**\" (with the `misc` prefix). Hermes earlier burned 4 turns looking for \"agy\" as a substring of \"workspace:...\" titles before realizing the keyword has to match the column AFTER the ref.\n\n**Rule:** when the user names a topic, **match against the title column only** (after stripping the `workspace:N` prefix and any status markers like `[selected]`). Don't expect titles to contain all the topic words — they often have prefixes (`w:`, `g -`, `lvl:`, etc.).\n\nIf you can't find the topic in any title, **ask the user for the workspace name verbatim** (e.g. \"is it `misc - agy` or `w: agy`?\"). Don't burn more than 2 grep iterations.\n\n## Topic vs. label drift — verify the surface matches the topic\n\nWorkspace titles are **labels set at creation time**, not guarantees of current work. A workspace named \"lvl: clean flags\" might be driving `mobile load` PRs. After finding the candidate workspace:\n\n1. `cmux identify --workspace=workspace:N` → get the focused `surface_ref` + `tty`.\n2. `ps -ef | grep ttysNNN` → identify the agent + launch cwd.\n3. Confirm the cwd's branch \u002F `gh pr list --head \u003Cbranch>` matches the topic.\n\nIf the label\u002Fcontent doesn't match: the topic might be in **another workspace whose title doesn't contain the keyword** — fall back to `git worktree list` + branch-name grep (same as \"no match\" path above).\n\n## Don't\n\n- **Don't trust `cmux list-workspaces` from the shim alone.** The shim may point at a dead dev CLI or the wrong live session. Always enumerate ALL live sockets first.\n- **Don't grep the socket filename for the topic.** Sockets are named `cmux-debug-\u003Cbuild-date>.sock`, not after the topic.\n- **Don't `cmux read-screen --workspace=workspace:N --surface=surface:M` without re-discovering the surface ID first.** Surface IDs rotate when panes are recreated. Always re-run `list-pane-surfaces --workspace=workspace:N` before reading.\n- **Don't grep `~\u002F.local\u002Fstate\u002Fcmux\u002F` for the topic.** That dir holds socket-pointer files, not workspace names.\n- **Don't tell the user \"no such workspace\" without enumerating worktrees + recent PRs first.** The work may live on disk with no cmux surface — that's a real finding, not a \"not found.\"\n\n## Companion skills\n\n- `cmux` (parent) — Unix socket \u002F CLI reference, including the \"Two cmux sessions\" multi-session pattern and \"Reading a Non-Focused Surface\" focus-then-read recipe.\n- `cmux-terminal-review` — bulk terminal inventory (Healthy\u002FRisky\u002FBlocked digest). Use that for \"what are all the terminals doing,\" not this skill.\n- `find-slack-thread-pr-for-request` — when the user references a topic in Slack history (\"remember that agy work we did last week\"), cross-reference Slack before concluding the work is gone.\n\n## Reference files (this skill)\n\n- `references\u002Fstale-askuserquestion-menu-clear-and-steer-2026-07-28.md` — when the agent is sitting at a stale 4-option AskUserQuestion blocking menu from a *prior* mission (and the menu's referenced PR is already merged \u002F closed \u002F terminal), use the **5-step clear-and-steer ritual**: read-screen to confirm menu state → `cmux send-key escape` → 3s settle → re-read to confirm empty `❯` → then the standard send→enter→verify. Esc is canonical over Enter because Enter on unselected menu picks the default option (often \"Stop here\"), which may not match the user's intent. Verified 2026-07-28, $GITHUB_REPOSITORY PR #8489 (w4\u002Fs80) — operator's steer to `\u002Fgreen` + `\u002Fer` + `\u002Fadvice` succeeded after Esc cleared the stale PR #8328 menu.","## ⚠️ Submit Discipline (MANDATORY — read this before every cmux steer)\n\n`cmux send` does **NOT** press Enter. This is the #1 recurring cmux failure mode\n(verified 2026-07-16: user explicitly flagged \"you always forget to send\" after the\nfable iOS pivot bootstrap). The **4-step ritual** below is a hard contract for every\nsend to a cmux surface. Skip ANY step and the message sits in the input buffer\nwithout ever reaching the agent.\n\n### The 4-step ritual\n\n```bash\n# STEP 1 — Type the text. OK response only proves socket acceptance, NOT submission.\ncmux send --workspace workspace:N --surface surface:M \"your message\"\n\n# STEP 2 — Press Enter. send does NOT auto-press Enter.\ncmux send-key --workspace workspace:N --surface surface:M enter\n\n# STEP 3 — Wait 5-15 seconds for the agent to start processing.\nsleep 8\n\n# STEP 4 — Verify with churning label (THE ONLY definitive proof).\ncmux capture-pane --workspace workspace:N --surface surface:M --lines 25\n# Look for one of:\n#   - \"Working (Xs • esc to interrupt)\"\n#   - \"Forming… (Xs · thinking)\"\n#   - \"Precipitating… (Xs · ↓ tokens)\"\n#   - \"Brewed \u002F Churned \u002F Cooked for Xm\"\n# If you see ANY active churning label → SUBMITTED.\n# If the text is still sitting at the ❯ prompt → NOT submitted, repeat step 2.\n# If \"Stopped\" \u002F \"Done\" \u002F nothing → no churn, investigate.\n```\n\n### ⚠️ Output Contract — typed text + terminal response (MANDATORY)\n\nEvery reply that reports a `cmux send` action MUST include, in the same reply:\n\n1. **The exact text that was typed** — verbatim copy of the string passed to `cmux send`.\n2. **The cmux terminal response** — verbatim transcript of what `cmux capture-pane` \u002F\n   `cmux read-screen` returned AFTER the `cmux send-key enter` settle window\n   (typically 5-15s). Specifically, the agent's first action after absorption.\n3. **Submission status** — explicit verdict: \"submitted (churning label X)\",\n   \"not submitted (text still at ❯ prompt)\", or \"blocked (no churn, retried N times)\".\n\n**Treat as not working until we see a response.** A reply that does NOT include\nboth the typed text AND a terminal response is invalid evidence that the\nsteer landed. The operator cannot distinguish a successful send from a failed\nsend that left text in the input buffer.\n\nCanonical contract + echo-back template: `~\u002F.hermes\u002Fskills\u002Fcmux\u002Freferences\u002Foutput-contract-mandatory.md`.\n\n### ⚠️ LLM-Provenance Caveat (MANDATORY footer)\n\nEvery reply that quotes cmux output, terminal text, or agent actions produced\nby another LLM (the worker agent OR the assistant's own synthesis of agent\noutput) MUST end with this verbatim footer:\n\n> *This was generated from another LLM and not the actual user, so feel free\n> to push back if you disagree and we can discuss.*\n\nFull caveat rules + scope: `~\u002F.hermes\u002Fskills\u002Fcmux\u002Freferences\u002Foutput-contract-mandatory.md` § \"LLM-Provenance Caveat\".\n\n### Echo-back proof (MANDATORY)\n\nEvery cmux steering action MUST be followed by an **echo-back proof** in the same\nturn or the immediate next turn to your operator (Slack thread, terminal reply,\nor whichever channel triggered the steer). The proof MUST follow the template\nin `~\u002F.hermes\u002Fskills\u002Fcmux\u002Freferences\u002Foutput-contract-mandatory.md` and include\nthe typed text + terminal response + submission status, not just the\nchurning label.\n\n> ◀ sent to surface:55 (LEFT\u002Fclaudec) at \u003CHH:MM:SS PT> — 4-step ritual complete;\n> churning label \"Forming… 9s · ↓ 4.9k tokens\" confirmed via capture-pane.\n\n**Banned** (these are the failure modes the user keeps flagging):\n- \"I sent the message\" (no Enter proof)\n- \"The agent should have received it\" (no churning label)\n- `cmux send` with no follow-up `cmux send-key enter`\n- Sending to a surface that hasn't been focused (the global focus may be on a\n  different workspace; use the raw RPC `surface.focus` if needed)\n\n### Worktree-pointer strategy for long briefs\n\nFor task briefs >200 chars (e.g. orchestrating iOS app pivot, multi-PR review),\ndo NOT paste the full text into the input. Write the brief to a file in the\nagent's cwd (e.g. `.cmux-\u003Ctask>-brief.md`) and send a 1-2 line pointer. This\navoids the autocompleter contamination pitfall where shell-style tokens inside\nlong text trigger tab completion mid-stream.\n\n### Canonical reference\n\nFull recipe + edge cases + the 2026-06-25 worked example live at:\n`~\u002F.hermes\u002Fskills\u002Fcmux\u002Freferences\u002Fsend-submit-proof-2026-06-25.md`\n\nThis rule was added 2026-07-16 after the fable iOS pivot bootstrap surfaced\n\"you always forget to send\" \u002F \"make sure you press submit and the work starts\non the cmux input\" (Slack ts 1784185650.528089). Apply it uniformly to every\ncmux-touching skill.\n\n# Find the cmux Workspace for a Topic\n\nThe single most common cmux task from the gateway: user names a topic (`agy`, `bq logging`, `cost`, `mobile load`, etc.) and you need to find the cmux workspace hosting it. This is harder than it looks because **multiple live cmux sessions can coexist** (prod + dev), the `~\u002F.local\u002Fbin\u002Fcmux` shim points at **one** of them, and the workspace you want is often in the other one.\n\n**Verified pattern, 2026-06-25 (agy workspace search):** the shim's hardcoded default was `\u002Ftmp\u002Fcmux-debug-fix-agy-hook-deny.sock` (a dead dev CLI). The actual `agy` workspace lived in `\u002Fprivate\u002Ftmp\u002Fcmux-debug-may-18.sock` (a different live dev session). Without the multi-socket probe, the workspace was invisible.\n\n## The 3-step recipe (always run, always in this order)\n\n### Step 1 — Probe all candidate cmux sockets\n\nThe shim (`~\u002F.local\u002Fbin\u002Fcmux`) may be pointed at a dead build or the wrong session. **Enumerate ALL live sockets** before trusting any single `cmux \u003Cverb>` call:\n\n```bash\nfor s in \u002Ftmp\u002Fcmux*.sock \u002Fprivate\u002Ftmp\u002Fcmux*.sock \\\n         ~\u002F.local\u002Fstate\u002Fcmux\u002Fcmux.sock; do\n  if [ -S \"$s\" ]; then\n    r=$(printf '{\"id\":\"q\",\"method\":\"ping\",\"params\":{}}\\n' | nc -U -w 2 \"$s\" 2>&1)\n    [ -n \"$r\" ] && echo \"LIVE: $s → $r\" | head -c 200\n  fi\ndone\n# Also check pointer files — cmux writes its preferred socket path here\ncat \u002Ftmp\u002Fcmux-last-socket-path 2>\u002Fdev\u002Fnull\nls $HOME\u002F.local\u002Fstate\u002Fcmux\u002F*-last-socket-path 2>\u002Fdev\u002Fnull\n# Each pointer references a build-date-suffixed socket like cmux-debug-may-18.sock\n```\n\nOutput: usually 1-2 LIVE entries (prod `cmux.sock` + one debug `cmux-debug-*.sock`). If the shim's default socket isn't in the LIVE list, the shim is pointing at a dead build.\n\n**Full diagnostic + the multi-app probe recipe (unattended-safe):** `cmux\u002FSKILL.md` § \"Two cmux sessions can be live at the same time\" and `references\u002Fmulti-app-socket-probe-recipe-2026-06-24.md`.\n\n### Step 2 — Grep the workspace list of EVERY live session for the topic keyword\n\n```bash\nfor s in \u002Ftmp\u002Fcmux-debug-*.sock \u002Fprivate\u002Ftmp\u002Fcmux-debug-*.sock \\\n         ~\u002F.local\u002Fstate\u002Fcmux\u002Fcmux.sock; do\n  if [ -S \"$s\" ]; then\n    echo \"=== $s ===\"\n    # `workspace list` is the canonical alias; `list-workspaces` works too\n    cmux --socket \"$s\" workspace list 2>\u002Fdev\u002Fnull \\\n      | grep -iE \"\u003Ckeyword>\" \\\n      || echo \"  (no match)\"\n  fi\ndone\n# Topic keyword → match against the TITLE column (after the workspace ref), not the ref itself.\n# E.g. for \"agy\", expect a match like:\n#   workspace:72  w: misc - agy\n```\n\nOutput: a `workspace:N` + human title for each live session that has the topic. If exactly one match: that's the workspace. If multiple matches across sessions: the user has two live cmux apps hosting the same topic — pick the one with the active surface (`[selected]` in `cmux tree --all`).\n\n### Step 3 — Discover the focused surface and read its screen\n\nOnce you have `workspace:N`:\n\n```bash\nSOCK=\u003Cthe socket that returned the match>\ncmux --socket \"$SOCK\" list-pane-surfaces --workspace=workspace:N\n# Look for the leading `*` → that's the focused surface (the one to steer\u002Fread).\n# Then:\ncmux --socket \"$SOCK\" read-screen --workspace=workspace:N \\\n  --surface=surface:M --lines 40\n# Or for a surface that's NOT the focused one, use the focus-then-read recipe\n# in cmux\u002FSKILL.md § \"Reading a Non-Focused Surface\" — `read-screen` ignores\n# non-focused refs.\n```\n\n## What to do when no workspace matches\n\nIf step 2 returns \"no match\" in every live session:\n\n1. **The work may exist in a worktree with no cmux surface driving it.** Check:\n   ```bash\n   git -C $HOME\u002Fprojects\u002F\u003Crepo> worktree list\n   for wt in $(git -C $HOME\u002Fprojects\u002F\u003Crepo> worktree list --porcelain \\\n               | awk '\u002F^worktree\u002F {print $2}'); do\n     branch=$(git -C \"$wt\" branch --show-current 2>\u002Fdev\u002Fnull)\n     echo \"$wt → $branch\"\n   done | grep -iE \"\u003Ctopic-keywords>\"\n   ```\n2. **Search the user's recent PRs and Slack history** for the topic — the workspace may have been closed since the work landed.\n3. **Report the gap explicitly:** \"No live cmux workspace matches `\u003Ckeyword>`. The work is in `\u003Cwt>` on branch `\u003Cbranch>` with no cmux surface, OR the workspace was closed.\"\n\nDon't fabricate a workspace. Don't grep harder hoping to find one. Report the gap.\n\n## Common trap — the user's name doesn't match the workspace title\n\nThe user says \"find the **agy** workspace.\" The actual cmux title is \"**w: misc - agy**\" (with the `misc` prefix). Hermes earlier burned 4 turns looking for \"agy\" as a substring of \"workspace:...\" titles before realizing the keyword has to match the column AFTER the ref.\n\n**Rule:** when the user names a topic, **match against the title column only** (after stripping the `workspace:N` prefix and any status markers like `[selected]`). Don't expect titles to contain all the topic words — they often have prefixes (`w:`, `g -`, `lvl:`, etc.).\n\nIf you can't find the topic in any title, **ask the user for the workspace name verbatim** (e.g. \"is it `misc - agy` or `w: agy`?\"). Don't burn more than 2 grep iterations.\n\n## Topic vs. label drift — verify the surface matches the topic\n\nWorkspace titles are **labels set at creation time**, not guarantees of current work. A workspace named \"lvl: clean flags\" might be driving `mobile load` PRs. After finding the candidate workspace:\n\n1. `cmux identify --workspace=workspace:N` → get the focused `surface_ref` + `tty`.\n2. `ps -ef | grep ttysNNN` → identify the agent + launch cwd.\n3. Confirm the cwd's branch \u002F `gh pr list --head \u003Cbranch>` matches the topic.\n\nIf the label\u002Fcontent doesn't match: the topic might be in **another workspace whose title doesn't contain the keyword** — fall back to `git worktree list` + branch-name grep (same as \"no match\" path above).\n\n## Don't\n\n- **Don't trust `cmux list-workspaces` from the shim alone.** The shim may point at a dead dev CLI or the wrong live session. Always enumerate ALL live sockets first.\n- **Don't grep the socket filename for the topic.** Sockets are named `cmux-debug-\u003Cbuild-date>.sock`, not after the topic.\n- **Don't `cmux read-screen --workspace=workspace:N --surface=surface:M` without re-discovering the surface ID first.** Surface IDs rotate when panes are recreated. Always re-run `list-pane-surfaces --workspace=workspace:N` before reading.\n- **Don't grep `~\u002F.local\u002Fstate\u002Fcmux\u002F` for the topic.** That dir holds socket-pointer files, not workspace names.\n- **Don't tell the user \"no such workspace\" without enumerating worktrees + recent PRs first.** The work may live on disk with no cmux surface — that's a real finding, not a \"not found.\"\n\n## Companion skills\n\n- `cmux` (parent) — Unix socket \u002F CLI reference, including the \"Two cmux sessions\" multi-session pattern and \"Reading a Non-Focused Surface\" focus-then-read recipe.\n- `cmux-terminal-review` — bulk terminal inventory (Healthy\u002FRisky\u002FBlocked digest). Use that for \"what are all the terminals doing,\" not this skill.\n- `find-slack-thread-pr-for-request` — when the user references a topic in Slack history (\"remember that agy work we did last week\"), cross-reference Slack before concluding the work is gone.\n\n## Reference files (this skill)\n\n- `references\u002Fstale-askuserquestion-menu-clear-and-steer-2026-07-28.md` — when the agent is sitting at a stale 4-option AskUserQuestion blocking menu from a *prior* mission (and the menu's referenced PR is already merged \u002F closed \u002F terminal), use the **5-step clear-and-steer ritual**: read-screen to confirm menu state → `cmux send-key escape` → 3s settle → re-read to confirm empty `❯` → then the standard send→enter→verify. Esc is canonical over Enter because Enter on unselected menu picks the default option (often \"Stop here\"), which may not match the user's intent. Verified 2026-07-28, $GITHUB_REPOSITORY PR #8489 (w4\u002Fs80) — operator's steer to `\u002Fgreen` + `\u002Fer` + `\u002Fadvice` succeeded after Esc cleared the stale PR #8328 menu.",{"name":5,"description":7},"main","42ccd02cbf5e8e47839dc3eab6fc754dc6b339cf","hermes\u002Fskills\u002Fcmux-find-workspace-by-topic",0,"https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills","https:\u002F\u002Fgithub.com\u002Fjleechanorg","2026-11-12 14:45:07",{"source":8,"skillName":5,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add jleechanorg\u002Fjleechan-skills --skill cmux-find-workspace-by-topic",{"tool":69,"command":70},"bunx","bunx skills add jleechanorg\u002Fjleechan-skills --skill cmux-find-workspace-by-topic",{"tool":72,"command":73},"pnpm","pnpm dlx skills add jleechanorg\u002Fjleechan-skills --skill cmux-find-workspace-by-topic","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002Fhermes\u002Fskills\u002Fcmux-find-workspace-by-topic\u002FSKILL.md",true,[77],{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"references\u002Fstale-askuserquestion-menu-clear-and-steer-2026-07-28.md","REFERENCE","参考文档",6683,"https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002Fhermes\u002Fskills\u002Fcmux-find-workspace-by-topic\u002Freferences\u002Fstale-askuserquestion-menu-clear-and-steer-2026-07-28.md",[84,102,124,138,151,166],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":51},"01M716Y5MTJ6GYJZ2ATXCJK8G4","instinct","Use when the user invokes \u002Finstinct or \u002Fin, or asks to \"message Instinct\", \"ask Instinct\", \"tell Instinct\", \"check Instinct\", or read replies from the configured peer assistant. iMessage first, WhatsApp Web as fallback.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Finstinct\u002FSKILL.md",[],[86,91,92,93,94,95,96,97,98,99,100,101],"user","when","replies","check","use","identity","whatsapp","gmail","read","message","ask",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":113,"publishedAt":51},"01M716Y4HF7FVVMJSA2CCVN5VF","hr","Compatibility alias for history-resume; produce the same fresh-state, provenance-aware resume briefing.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhr\u002FSKILL.md",[108],{"categoryNo":109,"categoryName":110,"taxonomyType":111,"taxonomyTypeDesc":112},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[104,114,115,116,117,118,119,120,121,122,123],"resume","compatibility","provenance","for","history","produce","alias","briefing","state","fresh",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":131,"publishedAt":51},"01M716Y1FFNFKFJYYKF8HQA6T8","history-resume","Resume briefing for the current repository branch or worktree using fresh state and admitted history sources.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhistory-resume\u002FSKILL.md",[130],{"categoryNo":109,"categoryName":110,"taxonomyType":111,"taxonomyTypeDesc":112},[118,114,132,133,91,134,121,135,117,136,137,122,123],"history resume","branch","analysis","repository","worktree","sources",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":51},"01M716XWXJ8EPHK4RH9T14TR85","grok","Alias for the canonical grokbot browser conversation workflow; \u002Fgrok talks to the Grok bot the same way \u002Fdot talks to Dot.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgrok\u002FSKILL.md",[],[140,145,146,48,117,147,120,148,149,150],"dot","bot","canonical","conversation","browser","grokbot",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":157,"publishedAt":51},"01M70N9Q07DTE0EW5KFXMMMSJ0","codexa-bench","Compare `codexa` and normal `codex` on a fair split of comparable work by default; use `--strict` for duplicate runs of the exact same task.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fcodexa-bench\u002FSKILL.md",[],[158,159,160,95,32,117,161,162,163,164,165],"codexa bench","work","split","duplicate","task","compare","normal","codex",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":170,"licenseFileUrl":171,"sourceHtmlUrl":172,"categories":173,"keywords":183,"publishedAt":51},"01M6C24S2X60SP8BBFGAEKPEGW","frontend-design","Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML\u002FCSS layouts, or when styling\u002Fbeautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-design\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-design\u002FSKILL.md",[174,177,180],{"categoryNo":175,"categoryName":176,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":178,"categoryName":179,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":181,"categoryName":182,"taxonomyType":111,"taxonomyTypeDesc":112},"01JBSEEDCAT000000000000032","设计师",[184,185,186,95,187,188,189,91,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,92,208],"frontend","design","frontend design","generic","ui design","react","html","components","code","artifacts","ui","aesthetics","Production","web components","landing","applications","quality","web","css","create","examples","with","react components","web ui","pages"]