[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6N1JS5K6N9EQDF11FZEMGG3":3,"skill-same:01M6N1JS5K6N9EQDF11FZEMGG3":106},{"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":28,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":57,"commitSha":58,"skillDirectory":59,"forksCount":60,"repositoryHtmlUrl":61,"repositoryHomepageUrl":62,"ownerHtmlUrl":63,"ownerBlogUrl":64,"ownerDescription":65,"updatedAt":66,"install":67,"resources":79},"01M6N1JS5K6N9EQDF11FZEMGG3","hitl-gates",null,"Agent Kit HITL contract, exact Ask questions labels, and numbered-list fallback as path 1. Use when running \u002Fstart-project, \u002Frun-plan, \u002Frun-plan-all, \u002Fcontinue-plan, \u002Fgit-prod, backlog CRUD, \u002Fhotfix, \u002Fqa, \u002Fplan-review-triage, install, or onboard, or when Ask questions is missing. Factory landing wraps \u002Fkit-staging and \u002Fkit-prod keep their own command-file Asks; they are not consumer default-path inventory. Invoke via the command's own link; do not auto-load.","agent-kit-startup\u002Fagent-kit","agent-kit-startup","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F273612197?v=4","01M6N1G5CDEDXFAYC2ZWJFRQ5N","dadado","01M6N1G5H5C367X5124515SA2T",23,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit\u002Fblob\u002Fmain\u002F.cursor\u002Fskills\u002Fcore\u002Fhitl-gates\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"gates","hitl","hitl gates","when","invoke","run","command","plan","review","crud","ask","auto","qa","kit","labels","default","inventory","project","agent kit","hotfix","2026-11-10 10:12:30",false,"---\nname: hitl-gates\ndescription: Agent Kit HITL contract, exact Ask questions labels, and numbered-list fallback as path 1. Use when running \u002Fstart-project, \u002Frun-plan, \u002Frun-plan-all, \u002Fcontinue-plan, \u002Fgit-prod, backlog CRUD, \u002Fhotfix, \u002Fqa, \u002Fplan-review-triage, install, or onboard, or when Ask questions is missing. Factory landing wraps \u002Fkit-staging and \u002Fkit-prod keep their own command-file Asks; they are not consumer default-path inventory. Invoke via the command's own link; do not auto-load.\nversion: 0.1.3\ncategory: core\ndisable-model-invocation: true\n---\n\n# HITL gates\n\nKit-wide human-in-the-loop. Commands stay Goal + five hard stops + Ask labels + a link here. Per-command procedures, one hop each: [run-plan-tick-contract.md](run-plan-tick-contract.md), [start-project-intake.md](start-project-intake.md), [run-plan-all-queue.md](run-plan-all-queue.md), [pending-ticket.md](pending-ticket.md); `\u002Fcontinue-plan` is inline in its own command file (`procedures.md` is a redirect stub only). Always-applied short rule: `.cursor\u002Frules\u002Fhitl-ask-questions.mdc`.\n\n## Contract\n\n1. Any confirmation, choice, or clarification before acting uses **Ask questions** (`AskQuestion` \u002F ACP `cursor\u002Fask_question`). Do not ask the user to type yes.\n2. Prefer one question at a time.\n3. Options are concrete labels (tables below). Do not invent a fake tool call.\n4. **Numbered-list fallback is path 1** when the tool is not in the session toolset. Say the tool is missing once, print one `HITL_GATE: \u003Cask-id> | \u003Clabels>` line and the same labels as a numbered list (block below), accept number or label, and treat a typed answer as Other. Do not invent a fake tool call. Matrix: `.cursor\u002Fmemory\u002Fdecisions\u002F2026-07-20_ask-questions-model-availability.md`.\n5. Skipped or cancelled answers mean **stop** (same as no yes).\n6. Do not fabricate HITL in HANDOFF. Parked \u002F approved \u002F deferred \u002F confirmed \u002F stopped-by-operator need Ask id, operator reply, or `agent-inferred`. In a headless run the operator reply arrives as a `HITL_REPLY: \u003Cask-id> | operator reply \u003Cn> | \u003Clabel>` line; cite that line.\n7. CLI `agent-kit init` keeps `@clack\u002Fprompts`. Do not call IDE Ask questions from the CLI.\n\n## Default-path Ask inventory\n\nEach main command has **exactly one Ask at entry** on the default path. Inbox, owed-close, and landing Asks are opt-in or post-default. They are never pre-Ask blockers. Empty Unprocessed inbox: silent skip (mention count only if non-empty, after the entry Ask or not at all). A pending operator ticket is the one preflight Ask before it.\n\n| Command | Default-path Ask (one at entry) | Off default path |\n|---------|--------------------------------|------------------|\n| `\u002Fstart-project` | Gate A (vague-goal Ask first only if the goal is missing) | Gate B after a second yes. `confirm-provider` never |\n| `\u002Frun-plan` | Risk Ask only when PII, secrets, or scope is ambiguous; otherwise the run starts with no entry Ask | Inbox, exhaustion, owed-close |\n| `\u002Frun-plan-all` | Start-vs-resume (stored queue + Backlog appeared after last confirm) **or** queue confirm (fresh synthesis) | Inbox, owed-close, landing, context checkpoint at plan boundaries, novel error \u002F expired wait. No mid-queue triage Ask |\n| `\u002Fcontinue-plan` | Next unit: `Start [to-do-id]` \u002F `Edit plan first` \u002F `Switch to different plan` \u002F `Stop here`. Multi-plan picker first when needed | Inbox |\n| `\u002Fbacklog-add` | `Write plan to backlog` \u002F `Modify proposal first` \u002F `Cancel` | Inbox. `confirm-provider` never |\n| `\u002Fgit-prod` | `Proceed with production deploy` \u002F `Review changes first` \u002F `Cancel` | none |\n| `\u002Fhotfix` | `Write mini plan and run` \u002F `Write mini plan only (stop)` \u002F `Modify proposal first` \u002F `Cancel` | none |\n| `\u002Fqa` | Mode Ask only when the invocation is ambiguous (`QA this release` \u002F `Repro this bug` \u002F `Claims only` \u002F `Cancel`); otherwise start | Scratch install: `Use a scratch git repo` \u002F `QA this checkout only` \u002F `Cancel` |\n| `\u002Fhandoff` | `Automatic handoff` \u002F `Manual handoff` (first time or when offering a choice) | none |\n\n## Exact Ask labels\n\n### \u002Fstart-project\n\n**Gate A, active plan** (id `gate-a`)**:** `Write plan and add to backlog (keep current active)` \u002F `Park current plan, write plan and activate new` \u002F `Modify proposal first` \u002F `Cancel`\n\n**Gate A, no active plan** (id `gate-a`)**:** `Write plan file` \u002F `Write plan and add to backlog` \u002F `Modify proposal first` \u002F `Cancel`\n\n**Gate B** (id `gate-b`)**:** `Start first unit` \u002F `Switch to \u002Frun-plan` \u002F `Edit plan first` \u002F `Add to backlog` \u002F `Stop here`\n\nVague goal: ask for a 1-2 sentence goal before Gate A. Confirm-provider \u002F `collaboration.provider` is advisory only; do not Ask it.\n\n### \u002Frun-plan\n\n| Gate | Id | Labels |\n|------|----|--------|\n| Risk (PII, secrets, ambiguous scope) | `risk` | `Continue with risk` \u002F `Modify approach` \u002F `Stop run` |\n| Inbox (post-default; Unprocessed non-empty; skip inside a `\u002Frun-plan-all` per-plan Task) | `inbox` | `Analyze inbox now` \u002F `Enqueue Fix now` \u002F `Not now` |\n| Exhaustion (post-default; after Final HANDOFF; `offerOnExhausted`) | `exhaustion` | `Run review now` \u002F `Always enable automatic` \u002F `Not now` |\n| Owed-close (post-default; dead wait-state + genuine later monitor) | `owed-close` | `Adopt existing monitor` \u002F `Ack owed without review` \u002F `Not now` |\n\nNever steal `\u002Fgit-prod`. Exhaustion Ask\u002Farm is after Final HANDOFF and the prod suggestion.\n\n### \u002Frun-plan-all\n\n| Gate | Id | Labels |\n|------|----|--------|\n| Inbox (post-default) | `inbox` | `Analyze inbox now` \u002F `Enqueue Fix now` \u002F `Not now` |\n| Start vs resume (Backlog appeared after last confirm) | `queue-drift` | `Resume frozen queue` \u002F `Insert new backlog` \u002F `Re-synthesize` |\n| Confirm queue | `queue-confirm` | `Run as proposed` \u002F `Run plans only` \u002F `Edit order` \u002F `Apply merges & drops only` \u002F `Keep all plans as-is` \u002F `Include Gate-B plans` \u002F `Cancel` |\n| Context checkpoint (plan boundary, ~50% window) | `context-checkpoint` | `Continue queue` \u002F `Stop and prepare handoff` \u002F `Change queue` |\n| Novel error \u002F expired wait | `novel-failure` | `Retry recovery once` \u002F `Hold and document` \u002F `Stop the queue` |\n| Queue end, deferred rows (after Final HANDOFF) | `queue-end-gates` | `Resolve gates now` \u002F `Print resolution prompt` \u002F `Later` |\n| Promote PR merge wait cap | `promote-merge-wait` | `Keep waiting` \u002F `Show the merge box reason` \u002F `Stop and hand off` |\n| Malformed Task summary | `malformed-summary` | Ask before advancing the cursor |\n\nAsks only at these rows (ADR `2026-09-25_run-plan-all-three-hitl-points.md`, Amend 2026-10-26). Drift only for Backlog new since `- **Confirmed backlog:**`. No mid-queue triage Ask. Queue end: `queue-end-gates`, `\u002Fplan-review-triage`, `\u002Fgit-prod` suggestion, separately.\n\n### Other surfaces\n\n| Surface | Labels |\n|---------|--------|\n| `\u002Fcontinue-plan` | Default-path (id `next-unit`): `Start [to-do-id]` \u002F `Edit plan first` \u002F `Switch to different plan` \u002F `Stop here`. Multi-plan picker (index + HANDOFF only): `[plan-name.plan.md]` \u002F `Create new plan instead`. Inbox (id `inbox`) same three labels, post-default, when Unprocessed is non-empty |\n| `\u002Fbacklog-add` | Default-path write (id `backlog-write`): `Write plan to backlog` \u002F `Modify proposal first` \u002F `Cancel`. Inbox (id `inbox`) same three labels, post-default, when Unprocessed is non-empty. Never park, activate, or Gate B. Never Ask confirm-provider |\n| `\u002Fbacklog-edit` | `Edit [plan-file]` \u002F `Cancel` |\n| `\u002Fbacklog-delete` | `Delete [plan-file] from backlog` \u002F `Cancel` |\n| `\u002Fbacklog-cancel` | `Cancel [plan-file] on backlog` \u002F `Keep on backlog` |\n| `\u002Fcancel-plan` | Id `cancel-plan`: `Cancel active plan [plan-file]` \u002F `Keep the active plan` |\n| `\u002Fgit-prod` | `Proceed with production deploy` \u002F `Review changes first` \u002F `Cancel`. Claude lane (or recorded classifier denial): `I pushed main` \u002F `Open staging→main PR instead` \u002F `Cancel` |\n| `\u002Fhotfix` | `Write mini plan and run` \u002F `Write mini plan only (stop)` \u002F `Modify proposal first` \u002F `Cancel` |\n| `\u002Fqa` | Mode (when ambiguous): `QA this release` \u002F `Repro this bug` \u002F `Claims only` \u002F `Cancel`. Scratch install: `Use a scratch git repo` \u002F `QA this checkout only` \u002F `Cancel`. Playbook: `.cursor\u002Fskills\u002Fcore\u002Fqa\u002FSKILL.md` |\n| `\u002Fplan-review-triage` | Write residuals \u002F Fix nits only \u002F Ack and stop. Residuals write uses backlog-add labels. Multi-path: one Ask when remaining monitors share a uniform class |\n| `\u002Fhandoff` \u002F guardian | `Automatic handoff` \u002F `Manual handoff` (first time) |\n| `install.md` | Registry URL\u002Fref; migrate nested `agent-kit\u002F`; optional git-hooks |\n| `\u002Fagent-kit-onboard` | One unresolved essential at a time. Domain skills: `Scaffold domain skills` \u002F `Defer (record reason)` \u002F `Skip` |\n| Pending ticket (preflight, only while `.cursor\u002Fcontext\u002Fgate-exit.json` has a pending entry) | Id `ticket`: `Read the ticket` \u002F `Accept` \u002F `Discard` \u002F `Later`. Unattended: list stamps, no Ask. Commands and effects: [pending-ticket.md](pending-ticket.md) |\n\n`\u002Fgit-prod` and factory `\u002Fkit-prod`: one `Proceed with production deploy` is one ship (one SemVer close, one annotated `v*` tag, one promote). A red or unfinished post-prod verification (tag CI, or the wrapper's release checks) is a STOP. The next patch needs a new Ask. Labels in the table stay exact. A `\u002Frun-plan-all` queue confirm that sets Ship auth `per-plan-release` is that yes for one ship per completed plan. It does not open this Ask again, and a red post-prod verification still stops the queue.\n\n### Wrapper commands (not consumer L0)\n\nA project may wrap `\u002Fgit-staging` \u002F `\u002Fgit-prod` (the kit factory keeps `\u002Fkit-staging` and `\u002Fkit-prod`, omitted from consumer L0, public-sync, and the `agent-kit run` catalog). A wrapper keeps the native Ask first and owns any extra post-ship Asks and their labels in its own command file.\n\n## Numbered fallback (path 1)\n\nWhen Ask questions is absent, the numbered list is **mandatory** (path 1). Print the `HITL_GATE:` sentinel line immediately before the list, in the same message: it is how a headless run (`agent-kit run`, `run-plan`, `run-plan-all`) detects the gate and relays the operator's answer (ADR `2026-09-19_headless-hitl-transport-and-live-tui.md`).\n\n```text\nAsk questions is not available in this session. Reply with the number or the label. You can also type your own answer (Other).\n\nHITL_GATE: \u003Cask-id> | \u003Clabel-a> | \u003Clabel-b> | \u003Clabel-c>\n1. \u003Clabel-a>\n2. \u003Clabel-b>\n3. \u003Clabel-c>\n```\n\nOne numbered list per message. Accept number or label. A typed answer that is not a number or label is Other.\n\nSentinel rules: one line, column 0, `HITL_GATE: \u003Cask-id> | \u003Clabel 1> | ... | \u003Clabel n>`.\n`\u003Cask-id>` is the kebab-case id from the tables above (`gate-a`, `gate-b`, `risk`, `inbox`, `exhaustion`, `owed-close`, `queue-drift`, `queue-confirm`, `context-checkpoint`, `novel-failure`, `queue-end-gates`, `promote-merge-wait`, `malformed-summary`, `next-unit`, `backlog-write`, `cancel-plan`, `ticket`); labels are the exact table labels, in list order, separated by ` | ` (no label contains `|`).\nSurfaces without a listed id keep the numbered list without a sentinel (the headless runner detects them by the wording above as a prose fallback). `git-prod` and `kit-prod` are never relayed headless: the run stops and points at the operator slash.\nThe operator's answer comes back as one line, `HITL_REPLY: \u003Cask-id> | operator reply \u003Cn> | \u003Clabel>` (or `operator reply other | \u003Ctyped text>`); cite it as the Ask provenance in HANDOFF. Never assume a reply: no answer means stop.\n\n## \u002Frun-plan compressed tick\n\nStrategy (announce, do not ask): Task available → orchestrated (inline-first only when every lightweight check passes); else in-session; headless → `agent-kit run-plan`.\n\n1. Read HANDOFF, plan, config. Refuse auto-reschedule on a recorded API\u002Fusage-limit stop until the operator confirms recovery. Audits preflight `off`\u002F`warn`\u002F`block`. Unsatisfiable `enabled: true` + reviewer `claude` on a Claude implementer: warn or block per preflight. Session-pile warn\u002Fcap before arm.\n2. Next pending to-do, frontmatter order. `force_task: true` → Task. Findings contract → Task. Else lightweight docs-only → inline-first. Mark `in_progress` before work.\n3. Execute only that to-do. Findings-only for `review-*`. `autoRemediate` default false: fix-agent or residuals plan, no silent product apply.\n4. Close: `completed`, HANDOFF `Mode: run-plan (\u003Cstrategy>)`, cadence bump, `\u002Fgit-staging` on a commitable diff. **Staging ready: yes** needs lint evidence (or `none applicable`). Dashboard HTML: `none applicable (dashboard-CSS)` covered by plugin-ux-validation. Contract string alone without that evidence is invalid.\n5. Reschedule or stop. Exit `3` is **timeout-only** and does **not** retroactively convert, upgrade, or rewrite a later monitor into success. Never `\u002Fgit-prod`.\n\nInline-first allowlist, findings authorship, worker prompt, headless runner, and audit wait: [run-plan-tick-contract.md](run-plan-tick-contract.md).\n\n## \u002Fcontinue-plan compressed\n\nRead HANDOFF first. Plans inventory is index + HANDOFF only (ADR `2026-07-26_command-orchestration-delegation-pattern.md`). Default-path Ask is the next-unit confirm (or the multi-plan picker when more than one resumable plan exists). Persona chrome after the entry Ask. One unit per chat unless `\u002Frun-plan`. Full procedure: `.cursor\u002Fcommands\u002Fcontinue-plan.md` (inline, no separate skill page).\n\n## \u002Fstart-project compressed\n\nBroad Intake (index + HANDOFF only; no `.cursor\u002Fplans\u002F*.plan.md` glob) → Gate A (plan file only) → stop → Gate B (one unit) only after a second yes. Host Plan Mode does not replace Gate A\u002FB: copy a native plan into `.cursor\u002Fplans\u002F` then run Gate A (ADR `2026-09-15_kit-plans-sot-over-host-plan-mode.md`). Goal in the same message is not execute permission. Backlog paths skip Gate B. Details: [start-project-intake.md](start-project-intake.md).\n\n## \u002Frun-plan-all compressed\n\nPure orchestrator. PO synthesis (Task explore) → start-vs-resume or queue confirm (write `- **Confirmed backlog:**`) → one Task per plan. Checkpoint (~50%+ window), novel error \u002F expired wait, promote merge wait cap: labels above.\nWhen Ship auth is `per-plan-release`, one release per completed plan before the next. `Run plans only` does not promote. Mid-batch audits wait, no triage Ask. Queue-end wait then `\u002Fplan-review-triage`. Details: [run-plan-all-queue.md](run-plan-all-queue.md).\n","# HITL gates\n\nKit-wide human-in-the-loop. Commands stay Goal + five hard stops + Ask labels + a link here. Per-command procedures, one hop each: [run-plan-tick-contract.md](run-plan-tick-contract.md), [start-project-intake.md](start-project-intake.md), [run-plan-all-queue.md](run-plan-all-queue.md), [pending-ticket.md](pending-ticket.md); `\u002Fcontinue-plan` is inline in its own command file (`procedures.md` is a redirect stub only). Always-applied short rule: `.cursor\u002Frules\u002Fhitl-ask-questions.mdc`.\n\n## Contract\n\n1. Any confirmation, choice, or clarification before acting uses **Ask questions** (`AskQuestion` \u002F ACP `cursor\u002Fask_question`). Do not ask the user to type yes.\n2. Prefer one question at a time.\n3. Options are concrete labels (tables below). Do not invent a fake tool call.\n4. **Numbered-list fallback is path 1** when the tool is not in the session toolset. Say the tool is missing once, print one `HITL_GATE: \u003Cask-id> | \u003Clabels>` line and the same labels as a numbered list (block below), accept number or label, and treat a typed answer as Other. Do not invent a fake tool call. Matrix: `.cursor\u002Fmemory\u002Fdecisions\u002F2026-07-20_ask-questions-model-availability.md`.\n5. Skipped or cancelled answers mean **stop** (same as no yes).\n6. Do not fabricate HITL in HANDOFF. Parked \u002F approved \u002F deferred \u002F confirmed \u002F stopped-by-operator need Ask id, operator reply, or `agent-inferred`. In a headless run the operator reply arrives as a `HITL_REPLY: \u003Cask-id> | operator reply \u003Cn> | \u003Clabel>` line; cite that line.\n7. CLI `agent-kit init` keeps `@clack\u002Fprompts`. Do not call IDE Ask questions from the CLI.\n\n## Default-path Ask inventory\n\nEach main command has **exactly one Ask at entry** on the default path. Inbox, owed-close, and landing Asks are opt-in or post-default. They are never pre-Ask blockers. Empty Unprocessed inbox: silent skip (mention count only if non-empty, after the entry Ask or not at all). A pending operator ticket is the one preflight Ask before it.\n\n| Command | Default-path Ask (one at entry) | Off default path |\n|---------|--------------------------------|------------------|\n| `\u002Fstart-project` | Gate A (vague-goal Ask first only if the goal is missing) | Gate B after a second yes. `confirm-provider` never |\n| `\u002Frun-plan` | Risk Ask only when PII, secrets, or scope is ambiguous; otherwise the run starts with no entry Ask | Inbox, exhaustion, owed-close |\n| `\u002Frun-plan-all` | Start-vs-resume (stored queue + Backlog appeared after last confirm) **or** queue confirm (fresh synthesis) | Inbox, owed-close, landing, context checkpoint at plan boundaries, novel error \u002F expired wait. No mid-queue triage Ask |\n| `\u002Fcontinue-plan` | Next unit: `Start [to-do-id]` \u002F `Edit plan first` \u002F `Switch to different plan` \u002F `Stop here`. Multi-plan picker first when needed | Inbox |\n| `\u002Fbacklog-add` | `Write plan to backlog` \u002F `Modify proposal first` \u002F `Cancel` | Inbox. `confirm-provider` never |\n| `\u002Fgit-prod` | `Proceed with production deploy` \u002F `Review changes first` \u002F `Cancel` | none |\n| `\u002Fhotfix` | `Write mini plan and run` \u002F `Write mini plan only (stop)` \u002F `Modify proposal first` \u002F `Cancel` | none |\n| `\u002Fqa` | Mode Ask only when the invocation is ambiguous (`QA this release` \u002F `Repro this bug` \u002F `Claims only` \u002F `Cancel`); otherwise start | Scratch install: `Use a scratch git repo` \u002F `QA this checkout only` \u002F `Cancel` |\n| `\u002Fhandoff` | `Automatic handoff` \u002F `Manual handoff` (first time or when offering a choice) | none |\n\n## Exact Ask labels\n\n### \u002Fstart-project\n\n**Gate A, active plan** (id `gate-a`)**:** `Write plan and add to backlog (keep current active)` \u002F `Park current plan, write plan and activate new` \u002F `Modify proposal first` \u002F `Cancel`\n\n**Gate A, no active plan** (id `gate-a`)**:** `Write plan file` \u002F `Write plan and add to backlog` \u002F `Modify proposal first` \u002F `Cancel`\n\n**Gate B** (id `gate-b`)**:** `Start first unit` \u002F `Switch to \u002Frun-plan` \u002F `Edit plan first` \u002F `Add to backlog` \u002F `Stop here`\n\nVague goal: ask for a 1-2 sentence goal before Gate A. Confirm-provider \u002F `collaboration.provider` is advisory only; do not Ask it.\n\n### \u002Frun-plan\n\n| Gate | Id | Labels |\n|------|----|--------|\n| Risk (PII, secrets, ambiguous scope) | `risk` | `Continue with risk` \u002F `Modify approach` \u002F `Stop run` |\n| Inbox (post-default; Unprocessed non-empty; skip inside a `\u002Frun-plan-all` per-plan Task) | `inbox` | `Analyze inbox now` \u002F `Enqueue Fix now` \u002F `Not now` |\n| Exhaustion (post-default; after Final HANDOFF; `offerOnExhausted`) | `exhaustion` | `Run review now` \u002F `Always enable automatic` \u002F `Not now` |\n| Owed-close (post-default; dead wait-state + genuine later monitor) | `owed-close` | `Adopt existing monitor` \u002F `Ack owed without review` \u002F `Not now` |\n\nNever steal `\u002Fgit-prod`. Exhaustion Ask\u002Farm is after Final HANDOFF and the prod suggestion.\n\n### \u002Frun-plan-all\n\n| Gate | Id | Labels |\n|------|----|--------|\n| Inbox (post-default) | `inbox` | `Analyze inbox now` \u002F `Enqueue Fix now` \u002F `Not now` |\n| Start vs resume (Backlog appeared after last confirm) | `queue-drift` | `Resume frozen queue` \u002F `Insert new backlog` \u002F `Re-synthesize` |\n| Confirm queue | `queue-confirm` | `Run as proposed` \u002F `Run plans only` \u002F `Edit order` \u002F `Apply merges & drops only` \u002F `Keep all plans as-is` \u002F `Include Gate-B plans` \u002F `Cancel` |\n| Context checkpoint (plan boundary, ~50% window) | `context-checkpoint` | `Continue queue` \u002F `Stop and prepare handoff` \u002F `Change queue` |\n| Novel error \u002F expired wait | `novel-failure` | `Retry recovery once` \u002F `Hold and document` \u002F `Stop the queue` |\n| Queue end, deferred rows (after Final HANDOFF) | `queue-end-gates` | `Resolve gates now` \u002F `Print resolution prompt` \u002F `Later` |\n| Promote PR merge wait cap | `promote-merge-wait` | `Keep waiting` \u002F `Show the merge box reason` \u002F `Stop and hand off` |\n| Malformed Task summary | `malformed-summary` | Ask before advancing the cursor |\n\nAsks only at these rows (ADR `2026-09-25_run-plan-all-three-hitl-points.md`, Amend 2026-10-26). Drift only for Backlog new since `- **Confirmed backlog:**`. No mid-queue triage Ask. Queue end: `queue-end-gates`, `\u002Fplan-review-triage`, `\u002Fgit-prod` suggestion, separately.\n\n### Other surfaces\n\n| Surface | Labels |\n|---------|--------|\n| `\u002Fcontinue-plan` | Default-path (id `next-unit`): `Start [to-do-id]` \u002F `Edit plan first` \u002F `Switch to different plan` \u002F `Stop here`. Multi-plan picker (index + HANDOFF only): `[plan-name.plan.md]` \u002F `Create new plan instead`. Inbox (id `inbox`) same three labels, post-default, when Unprocessed is non-empty |\n| `\u002Fbacklog-add` | Default-path write (id `backlog-write`): `Write plan to backlog` \u002F `Modify proposal first` \u002F `Cancel`. Inbox (id `inbox`) same three labels, post-default, when Unprocessed is non-empty. Never park, activate, or Gate B. Never Ask confirm-provider |\n| `\u002Fbacklog-edit` | `Edit [plan-file]` \u002F `Cancel` |\n| `\u002Fbacklog-delete` | `Delete [plan-file] from backlog` \u002F `Cancel` |\n| `\u002Fbacklog-cancel` | `Cancel [plan-file] on backlog` \u002F `Keep on backlog` |\n| `\u002Fcancel-plan` | Id `cancel-plan`: `Cancel active plan [plan-file]` \u002F `Keep the active plan` |\n| `\u002Fgit-prod` | `Proceed with production deploy` \u002F `Review changes first` \u002F `Cancel`. Claude lane (or recorded classifier denial): `I pushed main` \u002F `Open staging→main PR instead` \u002F `Cancel` |\n| `\u002Fhotfix` | `Write mini plan and run` \u002F `Write mini plan only (stop)` \u002F `Modify proposal first` \u002F `Cancel` |\n| `\u002Fqa` | Mode (when ambiguous): `QA this release` \u002F `Repro this bug` \u002F `Claims only` \u002F `Cancel`. Scratch install: `Use a scratch git repo` \u002F `QA this checkout only` \u002F `Cancel`. Playbook: `.cursor\u002Fskills\u002Fcore\u002Fqa\u002FSKILL.md` |\n| `\u002Fplan-review-triage` | Write residuals \u002F Fix nits only \u002F Ack and stop. Residuals write uses backlog-add labels. Multi-path: one Ask when remaining monitors share a uniform class |\n| `\u002Fhandoff` \u002F guardian | `Automatic handoff` \u002F `Manual handoff` (first time) |\n| `install.md` | Registry URL\u002Fref; migrate nested `agent-kit\u002F`; optional git-hooks |\n| `\u002Fagent-kit-onboard` | One unresolved essential at a time. Domain skills: `Scaffold domain skills` \u002F `Defer (record reason)` \u002F `Skip` |\n| Pending ticket (preflight, only while `.cursor\u002Fcontext\u002Fgate-exit.json` has a pending entry) | Id `ticket`: `Read the ticket` \u002F `Accept` \u002F `Discard` \u002F `Later`. Unattended: list stamps, no Ask. Commands and effects: [pending-ticket.md](pending-ticket.md) |\n\n`\u002Fgit-prod` and factory `\u002Fkit-prod`: one `Proceed with production deploy` is one ship (one SemVer close, one annotated `v*` tag, one promote). A red or unfinished post-prod verification (tag CI, or the wrapper's release checks) is a STOP. The next patch needs a new Ask. Labels in the table stay exact. A `\u002Frun-plan-all` queue confirm that sets Ship auth `per-plan-release` is that yes for one ship per completed plan. It does not open this Ask again, and a red post-prod verification still stops the queue.\n\n### Wrapper commands (not consumer L0)\n\nA project may wrap `\u002Fgit-staging` \u002F `\u002Fgit-prod` (the kit factory keeps `\u002Fkit-staging` and `\u002Fkit-prod`, omitted from consumer L0, public-sync, and the `agent-kit run` catalog). A wrapper keeps the native Ask first and owns any extra post-ship Asks and their labels in its own command file.\n\n## Numbered fallback (path 1)\n\nWhen Ask questions is absent, the numbered list is **mandatory** (path 1). Print the `HITL_GATE:` sentinel line immediately before the list, in the same message: it is how a headless run (`agent-kit run`, `run-plan`, `run-plan-all`) detects the gate and relays the operator's answer (ADR `2026-09-19_headless-hitl-transport-and-live-tui.md`).\n\n```text\nAsk questions is not available in this session. Reply with the number or the label. You can also type your own answer (Other).\n\nHITL_GATE: \u003Cask-id> | \u003Clabel-a> | \u003Clabel-b> | \u003Clabel-c>\n1. \u003Clabel-a>\n2. \u003Clabel-b>\n3. \u003Clabel-c>\n```\n\nOne numbered list per message. Accept number or label. A typed answer that is not a number or label is Other.\n\nSentinel rules: one line, column 0, `HITL_GATE: \u003Cask-id> | \u003Clabel 1> | ... | \u003Clabel n>`.\n`\u003Cask-id>` is the kebab-case id from the tables above (`gate-a`, `gate-b`, `risk`, `inbox`, `exhaustion`, `owed-close`, `queue-drift`, `queue-confirm`, `context-checkpoint`, `novel-failure`, `queue-end-gates`, `promote-merge-wait`, `malformed-summary`, `next-unit`, `backlog-write`, `cancel-plan`, `ticket`); labels are the exact table labels, in list order, separated by ` | ` (no label contains `|`).\nSurfaces without a listed id keep the numbered list without a sentinel (the headless runner detects them by the wording above as a prose fallback). `git-prod` and `kit-prod` are never relayed headless: the run stops and points at the operator slash.\nThe operator's answer comes back as one line, `HITL_REPLY: \u003Cask-id> | operator reply \u003Cn> | \u003Clabel>` (or `operator reply other | \u003Ctyped text>`); cite it as the Ask provenance in HANDOFF. Never assume a reply: no answer means stop.\n\n## \u002Frun-plan compressed tick\n\nStrategy (announce, do not ask): Task available → orchestrated (inline-first only when every lightweight check passes); else in-session; headless → `agent-kit run-plan`.\n\n1. Read HANDOFF, plan, config. Refuse auto-reschedule on a recorded API\u002Fusage-limit stop until the operator confirms recovery. Audits preflight `off`\u002F`warn`\u002F`block`. Unsatisfiable `enabled: true` + reviewer `claude` on a Claude implementer: warn or block per preflight. Session-pile warn\u002Fcap before arm.\n2. Next pending to-do, frontmatter order. `force_task: true` → Task. Findings contract → Task. Else lightweight docs-only → inline-first. Mark `in_progress` before work.\n3. Execute only that to-do. Findings-only for `review-*`. `autoRemediate` default false: fix-agent or residuals plan, no silent product apply.\n4. Close: `completed`, HANDOFF `Mode: run-plan (\u003Cstrategy>)`, cadence bump, `\u002Fgit-staging` on a commitable diff. **Staging ready: yes** needs lint evidence (or `none applicable`). Dashboard HTML: `none applicable (dashboard-CSS)` covered by plugin-ux-validation. Contract string alone without that evidence is invalid.\n5. Reschedule or stop. Exit `3` is **timeout-only** and does **not** retroactively convert, upgrade, or rewrite a later monitor into success. Never `\u002Fgit-prod`.\n\nInline-first allowlist, findings authorship, worker prompt, headless runner, and audit wait: [run-plan-tick-contract.md](run-plan-tick-contract.md).\n\n## \u002Fcontinue-plan compressed\n\nRead HANDOFF first. Plans inventory is index + HANDOFF only (ADR `2026-07-26_command-orchestration-delegation-pattern.md`). Default-path Ask is the next-unit confirm (or the multi-plan picker when more than one resumable plan exists). Persona chrome after the entry Ask. One unit per chat unless `\u002Frun-plan`. Full procedure: `.cursor\u002Fcommands\u002Fcontinue-plan.md` (inline, no separate skill page).\n\n## \u002Fstart-project compressed\n\nBroad Intake (index + HANDOFF only; no `.cursor\u002Fplans\u002F*.plan.md` glob) → Gate A (plan file only) → stop → Gate B (one unit) only after a second yes. Host Plan Mode does not replace Gate A\u002FB: copy a native plan into `.cursor\u002Fplans\u002F` then run Gate A (ADR `2026-09-15_kit-plans-sot-over-host-plan-mode.md`). Goal in the same message is not execute permission. Backlog paths skip Gate B. Details: [start-project-intake.md](start-project-intake.md).\n\n## \u002Frun-plan-all compressed\n\nPure orchestrator. PO synthesis (Task explore) → start-vs-resume or queue confirm (write `- **Confirmed backlog:**`) → one Task per plan. Checkpoint (~50%+ window), novel error \u002F expired wait, promote merge wait cap: labels above.\nWhen Ship auth is `per-plan-release`, one release per completed plan before the next. `Run plans only` does not promote. Mid-batch audits wait, no triage Ask. Queue-end wait then `\u002Fplan-review-triage`. Details: [run-plan-all-queue.md](run-plan-all-queue.md).\n",{"name":5,"version":54,"category":55,"description":7,"disable-model-invocation":56},"0.1.3","core",true,"main","06da3ee6e3cb2eb81f2c6db15074d74d8cedceab",".cursor\u002Fskills\u002Fcore\u002Fhitl-gates",2,"https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit","https:\u002F\u002Fmissionkit.io\u002F","https:\u002F\u002Fgithub.com\u002Fagent-kit-startup","dadado.dev","Everyone calls me Dadado.","2026-11-11 11:03:48",{"source":8,"skillName":5,"commands":68,"prompt":78,"zipAvailable":56},[69,72,75],{"tool":70,"command":71},"npx","npx skills add agent-kit-startup\u002Fagent-kit --skill hitl-gates",{"tool":73,"command":74},"bunx","bunx skills add agent-kit-startup\u002Fagent-kit --skill hitl-gates",{"tool":76,"command":77},"pnpm","pnpm dlx skills add agent-kit-startup\u002Fagent-kit --skill hitl-gates","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit\u002Fblob\u002Fmain\u002F.cursor\u002Fskills\u002Fcore\u002Fhitl-gates\u002FSKILL.md",[80,86,90,94,98,102],{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"pending-ticket.md","REFERENCE","参考文档",3883,"https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit\u002Fblob\u002Fmain\u002F.cursor\u002Fskills\u002Fcore\u002Fhitl-gates\u002Fpending-ticket.md",{"path":87,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":88,"sourceHtmlUrl":89},"procedures.md",654,"https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit\u002Fblob\u002Fmain\u002F.cursor\u002Fskills\u002Fcore\u002Fhitl-gates\u002Fprocedures.md",{"path":91,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":92,"sourceHtmlUrl":93},"promote-merge-wait.md",2733,"https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit\u002Fblob\u002Fmain\u002F.cursor\u002Fskills\u002Fcore\u002Fhitl-gates\u002Fpromote-merge-wait.md",{"path":95,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":96,"sourceHtmlUrl":97},"run-plan-all-queue.md",46044,"https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit\u002Fblob\u002Fmain\u002F.cursor\u002Fskills\u002Fcore\u002Fhitl-gates\u002Frun-plan-all-queue.md",{"path":99,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":100,"sourceHtmlUrl":101},"run-plan-tick-contract.md",47301,"https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit\u002Fblob\u002Fmain\u002F.cursor\u002Fskills\u002Fcore\u002Fhitl-gates\u002Frun-plan-tick-contract.md",{"path":103,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":104,"sourceHtmlUrl":105},"start-project-intake.md",15334,"https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit\u002Fblob\u002Fmain\u002F.cursor\u002Fskills\u002Fcore\u002Fhitl-gates\u002Fstart-project-intake.md",[107,128,145,161,168,181],{"skillNo":108,"name":41,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":49},"01M6N1Q7XF3R5BDAJ2W2VBXBNC","Playbook for \u002Fqa. Verify a release or bug against CHANGELOG claims, install journey, tests, and hygiene. Invoke via \u002Fqa; do not auto-load.","https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit\u002Fblob\u002Fmain\u002Fskills\u002Fqa\u002FSKILL.md",[],[41,33,113,114,115,116,117,118,119,120,55,121,122,123,124,125,126,40,127],"bug","hygiene","via","verify","load","tests","true","for","do","install","playbook","release","changelog","claims","journey",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":134,"publishedAt":49},"01M6N1Q4F95YR6JXRSHABJR18B","plan-review-triage","Triage plan monitor findings. Select untriaged targets, summarize open residuals, and persist durable triage headings. Invoke via \u002Fplan-review-triage; do not auto-load.","https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit\u002Fblob\u002Fmain\u002Fskills\u002Fplan-review-triage\u002FSKILL.md",[],[135,36,136,37,137,138,139,117,40,140,119,141,142,55,121,115,33,143,144],"triage","plan review","review triage","plan review triage","targets","open","monitor","select","summarize","persist",{"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":49},"01M6N1Q0T6HZ1HT425V9AED20T","plan-external-review","Arm external Claude reviewer for plan audits with autonomous background PTY spawn and freshness-gated wait. Invoke via \u002Fplan-external-review; do not auto-load.","https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit\u002Fblob\u002Fmain\u002Fskills\u002Fplan-external-review\u002FSKILL.md",[],[152,37,36,153,33,119,154,155,156,115,157,158,117,40,159,160,120,55,121],"plan external review","background","wait","spawn","gated","with","reviewer","autonomous","PTY",{"skillNo":162,"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":163,"categories":164,"keywords":167,"publishedAt":49},"01M6N1PV5VC6J8EF6VVWP95T2Y","https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit\u002Fblob\u002Fmain\u002Fskills\u002Fhitl-gates\u002FSKILL.md",[165,166],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},[30,29,31,48,39,40,41,42,43,44,45,46,47,38,32,33,34,35,36,37],{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":177,"publishedAt":49},"01M6N1PM87KBJ2CQ74CVZ9X4VB","field-report-resolve","Resolve Field Report attention cards by checking eligibility and dismissing when answered or subject-resolved. Invoke via \u002Ffield-report-resolve; do not auto-load.","https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit\u002Fblob\u002Fmain\u002Fskills\u002Ffield-report-resolve\u002FSKILL.md",[174],{"categoryNo":175,"categoryName":176,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000034","行政与办公人员",[178,179,32,33,115,117,40,119,55,180,121],"field report resolve","report","attention",{"skillNo":182,"name":183,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":189,"publishedAt":49},"01M6N1PGC3P3388CC5N91XVFXY","clean-code","https:\u002F\u002Fgithub.com\u002Fagent-kit-startup\u002Fagent-kit\u002Fblob\u002Fmain\u002Fskills\u002Fclean-code\u002FSKILL.md",[186],{"categoryNo":187,"categoryName":188,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师",[190,191,192],"code","clean","clean code"]