Repository navigation
fix: feature-ideation reusable honours AGENTS_PAUSED, so a fleet pause stops it - #1311
Conversation
…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>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Warning Review limit reachedYou'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. View limit details
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. Comment |
There was a problem hiding this comment.
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.
CodeAnt PR Risk: Low Risk
Assessed commit: |
There was a problem hiding this comment.
💡 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".
|
dev-lead is withholding action on this item. It is labeled To re-enable automated pickup: remove the |
… 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>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
|
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. |



Problem
AGENTS_PAUSED=trueis the switch that pauses the agent fleet.feature-ideation-reusable.ymlcalls the model (the Claude action, in jobanalyze) 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
if: vars.AGENTS_PAUSED != 'true'.analyzeis the model call.gather-signalscalls no model, but its only product is the artifactanalyzereads; 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.fleet-pausedjob runs on the complementary condition and prints one notice namingAGENTS_PAUSE_SOURCEandAGENTS_PAUSE_UNTIL. It has noneeds:, no secret, no token, no action andpermissions: {}.env:and have line breaks flattened to spaces, so a multi-line value cannot start a second workflow command. (The notice jobs inpetry-projects/.github-privatedo 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.)petry-projects/.github-private: only the wordtruepauses, in any letter case, because GitHub compares strings without regard to case. Unset,false,1,yesand a padded value run the workflow as before.varsis read in the calling repository's context, so an organisation variable pauses every consumer.Scope item 3 of the issue (other model calls in this repository). Of the 14
workflow_callreusables, this is the only one that calls a model. One non-reusable workflow also does and is not gated:compliance-audit-and-improvement.yml, jobanalyze. 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:
feature-ideation/v1-next4bb3e7aa(v1.20.0).github-privatefeature-ideation/v1-ring02e3d523b(v1.16.1)feature-ideation/v1-ring1cd0b1675(v1.11.0)TalkTerm,bmad-bgreat-suitefeature-ideation/v1-stablecd0b1675(v1.11.0)Most consumers are on
v1-stable, which is nine releases behindnext, so the pause does not reach them until the last promotion.Risk
prepjob always succeeds, so a paused run endssuccesswith or without the notice job, andring1 -> stableneeds only one sample. Filed as Canary promotion gate counts a fleet-paused feature-ideation run as a healthy sample #1310. It becomes reachable when this gate reaches a channel; it should be fixed before a pause is relied on.vars.AGENTS_PAUSEDfrom the caller inside thisworkflow_call(the jobs-ifcontext allowsvars, anddev-lead-reusable.ymlin.github-privaterelies on the same thing across repositories), that the organisation variable's visibility covers the consumers, and that the paused run shows the one notice.git merge-treeagainst its head is clean and the new suite passes on the merged tree.Test plan
test/workflows/feature-ideation/fleet-pause.bats(new, 12 tests), picked up by the existingfeature-ideation-tests.ymlpath filters. It parses the committed workflow and evaluates each job'sif: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.analyze, condition inverted, notice job dropped, a variable interpolated intorun:, 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).actionlintwith CI's flags: clean. Other suites unchanged before and after.jsonschemaoryq. 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_PAUSEDis unset today, so the first runs after each promotion should look exactly as before:fleet-pausedskipped, the two working jobs running.gather-signalsandanalyzeskipped 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