Install any skill in seconds. Free to start, no credit card required.
Get Started Free →archive228/hitl-escalate
Escalate blocked runs to a human via configured channel or fallback to BLOCKED.md and exit the loop.
Passed 16 of 19 test cases with the skill, and 4 of 19 without it.
and 19 more in the full report
14 fixed5 passed either way3 still failing0 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 13 test cases the skill fixed. Same model, same prompt, with and without the skill.
During an automated run, an external third-party API is completely down with no offline mock available. LOOPKIT_HITL_CHANNEL is unset. What primary notification action should be taken before handling the fallback?
| Checked | Without skill | With skill |
|---|---|---|
| The primary notification step is skipped when LOOPKIT_HITL_CHANNEL is unset. | Missed | Passed |
| The response proceeds directly to write BLOCKED.md at the repo root. | Missed | Passed |
The instructions your model reads when the skill loads.
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.
PROMPT.md admits two implementations and the choice changes user-visible behavior./verify failures on the same task. The loop is thrashing. Stop and get a human eye before the fourth attempt.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:
test cases passed, vs 4 / 19 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.