Skip to content

AGENTS_PAUSED stops only dev-lead: pr-review, the persona runner and the other model-calling workflows keep running through a fleet pause #2249

Closed

Description

@don-petry

Problem

AGENTS_PAUSED=true is documented and used as the switch that pauses the agent fleet, and the budget breaker ("Budget breaker writer", #2153) is being built to set it automatically when the model provider refuses work. But only one agent honours it.

A search of the workflows on main for the variable as a run condition finds it in dev-lead-reusable.yml only (three jobs). pr-review.yml mentions it in a message, and the engine-token liveness monitor reads it to stay quiet, but pr-review, the persona runner (qa-lead, architect and the other personas) and the remaining model-calling workflows do not stop when it is set.

So a pause, whether a human sets it or the breaker does, stops dev-lead and nothing else. During a quota outage the other agents keep starting runs that fail on the same refusal, which is the waste the pause exists to prevent, and a maintainer who sets the switch believes the fleet is stopped when it is not.

Scope

  1. List every workflow in this repository and in the reusable workflows it publishes that starts a model call (dev-lead, pr-review, persona runner, initiative planner, feature ideation, idea triage, any other). For each, state whether it honours AGENTS_PAUSED today.
  2. Make each one skip its model-calling jobs when vars.AGENTS_PAUSED == 'true', in the same way dev-lead does (read in the calling repository's context, so an organisation-level variable pauses every repository), with one log line saying the run was skipped because the fleet is paused and, when present, the pause source and until time.
  3. Workflows that must keep running while paused (the breaker itself, the poller, monitors, anything that does not call a model) are listed explicitly as exempt, with the reason.
  4. Document the full list in AGENTS.md under the pause section.

Acceptance criteria

  1. A static test enumerates the model-calling workflows and fails if one neither gates on AGENTS_PAUSED nor appears in the documented exempt list, so a new agent cannot be added without a decision.
  2. For each newly gated workflow, a test that the model-calling job is skipped when the variable is true and runs when it is unset or false.
  3. No change to behaviour when the variable is unset.
  4. Rollout notes: which channel tags have to move for each reusable before the gate is live in consumer repositories.

Out of scope

The breaker's own logic, and changing what the variable is called or where it lives.

Related: #1565, #2153, #2221.

Activity

  1. github-actions commented on Oct 11, 2026

    @github-actions
    Contributor

    Thanks for the thorough write-up. The gap between the documented pause switch and what actually stops is clear, and the scope and acceptance criteria are well laid out. One question to confirm the scope: should the static test's exempt list cover only workflows that make no model call (the breaker, poller and monitors), or also model-calling workflows you want to keep running during a pause, such as an emergency or manual-dispatch path?

  2. don-petry commented on Oct 11, 2026

    @don-petry
    CollaboratorAuthor

    Precision on the evidence, after checking how the variable reaches the scripts on main:

    • As a job condition (vars.AGENTS_PAUSED != 'true') it appears only in dev-lead-reusable.yml, on three jobs.
    • scripts/validate-engines.sh does have a pause branch: when the environment variable AGENTS_PAUSED is true it marks every engine unavailable and skips the probes. But the only workflow that passes vars.AGENTS_PAUSED into the environment is engine-token-liveness.yml. pr-review.yml mentions the variable once, in a message; it never sets it for its steps. So in pr-review and the persona workflows that branch is unreachable.
    • "Gemini trickle under a budget pause" (Gemini trickle under a budget pause: let a bounded slice of cheap work run on Gemini while the Claude breaker has paused the fleet (default off) #2147) describes the pause as honoured in pr-review.yml; on the current code that is not so, and it should be read with this issue.

    The cheapest correct fix for the workflows that already run validate-engines.sh may be to pass the variable through, rather than add a job condition; scope item 2 leaves that choice open.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugBug reports

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions