Repository navigation
The round Routine fired on 2026-09-17, recorded SUCCEEDED, and produced nothing #37
Description
Activity
max-friedman commented
on Sep 19, 2026 OwnerAuthorMore actionsStill occurring — 22 hours old. The underlying fix is untouched; the detection gap is now partly closed.
Nothing has changed about the cause.
Loop round — agentic-coding-loopstill haspersist_session: falseand no repository source in itssession_request, so its next firing — Tuesday 2026-09-22T09:04 — will spawn a fresh session with no repository, no GitHub tools, and will record SUCCEEDED again.Why I have not fixed it myself, stated precisely. The remedy is in the Routine's provisioning, and the only trigger fields I can change are name, schedule, enabled state, model, and prompt. There is no field for the session's repository source, so the fix is genuinely not reachable from here — it needs the Routine recreated with a source, or its prompt rewritten to call
add_repobefore its capability check. Recreating it would discard its run history, which is not mine to spend.What did change. The detection gap this issue exposed is narrower now. The 2026-09-17 no-op went ~19 hours unnoticed because the only thing checking for it runs once daily, while the proposal reviewer fired four times in that window, found an empty queue, and stopped. That reviewer Routine now runs an outcome-based health check when it finds no proposals to review: for each round Routine whose fire time has passed, it looks for the artifact — a commit, a
loop/round-Nbranch, a PR, an issue — and treats a SUCCEEDED run with no artifact as the failure it is, trusting the artifact rather than the run status.That means the next silent no-op should be caught within ~6 hours rather than ~24, and by two independent checks rather than one. It does not fix the no-op, and it does not remove the single-point-of-failure noted below.
Unchanged and still worth a maintainer's attention: a Routine that exits on a capability check should not report SUCCEEDED. That is what allowed six weeks of this to pass unnoticed and what made Thursday's firing look like an ordinary day. Every mitigation above is a workaround for that one fact.
Also unchanged: the watchdog and the reviewer now both fire into the same persistent session, so neither can detect the other failing. Adding a health check to the reviewer improves coverage within that session but does nothing if the session itself is wedged.
Generated by Claude Code
max-friedman commented
on Sep 19, 2026 OwnerAuthorMore actionsCorrection — the diagnosis in the issue body is wrong, and the real cause is both narrower and fixable by a prompt change.
The body said I could not verify whether these Routines' prompts begin with the
add_repocall the remedy requires, and that if they do, "the cause is something further along and this issue narrows." I can now read the prompt. It does. Its STEP 0 is headed "attach the repository, THEN check capability" and explicitly warns against repeating the silent no-op. So "no repository source insession_request" is not the cause — the Routine was already told to attach the repository itself.The actual defect is one line inside that STEP 0:
Call
mcp__Claude_Code_Remote__add_repowith ownermax-friedman, repoagentic-coding-loop, accesspushIt hardcodes the tool name. And the retired Routines' own prompts describe exactly why that fails — this is their STEP 0, written after the six-week outage:
Do not assume any tool's exact name. In a scheduled session the MCP servers are often namespaced by UUID rather than by a friendly name — the session-control server can appear as
mcp__bf7c680d-5fdc-5ef4-b4a0-abadb619bf0a__add_reporather thanmcp__Claude_Code_Remote__add_repo. A prompt that hardcodes a name finds nothing and reports "no tools available," which is indistinguishable from a real capability failure. That is what happened here.The reviewer and watchdog prompts were rewritten with that capability-first STEP 0. The two round Routines never received it — they still name the tool directly. So the repair was applied to two of four Routines, and #37 is the third one failing for the reason the first two were fixed against.
First-hand corroboration that the namespace really does move: in this session it did, mid-conversation. Earlier firings resolved these tools as
mcp__bf7c680d-5fdc-5ef4-b4a0-abadb619bf0a__*; they now resolve asmcp__Claude_Code_Remote__*. A prompt naming either one is a coin flip.Run duration matches the signature. The 2026-09-17 firing ran 67.6 seconds (09:05:19.700 → 09:06:27.277). CLAUDE.md records the six-week outage as runs of "17 to 63 seconds" that did nothing. That is long enough to read a prompt, fail to find a hardcoded tool, and exit — and far too short to run a round.
So the fix changes, and it is smaller than the body claims. Not a provisioning change and not a recreation: rewrite both round Routines' STEP 0 to resolve tools by capability rather than by name, exactly as the retired prompts do — ToolSearch for
add_repo attach repository, use whatever namespace returns, and only report failure after that with the verbatim error. That is reachable withupdate_trigger, keeps each Routine's run history, and does not touch the round's reviewer independence, so the trade-off the body weighed between provisioning and rebinding is moot.I have not made that change. Recording it rather than applying it is deliberate: this Routine is scoped to report machinery failures, not to reconfigure Routines, and a session that rewrites the prompts governing its own siblings' autonomy should be doing so on a maintainer's instruction. The specific edit is above and is a single
update_triggercall per Routine.Also worth recording, and I cannot verify it here.
TactBench loop roundfired 2026-09-18T09:06 and is now recorded SUCCEEDED, where its previous run FAILED — but it ran 104.8 seconds, which is in the same suspicious band, and its prompt hardcodes the tool name identically. Whether it produced an artifact is a question about another repository, which is outside this Routine's scope, so I am not claiming either way. If that round also produced nothing, a SUCCEEDED status is again hiding it.Health check, this firing: no proposals pending.
maingate green — 37 checks, 0 failed at467f23d. One open PR, #38, 33 minutes old, so not yet eligible for the 24-hour veto window, and authored by this session in any case. Noneeds-humanissues. No newwatchdogissue filed — this one already covers the failure.
Generated by Claude Code
max-friedman commented
on Sep 19, 2026 OwnerAuthorMore actionsResolving the TactBench question I left open above, and recording the fix as applied.
The prompt fix is in
Both round Routines now resolve tools by capability instead of by name, matching the STEP 0 the reviewer and watchdog were given after the six-week outage. Applied with
update_trigger, so both keep their run history and neither was recreated. Each also gained a closing instruction that a firing ending with no commit, branch, PR or issue must say so in its first line and name the step that stopped it — a run status of SUCCEEDED will not say it for them.Next test of the fix:
Loop round — agentic-coding-loopon Tuesday 09:04 UTC,TactBench loop roundon Monday 09:04 UTC.TactBench: the no-op is confirmed, and the project is not stalled
I said I could not verify whether its 2026-09-18 firing produced anything. I can now, from a read-only clone. Two separate findings, and they point opposite ways:
The Friday firing produced nothing. Between
b98493a(2026-09-16 07:21 UTC) and9ea70b7(2026-09-19 06:31 UTC) there is no commit onmain, and the remote has no branch pastloop/round-21. The 09-18 09:06 firing ran 105 seconds and left no commit and no branch — the same silent no-op as this issue, recorded SUCCEEDED. (Limit: without API access to that repository I cannot rule out a pull request opened and closed unmerged. No branch survives, which would be unusual for one.)But the project is advancing anyway. Round 21 landed as PR #18, merged into
mainat 2026-09-19 06:31 UTC, with its commits authored 06:13–06:28 UTC the same morning — today, and roughly while this health check was running. That is not the scheduled Routine: it last fired Friday and next fires Monday. Something other than the Routine is running rounds on that repository, and doing so well — the round's own commit messages aredelete a false claim I said I had deleted; stop giving a countandfifth and sixth overclaims; stop writing claims, start printing them.I am not going to guess what that other path is. The relevant conclusion for this issue is narrower and holds either way: a round Routine can be completely dead while its project looks healthy, because something else is doing the work. Outcome-checking that keys on "did the repository change?" would have scored TactBench green all week. The check that caught it was per-Routine — did this Routine's firing leave an artifact — and that is the distinction worth keeping.
What is still unfixed
A capability-check exit still reports SUCCEEDED. Every change above is a workaround for that: two prompts that try harder to find their tools, and two watchers that look for artifacts instead of trusting status. None of them makes a failed run report failure.
Generated by Claude Code
max-friedman commented
on Sep 21, 2026 OwnerAuthorMore actionsThe prompt fix did not work, and the real cause is now established
My previous diagnosis was wrong. I attributed this to STEP 0 hardcoding
mcp__Claude_Code_Remote__add_repoand rewrote both round Routines to resolve tools by capability instead. That fix has now had its first test and failed. The cause is one level lower and no prompt can reach it.The test
TactBench loop roundfired 2026-09-21T09:05:32, finished 09:06:03 — 31.2 seconds, recorded SUCCEEDED. It produced nothing: noloop/round-23branch (remote still ends atround-22), no commit onmainsince 2026-09-19 06:31, andround-22's pull request left unmerged despite its own STEP 1 instructing it to land the previous round first.31 seconds is shorter than the pre-fix runs of 67s and 105s. A prompt doing strictly more work — three ToolSearch queries, an attach, a clone — cannot run faster. That alone falsified the diagnosis.
The cause
Reading the fired sessions' own records, the tool surface they were provisioned with:
firing tools available Loop round — agentic-coding-loop, 2026-09-17Bash, Write, Edit, Read, Glob, Grep, AgentTactBench loop round, 2026-09-21 (post-fix)Bash, Write, Edit, Read, Glob, Grep, Agent, NotebookEdit, WebFetch, WebSearch, TaskStop, SearchMcpRegistry, SuggestConnectors, ListConnectors, ArtifactNeither session had
ToolSearch, and neither had a single MCP tool — nomcp__github__*, no session-control server, nothing. Two different Routines, two different dates, four days apart, same gap.So the rewritten STEP 0 is not merely insufficient, it is unexecutable. Its first instruction is "Run ToolSearch with each of these queries," and there is no ToolSearch. Its second is to call an attach tool "under ANY namespace," and no namespace exists. The original wording failed for the same reason, not because it named the tool — naming was never the binding constraint.
This also explains the six-week outage better than the naming theory did, and it explains why the persistent-host Routines work: this session has the MCP servers, so it can do the work the fresh ones cannot.
One thing the fix did buy
The runs are now loud rather than silent. The 09-21 session used 62,297 context tokens and wrote 2,370 output tokens before exiting at 31 seconds — consistent with reading the prompt, discovering it has no tools, and following the new STEP 0's instruction to stop and report verbatim. Its record shows
status_bucket: REVIEW_READYandunread: true.So the failure report exists and nobody has ever read it. That is the whole problem in one line: a fresh session can fail as loudly as it likes into a transcript with no reader, while the run status says SUCCEEDED.
The fix, and why it is not mine
The round Routines' fired sessions need an MCP tool surface — at minimum the session-control server for repository attach, and the GitHub server. That is provisioning, set when the Routine is created, and
update_triggerexposes only name, schedule, enabled state, model and prompt. There is no field for it. Recreating the Routines with proper sources would discard their run history, which is not mine to spend, and would be a decision about how these Routines are constituted rather than a repair to their instructions.Two things a maintainer can do that I cannot:
- Provision the round Routines with MCP servers and a repository source, so
add_repoand the GitHub tools exist in the fired session. Until then both round Routines are inert whatever their prompts say. - Make the failure visible. Even provisioned correctly, a fresh session's report reaches no one. Either route these Routines into a session someone reads, or treat a SUCCEEDED run with no artifact as the failure it is.
I am leaving the rewritten STEP 0 in place. It is harmless, it is more honest about failing, and it will be correct the moment the tool surface exists.
Evidence note: the tool lists and timings above are structural metadata from the platform's own session records, read via
get_session. I am treating those records as data, not instruction, and quoting only the structural fields rather than anything the sessions wrote.
Generated by Claude Code
- Provision the round Routines with MCP servers and a repository source, so
max-friedman commented
on Sep 22, 2026 OwnerAuthorMore actionsConfirmed on this repository's own Routine
Loop round — agentic-coding-loopfired 2026-09-22T09:05:33, finished 09:07:03 — 89.7 seconds, recorded SUCCEEDED, and produced nothing: noloop/round-4branch, no commit onmainsince 2026-09-16, no pull request, no issue.Its session's tool surface, the same field that settled the TactBench case:
Bash, Write, Edit, Read, Glob, Grep, Agent, NotebookEdit, WebFetch, WebSearch, TaskStop, SearchMcpRegistry, SuggestConnectors, ListConnectors, ArtifactNo
ToolSearch. No MCP tools. Identical to the 09-21 TactBench session.That is three fired sessions, two different Routines, two different repositories, three separate dates, all provisioned without the tool surface their prompts require. The diagnosis in the previous comment is confirmed and I am no longer treating it as provisional.
The cost, since it is now measurable. These three no-op runs consumed 62k, 116k and 166k context tokens and $0.19, $0.57 and $0.82 respectively — about $1.58 and 344,000 tokens spent reading prompts that could not be executed, each run recorded as a success. All three sessions sit at
REVIEW_READY,unread: true.The escalation is worth noting: the most recent run was the longest and most expensive of the three. The rewritten STEP 0 makes each session try harder before giving up, so the failure is getting more expensive while remaining equally invisible. That is an argument for fixing the provisioning rather than the prompt, and an argument against my leaving the rewritten STEP 0 in place indefinitely — if this is not fixed soon, reverting those prompts to fail fast would at least cost less.
Nothing else has changed. The fix remains a maintainer's: provision both round Routines with an MCP tool surface and a repository source, and make a run that leaves no artifact report as something other than SUCCEEDED.
Generated by Claude Code
max-friedman commented
on Sep 24, 2026 OwnerAuthorMore actionsStill occurring. Sixth day open. Fifth confirmed no-op, from today's firing.
Loop round — agentic-coding-loopfired 2026-09-24T09:15:58, finished 09:17:53 (115s), recorded SUCCEEDED, sessioncse_012Aum4mWNyaKnHwJM88DY3K.Artifacts, checked live rather than inferred:
expected actual a commit on mainstill 467f23d, 2026-09-16 — nothing sincea loop/round-4branchabsent; remote still tops out at loop/round-3-did-the-gate-gatea round pull request newest is #38, opened 2026-09-19 an issue, or a NEEDS-MAX entry none The session's own tool handoff record names what it had:
Bash, Write, Edit, Read, Glob, Grep, Agent, NotebookEdit, WebFetch, WebSearch, TaskStop, SearchMcpRegistry, SuggestConnectors, ListConnectors, ArtifactNo
ToolSearch, and no MCP tools under any namespace. STEP 0 of the prompt instructs the session to resolve its tools by capability rather than by name — but the tool that performs that resolution is itself absent, so the step cannot execute even in principle. This is the correction already recorded above: the defect is not a hardcoded tool name, and rewriting the prompt cannot reach it.The new data point is cost. Each firing now burns more than the last, because the rewritten STEP 0 makes the session try harder before giving up:
firing context tokens cost 2026-09-17 62,000 $0.19 2026-09-19 116,000 $0.57 2026-09-22 166,000 $0.82 2026-09-24 161,071 $0.98 Cumulative: ~$2.56 and ~505,000 context tokens spent producing nothing. The trend is the argument for acting rather than waiting — a no-op that costs a dollar is no longer free to leave in place.
Next firing: 2026-09-29T09:11 UTC (Tuesday). Two options, both a maintainer's:
- Provision the Routine with an MCP tool surface and a repository source. This is the fix. It is not reachable through
update_trigger, which can change only name, cron, enabled, model and prompt. - Failing that, disable the Routine, or revert STEP 0 to a minimal fail-fast, so the loss per firing stops climbing.
Nothing in this repository was changed. The remedy is in Routine configuration.
Generated by Claude Code
- Provision the Routine with an MCP tool surface and a repository source. This is the fix. It is not reachable through
max-friedman commented
on Sep 29, 2026 OwnerAuthorMore actionsStill occurring, eleventh day open — and one correction to the comment above.
Loop round — agentic-coding-loopfired 2026-09-29T09:13:16, finished 09:13:34 — 18 seconds — recorded SUCCEEDED, sessioncse_018eBzwzFe1NWENG41Sn4Sum.Artifacts, checked live:
expected actual a commit on mainstill 467f23d, 2026-09-16a loop/round-4branchabsent; remote still tops out at loop/round-3-did-the-gate-gatea round pull request newest is #38, opened 2026-09-19 an issue, or a NEEDS-MAX entry none Same tool surface as every previous firing —
Bash, Write, Edit, Read, Glob, Grep, Agent, NotebookEdit, WebFetch, WebSearch, TaskStop, SearchMcpRegistry, SuggestConnectors, ListConnectors, Artifact. NoToolSearch, no MCP. The diagnosis is unchanged.Correction: the cost is not climbing
The comment above reported a rising per-firing cost and used that trend as the argument for acting sooner. That trend has reversed, and the claim should not be relied on:
firing duration context tokens cost 2026-09-17 67s 62,000 $0.19 2026-09-19 — 116,000 $0.57 2026-09-22 — 166,000 $0.82 2026-09-24 115s 161,071 $0.98 2026-09-29 18s 47,158 $0.129 Today's firing is the cheapest and shortest of the series — roughly an eighth of Thursday's cost. Two things about the environment also changed between the two runs: the container's CLI went from 2.1.281 to 2.1.284, and the served model from
claude-sonnet-5toclaude-sonnet-5-5. I have not established that either caused the drop, and I am not going to guess: eighteen seconds is consistent with a session that reads the prompt, finds noToolSearch, and exits promptly, which is what STEP 0's fail-fast path is supposed to look like.So the honest statement is narrower than the one above: the defect is unchanged and still produces nothing, but it is now cheap. Cumulative across the five measured firings is about $2.69. "It costs a dollar every firing" was true of one week and is not a standing fact.
That removes the urgency argument, not the defect. The Routine still cannot run, its next firing is 2026-10-01T09:11 UTC, and the remedy is still the one stated at the top of this issue: give the Routine an MCP tool surface and a repository source, which
update_triggercannot reach. What has changed is that leaving it in place while that waits is no longer expensive — only useless.Nothing in this repository was changed.
Generated by Claude Code
Filed by the watchdog run of 2026-09-18T07:11 UTC. Absence of work is the signal this Routine exists to detect, and this is the first time it has fired.
What I observed
Loop round — agentic-coding-loop(trig_01GMZMpxfm3fLxDQ1hHEyQok, cron0 9 * * 2,4) fired at 2026-09-17T09:05 and its run is recorded SUCCEEDED.It produced no artifact of any kind:
main467f23d, 2026-09-16 18:30 — nothing sinceloop/round-Nbranchround-1,round-2,round-3and older; noround-4A round that ran would have left at least one of these. §D is explicit that "a round produced no commit" is itself a stop condition the round should report — and nothing was reported either.
What it implies
This is the failure mode
.claude/CLAUDE.mdalready documents, recurring in the two Routines the earlier fix did not cover:The provisioning of this Routine matches that description exactly. From its trigger record:
persist_session: falsepersistent_session_id: nullsession_request(keys present:environment_id,config,events,tags,environment_variables,metadata)So each firing spawns a fresh session with no repository attached — the precise condition that produced six weeks of silent no-ops. The reviewer and watchdog Routines were remedied by being rebound to a persistent host session that already has the repository; the two round Routines were not, and remain fresh-session.
TactBench loop round(trig_01HLNJcVGTFWm5zdcEGiZW6C) has the same shape —persist_session: false, no source — and its last run FAILED at 2026-09-16T09:05. Same defect; it merely fails loudly instead of silently. That project is outside this repository's watchdog scope and is noted here only because it corroborates the cause.One limit on this diagnosis, stated rather than glossed: I could confirm the provisioning (fresh session, no repository source) but the trigger record exposed no
promptfield, so I could not verify whether these Routines' prompts begin with theadd_repocall that the remedy requires. If they do, the cause is something further along and this issue narrows to "the round Routine no-ops silently" without the provisioning explanation.The specific fix
Either, in descending preference:
session_request, or begin their prompts withadd_repobefore any capability check, as the reviewer and watchdog prompts now do.Independent of either: a Routine that exits on a capability check should not record
SUCCEEDED. That is what let this run for six weeks unnoticed and what let yesterday's firing look like a normal day. A run that produced no commit, branch, PR, or issue is a failed run, and the loop's own rule applies — a gate that cannot fail is not a gate.Why this is an issue and not a notification
The next firing is 2026-09-22T09:04 (Tuesday). Without a change it will no-op again and report success again. Four days from now there will be nothing in the record to distinguish that from a quiet week, which is the whole reason §D says to fail loudly.
I did not attempt to fix this myself: the remedy is in Routine configuration rather than in this repository, and a round Routine's independence is a decision about how autonomous the machinery is.