Skip to content

Expose timeout-minutes as an input on the two agent workflows - #881

Merged
d-morrison merged 3 commits into
mainfrom
claude/expose-agent-timeout-input
Sep 15, 2026
Merged

d-morrison merged 3 commits into
mainfrom
claude/expose-agent-timeout-input

Conversation

@d-morrison

Copy link
Copy Markdown
Collaborator

Closes #879.

Problem

A caller cannot set timeout-minutes on a job that uses uses:, so the agent job's limit is unreachable from the consumer repo. Both workflows hard-coded 60:

  • claude.yml:439
  • claude-code-review.yml:533

That 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-minutes input 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.yml and check-code-similarity.yml already accept the same input, and the description follows r-cmd-check.yml's "hang ceiling, not a budget" framing.

Scoped to the agent job in each workflow (claude and claude-review — the two that carried the 60). The short helper jobs keep their fixed limits:

Workflow Job Before After
claude.yml mention-filter 5 5
claude.yml claude 60 ${{ inputs.timeout-minutes }}
claude-code-review.yml preempt-previous / gather-context 5 / 10 unchanged
claude-code-review.yml claude-review 60 ${{ inputs.timeout-minutes }}
claude-code-review.yml post-review / require-* 15 / 10 / 10 unchanged

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#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. 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:

  • README rows for both workflows
  • ## Inputs tables in website/reference/claude.qmd and claude-code-review.qmd
  • changelog fragment per changelog.d/README.md (.added category)

Verification

  • Both workflows parse; the input resolves onto the intended job in each, helper jobs untouched (checked by parsing, not grepping)
  • check-non-standard-chars clean across 363 files
  • check-new-line-breaks and check_list_item_splices clean

One 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

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
@github-actions

This comment has been minimized.

@github-actions

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

Copy link
Copy Markdown
Collaborator Author

All seven findings addressed in 8067210. Every one was correct.

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.

Site Fix
website/workflows.qmd:42-43 Key-inputs cells extended (the table that drifts independently of README's)
website/reference/claude.qmd, claude-code-review.qmd commented timeout-minutes: 50 in each Example block, matching r-cmd-check.qmd:172
examples/claude.yml, claude-code-review.yml same line in the commented with: block, matching examples/r-cmd-check.yml:42
README.md "Job timeouts" enumeration now lists all five

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 extra-secret-names, the previous last input, which returns every file enumerating these workflows' inputs. That makes the sweep complete by construction rather than by inspection, and it's what I should have done before the first push instead of updating the three surfaces I happened to think of.

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; check-non-standard-chars clean across 363 files; check-new-line-breaks and check_list_item_splices clean with the changes staged.


Generated by Claude Code

@github-actions

This comment has been minimized.

@github-actions

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

Copy link
Copy Markdown
Collaborator Author

Took the nit rather than deferring it, in 28aef98.

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:

origin/main   README.md:762  76 chars
8067210       README.md:762  96 chars   <- my reflow merged "additionally expose" onto it
28aef98       block max      74 chars

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. check-non-standard-chars and check-new-line-breaks both clean.


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

Claude finished reviewView run


Review: PR #881 — Expose timeout-minutes as an input on claude.yml and claude-code-review.yml

What changed since the last review round

Per the computed range (8067210e..89e84dc7), the only change is a pure re-wrap of the "Job timeouts" prose in README.md:

-additionally expose their timeouts as a `workflow_call` input, which is the pattern to follow if
-a consumer ever needs to raise one.
+additionally expose their timeouts as a `workflow_call` input,
+which is the pattern to follow if a consumer ever needs to raise one.

This is exactly the non-blocking semantic-line-break nit flagged in the prior round (README.md:762 being ~96 chars). The rendered Markdown text is identical before and after — only the source wrap point moved — so per this review's own instructions ("don't flag cosmetic source-only formatting that renders identically"), there is nothing further to raise here.

No other files changed in this round. The two workflow files (claude.yml, claude-code-review.yml) and the four other doc/example sites (website/workflows.qmd, both website/reference/*.qmd Example blocks, both examples/*.yml stubs) are unchanged from commit 8067210, which the prior round already confirmed fully addressed the doc-sync gaps from round 1.

Confirmation of prior verdict

The second review round (posted 2026-09-15T02:04:06Z, #881 (comment) — run 34919636257) confirmed all four CLAUDE.md doc-sync gaps from round 1 were closed and found no remaining blocking issues, only the now-resolved line-length nit. That verdict was effectively "Ready for merge" (the residual nit was explicitly non-blocking), and this round's sole change is that exact nit being addressed. Nothing in this round warrants revisiting that conclusion.

I re-verified independently:

  • README.md's "Job timeouts" enumeration correctly lists all five workflows (altdoc-multiversion-docs.yml, r-cmd-check.yml, check-code-similarity.yml, claude.yml, claude-code-review.yml).
  • website/workflows.qmd, both reference .qmd Example blocks, and both examples/*.yml stubs all carry timeout-minutes per the diff file (.claude-review-pr.diff).
  • The workflow YAML changes (claude.yml, claude-code-review.yml) are unchanged from the previously-approved commit — no new functional review is needed.

Verdict

Ready for merge

Structured Review Data (JSON)
{
  "schema_version": "1.1",
  "reviewer": "claude",
  "commit_sha": "89e84dc7c0842d17fb2a8fdab63465772c75c4cf",
  "verdict": "CLEAN",
  "findings": [],
  "detailed_assessment": "The only change since the prior round is a cosmetic re-wrap of README.md's Job timeouts prose to satisfy the semantic-line-break guideline; rendered Markdown is unchanged and no other file was touched.",
  "holistic_assessment": "All four doc-sync sites CLAUDE.md requires for a new workflow_call input were already verified complete in the prior round, and the workflow YAML wiring for timeout-minutes on claude.yml and claude-code-review.yml remains unchanged and correct."
}

Reviewed commit: 28aef98

@github-actions

Copy link
Copy Markdown
Contributor

💰 Cost: $0.6926 (review) — run

@github-actions

github-actions Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor
PR Preview Action v1.8.1
Preview removed because the pull request was closed.

2026-09-15 02:19 UTC

@d-morrison
d-morrison merged commit 15b202a into main Sep 15, 2026
72 checks passed
@d-morrison
d-morrison deleted the claude/expose-agent-timeout-input branch September 15, 2026 02:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Expose timeout-minutes as an input on claude.yml and claude-code-review.yml

2 participants