docs(loops): retire cloud routines, loops are local-only (#1086)

Founder decision 2026-07-20: the three claude.ai cloud triggers ran for
19 days as silent no-ops (GH_TOKEN never provisioned, issue #993) and
were disabled instead of provisioned. loops.md and loop-ignite now
document local-only operation so future sessions do not re-enable the
dead triggers or re-ask for provisioning.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Jakob Wennberg
2026-07-20 20:51:16 +02:00
committed by GitHub
co-authored by Claude Fable 5
parent d860567976
commit 3d97b95197
2 changed files with 38 additions and 38 deletions
+20 -22
View File
@@ -2,8 +2,8 @@
Proactive loops that scan the codebase and our external systems (GitHub, Vercel), then
**propose** fixes and file well-formed tickets. This file is the shared contract every loop obeys.
Skills under `.claude/skills/loop-*` implement the loops; cloud routines and local `/loop` invocations
run them on a schedule.
Skills under `.claude/skills/loop-*` implement the loops; local `/loop` invocations and session-local
crons run them on a schedule. **Cloud routines are retired (2026-07-20): all loops are LOCAL.**
> These are **proactive loops**: triggered by a schedule, no human in real time, each item exits when
> its goal is met. Quality comes from the *system around the loop* (verification skills, clean
@@ -58,14 +58,17 @@ comment what was tried. Never retry the same failing action in a cycle.
| # | Loop | Skill | Where | Cadence (default) | Per-run cap |
|---|---|---|---|---|---|
| 1 | PR + CI triage | `loop-pr-ci-triage` | **Cloud** `trig_01J2nG7eB9gsdAb9YSGBVwa8` | `0 7,11,15 * * *` UTC | ≤5 PRs |
| 2 | Vercel errors → tickets | `loop-vercel-errors` | **Local** (Vercel MCP); cloud needs `VERCEL_TOKEN`. Trigger `trig_014CmE3gTJ7ErnvL2trPYymu` **disabled** | on-demand / `/loop` | ≤8 issues, ≤2 PRs |
| 3 | Issue triage + easy-fix | `loop-issue-triage` | **Cloud** `trig_017hB94ieGVwreJqHpGRDVoM` | `0 7,15 * * *` UTC | triage all; ≤2 PRs |
| 1 | PR + CI triage | `loop-pr-ci-triage` | **Local** (session cron / `/loop`) | ~3x/day while a session is open | ≤5 PRs |
| 2 | Vercel errors → tickets | `loop-vercel-errors` | **Local** (Vercel MCP) | daily / on-demand | ≤8 issues, ≤2 PRs |
| 3 | Issue triage + easy-fix | `loop-issue-triage` | **Local** (session cron / `/loop`) | ~2x/day while a session is open | triage all; ≤2 PRs |
| 4 | UI/UX + design scan | `loop-design-scan` | **Local** (`/loop`) | on-demand | ≤1 area, ≤6 findings |
Loops 1 & 3 are cloud routines (only need `gh`). Loop 2 (Vercel errors) is **local**: the Vercel MCP is
only available locally, and there's no error-aggregation service (Sentry is not used). Loop 4 is
**local**: it needs `npm run dev` + Chrome to render/screenshot the UI.
**All loops are local.** Cloud routines were retired 2026-07-20: the three claude.ai triggers
(`trig_01J2nG7eB9gsdAb9YSGBVwa8`, `trig_014CmE3gTJ7ErnvL2trPYymu`, `trig_017hB94ieGVwreJqHpGRDVoM`)
ran for 19 days as silent no-ops (no `GH_TOKEN` in the cloud env, issue #993) and the founder chose
to disable them rather than provision. Do not re-enable or re-create them. Loop 2 additionally needs
the Vercel MCP (local-only; Sentry is not used). Loop 4 needs `npm run dev` + Chrome.
The `loop-ignite` skill audits and (re)schedules the local cadence each session.
---
@@ -77,25 +80,20 @@ grep → build if config/types changed. Plus: never violate an
---
## Cloud-environment requirements (verify these: they are the usual failure points)
## Why not cloud (historical, kept so nobody re-litigates it)
Cloud routines run in a **fresh session** in the anthropic_cloud env (`env_01R1K99XTZCEptnQ7k955qfN`),
cloning `main`. For them to work:
1. **`gh` must be authenticated in the cloud env.** Each routine's preflight stops and reports
*"environment not provisioned"* if not. Verify via the completion notification of the first fire.
2. **Cloud routines cannot reach interactively-authenticated MCPs** (Vercel/Supabase plugins are not in
the routine tool allowlist). Loops rely on `gh` (via Bash) + HTTP APIs.
3. **The Vercel-errors loop runs locally** (Vercel MCP). Sentry is **not** used in this codebase: the
`SENTRY_*` names in `.env.local`/CLAUDE.md are leftovers. To run this loop in the cloud instead, set a
`VERCEL_TOKEN` secret on the env and accept that Vercel runtime-log retention is short (recent window
only). `GH_TOKEN` is the one secret loops 1 & 3 actually require (private-repo access;
OAuth-only integration does not work for private repos, anthropics/claude-code#64130).
Cloud routines were tried 2026-07-01 and retired 2026-07-20. The blockers, should anyone revisit:
the anthropic_cloud env needs a `GH_TOKEN` fine-grained PAT for private-repo access (OAuth-only
integration does not work, anthropics/claude-code#64130), cannot reach interactively-authenticated
MCPs (Vercel/Supabase plugins), and Sentry is **not** used in this codebase (the `SENTRY_*` names in
`.env.local` are leftovers). Reviving cloud means: set `GH_TOKEN` in the routine editor's cloud env,
re-enable the triggers, and verify the first fire leaves a real GitHub trace. Until someone does all
of that deliberately, treat cloud as retired: see issue #993 for the full history.
---
## Operating the loops
- **List / pause / retune:** `/schedule` (or the trigger MCP tools; `update_trigger` for a new cron).
- **Audit / (re)ignite each session:** `/loop-ignite` (audits evidence, schedules session-local crons).
- **Run on-demand:** `/loop-pr-ci-triage`, `/loop-issue-triage`, `/loop-vercel-errors`,
`/loop-design-scan <area>`. Wrap in `/loop <interval>` to repeat locally; `/goal` for a hard exit.
- **Cost:** route mechanical steps to cheaper models; reserve judgment for the strong model. `/usage`.
+18 -16
View File
@@ -1,33 +1,35 @@
---
name: loop-ignite
description: Verify the agentic loops are actually running and ignite any that are not. Use at the start of any session, or whenever the user manually asks to "check the pr comments" / check logs / triage issues, which signals a loop is not firing. The loops exist (dev_docs/loops.md); the historical failure mode is that nobody initiates them.
description: Verify the agentic loops are actually running and ignite any that are not. Use at the start of any session, or whenever the user manually asks to "check the pr comments" / check logs / triage issues, which signals a loop is not firing. The loops are LOCAL-only since 2026-07-20 (cloud routines retired); the historical failure mode is that nobody initiates them.
---
# loop-ignite
**Goal:** the user never has to type "check the pr comments" again. That prompt was typed 323 times
between 2026-04 and 2026-07; the loops that replace it were built 2026-07-01 and never initiated.
This skill closes that gap.
between 2026-04 and 2026-07; the loops that replace it were built 2026-07-01.
This skill closes the initiation gap.
**Cloud routines are RETIRED (founder decision 2026-07-20).** The three claude.ai triggers
(trig_01J2nG7eB9gsdAb9YSGBVwa8, trig_014CmE3gTJ7ErnvL2trPYymu, trig_017hB94ieGVwreJqHpGRDVoM)
fired daily for 19 days as silent no-ops (no GH_TOKEN in the cloud env, issue #993) and were
deliberately disabled instead of provisioned. Do NOT re-enable or re-create them; ignore them in
audits. All loops run locally now.
## When invoked
1. **Audit what is live.**
- Cloud routines: list scheduled triggers (`/schedule` or the list-triggers MCP tool). Expected per
`dev_docs/loops.md`: PR+CI triage `0 7,11,15 * * *` UTC, Vercel errors `0 6 * * *` UTC,
issue triage `0 7,15 * * *` UTC.
- Local fallback: `CronList` for local scheduled jobs.
- Local schedule: `CronList` for session-local jobs invoking `/loop-*` skills.
- Evidence of firing: recent `loop/*` branches, PR comments by the loop, `loop:needs-human` labels
(`gh pr list`, `gh issue list --label loop:needs-human`).
2. **Report a one-screen status table**: loop, expected cadence, last observed run, verdict (LIVE / DEAD / NEVER RAN).
3. **Ignite what is dead.** For each non-live loop, in order of preference (idempotent: re-list
triggers first and enable/repair an existing one before creating; never create a duplicate):
- Re-create/enable its cloud routine trigger.
- If cloud is unavailable, schedule a local fallback (`CronCreate` invoking the matching
`/loop-*` skill) and say clearly that it only runs while this machine is awake.
- If neither is possible, run the loop skill once now AND file the blocker as a GitHub issue so
the gap is visible instead of silent.
4. **Switch-on check (mandatory):** after igniting, verify the trigger exists by listing it again.
End with either "ALL LOOPS LIVE" or "NOT SWITCHED ON YET: <loop> - <what remains, who flips it>".
3. **Ignite what is dead.** For each non-live loop:
- Run the loop skill once NOW (`/loop-pr-ci-triage`, `/loop-issue-triage`, `/loop-vercel-errors`)
so the backlog is cleared this session.
- Then schedule a session-local cadence (`CronCreate` invoking the matching `/loop-*` skill) and
say clearly that it only runs while this session is alive (7-day auto-expiry).
- If a loop cannot run at all, file the blocker as a GitHub issue so the gap is visible instead of silent.
4. **Switch-on check (mandatory):** after igniting, verify via `CronList` that the jobs exist.
End with either "ALL LOOPS LIVE (session-local)" or "NOT SWITCHED ON YET: <loop> - <what remains, who flips it>".
## If the user manually types a loop-shaped request