gsd-headless
Orchestrate GSD (Git Ship Done) projects programmatically via headless CLI. Use when an agent needs to create milestones from…
GSD blocker and failed-run recovery authority. Use when a GSD run is blocked or paused on an auto-pause blocker, a Task attempt failed, a recovery action exists, or anyone asks to "clear the blocker", "unblock the run", "resolve the pause", or "resume the failed task". Explains
$ npx -y skills add open-gsd/gsd-pi --skill gsd-blocker-recovery --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/gsd-blocker-recoveryContext preview
The summary Claude sees to decide when to auto-load this skill.
GSD blocker and failed-run recovery authority. Use when a GSD run is blocked or paused on an auto-pause blocker, a Task attempt failed, a recovery action exists, or anyone asks to "clear the blocker", "unblock the run", "resolve the pause", or "resume the failed task". Explains
name: gsd-blocker-recovery description: >- GSD blocker and failed-run recovery authority. Use when a GSD run is blocked or paused on an auto-pause blocker, a Task attempt failed, a recovery action exists, or anyone asks to "clear the blocker", "unblock the run", "resolve the pause", or "resume the failed task". Explains the two enforced routes: blocker resolution is cleared only by the human in the native terminal, and a Task recovery resume is one gated continuation after a real repair with concrete evidence — never a state-surgery bypass.
<objective> Teach the enforced blocker/recovery authority model so recovery requests go through the real routes instead of state surgery. GSD's blocker command, Task recovery guards, and domain operations already enforce these boundaries; this skill makes them discoverable so an agent neither attempts a forbidden bypass nor stalls when a legitimate gated route exists. </objective>
<context> GSD separates three identities and three outcomes. Confusing them is the root cause of most bad recovery advice:
| Concept | Meaning | |---|---| | Blocker ID (`workflow_blockers.blocker_id`) | Identifies one blocker. It is not a Recovery Action ID and not an Attempt ID. | | `eligible: true` | Clear-only association eligibility from `/gsd blocker inspect`: the blocker is open, human-owned, and associated with exactly one open auto pause. It does NOT mean the problem is repaired and never means a Task succeeded. | | Native blocker resolution | A human clears an eligible blocker and its pause via `/gsd blocker resolve <id> resolved <reason>` in the native terminal, with nonblank evidence and an explicit y approval. RPC/headless callers can only inspect. Clearing resumes nothing. | | Task Recovery Action resume | One gated continuation for an agent-owned abort/remediation: it authorizes exactly one new (lineage-linked successor) Task Attempt after a real repair, via `gsd_task_recovery_resume` or the operator bridge `/gsd recover <recoveryActionId>`, with repair summary + concrete evidence. The authorization is consumed once. | | Verified Task completion | The Attempt (failed or successor) settles and completes only through the normal host-verification path. Failure or interruption never equals completion. |
Human auto-pause blocker kinds (the only ones a human can clear): `missing_authority`, `missing_access`, `external_dependency`, `consent`, `ambiguous_intent`, `subjective_uat`, `user_limit`. </context>
<core_principle> **BLOCKER APPROVAL IS HUMAN AND NATIVE-TERMINAL-ONLY.** `/gsd blocker resolve` runs an interactive approval component in the real terminal; the caller must press y. In RPC/headless contexts that component never executes, so resolution is impossible there — inspect only. Never synthesize, simulate, or automate that approval; never impersonate the user or fabricate input markers; a dialog response or command exit is not consent. There is no agent or RPC path to approve a blocker resolution.
**RESUME IS GATED, NOT FREE.** A recovery resume is legitimate only when the recorded cause is genuinely repaired and concrete verification evidence accompanies it. The durable guards fail closed: recovery action exists; action is abort or remediate and agent-owned; not linked to a Blocker; not already resumed; Task lifecycle `ready` or `in_progress`; Attempt settled and still owning the causal route; no open blockers. The authorization is consumed by the next lineage-linked Task Attempt and cannot be reused.
**FAIL-CLOSED FENCES ARE LOAD-BEARING.** Resolution re-verifies the checkout, the existing writable database binding, and the inspected snapshot (revision + authority epoch) before the atomic clear. A mismatch refuses and requires a fresh inspect — that is stale-consent protection, not a bug to route around.
**DIAGNOSIS STAYS READ-ONLY.** In forensics or `find_root_cause_only` debug mode, stay inside that goal: inspect, analyze, and hand the operator the route. Do not clear, approve, resume, or repair state as a side effect. </core_principle>
<process>
While executing a unit, a plan-invalidating problem is reported through `gsd_task_complete` with `blockerDiscovered: true` (name the category in narrative/knownIssues) — the orchestrator routes it. Never mark a Task complete to escape it, and never hide it.
</process>
<prohibited> These are not recovery methods. None of them can make GSD treat work as unblocked or complete:
GSD Pi is a local-first coding agent for planning, implementing, verifying, and tracking project work from the command line.
Orchestrate GSD (Git Ship Done) projects programmatically via headless CLI. Use when an agent needs to create milestones from…
Audit and improve web accessibility following WCAG 2.1 guidelines. Use when asked to "improve accessibility", "a11y audit", "WCAG…
Browser automation CLI for AI agents. Use when interacting with websites — navigating pages, filling forms, clicking buttons,…
Design or review an HTTP/REST/GraphQL API for versioning, pagination, error shapes, idempotency, auth, status codes, cache…
Apply modern web development best practices for security, compatibility, and code quality. Use when asked to "apply best…
Ask a quick side question about your current work without derailing the main task. Answers from existing conversation context…