Expose timeout-minutes as an input on the two agent workflows - #881
Conversation
Closes #879. A caller cannot set timeout-minutes on a job that uses `uses:`, so the agent job's limit was unreachable from the consumer repo and both workflows hard-coded 60. That is a reasonable default and a problem only for a consumer with a stricter policy, which had no way to express it. Adds an optional timeout-minutes input to claude.yml and claude-code-review.yml, defaulting to 60 so no existing caller changes behavior. This extends an established pattern rather than introducing one: r-cmd-check.yml, altdoc-multiversion-docs.yml and check-code-similarity.yml already take the same input. Scoped to the agent job in each workflow (`claude` and `claude-review`, the two that carried the 60). The short helper jobs keep their own fixed limits, since a consumer capping the long agent run has no reason to shorten a five-minute mention filter. Motivating case: Morrison-Lab/qbt#28 requires every job at or under 50 minutes. qbt#58 brought everything that repo controls under the cap, and these two were the only jobs left above it with no caller-side way to reach them. Docs updated alongside the code so the input lists do not drift: the README rows for both workflows, and the Inputs tables in website/reference/claude.qmd and claude-code-review.qmd. Changelog fragment added per changelog.d/README.md. Verified: both workflows parse; the input resolves onto the intended job in each and the helper jobs are untouched; the repo's own check-non-standard-chars, check-new-line-breaks and list-item-splice checks pass, the latter two run with the fragment staged so it was actually examined rather than skipped as untracked. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lx1hhHu58mXq9DfJsAxkHn
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
The review round found the doc sync half done. It was right, and the gap is
larger than the two sites I updated.
CLAUDE.md names three sites beyond the workflow file: README.md's Key-inputs
cell, website/workflows.qmd's separate table, and website/reference/<name>.qmd's
Inputs table plus a commented usage line in its Example block. I did the first
and part of the third, and missed the rest. The review also found two sites the
rule does not enumerate but the r-cmd-check precedent demonstrates.
Now covered, for both claude.yml and claude-code-review.yml:
website/workflows.qmd Key-inputs cell, the table that drifts
independently of README's
website/reference/*.qmd commented `timeout-minutes: 50` in the
Example block, matching r-cmd-check.qmd
examples/*.yml same line in the commented `with:` block,
matching examples/r-cmd-check.yml
README.md "Job timeouts" the prose enumerating which workflows expose
their timeout as an input, which this change
makes stale by adding two more
That last one is the one worth naming: it is a sentence listing three workflow
names, and this PR makes it five. Nothing points from the input to that prose,
so it goes stale silently.
Found the full set by grepping for `extra-secret-names`, the previous last
input, rather than working from the review's list. That returns every file
enumerating these workflows' inputs, so the sweep is complete by construction
instead of by inspection.
Verified: all four YAML files still parse; the repo's check-non-standard-chars,
check-new-line-breaks and list-item-splice checks pass with the changes staged.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Lx1hhHu58mXq9DfJsAxkHn
|
All seven findings addressed in The finding I'd argue is the most valuable is #5, the README "Job timeouts" prose — it isn't in CLAUDE.md's three-site rule at all. It's a sentence naming three workflows that expose their timeout as an input, and this PR makes it five. Nothing links the input to that paragraph, so it would have gone stale silently and the next person would have read an enumeration that quietly excluded the two workflows they were looking at.
On method, since this is the second time I've claimed a sweep was complete when it wasn't. I didn't work from the list above — I grepped for The PR description claimed "docs updated alongside the code so the input lists don't drift." That was the claim, and it was wrong in four places. Corrected, and the description now reflects what actually shipped. Verified: all four YAML files parse; Generated by Claude Code |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
The review flagged README.md:762 at 96 characters, past the 60-80 semantic line-break guideline, and marked it non-blocking. Taking it anyway, because it is a regression I introduced rather than a pre-existing nit: that line was 76 characters on main, and the previous commit merged "additionally expose" onto it while rewording the enumeration. Leaving it would ship a worse line than the one this branch started from, in a commit whose whole purpose was documentation hygiene. Rewrapped at a clause boundary. The block's longest line is now 74 characters, and no wording changed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lx1hhHu58mXq9DfJsAxkHn
|
Took the nit rather than deferring it, in Normally an optional finding wouldn't start a push. This one is different because it's a regression I introduced, not a pre-existing nit — checked rather than assumed: The previous commit reworded the enumeration from three workflows to five and, in doing so, made that line worse than the one this branch started from — inside a commit whose entire purpose was documentation hygiene. The "don't churn on optional findings" rule is there to protect against noise on pre-existing nits; it shouldn't be used to lock in something I broke two commits ago. Rewrapped at a clause boundary, no wording changed, block max now 74 characters. Generated by Claude Code |
|
Claude finished review — View run Review: PR #881 — Expose
|
2026-09-15 02:19 UTC |
Closes #879.
Problem
A caller cannot set
timeout-minuteson a job that usesuses:, so the agent job's limit is unreachable from the consumer repo. Both workflows hard-coded 60:claude.yml:439claude-code-review.yml:533That default is reasonable. It is only a problem for a consumer with a stricter policy, which had no way to express one.
Change
An optional
timeout-minutesinput on both, defaulting to 60 so no existing caller changes behavior.This extends an established pattern rather than inventing one —
r-cmd-check.yml,altdoc-multiversion-docs.ymlandcheck-code-similarity.ymlalready accept the same input, and the description followsr-cmd-check.yml's "hang ceiling, not a budget" framing.Scoped to the agent job in each workflow (
claudeandclaude-review— the two that carried the 60). The short helper jobs keep their fixed limits:claude.ymlmention-filterclaude.ymlclaude${{ inputs.timeout-minutes }}claude-code-review.ymlpreempt-previous/gather-contextclaude-code-review.ymlclaude-review${{ inputs.timeout-minutes }}claude-code-review.ymlpost-review/require-*A consumer capping the long agent run has no reason to shorten a five-minute mention filter, and parameterizing those would invite someone to set a value that starves them.
Motivating case
Morrison-Lab/qbt#28requires every job at or under 50 minutes. qbt#58 brought everything that repo controls under the cap — and these two were the only jobs left above it, with no caller-side way to reach them. So the policy held everywhere except the two longest-running jobs, which is the opposite of useful.Docs
Updated alongside the code so the input lists don't drift:
## Inputstables inwebsite/reference/claude.qmdandclaude-code-review.qmdchangelog.d/README.md(.addedcategory)Verification
check-non-standard-charsclean across 363 filescheck-new-line-breaksandcheck_list_item_splicescleanOne note on that last pair: the first run warned my changelog fragment was untracked and therefore not examined. I staged it and re-ran so it was actually checked — otherwise the "clean" result would have covered every file except the one I added.
🤖 Generated with Claude Code
https://claude.ai/code/session_01Lx1hhHu58mXq9DfJsAxkHn
Generated by Claude Code