a11y-pass
Catch the accessibility failures that ship in almost every AI-built UI. Use after building any interactive component.
Escalate blocked runs to a human via configured channel or fallback to BLOCKED.md and exit the loop. Use when the loop hits an ambiguous spec, a missing credential, a destructive action needing approval, or 3+ consecutive verify failures on the same task.
$ npx -y skills add Archive228/loopkit --skill hitl-escalate --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/hitl-escalateContext preview
The summary Claude sees to decide when to auto-load this skill.
Escalate blocked runs to a human via configured channel or fallback to BLOCKED.md and exit the loop. Use when the loop hits an ambiguous spec, a missing credential, a destructive action needing approval, or 3+ consecutive verify failures on the same task.
name: hitl-escalate description: Escalate blocked runs to a human via configured channel or fallback to BLOCKED.md and exit the loop. Use when the loop hits an ambiguous spec, a missing credential, a destructive action needing approval, or 3+ consecutive verify failures on the same task. when_to_use: the loop hit an ambiguous spec, a missing credential, a destructive action needing approval, or 3+ consecutive verify failures on same task
Long-running agent loops fail in a specific way when they meet a question they can't answer: they guess. The guess ships, the next session builds on it, and by the time a human looks the divergence is three commits deep. This skill is the release valve — when the agent is stuck, it stops and asks, cleanly, in a shape the human can act on.
If none of the above hold, do not escalate. Guessing is bad; escalating on a solvable problem is also bad (it trains humans to ignore the channel).
Read `LOOPKIT_HITL_CHANNEL`. Supported values:
| Value | Shape | |---|---| | `telegram` | POST to `https://api.telegram.org/bot$LOOPKIT_HITL_TELEGRAM_TOKEN/sendMessage` with `chat_id=$LOOPKIT_HITL_TELEGRAM_CHAT`, `text=<question + repo + short context>`. | | `slack` | POST JSON `{"text": "..."}` to `$LOOPKIT_HITL_SLACK_WEBHOOK` (incoming-webhook URL). | | `dial` | Run `$LOOPKIT_HITL_DIAL_CMD` with the message on stdin. Whatever the operator wired up — SMS gateway, ntfy, phone call, pager. | | `none` (or unset) | Skip the primary action. Go straight to fallback. |
Message body — always these five lines, in this order:
[loopkit] blocked in <repo-name> on <ISO timestamp> Q: <one-line question> Context: <one-line what you were doing> Attempted: <one-line what you tried> Choices: <A | B | C>
Non-2xx from the channel is a soft failure. Log it, then fall through to the fallback so the loop still exits cleanly.
Whether the primary succeeds or fails, always write `./BLOCKED.md` at the repo root with exactly four sections:
# Blocked ## Question: <one sentence, answerable with a short reply> ## Context: <what feature, which file, which commit, why now — 3-6 lines> ## Attempted: <bulleted list of what you tried and why each fell short> ## Choices: - A) <option> — <consequence> - B) <option> — <consequence> - C) <option> — <consequence>
Then `exit 2`. The loop runner (`run.sh`) checks for `BLOCKED.md` at the head of each iteration and exits with code 2 if it exists — that stops the loop until a human clears it.
The human reads `BLOCKED.md`, edits `PROMPT.md` / drops the credential / approves the destructive step, then `rm BLOCKED.md` and restarts `run.sh`. The deleted `BLOCKED.md` is the unblock signal.
33 battle-tested skills + minimal .claude harness for any coding agent (Claude Code, Cursor, Codex, Gemini CLI).
Catch the accessibility failures that ship in almost every AI-built UI. Use after building any interactive component.
Before compaction Loopkit extracts decisions into claude-decisions.json (machine-readable). Read it alongside claude-progress.txt…
Review a diff against the goal spec assuming the code is BROKEN. The reviewer
Verify that an endpoint checks ownership, not just authentication. Use on any handler that reads or mutates user data.
Find the exact commit that introduced a bug. Use when something worked before and broke, and you don't know which change did it.
Before picking new work, smoke-test the last "completed" feature. If it's broken, revert and re-open it before touching anything…