[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C6CWQR2X5ZPD73ENDGPY28":3,"skill-same:01M6C6CWQR2X5ZPD73ENDGPY28":97},{"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":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":6,"ownerHtmlUrl":54,"ownerBlogUrl":6,"ownerDescription":55,"updatedAt":56,"install":57,"resources":70},"01M6C6CWQR2X5ZPD73ENDGPY28","session-end",null,"End-of-session orchestrator. Runs reversible wrap\u002Fdistill\u002Ftaskwarrior work at once, asks once for outward filings. Use when winding down a session.","laurigates\u002Fclaude-plugins","laurigates","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F13014001?v=4","01M6C59YHWS9C7KMXKSRX1YXNP","Lauri Gates","01M6C59YP2APG9YAM4DWYQYGFJ",59,"MIT","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fsession-plugin\u002Fskills\u002Fsession-end\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"session end","session","end","2026","when","down","at","for","taskwarrior","wed","wrap","work","task","filings","Bash","use","gh","git","distill","read","orchestrator","2026-11-10 10:12:30",false,"---\nname: session-end\ndescription: End-of-session orchestrator. Runs reversible wrap\u002Fdistill\u002Ftaskwarrior work at once, asks once for outward filings. Use when winding down a session.\nallowed-tools: Bash(bash *), Bash(task *), Bash(git *), Bash(gh *), Read, Skill, AskUserQuestion, TodoWrite\ncreated: 2026-06-10\nmodified: 2026-11-02\nreviewed: 2026-06-24\n---\n\n\u003C!-- skill-size-exception: scripts\u002Fplugin-compliance-check.sh check_skill_body (session-end blocks) -->\n\n# session-end\n\nOne survey, then the reversible work runs immediately and the\noutward-facing work waits for **one** question at the end — so a user who\nstarts `\u002Fsession-end` and walks away comes back to finished work and at\nmost one question. This is the orchestrator\nover the five end-of-session passes, which otherwise compete for the wind-down\nmoment (design decisions D3\u002FD4, `docs\u002Farchive\u002Fsession-plugin-workflow.md`).\n\nThe five passes — Wrap, Distill, Feedback, Taskwarrior sync, Blueprint\ntracker-sync — and what each captures are listed in\n[references\u002Fpasses.md](references\u002Fpasses.md).\n\n## When to Use This Skill\n\n| Use this skill when... | Use alternative when... |\n|------------------------|------------------------|\n| User winds down (\"wrap up\", \"done for today\") and more than one pass may apply | Only loose threads to capture → `session-plugin:session-wrap` directly |\n| The Stop-hook nudge offered this skill and the user confirmed | Only learnings to codify → `session-plugin:session-distill` directly |\n| User invokes `\u002Fsession-end` | Mid-session single-task close → `taskwarrior-plugin:task-done` |\n\n## Execution\n\nExecute this orchestration. **Not fully automatic by design**: filing\nthird-party GitHub issues, opening cross-repo PRs and writing a journal\nare not `git restore`-able, so those wait for the Step 4 question. Everything that\ncan be undone runs first, without asking.\n\n### Step 1: Survey once\n\nOne shared decision pass — do not let each sub-skill re-survey. Run the\nshared collector (the same one the wrap\u002Fspinup skills and the nudge hook\nuse); it emits detection, git state, PRs, taskwarrior tasks **with stable\nUUIDs**, and recent commits in one parallel-safe pass. Its `TASKWARRIOR`\nsection carries scoping keys (`TASK_SCOPE`, `PROJECT_CONFIDENCE`,\n`PROJECT_AMBIGUOUS`, `PROJECT_PREFIX_SIBLINGS`, `PROJECT_EXACT_TASKS`) that say\nwhether a task count can be trusted — their meanings are in\n[references\u002Fsurvey-digest.md](references\u002Fsurvey-digest.md).\n\n```sh\nbash \"${CLAUDE_SKILL_DIR}\u002F..\u002F..\u002Fscripts\u002Fsession-survey.sh\" --with-commits --with-blueprint --with-dedup\n```\n\nPass `--project \u003Cname>` to override the detected project. Hand the digest\nto the passes in Steps 3–4 so they don't re-survey. `--with-dedup`\nis what populates the `GITHUB_DRIFT` section that Step 3's taskwarrior-sync\nredundancy test reads — without it the section is always empty and the\nguard silently runs against nothing. That section also carries `GH_READY`:\n`false` means it is present but **unqueried**, the same \"not clean, just\nnot asked\" signal as `PROJECT_CONFIDENCE=low` above — don't treat an empty\n`GITHUB_DRIFT` under `GH_READY=false` as evidence there's nothing to dedup\nagainst. Plus the conversation: what finished, what's hanging, what was\nlearned, what plugin\u002Fskill friction or wins occurred.\n\n**Remediating `GH_READY=false`.** Act on its `GH_FAIL_REASON=` — the\nper-reason table, and which reasons must never be re-run, are in\n[REFERENCE.md](REFERENCE.md). For `cloud-restricted` (a cloud session) the\nGitHub MCP tools are the source of PR and issue state for Step 3's redundancy\ntest.\n\nFor the **Distill** qualify gate (Step 2), also run the distill collector's\ncoarse summary — the mechanical half of the Distill signal (recipe candidates,\nhot files, process groupings). It degrades to `TRANSCRIPT_AVAILABLE=false` when\nno transcript is reachable, so treat a SKIP as \"no mechanical signal, judge\nconceptually only\":\n\n```sh\nbash \"${CLAUDE_SKILL_DIR}\u002F..\u002F..\u002Fscripts\u002Fdistill-survey.sh\" --session-id \"${CLAUDE_SESSION_ID}\" --summary\n```\n\n### Step 2: Qualify each pass and sort its items into two lanes\n\nApply each skill's own signal filter strictly; **silently skip passes\nthat don't qualify** — offering an empty pass is the drown-in-signals\nfailure mode.\n\n| Pass | Qualifies when |\n|---|---|\n| Wrap | ≥1 genuine loose thread per session-wrap's LOG IT filter |\n| Distill | A durable, generalizable learning emerged AND the repo has a distillable surface (`.claude\u002Frules\u002F` or a justfile). Corroborate the mechanical half with the distill collector's `--summary` (Step 1): `RECIPE_CANDIDATE_COUNT` \u002F `HOT_FILE_COUNT` \u002F `PROCESS_SIGNAL` > 0 means recipes\u002Fhot-files\u002Fprocess are worth a pass even if no conceptual rule emerged |\n| Feedback | A plugin\u002Fskill behaved notably well or badly — bug, enhancement, or positive worth filing |\n| Taskwarrior sync | `TASK_AVAILABLE=true`, `TASK_STORE_REACHABLE=true`, AND ≥1 **session-linked task**: one this session worked on, created, or made closeable (its `TASK_n_GHID` PR\u002Fissue merged or closed, or the conversation shows it done). Open tasks the session never touched — the project backlog, `RECENT_TASK_*` rows from other projects — never qualify the pass; see [Backlog is reported, never walked](#backlog-is-reported-never-walked) |\n| Blueprint tracker-sync | `UNDRAINED_COUNT` ≥ 1 in the Step 1 digest's `BLUEPRINT` section. Non-blueprint \u002F tracker-missing repos auto-disqualify (count is 0) → silent skip. If `blueprint-plugin` isn't installed, note it and skip (as with Feedback) |\n\n**Taskwarrior scope keys.** When `TASK_AVAILABLE=true` and `TASK_STORE_REACHABLE=false`, the\nstore was never read — **unqueried**, exactly like `GH_READY=false`, never an\nempty queue: state `taskwarrior: not queried (\u003CTASK_FAIL_REASON>)` in the\nStep 5 report, quoting `TASK_FAIL_DETAIL` (remedies per reason:\n[references\u002Fsurvey-digest.md](references\u002Fsurvey-digest.md)). With\n`TASK_AVAILABLE=false` (`TASK_FAIL_REASON=no-cli`) skip silently. Before\nadding a task, confirm the slug: when `PROJECT_CONFIDENCE=low`,\n`PROJECT_AMBIGUOUS` is set (it fires even at `high`), or\n`PROJECT_PREFIX_SIBLINGS` is present, a new task could land in a sibling\nproject nobody reads — move that add to the Ask lane and name the slugs\n(`0 here, N under \u003Cslug>`).\n\n**Sort every qualifying item into one of two lanes.** The lane decides\nwhether it runs now or waits for the one question in Step 4:\n\n| Lane | Items | Why |\n|---|---|---|\n| **Act** — run in Step 3, no question | Feedback issues; taskwarrior annotate \u002F modify \u002F add on session-linked tasks; close a task **with evidence** (merged PR, closed issue, commit on the default branch); Wrap's taskwarrior writes; Distill `[UPDATE]` \u002F `[NEW]` edits in the current repo; Blueprint tracker-sync drain | Undoable (`task undo`, `task \u003Cuuid> modify status:pending`, `git restore`), or — for feedback issues — triaged and acted on separately, so filing one decides nothing |\n| **Ask** — confirmed once in Step 4 | Wrap's GitHub follow-up issues, journal writes and upstream candidates; Distill `[PROMOTE]` PRs and `[REDUNDANT]` removals; a task add whose project slug is in doubt; closing a task without evidence | Outward-facing, destructive, or a guess — not `git restore`-able |\n\nA task close without evidence is a guess, so it goes in the Ask lane or\nbecomes an annotation.\n\n**Blueprint auto-drain (ADR-0020 level 1):** the Blueprint drain sits in the Act\nlane only when the qualifying repo's `docs\u002Fblueprint\u002Fmanifest.json` enables and\nopts the feature-tracker-sync task into auto-running at autonomy level ≥ 1;\notherwise it goes in the Ask lane. The gate requires all three fields (issue\n#2358) — run it as written, `auto` ⇒ Act lane, anything else ⇒ Ask lane:\n\n```sh\njq -r 'if ((.automation.autonomy_level \u002F\u002F 0) >= 1) and (.task_registry[\"feature-tracker-sync\"].enabled == true) and (.task_registry[\"feature-tracker-sync\"].auto_run == true) then \"auto\" else \"ask\" end' docs\u002Fblueprint\u002Fmanifest.json 2>\u002Fdev\u002Fnull\n```\n\nFor why all three are required and the safe default for a missing `enabled`\nkey, see [REFERENCE.md](REFERENCE.md).\n\nIf **nothing** qualifies, say so in one line and end — no question.\n\n#### Backlog is reported, never walked\n\nDo not offer to walk open tasks the session did not touch, one by one or\nin bulk. In 62 recorded runs that offer was declined 20 of 29 times, and\nwhen it was accepted the usual per-task answer was \"leave\". Put one line\nin the Step 5 report instead —\n`taskwarrior: N other open tasks under project:\u003Cslug> untouched — \u002Ftaskwarrior:task-status to review` —\nand stop there.\n\n### Step 3: Run the Act lane now\n\nRun the Act-lane work immediately, before asking anything. It needs the\nwarm prompt cache and the full conversation: Distill reads the session's\nreasoning, and a session left idle for about an hour can be compacted into\na summary. Run in this order, each via the Skill tool, or — where there is\nno Skill tool — read that skill's SKILL.md and follow it (inline for\ntaskwarrior sync), passing the Step 1 survey so it doesn't re-survey:\n\n1. **Taskwarrior sync** — inline, before Wrap, so Wrap sees the updated\n   queue. Address tasks by stable UUID (`task +LATEST uuids` after\n   creation; `task \u003Cuuid> done` \u002F `task \u003Cuuid> modify` for existing ones);\n   never use volatile numeric IDs. Annotate before closing. Any follow-up\n   obeys Wrap's redundancy test: an open PR or assigned issue in the Step 1\n   digest's `PRS` \u002F `GITHUB_DRIFT` sections is already its own tracker —\n   annotate, never mirror it into a task.\n2. `session-plugin:session-wrap` with `--orchestrated` — Wrap applies its\n   taskwarrior items without its own preview\u002Fconfirm, and returns its\n   journal, GitHub-issue and upstream items as `DEFERRED:` lines instead of\n   asking.\n3. **Blueprint tracker-sync** (Act lane only) — after passes 1–2, because\n   both mutate the queue. Re-derive the wave inline right before delegating\n   (never reuse the survey's `UNDRAINED_WOS` as the drain list); the\n   command is in [references\u002Fblueprint-drain.md](references\u002Fblueprint-drain.md).\n   Then invoke `\u002Fblueprint:blueprint-feature-tracker-sync --drain-wave \u003Clist>`\n   with **no** evidence flags — the sync skill sources evidence from\n   taskwarrior annotations itself (its priority order: files → inline →\n   annotation → ask). If the re-derived list is empty, report \"already\n   drained\". If `blueprint-plugin` isn't installed, note it and skip.\n4. `session-plugin:session-distill` with `--orchestrated` — applies\n   `[UPDATE]` \u002F `[NEW]` in the current repo and returns `[PROMOTE]` and\n   `[REDUNDANT]` proposals as `DEFERRED:` lines.\n5. **Feedback** — `feedback-plugin:feedback-session --confirmed \"\u003Cfindings>\"`\n   with the findings collected in Step 1. It files the ones that survive\n   dedup without its own review step. If it cannot resolve the target repo\n   without asking, it returns the findings as `DEFERRED:` lines instead. If\n   the feedback plugin isn't installed, note it and skip.\n\n### Step 4: One question for the Ask lane\n\nGather the Ask-lane items: every `DEFERRED:` line from\nStep 3, a Blueprint drain that did not pass the auto gate, and any\nlow-confidence task add. If there are none, skip to Step 5 — no question.\n\nOtherwise print a short receipt of what Step 3 already did (so the user can\nundo it), then ask **one AskUserQuestion** call: up to 4 questions grouped\nby destination (GitHub filings, `[PROMOTE]` PRs,\njournal \u002F removals), each `multiSelect`, each option one concrete item. The\nuser picks any subset; \"Other\" covers adjustments. Never ask a second\nround — the sub-skills already received their decisions.\n\nThen run the approved items:\n\n- **Wrap upstream candidates** — a *File now* candidate always routes\n  through `workflow-orchestration-plugin:workflow-verify-before-filing` →\n  `agent-patterns-plugin:cold-read-gate` → file; never blind. *Track for\n  later* is a `+upstream` taskwarrior task.\n- **Distill `[PROMOTE]`** — the throwaway-clone PR hand-off in session-distill.\n- **Everything else** — apply as described by its owning skill.\n\nNever end the turn on a freeform \"y\u002Fn\" text question — ending the turn\nfires Stop hooks mid-confirmation (the race that motivated this\norchestrator). AskUserQuestion keeps the turn open. Where `AskUserQuestion`\nis unavailable (a harness without the tool), ask in plain text and end the\nturn.\n\n### Step 5: Report\n\nOne short block: what each pass wrote (tasks touched \u002F closed with UUIDs,\nfiles edited, issues and PRs filed), which passes were skipped as not\nqualifying, the backlog line, and any `not queried` line.\n\n## Seam: distill vs feedback\n\n\"Discovered a better flag \u002F a skill suggested something subtly wrong\" →\n**feedback** (issue on claude-plugins). \"Found a reusable project\npattern, rule, or recipe\" → **distill** (artifact in this repo). When\nboth apply, both run — they write to different places.\n\n## Auto-surfacing\n\nHow the Stop-hook nudge offers this skill (and how to pre-silence it) is in\n[references\u002Fauto-surfacing.md](references\u002Fauto-surfacing.md).\n\n## Agentic Optimizations\n\nCommand forms for the survey, the scope\u002Fconfidence keys (`TASK_SCOPE`,\n`GIT_CONFIDENCE`), the distill signal, the drain wave, and UUID-safe task edits\nare in [references\u002Fcommands.md](references\u002Fcommands.md).\n\nFor the `GH_FAIL_REASON` remediation table and the Blueprint auto-drain gate\ndetails, see [REFERENCE.md](REFERENCE.md).\n","\u003C!-- skill-size-exception: scripts\u002Fplugin-compliance-check.sh check_skill_body (session-end blocks) -->\n\n# session-end\n\nOne survey, then the reversible work runs immediately and the\noutward-facing work waits for **one** question at the end — so a user who\nstarts `\u002Fsession-end` and walks away comes back to finished work and at\nmost one question. This is the orchestrator\nover the five end-of-session passes, which otherwise compete for the wind-down\nmoment (design decisions D3\u002FD4, `docs\u002Farchive\u002Fsession-plugin-workflow.md`).\n\nThe five passes — Wrap, Distill, Feedback, Taskwarrior sync, Blueprint\ntracker-sync — and what each captures are listed in\n[references\u002Fpasses.md](references\u002Fpasses.md).\n\n## When to Use This Skill\n\n| Use this skill when... | Use alternative when... |\n|------------------------|------------------------|\n| User winds down (\"wrap up\", \"done for today\") and more than one pass may apply | Only loose threads to capture → `session-plugin:session-wrap` directly |\n| The Stop-hook nudge offered this skill and the user confirmed | Only learnings to codify → `session-plugin:session-distill` directly |\n| User invokes `\u002Fsession-end` | Mid-session single-task close → `taskwarrior-plugin:task-done` |\n\n## Execution\n\nExecute this orchestration. **Not fully automatic by design**: filing\nthird-party GitHub issues, opening cross-repo PRs and writing a journal\nare not `git restore`-able, so those wait for the Step 4 question. Everything that\ncan be undone runs first, without asking.\n\n### Step 1: Survey once\n\nOne shared decision pass — do not let each sub-skill re-survey. Run the\nshared collector (the same one the wrap\u002Fspinup skills and the nudge hook\nuse); it emits detection, git state, PRs, taskwarrior tasks **with stable\nUUIDs**, and recent commits in one parallel-safe pass. Its `TASKWARRIOR`\nsection carries scoping keys (`TASK_SCOPE`, `PROJECT_CONFIDENCE`,\n`PROJECT_AMBIGUOUS`, `PROJECT_PREFIX_SIBLINGS`, `PROJECT_EXACT_TASKS`) that say\nwhether a task count can be trusted — their meanings are in\n[references\u002Fsurvey-digest.md](references\u002Fsurvey-digest.md).\n\n```sh\nbash \"${CLAUDE_SKILL_DIR}\u002F..\u002F..\u002Fscripts\u002Fsession-survey.sh\" --with-commits --with-blueprint --with-dedup\n```\n\nPass `--project \u003Cname>` to override the detected project. Hand the digest\nto the passes in Steps 3–4 so they don't re-survey. `--with-dedup`\nis what populates the `GITHUB_DRIFT` section that Step 3's taskwarrior-sync\nredundancy test reads — without it the section is always empty and the\nguard silently runs against nothing. That section also carries `GH_READY`:\n`false` means it is present but **unqueried**, the same \"not clean, just\nnot asked\" signal as `PROJECT_CONFIDENCE=low` above — don't treat an empty\n`GITHUB_DRIFT` under `GH_READY=false` as evidence there's nothing to dedup\nagainst. Plus the conversation: what finished, what's hanging, what was\nlearned, what plugin\u002Fskill friction or wins occurred.\n\n**Remediating `GH_READY=false`.** Act on its `GH_FAIL_REASON=` — the\nper-reason table, and which reasons must never be re-run, are in\n[REFERENCE.md](REFERENCE.md). For `cloud-restricted` (a cloud session) the\nGitHub MCP tools are the source of PR and issue state for Step 3's redundancy\ntest.\n\nFor the **Distill** qualify gate (Step 2), also run the distill collector's\ncoarse summary — the mechanical half of the Distill signal (recipe candidates,\nhot files, process groupings). It degrades to `TRANSCRIPT_AVAILABLE=false` when\nno transcript is reachable, so treat a SKIP as \"no mechanical signal, judge\nconceptually only\":\n\n```sh\nbash \"${CLAUDE_SKILL_DIR}\u002F..\u002F..\u002Fscripts\u002Fdistill-survey.sh\" --session-id \"${CLAUDE_SESSION_ID}\" --summary\n```\n\n### Step 2: Qualify each pass and sort its items into two lanes\n\nApply each skill's own signal filter strictly; **silently skip passes\nthat don't qualify** — offering an empty pass is the drown-in-signals\nfailure mode.\n\n| Pass | Qualifies when |\n|---|---|\n| Wrap | ≥1 genuine loose thread per session-wrap's LOG IT filter |\n| Distill | A durable, generalizable learning emerged AND the repo has a distillable surface (`.claude\u002Frules\u002F` or a justfile). Corroborate the mechanical half with the distill collector's `--summary` (Step 1): `RECIPE_CANDIDATE_COUNT` \u002F `HOT_FILE_COUNT` \u002F `PROCESS_SIGNAL` > 0 means recipes\u002Fhot-files\u002Fprocess are worth a pass even if no conceptual rule emerged |\n| Feedback | A plugin\u002Fskill behaved notably well or badly — bug, enhancement, or positive worth filing |\n| Taskwarrior sync | `TASK_AVAILABLE=true`, `TASK_STORE_REACHABLE=true`, AND ≥1 **session-linked task**: one this session worked on, created, or made closeable (its `TASK_n_GHID` PR\u002Fissue merged or closed, or the conversation shows it done). Open tasks the session never touched — the project backlog, `RECENT_TASK_*` rows from other projects — never qualify the pass; see [Backlog is reported, never walked](#backlog-is-reported-never-walked) |\n| Blueprint tracker-sync | `UNDRAINED_COUNT` ≥ 1 in the Step 1 digest's `BLUEPRINT` section. Non-blueprint \u002F tracker-missing repos auto-disqualify (count is 0) → silent skip. If `blueprint-plugin` isn't installed, note it and skip (as with Feedback) |\n\n**Taskwarrior scope keys.** When `TASK_AVAILABLE=true` and `TASK_STORE_REACHABLE=false`, the\nstore was never read — **unqueried**, exactly like `GH_READY=false`, never an\nempty queue: state `taskwarrior: not queried (\u003CTASK_FAIL_REASON>)` in the\nStep 5 report, quoting `TASK_FAIL_DETAIL` (remedies per reason:\n[references\u002Fsurvey-digest.md](references\u002Fsurvey-digest.md)). With\n`TASK_AVAILABLE=false` (`TASK_FAIL_REASON=no-cli`) skip silently. Before\nadding a task, confirm the slug: when `PROJECT_CONFIDENCE=low`,\n`PROJECT_AMBIGUOUS` is set (it fires even at `high`), or\n`PROJECT_PREFIX_SIBLINGS` is present, a new task could land in a sibling\nproject nobody reads — move that add to the Ask lane and name the slugs\n(`0 here, N under \u003Cslug>`).\n\n**Sort every qualifying item into one of two lanes.** The lane decides\nwhether it runs now or waits for the one question in Step 4:\n\n| Lane | Items | Why |\n|---|---|---|\n| **Act** — run in Step 3, no question | Feedback issues; taskwarrior annotate \u002F modify \u002F add on session-linked tasks; close a task **with evidence** (merged PR, closed issue, commit on the default branch); Wrap's taskwarrior writes; Distill `[UPDATE]` \u002F `[NEW]` edits in the current repo; Blueprint tracker-sync drain | Undoable (`task undo`, `task \u003Cuuid> modify status:pending`, `git restore`), or — for feedback issues — triaged and acted on separately, so filing one decides nothing |\n| **Ask** — confirmed once in Step 4 | Wrap's GitHub follow-up issues, journal writes and upstream candidates; Distill `[PROMOTE]` PRs and `[REDUNDANT]` removals; a task add whose project slug is in doubt; closing a task without evidence | Outward-facing, destructive, or a guess — not `git restore`-able |\n\nA task close without evidence is a guess, so it goes in the Ask lane or\nbecomes an annotation.\n\n**Blueprint auto-drain (ADR-0020 level 1):** the Blueprint drain sits in the Act\nlane only when the qualifying repo's `docs\u002Fblueprint\u002Fmanifest.json` enables and\nopts the feature-tracker-sync task into auto-running at autonomy level ≥ 1;\notherwise it goes in the Ask lane. The gate requires all three fields (issue\n#2358) — run it as written, `auto` ⇒ Act lane, anything else ⇒ Ask lane:\n\n```sh\njq -r 'if ((.automation.autonomy_level \u002F\u002F 0) >= 1) and (.task_registry[\"feature-tracker-sync\"].enabled == true) and (.task_registry[\"feature-tracker-sync\"].auto_run == true) then \"auto\" else \"ask\" end' docs\u002Fblueprint\u002Fmanifest.json 2>\u002Fdev\u002Fnull\n```\n\nFor why all three are required and the safe default for a missing `enabled`\nkey, see [REFERENCE.md](REFERENCE.md).\n\nIf **nothing** qualifies, say so in one line and end — no question.\n\n#### Backlog is reported, never walked\n\nDo not offer to walk open tasks the session did not touch, one by one or\nin bulk. In 62 recorded runs that offer was declined 20 of 29 times, and\nwhen it was accepted the usual per-task answer was \"leave\". Put one line\nin the Step 5 report instead —\n`taskwarrior: N other open tasks under project:\u003Cslug> untouched — \u002Ftaskwarrior:task-status to review` —\nand stop there.\n\n### Step 3: Run the Act lane now\n\nRun the Act-lane work immediately, before asking anything. It needs the\nwarm prompt cache and the full conversation: Distill reads the session's\nreasoning, and a session left idle for about an hour can be compacted into\na summary. Run in this order, each via the Skill tool, or — where there is\nno Skill tool — read that skill's SKILL.md and follow it (inline for\ntaskwarrior sync), passing the Step 1 survey so it doesn't re-survey:\n\n1. **Taskwarrior sync** — inline, before Wrap, so Wrap sees the updated\n   queue. Address tasks by stable UUID (`task +LATEST uuids` after\n   creation; `task \u003Cuuid> done` \u002F `task \u003Cuuid> modify` for existing ones);\n   never use volatile numeric IDs. Annotate before closing. Any follow-up\n   obeys Wrap's redundancy test: an open PR or assigned issue in the Step 1\n   digest's `PRS` \u002F `GITHUB_DRIFT` sections is already its own tracker —\n   annotate, never mirror it into a task.\n2. `session-plugin:session-wrap` with `--orchestrated` — Wrap applies its\n   taskwarrior items without its own preview\u002Fconfirm, and returns its\n   journal, GitHub-issue and upstream items as `DEFERRED:` lines instead of\n   asking.\n3. **Blueprint tracker-sync** (Act lane only) — after passes 1–2, because\n   both mutate the queue. Re-derive the wave inline right before delegating\n   (never reuse the survey's `UNDRAINED_WOS` as the drain list); the\n   command is in [references\u002Fblueprint-drain.md](references\u002Fblueprint-drain.md).\n   Then invoke `\u002Fblueprint:blueprint-feature-tracker-sync --drain-wave \u003Clist>`\n   with **no** evidence flags — the sync skill sources evidence from\n   taskwarrior annotations itself (its priority order: files → inline →\n   annotation → ask). If the re-derived list is empty, report \"already\n   drained\". If `blueprint-plugin` isn't installed, note it and skip.\n4. `session-plugin:session-distill` with `--orchestrated` — applies\n   `[UPDATE]` \u002F `[NEW]` in the current repo and returns `[PROMOTE]` and\n   `[REDUNDANT]` proposals as `DEFERRED:` lines.\n5. **Feedback** — `feedback-plugin:feedback-session --confirmed \"\u003Cfindings>\"`\n   with the findings collected in Step 1. It files the ones that survive\n   dedup without its own review step. If it cannot resolve the target repo\n   without asking, it returns the findings as `DEFERRED:` lines instead. If\n   the feedback plugin isn't installed, note it and skip.\n\n### Step 4: One question for the Ask lane\n\nGather the Ask-lane items: every `DEFERRED:` line from\nStep 3, a Blueprint drain that did not pass the auto gate, and any\nlow-confidence task add. If there are none, skip to Step 5 — no question.\n\nOtherwise print a short receipt of what Step 3 already did (so the user can\nundo it), then ask **one AskUserQuestion** call: up to 4 questions grouped\nby destination (GitHub filings, `[PROMOTE]` PRs,\njournal \u002F removals), each `multiSelect`, each option one concrete item. The\nuser picks any subset; \"Other\" covers adjustments. Never ask a second\nround — the sub-skills already received their decisions.\n\nThen run the approved items:\n\n- **Wrap upstream candidates** — a *File now* candidate always routes\n  through `workflow-orchestration-plugin:workflow-verify-before-filing` →\n  `agent-patterns-plugin:cold-read-gate` → file; never blind. *Track for\n  later* is a `+upstream` taskwarrior task.\n- **Distill `[PROMOTE]`** — the throwaway-clone PR hand-off in session-distill.\n- **Everything else** — apply as described by its owning skill.\n\nNever end the turn on a freeform \"y\u002Fn\" text question — ending the turn\nfires Stop hooks mid-confirmation (the race that motivated this\norchestrator). AskUserQuestion keeps the turn open. Where `AskUserQuestion`\nis unavailable (a harness without the tool), ask in plain text and end the\nturn.\n\n### Step 5: Report\n\nOne short block: what each pass wrote (tasks touched \u002F closed with UUIDs,\nfiles edited, issues and PRs filed), which passes were skipped as not\nqualifying, the backlog line, and any `not queried` line.\n\n## Seam: distill vs feedback\n\n\"Discovered a better flag \u002F a skill suggested something subtly wrong\" →\n**feedback** (issue on claude-plugins). \"Found a reusable project\npattern, rule, or recipe\" → **distill** (artifact in this repo). When\nboth apply, both run — they write to different places.\n\n## Auto-surfacing\n\nHow the Stop-hook nudge offers this skill (and how to pre-silence it) is in\n[references\u002Fauto-surfacing.md](references\u002Fauto-surfacing.md).\n\n## Agentic Optimizations\n\nCommand forms for the survey, the scope\u002Fconfidence keys (`TASK_SCOPE`,\n`GIT_CONFIDENCE`), the distill signal, the drain wave, and UUID-safe task edits\nare in [references\u002Fcommands.md](references\u002Fcommands.md).\n\nFor the `GH_FAIL_REASON` remediation table and the Blueprint auto-drain gate\ndetails, see [REFERENCE.md](REFERENCE.md).\n",{"name":5,"created":45,"modified":46,"reviewed":47,"description":7,"allowed-tools":48},1781049600000,1793577600000,1782259200000,"Bash(bash *), Bash(task *), Bash(git *), Bash(gh *), Read, Skill, AskUserQuestion, TodoWrite","main","9d783554148f9c8a9c55a486b480760d3da673e6","session-plugin\u002Fskills\u002Fsession-end",6,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins","https:\u002F\u002Fgithub.com\u002Flaurigates","Linux enthusiast, cloud engineer, neovim addict, electronics hobbyist.","2026-11-12 03:43:32",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add laurigates\u002Fclaude-plugins --skill session-end",{"tool":63,"command":64},"bunx","bunx skills add laurigates\u002Fclaude-plugins --skill session-end",{"tool":66,"command":67},"pnpm","pnpm dlx skills add laurigates\u002Fclaude-plugins --skill session-end","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fsession-plugin\u002Fskills\u002Fsession-end\u002FSKILL.md",true,[71,77,81,85,89,93],{"path":72,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":75,"sourceHtmlUrl":76},"REFERENCE.md","REFERENCE","参考文档",3336,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fsession-plugin\u002Fskills\u002Fsession-end\u002FREFERENCE.md",{"path":78,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":79,"sourceHtmlUrl":80},"references\u002Fauto-surfacing.md",361,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fsession-plugin\u002Fskills\u002Fsession-end\u002Freferences\u002Fauto-surfacing.md",{"path":82,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":83,"sourceHtmlUrl":84},"references\u002Fblueprint-drain.md",872,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fsession-plugin\u002Fskills\u002Fsession-end\u002Freferences\u002Fblueprint-drain.md",{"path":86,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Fcommands.md",1714,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fsession-plugin\u002Fskills\u002Fsession-end\u002Freferences\u002Fcommands.md",{"path":90,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002Fpasses.md",991,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fsession-plugin\u002Fskills\u002Fsession-end\u002Freferences\u002Fpasses.md",{"path":94,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Fsurvey-digest.md",4150,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fsession-plugin\u002Fskills\u002Fsession-end\u002Freferences\u002Fsurvey-digest.md",[98,125,145,161,184,214],{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":109,"publishedAt":40},"01M70PFHMH9ADY0CRE6047Y4B2","kitty-show-image","Show the user an image with a note on what to judge, via a file send or a labelled kitty tab. Use when the user must see an image, or icat fails with no \u002Fdev\u002Ftty.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-show-image\u002FSKILL.md",[104],{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[110,111,112,113,114,115,116,117,118,119,34,23,33,120,121,122,123,124,22,38],"show","kitty show image","image","kitty","show image","ls","get","send","open","dev","file","text","with","xdg","via",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":40},"01M70PFEN18HKQ4RCQ1VPGMPTB","kitty-session-persistence","Snapshot and restore kitty terminal sessions on macOS. Use when surviving WindowServer hangs without losing tabs, configuring snapshots, or restoring after a force-reboot.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-session-persistence\u002FSKILL.md",[],[113,132,20,133,134,135,23,33,136,137,138,22,38,139,140,141,142,143,144,34],"kitty session persistence","persistence","false","snapshots","uname","reboot","terminal","write","edit","snapshot","macos","sessions","restore",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":151,"publishedAt":40},"01M70PFC77XGXCVQ1543VGZHYR","kitty-remote-control","Safe kitty remote control from an agent — read panes with kitty @ ls\u002Fget-text, notify, and never mutate the live terminal unasked. Use when running inside kitty.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-remote-control\u002FSKILL.md",[],[152,153,113,154,155,115,156,157,116,158,159,34,23,160,33,121,122,138,22,38],"kitty remote control","remote","control","remote control","running","never","panes","notify","query",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":167,"publishedAt":40},"01M70P6WVMCT5JG4SACTM69AF9","docs-reference-check","Dangling doc-reference gate: flag markdown naming repo paths or relative links that no longer exist. Use when docs cite moved\u002Fdeleted files, or wiring a doc-drift lint.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fdocumentation-plugin\u002Fskills\u002Fdocs-reference-check\u002FSKILL.md",[],[168,169,170,171,172,173,174,175,176,177,34,23,33,178,120,179,180,181,182,183],"docs reference check","check","reference check","reference","docs","links","python3","repo","files","auto","drift","lint","wiring","chezmoi","references","cp",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":199,"publishedAt":40},"01M6C6NDE7DAQGNWSF22J5CJ0Z","youtube-upload","Upload a video to YouTube via the Data API v3 and edit its title, description, tags or thumbnail afterwards. Use when publishing or retitling a YouTube video.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fyoutube-plugin\u002Fskills\u002Fyoutube-upload\u002FSKILL.md",[190,193,194],{"categoryNo":191,"categoryName":192,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},{"categoryNo":195,"categoryName":196,"taxonomyType":197,"taxonomyTypeDesc":198},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[200,201,202,203,174,204,38,205,140,206,207,208,34,33,120,209,210,23,211,212,213,124,22],"youtube upload","upload","youtube","Video","run","uv run","publishing","data","uv","api","v3","tags","id","title",{"skillNo":215,"name":216,"nameZh":6,"description":217,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":218,"categories":219,"keywords":223,"publishedAt":40},"01M6C6NABWW1X58KJJM4F6GQMQ","youtube-studio-share","Share a private YouTube video with a whole Google Workspace organization by scripting YouTube Studio in the browser. Use when a video must be org-only.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fyoutube-plugin\u002Fskills\u002Fyoutube-studio-share\u002FSKILL.md",[220],{"categoryNo":221,"categoryName":222,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000023","Skill与智能体开发",[224,225,226,227,202,203,228,229,230,231,232,38,233,234,235,236,34,237,23,122,238,22],"youtube studio share","share","youtube studio","studio","browser","javascript","scripting","google workspace","workspace","tool","google","only","MCP","chrome","organization"]