Skip to content

fix: feature-ideation reusable honours AGENTS_PAUSED, so a fleet pause stops it - #1311

Merged
don-petry merged 2 commits into
mainfrom
claude/issue-1295-feature-ideation-pause
Oct 11, 2026
Merged

don-petry merged 2 commits into
mainfrom
claude/issue-1295-feature-ideation-pause

Conversation

@don-petry

@don-petry don-petry commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Problem

AGENTS_PAUSED=true is the switch that pauses the agent fleet. feature-ideation-reusable.yml calls the model (the Claude action, in job analyze) and never reads the variable, so a fleet pause does not stop it. Its callers are frozen stubs, so the gate has to live in the reusable.

Design

  • Both working jobs carry if: vars.AGENTS_PAUSED != 'true'. analyze is the model call. gather-signals calls no model, but its only product is the artifact analyze reads; left running during a pause it would start a runner, upload an orphan artifact, and could turn a paused run red on an unrelated API error.
  • A new fleet-paused job runs on the complementary condition and prints one notice naming AGENTS_PAUSE_SOURCE and AGENTS_PAUSE_UNTIL. It has no needs:, no secret, no token, no action and permissions: {}.
  • The two values reach the script through env: and have line breaks flattened to spaces, so a multi-line value cannot start a second workflow command. (The notice jobs in petry-projects/.github-private do not flatten; filed there as fleet-paused notice jobs print the pause variables with their line breaks, so a multi-line value starts a second workflow command .github-private#2282.)
  • Matching rule, the same as petry-projects/.github-private: only the word true pauses, in any letter case, because GitHub compares strings without regard to case. Unset, false, 1, yes and a padded value run the workflow as before.
  • vars is read in the calling repository's context, so an organisation variable pauses every consumer.
  • No caller stub, channel tag or CI workflow is touched.

Scope item 3 of the issue (other model calls in this repository). Of the 14 workflow_call reusables, this is the only one that calls a model. One non-reusable workflow also does and is not gated: compliance-audit-and-improvement.yml, job analyze. Filed as #1309; not changed here.

Which channel tags have to move (acceptance criterion 3). Consumers get the gate only when the tag they pin reaches a commit that contains this change:

Tag Now Pinned by
feature-ideation/v1-next 4bb3e7aa (v1.20.0) .github-private
feature-ideation/v1-ring0 2e3d523b (v1.16.1) this repository's own stub
feature-ideation/v1-ring1 cd0b1675 (v1.11.0) TalkTerm, bmad-bgreat-suite
feature-ideation/v1-stable cd0b1675 (v1.11.0) every other consumer, and the template stub

Most consumers are on v1-stable, which is nine releases behind next, so the pause does not reach them until the last promotion.

Risk

Test plan

  • test/workflows/feature-ideation/fleet-pause.bats (new, 12 tests), picked up by the existing feature-ideation-tests.yml path filters. It parses the committed workflow and evaluates each job's if: with a small model of GitHub's expression rules for eight values of the variable; the model refuses any expression form it does not know, so a rewritten gate fails until the test is updated. It also executes the notice script.
  • Mutation-checked, 15 mutations, each turns named tests red: gate removed from analyze, condition inverted, notice job dropped, a variable interpolated into run:, an || bypass after the gate, a misspelt variable name, a second ungated model job, the notice job given a credential, and others. I re-ran the first independently after rebasing (6 of 12 red, then 12 of 12 green restored).
  • actionlint with CI's flags: clean. Other suites unchanged before and after.
  • Not runnable locally: 14 existing tests in this directory need jsonschema or yq. CI is the authority.

Rollback

Revert the squash commit. Channels that already carry the change keep it until they are re-cut or rolled back; the gate is inert while the variable is unset.

Monitoring

  • AGENTS_PAUSED is unset today, so the first runs after each promotion should look exactly as before: fleet-paused skipped, the two working jobs running.
  • The first run during a real pause should show gather-signals and analyze skipped and one "Agent fleet paused" notice. That run is the live proof the tests cannot give; record it on the issue.

Closes #1295

🤖 Generated with Claude Code

View guided diff Turn on auto-fix

…e stops it

AGENTS_PAUSED=true pauses the agent fleet, but feature-ideation-reusable.yml
called the model without reading the variable. Its callers are frozen stubs,
so the gate goes in the reusable.

- gather-signals and analyze carry `vars.AGENTS_PAUSED != 'true'`. analyze
  holds the model call; gather-signals only produces the artifact analyze
  reads, so it is skipped with it.
- A new `fleet-paused` job runs on the complementary condition and prints one
  notice naming AGENTS_PAUSE_SOURCE and AGENTS_PAUSE_UNTIL ("not set" when
  absent). It stands alone, has `permissions: {}`, reads the two variables
  through `env:` and flattens line breaks, so a value cannot start a second
  workflow command.
- Same rule as dev-lead-reusable.yml in petry-projects/.github-private: only
  the word `true` pauses, in any letter case. Unset, `false` or any other
  value runs the workflow as before. The caller stub template is unchanged.

test/workflows/feature-ideation/fleet-pause.bats evaluates each job's `if:`
for unset/false/true/TRUE/True/1/yes/padded and executes the notice script.
It is a static test: that GitHub resolves `vars` from the calling repository
inside workflow_call, and that a paused run ends green, needs a live run.

Consumers get the gate only when the channel tag they pin moves:
feature-ideation/v1-next, then v1-ring0, v1-ring1 and v1-stable.

Refs #1295

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@don-petry
don-petry requested a review from a team as a code owner October 11, 2026 15:21
@don-petry don-petry added the dev-lead:hands-off Opt an item out of the dev-lead persona automation entirely label Oct 11, 2026
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 11, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-11T15:24:53.085933Z 7c8c2b0 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@coderabbitai

coderabbitai Bot commented Oct 11, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 40 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 8b759a02-f743-469d-8398-01c05644139b

📥 Commits

Reviewing files that changed from the base of the PR and between fa702e8 and 4bdbd9e.


📒 Files selected for processing (2)
  • .github/workflows/feature-ideation-reusable.yml
  • test/workflows/feature-ideation/fleet-pause.bats

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a new BATS test suite, fleet-pause.bats, to statically validate the fleet pause gate of the reusable feature-ideation workflow. The test suite uses an embedded Python script to parse the workflow YAML and evaluate job execution conditions under various AGENTS_PAUSED variable states. The review feedback suggests optimizing the outcome and load_table helper functions in the BATS script by pre-parsing the table output into a native Bash associative array, thereby avoiding repeated subshell overhead from calling awk inside loops.

Comment thread test/workflows/feature-ideation/fleet-pause.bats
@codeant-ai

codeant-ai Bot commented Oct 11, 2026

Copy link
Copy Markdown

CodeAnt PR Risk: Low Risk

  • The PR appears safe to merge; the pause gates skip the signal-gathering and model jobs while a standalone notice reports the pause.
  • The Bats tests check the gate conditions and notice output, though they do not verify caller variables in a live reusable-workflow run.

Assessed commit: 7c8c2b055d35

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7c8c2b055d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/feature-ideation-reusable.yml
Comment thread test/workflows/feature-ideation/fleet-pause.bats Outdated
@don-petry

Copy link
Copy Markdown
Contributor Author

dev-lead is withholding action on this item.

It is labeled dev-lead:hands-off (deliberately kept off-limits to dev-lead (e.g. changes to the dev-lead automation itself)), so dev-lead will not pick it up while that label is present. This notice is posted once so the withhold is visible rather than looking like a stalled run.

To re-enable automated pickup: remove the dev-lead:hands-off label.

… parse the workflow

A skip without PyYAML reported twelve tests as passed-over while nothing had
checked the gate. The suite now fails with the install command in every
environment. From review.

Refs #1295

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@sonarqubecloud

Copy link
Copy Markdown

@donpetry-bot

Copy link
Copy Markdown
Contributor

Advisory bots were rate-limited; auto-approval is withheld until they recover. pr-review-sweep will re-review this PR after 2026-10-11T17:19:14Z.

@don-petry
don-petry merged commit 9e2daad into main Oct 11, 2026
35 of 53 checks passed
@don-petry
don-petry deleted the claude/issue-1295-feature-ideation-pause branch October 11, 2026 17:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dev-lead:hands-off Opt an item out of the dev-lead persona automation entirely

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feature-ideation reusable calls the model but ignores AGENTS_PAUSED, so a fleet pause does not stop it

2 participants