Schedule a prompt to fire on a fixed cadence (recurring loop). Use when the user asks to "run X every N minutes/hours/days", "loop X", "babysit Y", "be proactive about Y every N", or invokes `/loop` directly. Parses `[interval] <prompt>`, picks a clean cron expression, registers the job via the `cron` tool, and executes the prompt once immediately so the user sees activity without waiting for the first cron tick.
75
92%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
High
Do not use without reviewing
This skill turns a free-form [interval] <prompt> line into a cron tool call and runs the prompt once right away.
The user's text is whatever appears after /loop . Apply the three rules below in order and stop at the first match.
Leading interval token. If the first whitespace-separated token matches the regex ^\d+[smhd]$ (case-insensitive), that token is the interval. Examples: 5m, 2h, 1d, 30s. The rest of the input is the prompt.
Trailing every <N><unit> clause. Otherwise, look for a clause at the end of the input of the form every <N><unit> or every <N> <unit-word> where <unit> is s|m|h|d and <unit-word> is second(s)|minute(s)|hour(s)|day(s). Strip the clause; what's left is the prompt; the captured <N><unit> is the interval. Examples: every 20m, every 5 minutes, every 2 hours.
Default. No interval found → interval is 10m, the whole input is the prompt.
If the input is empty, or is only an interval with no prompt body, reply with a one-line usage hint (/loop [interval] <prompt>) and stop. Do not schedule anything.
When the user types /loop <interval> (interval only) and the project has explicitly opted into autonomous-loop mode (a session-level flag the runtime sets), the prompt body is the sentinel <<autonomous-loop>>. The scheduler expands this sentinel at fire time into a self-directed tick instruction. If autonomous mode is not enabled, treat empty as the usage-hint case above.
| Pattern | Cron expression |
|---|---|
Ns | treat as ceil(N/60)m; minimum is 1m |
Nm where N is 1–59 and divides cleanly (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30) | */N * * * * |
Nm where N ≥ 60 and N/60 divides 24 (1, 2, 3, 4, 6, 8, 12) | 0 */(N/60) * * * |
Nh where N is 1–23 and divides 24 | 0 */N * * * |
Nd where N divides 31 sensibly (1, 2) | 0 0 */N * * |
Rounding rule. If N does not divide its wrap-around cleanly (e.g. 7m, 90m, 5h, 7d), pick the nearest interval that does and tell the user explicitly what you rounded to and why. Acceptable nearby values:
Examples of rounding messages:
7m → "rounding 7m to 6m so the fires stay evenly spaced; */7 skews at the hour wrap"90m → "rounding 90m to 2h; cron's hour field can't express 1.5h"With the parsed cron expression and prompt, invoke the cron tool's schedule verb. Use whichever call form the tool's own prompt describes — pass cron and prompt as required, leave durable: false (the default; only set true when the user explicitly asked the job to persist across sessions), leave it recurring (the default; one-shot is wrong for /loop — one-shots come from natural-language scheduling).
The cron tool returns a job id. Mention it briefly so the user can cancel with /loops cancel <id>.
After the cron call succeeds, do not wait for the first scheduled tick. Run the prompt body once right now:
/ (e.g. /loop 5m /standup → prompt is /standup), invoke it as a slash command — load the corresponding skill or command via the skill tool.This is the "don't make the user wait" rule. The cron job carries the recurring behavior; the immediate run is for responsiveness.
| User input | Interval | Cron | Prompt |
|---|---|---|---|
/loop 5m /babysit-prs | 5m (leading) | */5 * * * * | /babysit-prs |
/loop check the deploy every 20m | 20m (trailing) | */20 * * * * | check the deploy |
/loop /standup every 2 hours | 2h | 0 */2 * * * | /standup |
/loop tidy inbox | 10m (default) | */10 * * * * | tidy inbox |
/loop 30s ping | 30s → 1m | */1 * * * * | ping |
/loop 7m ping | 7m → 6m (rounded, explain) | */6 * * * * | ping |
/loop | (usage hint) | — | — |
/loop 5m | autonomous-only | (if enabled) | <<autonomous-loop>> |
10m and say so.--one-shot. This skill is for recurring loops./loops for that.<prompt> every <interval>; job id <id>") is enough.ff87d47
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.