feat(workflows): make shell step timeout configurable#3404
Merged
Conversation
The shell step hardcoded a 300s subprocess timeout, killing any legitimate long-running QA command. Read an optional timeout field (seconds, positive integer, default 300) and validate it. Fixes github#3327 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
There was a problem hiding this comment.
Pull request overview
This PR makes the workflow shell step’s execution timeout configurable via an optional timeout (seconds) field, defaulting to 300 seconds for backward compatibility, and updates validation and error reporting accordingly.
Changes:
- Thread a per-step
timeoutvalue throughShellStep.execute()(default 300s) and report the configured timeout inTimeoutExpirederrors. - Add
ShellStep.validate()checks to reject invalidtimeoutvalues (non-int, bool, <= 0, null). - Add tests covering override/default behavior, timeout error messaging, and validation acceptance/rejection.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
src/specify_cli/workflows/steps/shell/__init__.py |
Reads timeout from step config, passes it to subprocess.run, updates timeout error text, and validates timeout values. |
tests/test_workflows.py |
Adds TestShellStep coverage for configurable timeouts, defaults, error messaging, and validation rules. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The engine does not auto-validate step config, so a string or null timeout would reach subprocess.run() and crash the run with a TypeError. Fall back to the 300s default for malformed values, mirroring how the engine treats unvalidated continue_on_error. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Collaborator
|
Thank you! |
kanfil
added a commit
to tikalk/agentic-sdlc-spec-kit
that referenced
this pull request
Jul 11, 2026
Upstream merge (30 commits, 3 releases 0.12.9-0.12.11): - invoke_separator parse-success fix (github#3304) - Windows Store python3 stub skip + _interpreter_runs() probe (github#3385) - SKILL.md frontmatter control char escape via yaml_quote() (github#3399) - chained expression filters left-to-right refactor (github#3339) - refresh_shared_templates preserves recovered files (github#3378) - Goose yaml skill placeholder resolution (github#3374) - bundled version pin enforcement (github#3377) - integration test home isolation (github#3144) - py: script type in command templates (github#3403) - configurable shell step timeout (github#3404) - find plans in nested spec directories (github#3405) - plan.md phase numbering fix (github#3416) - PowerShell -Number 0 honor via ContainsKey (github#3412) - workflow.yml non-string scalar validation (github#3421) - plan-template.md self-referencing path fix (github#3417) - pre-commit config + trailing whitespace cleanup (github#3430) - malformed URL error handling (github#3433/github#3435/github#3437) - agent-context nested plan.md discovery (github#3301) - community catalog additions (EARS, Figma) (github#3407/github#3408) 9 conflicts resolved: pyproject.toml, integrations/base.py, agents.py, forge/__init__.py, hermes/__init__.py, create-new-feature-branch.ps1, test_git_extension.py, test_base.py, test_integration_devin.py. Template-to-preset alignment: added py: script lines to 6 preset commands, removed stale Phase 1 agent context line from plan preset, fixed phase numbering. Pre-merge fix: wrapped bare make_typer import with fallback. Assisted-by: opencode (model: glm-5.2, autonomous)
kanfil
added a commit
to tikalk/agentic-sdlc-spec-kit
that referenced
this pull request
Jul 11, 2026
Upstream merge (30 commits, 3 releases 0.12.9-0.12.11): - invoke_separator parse-success fix (github#3304) - Windows Store python3 stub skip + _interpreter_runs() probe (github#3385) - SKILL.md frontmatter control char escape via yaml_quote() (github#3399) - chained expression filters left-to-right refactor (github#3339) - refresh_shared_templates preserves recovered files (github#3378) - Goose yaml skill placeholder resolution (github#3374) - bundled version pin enforcement (github#3377) - integration test home isolation (github#3144) - py: script type in command templates (github#3403) - configurable shell step timeout (github#3404) - find plans in nested spec directories (github#3405) - plan.md phase numbering fix (github#3416) - PowerShell -Number 0 honor via ContainsKey (github#3412) - workflow.yml non-string scalar validation (github#3421) - plan-template.md self-referencing path fix (github#3417) - pre-commit config + trailing whitespace cleanup (github#3430) - malformed URL error handling (github#3433/github#3435/github#3437) - agent-context nested plan.md discovery (github#3301) - community catalog additions (EARS, Figma) (github#3407/github#3408) 9 conflicts resolved: pyproject.toml, integrations/base.py, agents.py, forge/__init__.py, hermes/__init__.py, create-new-feature-branch.ps1, test_git_extension.py, test_base.py, test_integration_devin.py. Template-to-preset alignment: added py: script lines to 6 preset commands, removed stale Phase 1 agent context line from plan preset, fixed phase numbering. Pre-merge fix: wrapped bare make_typer import with fallback. Assisted-by: opencode (model: glm-5.2, autonomous)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Fixes #3327
The shell step hardcoded
timeout=300in itssubprocess.runcall, so any workflow gate longer than 5 minutes (full builds, linter aggregators, integration tests) died withTimeoutExpiredregardless of whether the command would pass.The step now reads an optional
timeoutfield (seconds), defaulting to 300 for backward compatibility:validaterejects non-integer, boolean, zero, negative, and null values, and the timeout error message reports the configured value instead of a hardcoded 300.Testing
uv run specify --helpuv sync && uv run pytest(3819 passed)Six new tests in
TestShellStep: override reachessubprocess.run, default stays 300, timeout error reports the configured value, validation rejects bad values (includingTrueand YAML-null), and accepts a positive integer.AI Disclosure
Written with GitHub Copilot CLI; I reviewed the diff and test results.