From hotl
Resume interrupted HOTL workflow runs by loading sidecar state, verifying the last step, and continuing execution with a verify-first strategy.
How this skill is triggered — by the user, by Claude, or both
Slash command
/hotl:resumingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Resume a previously interrupted workflow run. HOTL persists execution state in a sidecar file (`.hotl/state/<run-id>.json`). On resume, it uses a verify-first strategy to determine whether the interrupted step already succeeded before continuing.
Resume a previously interrupted workflow run. HOTL persists execution state in a sidecar file (.hotl/state/<run-id>.json). On resume, it uses a verify-first strategy to determine whether the interrupted step already succeeded before continuing.
Announce: "Looking for interrupted HOTL runs..."
Execution state is persisted at .hotl/state/<run-id>.json. This is the authoritative source of truth — workflow checkboxes are a human-visible mirror that may drift after a crash.
{
"run_id": "<slug>-<YYYYMMDDTHHMMSSZ>",
"workflow_path": "/abs/path/to/execution-root/docs/plans/YYYY-MM-DD-<slug>-workflow.md",
"source_workflow_path": "/abs/path/to/original/workflow.md",
"workflow_slug": "<slug>",
"intent": "<from workflow frontmatter>",
"branch": "<branch name>",
"repo_root": "/abs/path/to/repo",
"execution_root": "/abs/path/to/repo-or-worktree",
"worktree_path": null,
"executor_mode": "loop | executing-plans | subagent",
"started_at": "<ISO 8601>",
"last_update": "<ISO 8601>",
"status": "running | paused | blocked | completed | abandoned",
"current_step": 3,
"total_steps": 8,
"steps": [
{"number": 1, "name": "<step name>", "status": "done | in_progress | pending | failed | blocked", "attempts": 1},
{"number": 2, "name": "<step name>", "status": "done", "attempts": 2}
],
"last_verify_output": "<captured stdout/stderr from last verify>"
}
<slug>-<YYYYMMDDTHHMMSSZ> (e.g., add-auth-20260320T212315Z). Derived from the semantic workflow slug and UTC execution start time, not from the date prefix in canonical workflow filenames.
running — execution is in progress (or was interrupted)paused — stopped at a gate: human or a verify: human-review checkpoint awaiting approvalblocked — stopped due to verify failure at max_iterationscompleted — all steps passed, verification doneabandoned — user explicitly abandoned the runrun_id → load that specific runworkflow_path or source_workflow_pathUse scripts/hotl-locate-run.sh when available:
scripts/hotl-locate-run.sh --workflow <workflow-file>
scripts/hotl-locate-run.sh --run-id <run-id>
The locator prints a JSON array and scans:
git worktree list --porcelain roots for the repo$(dirname <repo-root>)/.hotl-worktrees/$(basename <repo-root>)/*This is required for default isolated-worktree execution. In that mode, .hotl/state/<run-id>.json is created inside the execution worktree, while the workflow file usually remains in the authoring checkout. A new session started from the authoring checkout must find the existing execution worktree and resume there instead of trying to create a new worktree.
If hotl-locate-run.sh is unavailable, manually scan the same locations. Do not run normal Branch/Worktree Preflight until after you have ruled out an interrupted run; preflight will reject an existing execution worktree and can incorrectly look like a start-from-scratch path.
status: running is ambiguous after a crash — the owning session may still be alive.
last_update is older than 10 minutes and status: running → treat as resumable (owning session is likely dead)last_update is within 10 minutes and status: running → warn: "This run was updated recently. Another session may still own it. Resume anyway?" Wait for user confirmation.last_update immediately to claim ownership.1. Load sidecar state for the resolved run
2. Change into `execution_root` from the sidecar before invoking runtime/helpers
3. Check for existing report at report_path from the sidecar
- If report exists: surface its path to the user and continue appending to it
- If report is missing: create a new report from sidecar state
4. Repair workflow checkboxes from sidecar if drift is detected
(crash may have interrupted between sidecar write and checkbox update)
5. Find the current unfinished step (first step without status: `done`; `in_progress`, `pending`, `failed`, and `blocked` are unfinished)
6. Check verify type for that step:
a. Machine-runnable verify (type: shell or type: artifact):
→ Run verify first
→ If verify PASSES: mark step complete, advance to next step
→ If verify FAILS: re-run the step body from the beginning
b. Browser verify (type: browser):
→ If browser tooling available: run verify
→ If unavailable: downgrade to human-review with check text
c. Human-review verify or no verify:
→ Pause and ask: "Step N was in progress when the session ended.
Re-run the step, or skip after manual inspection?"
7. Continue normal execution from the resumed point, using the original `run_id` for every `hotl-rt step/gate/finalize` call
8. If the resumed run reaches completion, keep using that same `run_id` when invoking `hotl:finishing-a-development-branch`
9. Use the original executor mode (loop, executing-plans, or subagent)
On resume, compare sidecar step statuses with workflow checkboxes:
done but checkbox shows [ ] → update to [x]pending but checkbox shows [x] → update to [ ]run_id or workflow, then ask when multiple matches remainnpx claudepluginhub yimwoo/hotl-plugin --plugin hotlExecutes an existing HOTL workflow file autonomously, iterating steps until success criteria are met with automatic low-risk gate approval and high-risk gate pausing.
Resumes a saved Hypo-Workflow pipeline from `.pipeline/state.yaml`, continuing from the next uncompleted step without replaying finished work. Handles lock files, worker separation, and subagent authorization.
Resumes coding sessions by detecting blockers, reconciling STATE.md with filesystem, and suggesting next actions from checkpoints or plans.