Skip to content

feat(roadmap): a group that changes no file returns for a smaller one #3576

Open

Description

@dan-petty

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_defect for 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_defect for 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_class is plan_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 group names group 3 and gives one group numbered 3 with two tasks, where group 3 has four tasks.
  • THEN judge returns Applied, tasks.md holds the two tasks under group 3, and its ## Amendments section 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 group gives a group with the same number of tasks as the group it replaces.
  • THEN judge returns Refused with a reason, and tasks.md does 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_failure sets it when a group step stages no change, and the trace records it as plan_defect. [sources: src/devops_cli/roadmap/implement_step.py, docs/ROADMAP_WORKFLOW.md:166]
  • Which action does the class plan_defect select?: amend. The action table gives plan_defect the action amend, 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 group to 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 group in implement_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 a plan_defect at 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.
  • 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_ask returns 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

  1. added
    type/featureNew user-facing functionality or capability addition
    scope/roadmapThe roadmap jobs: intake, refine, stage, implement and the Service that runs them
    status/newStatus New: the item is not ready yet
    effort/lowEffort Low: little work
    on Nov 5, 2026
  2. dan-petty commented on Nov 5, 2026

    @dan-petty
    OwnerAuthor

    Intake placed this item to the backlog: intake puts every new item in the backlog. A person plans the milestones.

    • Type: type/feature. The feat prefix of the title gives the type.
    • Scope: scope/roadmap. The (roadmap) scope of the title gives the scope.
    • Priority: P2-Medium. A specific edge case that stops one run but does not block all roadmap work.
    • Value: Medium. Prevents a hard stop for one group shape but does not change the overall amendment flow.
    • Effort: Low. The amendment mechanism exists; this adds one trigger and one test case.
    • Related: feat(roadmap): the implement agent can amend the plan when the plan is wrong #3057, which asks for a different change. Both use the plan amendment mechanism; #3057 builds the general capability, the candidate adds a specific no-file trigger within it.
  3. added
    priority/p2-mediumStandard priority feature work and architectural improvements
    on Nov 5, 2026
  4. added
    status/readyStatus Ready: problem, acceptance criteria and an answer to each key question
    and removed
    status/newStatus New: the item is not ready yet
    on Nov 6, 2026
  5. devops-cli-service commented on Nov 6, 2026

    @devops-cli-service
    Contributor

    Status set to Ready at 8714474 (see proposed design in issue body).

  6. devops-cli-service commented on Nov 7, 2026

    @devops-cli-service
    Contributor

    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_defect failure 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 in implement_step.py and implement_amend.py, which the issue itself notes no open tool covers.

    Tool: none found

    Lacks:

    • Recording failure class plan_defect for a group step that stages no change, with a reason that names the group
    • A plan request of kind group that replaces a group with a smaller one while keeping the group number
    • Bounds enforcement: fewer tasks than the replaced group, same group number, only the paths the group already names
    • Refusal of a group replacement that breaks a bound, with tasks.md left unchanged
    • Recording plan_defect on the attempt event of the no-change group only, leaving a changing group's class empty

    Tools considered:

    Searches run:

    • OpenSpec spec-driven development change proposal tool, results: 0
    • tool that validates and bounds edits to a task plan, smaller task group replacement, results: 0
    • OpenSpec openspec spec-driven development tasks.md change proposal, results: 0
    • OpenSpec spec driven development, results: 0
    • plan amendment tool roadmap agent, results: 0
    • openspec, results: 0
    • spec driven development tool open source change proposals archive, results: 0
    • GitHub Spec Kit tasks.md plan amendment, results: 0
    • spec kit specify cli tasks plan, results: 0
    • spec kit, results: 0

    Sources:

    Checked on 2026-11-07. A person decides what this means for the item. The check changes no label and closes no issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    effort/lowEffort Low: little workpriority/p2-mediumStandard priority feature work and architectural improvementsscope/roadmapThe roadmap jobs: intake, refine, stage, implement and the Service that runs themsource/agentFiled by an agentstatus/readyStatus Ready: problem, acceptance criteria and an answer to each key questiontype/featureNew user-facing functionality or capability additionvalue/mediumValue Medium

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions