fix(workflows): drop the bundled speckit workflow's inert scope input - #4398
fix(workflows): drop the bundled speckit workflow's inert scope input#4398Yash-Chindam wants to merge 2 commits into
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
The reference guide still reproduces and advertises the removed scope input.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Removes the bundled workflow’s unused scope input and updates its usage example.
Changes:
- Removes the inert
scopeselector. - Uses the functional
integrationinput in documentation.
File summaries
| File | Description |
|---|---|
workflows/speckit/workflow.yml |
Removes the unused input declaration. |
workflows/README.md |
Corrects the multiple-input example. |
Review details
- Files reviewed: 2/2 changed files
- Comments generated: 1
- Review effort level: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| specify workflow run speckit \ | ||
| --input spec="Build a user authentication system with OAuth support" \ | ||
| --input scope="backend-only" | ||
| --input integration="claude" |
The bundled workflow declared a required-choice scope input that no step
referenced. All four steps pass {{ inputs.spec }}, so every choice behaved
identically.
The value was enum-validated and then discarded, which is worse than being
ignored outright: -i scope=bogus errors while -i scope=backend-only is
accepted, so the rejection of an invalid value is evidence to the user that
the flag does something.
Propagating scope instead would need a contract that does not exist -- the
steps take a single args string, so a scope could only be appended as prose
to the user's own description and left to the agent to interpret. That is a
feature with a design question attached, not a bug fix, so this removes the
selector and leaves the door open for a real one.
workflows/README.md demonstrated multiple inputs using this exact input
against the bundled workflow, so that example moves to a declared one.
Every declared input is now referenced and every referenced input declared.
Fixes github#4384
…rkflow Addresses review feedback. docs/reference/workflows.md reproduces the shipped Full SDD Cycle workflow verbatim, so leaving its scope block in place would have made the documented definition disagree with the workflow this PR changes -- and would have kept advertising the inert selector. Checked the other scope references and left them alone deliberately: workflows/README.md's input-type section and workflows/PUBLISHING.md's authoring skeleton are generic examples of enum inputs, not copies of the bundled workflow, as is the enum row in workflows/ARCHITECTURE.md.
3f4ec8a to
6948a42
Compare
|
Fixed — I checked the other
Pre-existing drift in the same reference copyWhile confirming that block, I noticed the copy has drifted from the shipped workflow in three other ways, all predating this PR:
The last one is the most user-visible — the docs state the default integration is I have left these out to keep the PR to the reported bug. Happy to sync them here if you would prefer the reference copy fully accurate in one go, or to file it separately — your call. Also rebased onto current Disclosure: AI assistance (Claude) was used for this change and comment, as with the original PR. |
Fixes #4384
Problem
The bundled
workflows/speckit/workflow.ymldeclared a required-choicescopeinput that no step referenced. All four steps pass{{ inputs.spec }}, so every choice behaved identically.What actually happens
Two corrections to the report's framing, both checked against
main:Workflow inputs are never prompted for. The report says users "are prompted to choose among three values", but nothing in the engine reads an input's
prompt:field to ask anything —_resolve_inputsonly merges provided values with defaults, and the sole interactiveinput()call inworkflows/belongs to the gate step. Theprompt:key is documentation-only metadata today, which is also whyscopebeing the one input without one went unnoticed.The value is validated, then discarded. Calling
_coerce_inputwith the declared definition:That is worse than being ignored outright: a bogus value errors, so the acceptance of
backend-onlyreads to the user as confirmation the flag does something.Why removal rather than propagation
The issue offered both. Propagating scope has no contract to hang it on — the four steps take a single
argsstring, so a scope could only be smuggled in by appending prose to{{ inputs.spec }}, putting a scoping instruction into the same free-text field the user's own description occupies and leaving its interpretation to the agent. That is a feature with a design question attached, not a bug fix.Removing the selector restores the invariant that every declared input affects the run, and leaves a real scope feature free to land later on its own terms.
Also updated
workflows/README.mddemonstrated "Multiple Inputs" using this exact input against the bundled workflow:That documented the inert input as if it worked, so the example now uses a declared one (
integration). Theinputs.scopereference further down in the If/Then/Else section is a generic authoring illustration with its own hypothetical workflow, not the bundled one, so it stays.Verification
pytest tests/test_workflows.py— 941 passed. The 20 failures are allWinError 1314: A required privilege is not held by the clientfrom symlink creation; I confirmed the identical set fails on unmodifiedupstream/main, so they are environmental and unrelated.Follow-up worth considering separately
validate_workflowalready rejects malformedenumshapes and out-of-enum defaults, but has no check for a declared input that no step references. A warning there would have caught this at authoring time. Left out of this PR to keep it to the fix.Disclosure: this change was developed with AI assistance (Claude). The AI helped trace the input-resolution path, establish the accept-and-discard behaviour, and draft this description. The coercion results and the declared/referenced comparison above were produced by running the code; I reviewed the change before submitting.