Repository navigation
Description
Problem or Motivation
A group step that changes no file stops with class plan_defect. The group may be too large or already done. The issue #3460 closed as superseded, and this is its group-step case from #3053. The owner decision of 2026-11-02 holds: a plan_defect stops at once unless the bounded amendment covers it.
Proposed Solution & Architectural Design
- The step records class
plan_defectfor the group that changed no file and returns it for a smaller replacement, within the bounded amendment of feat(roadmap): the implement agent can amend the plan when the plan is wrong #3057. - The stop names the group.
- Acceptance: a test runs one group that changes no file and one that changes a file. The trace records class
plan_defectfor the first group only, and the next round asks for a smaller replacement of that group.
Target Subsystem
src/devops_cli/roadmap/implement_step.py, src/devops_cli/roadmap/implement_amend.py.
Existing Tool Considered
No open tool covers plan amendment. The project builds on the amendment of #3057: about 40000 tokens to build, 2000 each quarter to keep, 8000 to fix one miss, about 3 hours.
Source: #3053
Proposed design
Problem statement
A group step that changes no file stops as plan_defect and the item blocks. The group may be too large, or its work may already be in the tree. The stop names the group. The stop asks for a smaller replacement of the group through the bounded amendment of #3057.
Acceptance criteria
Requirement: The no-change group stops as plan_defect
A group step that changes no file SHALL stop with the failure class plan_defect and a reason that names the group and asks for a smaller replacement.
Scenario: A group that changes no file
- WHEN A group step ends and the checkout holds no staged change.
- THEN The outcome is stopped, its
failure_classisplan_defect, and its reason holds the number and the title of the group and the request for a smaller replacement.
Requirement: The trace holds plan_defect for the no-change group only
The trace SHALL hold class plan_defect for each group step that changes no file, and no class for a group step that changes a file.
Scenario: One group changes no file and one changes a file
- WHEN The trace records one group step that changes no file and one group step that changes a file.
- THEN The attempt event of the first step holds class
plan_defect, and the attempt event of the second step holds an empty class.
Requirement: A plan request replaces a group with a smaller one
A plan request of kind group SHALL replace the named group with a smaller one when the new text keeps the group number and holds fewer tasks.
Scenario: A smaller replacement of group 3
- WHEN A plan request of kind
groupnames group 3 and gives one group numbered 3 with two tasks, where group 3 has four tasks. - THEN
judgereturnsApplied,tasks.mdholds the two tasks under group 3, and its## Amendmentssection holds the bullet of the request.
Requirement: A group replacement that breaks a bound is refused
A plan request of kind group MUST be refused with a reason when the new text holds as many tasks as the group or more, changes the group number, or names a path that the group does not name.
Scenario: A replacement with no fewer tasks
- WHEN A plan request of kind
groupgives a group with the same number of tasks as the group it replaces. - THEN
judgereturnsRefusedwith a reason, andtasks.mddoes not change.
Existing Tool Considered
No alternatives check has run. No open tool covers a bounded amendment of a plan. The project builds it on the amendment of #3057: about 40000 tokens to build, 2000 each quarter to keep, 8000 to fix one miss, and about 3 hours.
Key questions
- Which class does a group step that changes no file record?:
FailureClass.PLAN_DEFECT._exit_failuresets it when a group step stages no change, and the trace records it asplan_defect. [sources: src/devops_cli/roadmap/implement_step.py, docs/ROADMAP_WORKFLOW.md:166] - Which action does the class
plan_defectselect?:amend. The action table givesplan_defectthe actionamend, so the job asks for one bounded amendment of the plan. [sources: src/devops_cli/roadmap/failure.py, docs/ROADMAP_WORKFLOW.md:166, docs/ROADMAP_WORKFLOW.md:203] - How does the stop return the group for a smaller replacement?: Add a bounded kind
groupto the amendment of feat(roadmap): the implement agent can amend the plan when the plan is wrong #3057. The request replaces one group with a smaller one under the same number. (best practice) [sources: src/devops_cli/roadmap/implement_amend.py, docs/ROADMAP_WORKFLOW.md:166, docs/ROADMAP_WORKFLOW.md:203]- Chosen: A new bounded kind
groupinimplement_amend.py. It keeps the replacement inside the bounded amendment of feat(roadmap): the implement agent can amend the plan when the plan is wrong #3057, which the owner decision of 2026-11-02 requires. - Rejected: A person edits the plan and comments
implement: retry. The item waits, and the owner decision stops aplan_defectat once unless the bounded amendment covers it. - Rejected: The job splits the group into one group for each task. The job writes plan text with no evidence from a model, and the group numbers change.
- Chosen: A new bounded kind
- Which bounds keep the replacement of a group small?: The new text keeps the group number, holds fewer tasks than the group it replaces, and names only paths that the group names. Every verification command is valid and starts with an allowed program. (best practice) [sources: src/devops_cli/roadmap/implement_amend.py, docs/ROADMAP_WORKFLOW.md:203]
- Chosen: Same group number, fewer tasks, and the paths of the group. The inputs of the step stay the same or smaller, so the window check cannot fail.
- Rejected: Any text under the same group number. It is unbounded plan editing, which the owner decision of 2026-11-02 rejects.
- Rejected: More tasks, to make the group easier to run. It grows the group and does not answer a stop for a group that changed no file.
- Does a group that changes no file get a repair round?: No.
_extra_askreturns no turn for a failure with no repair paths, and a group that changed no file has none. [sources: src/devops_cli/roadmap/implement_step.py, docs/ROADMAP_WORKFLOW.md:361] - Which text of the stop names the group?: The reason of the stop names the group number and its title, and asks for a smaller replacement. (best practice) [sources: src/devops_cli/roadmap/implement_step.py, docs/ROADMAP_WORKFLOW.md:203]
- Chosen: The reason names the number and the title. The reason is the evidence of the stop, and a reader of the trace reads the group there.
- Rejected: Only the stop comment of the job names the group. The outcome of the step is the tested record, and the reason alone then gives no group.
Fit
Fits in one pull request.
Suspected block
None.
Dependencies
None.
Alternatives check of 2026-11-07: none.
Tool: none found.
Activity
dan-petty commentedon Nov 5, 2026
Intake placed this item to the backlog: intake puts every new item in the backlog. A person plans the milestones.
featprefix of the title gives the type.(roadmap)scope of the title gives the scope.A specific edge case that stops one run but does not block all roadmap work.Prevents a hard stop for one group shape but does not change the overall amendment flow.The amendment mechanism exists; this adds one trigger and one test case.Both use the plan amendment mechanism; #3057 builds the general capability, the candidate adds a specific no-file trigger within it.feat(roadmap): a step stops at its budgets and records attempts (#3580)
feat(roadmap): ask for a smaller edit after a parser failure (#3737)
devops-cli-service commentedon Nov 6, 2026
Status set to Ready at 8714474 (see proposed design in issue body).
devops-cli-service commentedon Nov 7, 2026
Alternatives check: none
Reason: The web searches for tooling that amends a plan did not return a covering tool, and the two closest maintained planning tools read (OpenSpec, GitHub Spec Kit) manage spec/change-proposal documents and task lists, but neither implements a bounded replacement of a named task group under the same number, a
plan_defectfailure class for a group step that stages no change, or the trace/refusal behaviour the issue specifies. The need is the project's own amendment kind inimplement_step.pyandimplement_amend.py, which the issue itself notes no open tool covers.Tool: none found
Lacks:
plan_defectfor a group step that stages no change, with a reason that names the groupgroupthat replaces a group with a smaller one while keeping the group numbertasks.mdleft unchangedplan_defecton the attempt event of the no-change group only, leaving a changing group's class emptyTools considered:
Searches run:
Sources:
Checked on 2026-11-07. A person decides what this means for the item. The check changes no label and closes no issue.