[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7354D93G0P37BRHR2T3HD82":3,"skill-same:01M7354D93G0P37BRHR2T3HD82":51},{"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":30,"commitSha":31,"skillDirectory":32,"forksCount":33,"repositoryHtmlUrl":34,"repositoryHomepageUrl":35,"ownerHtmlUrl":36,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":37,"install":38,"resources":50},"01M7354D93G0P37BRHR2T3HD82","handoff",null,"Snapshot state to forge\u002Fmemory.","Morrison-Lab\u002Fai-config","Morrison-Lab","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F104235520?v=4","01M734G0451S2G35MN4HFQK7XP","Morrison Lab","01M734G059BYFDFQA8YTPDGPMH",4,"MIT","https:\u002F\u002Fgithub.com\u002FMorrison-Lab\u002Fai-config\u002Fblob\u002Fmain\u002Fskills\u002Fhandoff\u002FSKILL.md",[],[],"2026-11-11 15:11:14",false,"---\nname: handoff\ndescription: \"Snapshot state to forge\u002Fmemory.\"\nuser-invocable: true\nallowed-tools:\n  - Bash\n  - Read\n  - Write\n  - Edit\n---\n\n# handoff\n\nCapture everything the next session (or a context reset) needs to resume this\nwork cleanly, then **post it on the forge** --- GitHub, GitLab, or whichever\ntracker owns the work --- and keep a copy as a **project memory**.\n\nThe forge post is the required half, and the memory file is the backup.\nA memory file is readable only by this account on this machine,\nso a teammate, a remote session, a CI run,\nand the user reading the forge cannot see a handoff that exists only there.\n\nThis is the manual trigger for the standing \"always leave handoff notes\nproactively when pausing\" policy in `memories\u002Fpreferences.md`: *always* leave\npick-up notes when pausing, especially with long-running jobs in flight. Run it\non demand, or fire it yourself proactively when you're about to pause and\nsomething is still running.\n\n## When this fires\n\n- The user ends or pauses a session: \"handoff\", \"leave myself notes\", \"pause\n  and save state\", \"wrap up for now\", \"I'm stopping here\".\n- **Proactively**, without being asked, whenever you pause while a job outlives\n  the session — SLURM arrays, long builds, CI runs, background tasks, remote\n  agents.\n\nSkip it for a clean stopping point with nothing outstanding (no jobs, no\nunpushed commits, no open decisions) — there's nothing to hand off.\n\n## Step 1 — Snapshot the state\n\nGather the facts. Run what's relevant; don't invent values.\n\n```bash\nTZ=America\u002FLos_Angeles date \"+%Y-%m-%d %H:%M %Z\" # local-time stamp (Pacific)\ngit rev-parse --abbrev-ref HEAD                  # branch\ngit log --oneline -1                             # local HEAD\ngit log --oneline @{u}..HEAD 2>\u002Fdev\u002Fnull         # UNPUSHED commits\ngit rev-parse --short @{u} 2>\u002Fdev\u002Fnull           # pushed HEAD on remote\ngit status --short                               # dirty \u002F untracked\nsqueue -u \"$USER\" 2>\u002Fdev\u002Fnull                    # SLURM jobs (if on a cluster)\n```\n\nAlso note anything not visible to git: background tasks you launched (IDs +\noutput paths), CI runs you're waiting on, archived\u002Fbackup directories, and any\n**open decisions** the user still has to make.\n\nIn an ephemeral container, a pause can outlive the container, and a quota limit can end the session with no clean exit.\nSo before such a pause, push every worktree branch to `origin` that the repo's pre-push review guard (`hooks\u002Fno-push-without-self-review.py`) lets you push without a review, giving a dirty tree a `wip:` commit that names the interrupted step.\nWhere the guard needs a verdict that cannot run before the pause, leave the branch unpushed and say so in the handoff.\nPost each in-flight item's head SHA and last findings on its issue too, since `Workflow` journals die with the container ([ai-config#3203](https:\u002F\u002Fgithub.com\u002FMorrison-Lab\u002Fai-config\u002Fissues\u002F3203), 2026-09-03).\n\n## Step 2 — Write (or update) the handoff memory\n\nThis is the backup copy, and Step 3 posts the same content somewhere others can\nread it.\n\nWrite to the project memory directory\n(`~\u002F.claude\u002Fprojects\u002F\u003Cproject-slug>\u002Fmemory\u002F`). Reuse an existing in-flight\nhandoff file if one already covers this work (update it in place) rather than\ncreating a duplicate. Frontmatter `type: project`. Convert relative dates to\nabsolute. Capture, concretely:\n\n- **Where things stand** — current verdict\u002FCI state, what's done vs pending.\n- **Unpushed\u002Funcommitted work** — commit SHAs held back and *why*.\n- **In-flight jobs** — exact IDs, how to check status, expected outputs + paths,\n  rough ETA.\n- **Backups\u002Farchives** — paths to anything moved aside, and when it's safe to\n  delete.\n- **Open decisions** — questions still owned by the user.\n- **Pick-up steps** — a numbered, copy-pasteable sequence to resume. End with a\n  one-line \"next session, in one line\" summary.\n\nLink related memories with `[[name]]` (e.g. any runtime-quirk memory the\npick-up steps depend on). Then add a one-line pointer to `MEMORY.md` (or update\nthe existing one).\n\n## Step 3 --- Post the handoff on the relevant forge thread(s)\n\nPost the handoff every time, including when no PR\u002FMR is in play.\nThe forge is the one place a later session, a reviewer, and the user all\nalready look, so it is where the pick-up state belongs.\nRoute by what the work actually has:\n\n- **An open PR\u002FMR you've claimed, still in scope** --- comment on it, in the\n  paused-claim form below; otherwise route the handoff to the issue.\n- **An issue and no PR\u002FMR** --- comment on the issue.\n- **Neither** --- file an issue whose body is the handoff, per\n  [`issue-first`](..\u002F..\u002Fshared\u002Fworkflow\u002Fissue-first.md).\n- **State that outlives the thread** --- commit it to a file in the repo (a\n  runbook, a design note) and link that file from the comment.\n\nCombine these freely: a committed file for the long-lived detail, an issue for\nthe open decisions, a PR comment for the paused claim.\nEnd every comment you post with the agent-disclosure marker, per\n[`disclose-agent-authorship`](..\u002F..\u002Fshared\u002Fworkflow\u002Fdisclose-agent-authorship.md).\nOn GitLab, `glab` mirrors each `gh` command below.\n[`AGENTS.md`](..\u002F..\u002FAGENTS.md)'s membership gate still governs the post: verify\nmembership in that repository first, and where it is unverified, keep the\nmemory file and ask the user before posting.\n\nIf the work has an open PR\u002FMR and you've **claimed** it (see `claim-pr`), the\nnote also stops the `@claude` bot and other sessions pushing conflicting\nchanges --- especially when you have unpushed local commits or running jobs.\nPost it only when that PR still passes `memories\u002Freviewing-prs.md`'s scope\ntest: a claim confers no scope, so if the PR has since fallen out of scope,\nskip the note, route the handoff to the issue instead, and report the PR to\nthe user.\n\n```bash\ngh pr comment \u003CN> --body \"⏸️ **Local session paused** (\u003Clocal timestamp>) — still claimed.\n\n\u003Cthe Step 2 handoff content: where things stand, in-flight jobs + IDs, unpushed\nlocal commits and why held, open decisions, numbered pick-up steps>\n\nPlease hold off on pushing to this branch in the meantime.\n\nSession worktree: \u003Coutput of git rev-parse --show-toplevel>\n\n_Posted by Claude Code (AI agent) --- not written by a human._\"   # COMMENT_PR\n```\n\nIf the work is genuinely *finished* (merged\u002Fclosed, nothing outstanding), post a\nclosing\u002Funclaim note instead per `claim-pr` — don't leave a stale \"paused\" claim.\n\n- **Do:** post the handoff to the forge thread that owns the work every time\n  you pause, and keep the memory file as the backup copy.\n- **Do:** route to the issue --- filing one when none exists --- when the work\n  has no open PR\u002FMR to comment on.\n- **Do:** end each posted comment with the agent-disclosure marker.\n- **Don't:** treat a written memory file as a completed handoff; nobody but\n  this account on this machine can read it.\n- **Don't:** skip the post because there is no PR --- an issue thread, a\n  committed file, or a new issue is the route.\n- **Don't:** post to a repository whose membership is unverified --- hold the\n  handoff in memory and ask the user.\n\n## Step 4 --- Confirm\n\nGive the user a compact recap: what was snapshotted, where the memory lives,\nlinks to every forge thread the handoff was posted on, and the one-line pick-up\nsummary.\nInclude a local-time stamp.\n\n## Step 5 --- Retire a handoff once its state is resolved\n\nA handoff is a **snapshot with an expiry**, not a durable record.\nEverything it carries --- a branch, an unpushed commit, a running job, an open\ndecision --- either resolves or is superseded.\nOnce all of it has, the handoff is not merely redundant.\nIt is **actively misleading**, because a later reader meets it as orientation\nand cannot tell which parts still hold.\n\n**You may clear an out-of-date handoff without asking.**\nStanding permission, given 2026-08-16.\nThe judgment worth exercising is whether it is genuinely stale, not whether you\nare allowed to remove it.\n\nStaleness is derivable rather than a matter of taste, so derive it.\nTake every PR, issue, branch, and job id the handoff names, and check each:\n\n```bash\ngrep -oE '#[0-9]+' \u003Chandoff> | sort -u | while read -r n; do\n  printf \"  %s %s\\n\" \"$n\" \"$(gh pr view \"${n#\\#}\" --json state -q .state 2>\u002Fdev\u002Fnull \\\n    || gh issue view \"${n#\\#}\" --json state -q .state 2>\u002Fdev\u002Fnull || echo '?')\"\ndone\ngrep -oE '`[a-z]+\u002F[a-z0-9-]+`' \u003Chandoff> | tr -d '`' | sort -u | while read -r b; do\n  printf \"  branch %-40s %s\\n\" \"$b\" \\\n    \"$(git ls-remote --heads origin \"$b\" | wc -l | sed 's\u002F^0$\u002FGONE\u002F;s\u002F^1$\u002FEXISTS\u002F')\"\ndone\n```\n\nEvery PR merged or closed, every branch gone, every job finished --- clear it.\nAnything still open or still running --- keep it, and say which item held it.\n\n**An open *issue* it references does not keep it alive.**\nA handoff's value is the in-flight state it captured; an issue is tracked in the\ntracker, which is where a reader should meet it.\nJudge on the in-flight items.\n\n### A handoff written as a repo-root file is a staging hazard\n\nStep 2 persists the snapshot as a **project memory**, which is outside the repo\nand cannot be committed by accident,\nand Step 3's committed-file route tracks the file deliberately.\nA handoff written instead as a repo-root `HANDOFF-*.md` is untracked **and**\nusually unignored, which is precisely the combination that lets a bare\n`git add -A` sweep it into a PR.\n\nThat is not hypothetical.\nIt is the shape of `ucdavis\u002Fbcs`'s 2026-07-30 incident, where an\nuntracked-and-unignored directory was staged that way and pushed a credential.\n\nSo prefer the project-memory form, or a file you track deliberately.\nWhere a repo-root file already exists, either retire it under the rule above or\nadd a `.gitignore` entry --- and read its contents before doing either, since a\nstale handoff can carry a rule the project has since **reversed**, which is\nworse than one that is merely out of date.\n\n- **Do:** derive staleness from the state of every item a handoff names, and\n  clear it once they have all resolved.\n- **Do:** read a stale handoff before deleting it, in case it states a\n  convention the project has since changed.\n- **Don't:** keep a handoff alive because it mentions an open issue --- the\n  tracker owns that.\n- **Don't:** leave a repo-root handoff untracked and unignored; that is the\n  `git add -A` hazard, not merely clutter.\n\n## Relationship to other skills\n\n- `memories\u002Fpreferences.md` (the \"always leave handoff notes proactively\"\n  bullet) — the *policy* (when to hand off automatically); this skill is the\n  *action*.\n- `memorize` \u002F `remember` — general fact persistence; `handoff` is the\n  specialized \"save session state\" case.\n- `claim-pr` — owns the claim\u002Funclaim lifecycle; `handoff` posts the *paused*\n  note within an existing claim.\n- **`checkpoint`** — a lighter, deliberate mid-task snapshot for a session\n  that *isn't* ending: plan state, decisions, next actions, no branch\u002Fjob\u002Fforge-post\n  mechanics. Run `handoff` when actually stopping; `checkpoint` when just\n  banking progress mid-task.\n- **`compress-session`** — distills the conversation into auto memory before\n  the context window fills up, so a compaction (not a session end) doesn't\n  lose what matters. `handoff` ends the session; `compress-session` keeps it\n  going with a smaller, curated context.\n","# handoff\n\nCapture everything the next session (or a context reset) needs to resume this\nwork cleanly, then **post it on the forge** --- GitHub, GitLab, or whichever\ntracker owns the work --- and keep a copy as a **project memory**.\n\nThe forge post is the required half, and the memory file is the backup.\nA memory file is readable only by this account on this machine,\nso a teammate, a remote session, a CI run,\nand the user reading the forge cannot see a handoff that exists only there.\n\nThis is the manual trigger for the standing \"always leave handoff notes\nproactively when pausing\" policy in `memories\u002Fpreferences.md`: *always* leave\npick-up notes when pausing, especially with long-running jobs in flight. Run it\non demand, or fire it yourself proactively when you're about to pause and\nsomething is still running.\n\n## When this fires\n\n- The user ends or pauses a session: \"handoff\", \"leave myself notes\", \"pause\n  and save state\", \"wrap up for now\", \"I'm stopping here\".\n- **Proactively**, without being asked, whenever you pause while a job outlives\n  the session — SLURM arrays, long builds, CI runs, background tasks, remote\n  agents.\n\nSkip it for a clean stopping point with nothing outstanding (no jobs, no\nunpushed commits, no open decisions) — there's nothing to hand off.\n\n## Step 1 — Snapshot the state\n\nGather the facts. Run what's relevant; don't invent values.\n\n```bash\nTZ=America\u002FLos_Angeles date \"+%Y-%m-%d %H:%M %Z\" # local-time stamp (Pacific)\ngit rev-parse --abbrev-ref HEAD                  # branch\ngit log --oneline -1                             # local HEAD\ngit log --oneline @{u}..HEAD 2>\u002Fdev\u002Fnull         # UNPUSHED commits\ngit rev-parse --short @{u} 2>\u002Fdev\u002Fnull           # pushed HEAD on remote\ngit status --short                               # dirty \u002F untracked\nsqueue -u \"$USER\" 2>\u002Fdev\u002Fnull                    # SLURM jobs (if on a cluster)\n```\n\nAlso note anything not visible to git: background tasks you launched (IDs +\noutput paths), CI runs you're waiting on, archived\u002Fbackup directories, and any\n**open decisions** the user still has to make.\n\nIn an ephemeral container, a pause can outlive the container, and a quota limit can end the session with no clean exit.\nSo before such a pause, push every worktree branch to `origin` that the repo's pre-push review guard (`hooks\u002Fno-push-without-self-review.py`) lets you push without a review, giving a dirty tree a `wip:` commit that names the interrupted step.\nWhere the guard needs a verdict that cannot run before the pause, leave the branch unpushed and say so in the handoff.\nPost each in-flight item's head SHA and last findings on its issue too, since `Workflow` journals die with the container ([ai-config#3203](https:\u002F\u002Fgithub.com\u002FMorrison-Lab\u002Fai-config\u002Fissues\u002F3203), 2026-09-03).\n\n## Step 2 — Write (or update) the handoff memory\n\nThis is the backup copy, and Step 3 posts the same content somewhere others can\nread it.\n\nWrite to the project memory directory\n(`~\u002F.claude\u002Fprojects\u002F\u003Cproject-slug>\u002Fmemory\u002F`). Reuse an existing in-flight\nhandoff file if one already covers this work (update it in place) rather than\ncreating a duplicate. Frontmatter `type: project`. Convert relative dates to\nabsolute. Capture, concretely:\n\n- **Where things stand** — current verdict\u002FCI state, what's done vs pending.\n- **Unpushed\u002Funcommitted work** — commit SHAs held back and *why*.\n- **In-flight jobs** — exact IDs, how to check status, expected outputs + paths,\n  rough ETA.\n- **Backups\u002Farchives** — paths to anything moved aside, and when it's safe to\n  delete.\n- **Open decisions** — questions still owned by the user.\n- **Pick-up steps** — a numbered, copy-pasteable sequence to resume. End with a\n  one-line \"next session, in one line\" summary.\n\nLink related memories with `[[name]]` (e.g. any runtime-quirk memory the\npick-up steps depend on). Then add a one-line pointer to `MEMORY.md` (or update\nthe existing one).\n\n## Step 3 --- Post the handoff on the relevant forge thread(s)\n\nPost the handoff every time, including when no PR\u002FMR is in play.\nThe forge is the one place a later session, a reviewer, and the user all\nalready look, so it is where the pick-up state belongs.\nRoute by what the work actually has:\n\n- **An open PR\u002FMR you've claimed, still in scope** --- comment on it, in the\n  paused-claim form below; otherwise route the handoff to the issue.\n- **An issue and no PR\u002FMR** --- comment on the issue.\n- **Neither** --- file an issue whose body is the handoff, per\n  [`issue-first`](..\u002F..\u002Fshared\u002Fworkflow\u002Fissue-first.md).\n- **State that outlives the thread** --- commit it to a file in the repo (a\n  runbook, a design note) and link that file from the comment.\n\nCombine these freely: a committed file for the long-lived detail, an issue for\nthe open decisions, a PR comment for the paused claim.\nEnd every comment you post with the agent-disclosure marker, per\n[`disclose-agent-authorship`](..\u002F..\u002Fshared\u002Fworkflow\u002Fdisclose-agent-authorship.md).\nOn GitLab, `glab` mirrors each `gh` command below.\n[`AGENTS.md`](..\u002F..\u002FAGENTS.md)'s membership gate still governs the post: verify\nmembership in that repository first, and where it is unverified, keep the\nmemory file and ask the user before posting.\n\nIf the work has an open PR\u002FMR and you've **claimed** it (see `claim-pr`), the\nnote also stops the `@claude` bot and other sessions pushing conflicting\nchanges --- especially when you have unpushed local commits or running jobs.\nPost it only when that PR still passes `memories\u002Freviewing-prs.md`'s scope\ntest: a claim confers no scope, so if the PR has since fallen out of scope,\nskip the note, route the handoff to the issue instead, and report the PR to\nthe user.\n\n```bash\ngh pr comment \u003CN> --body \"⏸️ **Local session paused** (\u003Clocal timestamp>) — still claimed.\n\n\u003Cthe Step 2 handoff content: where things stand, in-flight jobs + IDs, unpushed\nlocal commits and why held, open decisions, numbered pick-up steps>\n\nPlease hold off on pushing to this branch in the meantime.\n\nSession worktree: \u003Coutput of git rev-parse --show-toplevel>\n\n_Posted by Claude Code (AI agent) --- not written by a human._\"   # COMMENT_PR\n```\n\nIf the work is genuinely *finished* (merged\u002Fclosed, nothing outstanding), post a\nclosing\u002Funclaim note instead per `claim-pr` — don't leave a stale \"paused\" claim.\n\n- **Do:** post the handoff to the forge thread that owns the work every time\n  you pause, and keep the memory file as the backup copy.\n- **Do:** route to the issue --- filing one when none exists --- when the work\n  has no open PR\u002FMR to comment on.\n- **Do:** end each posted comment with the agent-disclosure marker.\n- **Don't:** treat a written memory file as a completed handoff; nobody but\n  this account on this machine can read it.\n- **Don't:** skip the post because there is no PR --- an issue thread, a\n  committed file, or a new issue is the route.\n- **Don't:** post to a repository whose membership is unverified --- hold the\n  handoff in memory and ask the user.\n\n## Step 4 --- Confirm\n\nGive the user a compact recap: what was snapshotted, where the memory lives,\nlinks to every forge thread the handoff was posted on, and the one-line pick-up\nsummary.\nInclude a local-time stamp.\n\n## Step 5 --- Retire a handoff once its state is resolved\n\nA handoff is a **snapshot with an expiry**, not a durable record.\nEverything it carries --- a branch, an unpushed commit, a running job, an open\ndecision --- either resolves or is superseded.\nOnce all of it has, the handoff is not merely redundant.\nIt is **actively misleading**, because a later reader meets it as orientation\nand cannot tell which parts still hold.\n\n**You may clear an out-of-date handoff without asking.**\nStanding permission, given 2026-08-16.\nThe judgment worth exercising is whether it is genuinely stale, not whether you\nare allowed to remove it.\n\nStaleness is derivable rather than a matter of taste, so derive it.\nTake every PR, issue, branch, and job id the handoff names, and check each:\n\n```bash\ngrep -oE '#[0-9]+' \u003Chandoff> | sort -u | while read -r n; do\n  printf \"  %s %s\\n\" \"$n\" \"$(gh pr view \"${n#\\#}\" --json state -q .state 2>\u002Fdev\u002Fnull \\\n    || gh issue view \"${n#\\#}\" --json state -q .state 2>\u002Fdev\u002Fnull || echo '?')\"\ndone\ngrep -oE '`[a-z]+\u002F[a-z0-9-]+`' \u003Chandoff> | tr -d '`' | sort -u | while read -r b; do\n  printf \"  branch %-40s %s\\n\" \"$b\" \\\n    \"$(git ls-remote --heads origin \"$b\" | wc -l | sed 's\u002F^0$\u002FGONE\u002F;s\u002F^1$\u002FEXISTS\u002F')\"\ndone\n```\n\nEvery PR merged or closed, every branch gone, every job finished --- clear it.\nAnything still open or still running --- keep it, and say which item held it.\n\n**An open *issue* it references does not keep it alive.**\nA handoff's value is the in-flight state it captured; an issue is tracked in the\ntracker, which is where a reader should meet it.\nJudge on the in-flight items.\n\n### A handoff written as a repo-root file is a staging hazard\n\nStep 2 persists the snapshot as a **project memory**, which is outside the repo\nand cannot be committed by accident,\nand Step 3's committed-file route tracks the file deliberately.\nA handoff written instead as a repo-root `HANDOFF-*.md` is untracked **and**\nusually unignored, which is precisely the combination that lets a bare\n`git add -A` sweep it into a PR.\n\nThat is not hypothetical.\nIt is the shape of `ucdavis\u002Fbcs`'s 2026-07-30 incident, where an\nuntracked-and-unignored directory was staged that way and pushed a credential.\n\nSo prefer the project-memory form, or a file you track deliberately.\nWhere a repo-root file already exists, either retire it under the rule above or\nadd a `.gitignore` entry --- and read its contents before doing either, since a\nstale handoff can carry a rule the project has since **reversed**, which is\nworse than one that is merely out of date.\n\n- **Do:** derive staleness from the state of every item a handoff names, and\n  clear it once they have all resolved.\n- **Do:** read a stale handoff before deleting it, in case it states a\n  convention the project has since changed.\n- **Don't:** keep a handoff alive because it mentions an open issue --- the\n  tracker owns that.\n- **Don't:** leave a repo-root handoff untracked and unignored; that is the\n  `git add -A` hazard, not merely clutter.\n\n## Relationship to other skills\n\n- `memories\u002Fpreferences.md` (the \"always leave handoff notes proactively\"\n  bullet) — the *policy* (when to hand off automatically); this skill is the\n  *action*.\n- `memorize` \u002F `remember` — general fact persistence; `handoff` is the\n  specialized \"save session state\" case.\n- `claim-pr` — owns the claim\u002Funclaim lifecycle; `handoff` posts the *paused*\n  note within an existing claim.\n- **`checkpoint`** — a lighter, deliberate mid-task snapshot for a session\n  that *isn't* ending: plan state, decisions, next actions, no branch\u002Fjob\u002Fforge-post\n  mechanics. Run `handoff` when actually stopping; `checkpoint` when just\n  banking progress mid-task.\n- **`compress-session`** — distills the conversation into auto memory before\n  the context window fills up, so a compaction (not a session end) doesn't\n  lose what matters. `handoff` ends the session; `compress-session` keeps it\n  going with a smaller, curated context.\n",{"name":5,"description":7,"allowed-tools":24,"user-invocable":29},[25,26,27,28],"Bash","Read","Write","Edit",true,"main","aed9be7a6beca85e267d19d9d354f50da6c37417","skills\u002Fhandoff",1,"https:\u002F\u002Fgithub.com\u002FMorrison-Lab\u002Fai-config","https:\u002F\u002Fmorrison-lab.github.io\u002Fai-config\u002F","https:\u002F\u002Fgithub.com\u002FMorrison-Lab","2026-11-14 04:56:47",{"source":8,"skillName":5,"commands":39,"prompt":49,"zipAvailable":29},[40,43,46],{"tool":41,"command":42},"npx","npx skills add Morrison-Lab\u002Fai-config --skill handoff",{"tool":44,"command":45},"bunx","bunx skills add Morrison-Lab\u002Fai-config --skill handoff",{"tool":47,"command":48},"pnpm","pnpm dlx skills add Morrison-Lab\u002Fai-config --skill handoff","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FMorrison-Lab\u002Fai-config\u002Fblob\u002Fmain\u002Fskills\u002Fhandoff\u002FSKILL.md",[],[52,59,66,73,80,87],{"skillNo":53,"name":54,"nameZh":6,"description":55,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":58,"publishedAt":19},"01M735ADD75T5N3CYSMV3PKZN7","stack-prs","Stack dependent PR on another.","https:\u002F\u002Fgithub.com\u002FMorrison-Lab\u002Fai-config\u002Fblob\u002Fmain\u002Fskills\u002Fstack-prs\u002FSKILL.md",[],[],{"skillNo":60,"name":61,"nameZh":6,"description":62,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":65,"publishedAt":19},"01M7353JY4NDFPQEMYDBJSTYGC","finish-wave","Finish the current wave; start no new one.","https:\u002F\u002Fgithub.com\u002FMorrison-Lab\u002Fai-config\u002Fblob\u002Fmain\u002Fskills\u002Ffinish-wave\u002FSKILL.md",[],[],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":19},"01M734Y0XAAEAWM3J2X7JFDZSM","advisor","Read-only second opinion from a different model family.","https:\u002F\u002Fgithub.com\u002FMorrison-Lab\u002Fai-config\u002Fblob\u002Fmain\u002Fskills\u002Fadvisor\u002FSKILL.md",[],[],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":19},"01M73593BZ33TKTNBDX8JNKYN8","resolve-conflicts","Resolve merge conflicts.","https:\u002F\u002Fgithub.com\u002FMorrison-Lab\u002Fai-config\u002Fblob\u002Fmain\u002Fskills\u002Fresolve-conflicts\u002FSKILL.md",[],[],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":19},"01M73584TVDWNA1HMAQ8XXGSZV","rec","Provide recommendations for choices.","https:\u002F\u002Fgithub.com\u002FMorrison-Lab\u002Fai-config\u002Fblob\u002Fmain\u002Fskills\u002Frec\u002FSKILL.md",[],[],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":93,"publishedAt":19},"01M7357KC2MZNHTDDSY4DT9CGJ","push","Pre-push check for active sessions.","https:\u002F\u002Fgithub.com\u002FMorrison-Lab\u002Fai-config\u002Fblob\u002Fmain\u002Fskills\u002Fpush\u002FSKILL.md",[],[]]