| name | taskforge-plan-edit |
| description | Edits the project plan (milestones/sprints/tasks). Use when the user says "/taskforge-plan-edit", "edit the plan", "add a task", "remove this", "reorder", "change difficulty", "adjust wave", or similar. |
| model | opus |
Plan Edit โ Plan Editing
Edit the project plan according to user requests.
Prerequisites
- A project with a plan must exist under
_workspace/projects/{projectId}/
- Project selection: Same as
/taskforge-execute โ auto-select if only one, ask if multiple
- All file paths below are relative to
_workspace/projects/{projectId}/
- If no plan exists: "Please create a plan first with
/taskforge-plan"
Supported Edits
Task Level
- Add: "Add a task to sprint {id}" โ Insert task into that sprint
- Remove: "Remove the {taskName} task" โ Delete the task + clean up dependencies
- Modify: "Change {taskName} to hard" โ Update difficulty/model/plan, etc.
- Move: "Move this task to sprint {id}" โ Move between sprints
- Merge: "Merge these two" โ Combine tasks
- Split: "Split this task into two" โ Divide a task
Per-Field Editing Guide
| Field | Notes when editing |
|---|
| difficulty/model | Changing difficulty updates the task's code-writing model (easy=haiku, medium=sonnet, hard=sonnet). Opus is never assigned to a task's code-writing model โ it's reserved for judgment work (planning, orchestration, propagation). If a task is harness mode, the orchestrator runs on opus automatically; the task's model field still controls the worker code-writing model. |
| wave | Verify no file conflicts within the same wave. Must align with dependency relationships |
| dependencies | Adding/removing requires recalculating wave numbers |
| acceptanceCriteria | Write as verifiable statements (file exists, content present, build passes, etc.) |
| mustHaves | Maintain structure: truths (observable), artifacts (file paths), keyLinks (connections) |
| skills | Use valid skill names from harnesses/INDEX.md |
| executionMode | When changing to "harness", also specify harnessId |
| contextManifest (v2) | List of { path, priority } โ files read by the task in priority order. Lower priority = read first. Paths relative to project root. |
| cotTemplate (v2) | Optional path to a CoT scaffold under prompts/cot/. Only set for tasks involving complex judgment. |
| guardrails (v2) | { maxTurns, maxCostUSD, maxWallTimeMin }. Defaults 20 / $2.00 / 35. Raise only with clear justification. |
| estimatedMinutes (v2) | Must be โค35. If editing pushes it over, split the task. |
Sprint Level
- Add/remove/rename/reorder
- Edit validation strategy
Milestone Level
- Add/remove/rename/reorder
- Edit validation strategy
Post-Edit Processing
- Auto-clean dependencies: Update dependencies of tasks that depended on removed tasks
- Recalculate waves: If dependencies change, recalculate wave numbers
- Wave 1: Tasks with no dependencies
- Wave N: Tasks that depend on wave N-1 tasks
- Re-sequence IDs (if needed)
- Update statistics: Update totalTasks, modelDistribution, waveStats
- Cross-file propagation check (v2 โ mandatory): see next section
- Record edit history: Add change record to project-plan.json's editHistory
Cross-File Propagation (v2 โ mandatory)
In v2 the project state is split across many files, not one. An edit to project-plan.json often makes one of the sibling files stale. Before finishing, walk through this checklist for every change. Do not skip it โ silent drift between these files is the #1 source of "๊ฐฑ์ ์ ๋ ๋ถ๋ถ" complaints.
| Change type | Files to re-check | What to look for |
|---|
| Add task | roadmap.json (active milestone description / openQuestions), verification.md (does new task introduce a new completion criterion?), decisions/ (does it depend on a decision not yet recorded?) | Did the milestone scope just grow? Reflect it. |
| Remove task | roadmap.json (description still claims something this task delivered?), verification.md (a criterion now unprovable?), handoffs/ (only for completed tasks โ warn user), decisions/ (decisions whose ์ํฅ๋ฐ๋ ํ์ผ list pointed to this task) | Did we just delete something the milestone description still promises? |
Modify scope (plan, description, acceptanceCriteria) | roadmap.json, verification.md, constraints.md (does change violate a hard rule?), references/ (still relevant?) | Has the meaning of the task drifted from the milestone-level promise? |
| Change difficulty/model | concept.json (tech stack still appropriate?) | Usually no propagation needed โ local change. |
| Change wave/dependencies | None (local) | Just re-verify no file conflicts within the same wave. |
| Add/remove sprint | roadmap.json (milestone description), verification.md | Sprint boundaries usually map to user-visible chunks. |
| Add/remove/rename milestone | roadmap.json (always), vision.json (only if successCriteria affected โ warn user, vision is supposed to be unchanging), concept.json (usually no), all future milestones' openQuestions | Milestone-level changes ripple far. Always read every other milestone's roadmap entry and decide if it needs an update. |
| Edit milestone validation strategy | verification.md, spec-card.json (validationStrategy field) | These two must stay aligned. |
Propagation rules:
- Always read before deciding. Open each file in the "Files to re-check" column โ do not guess from memory.
- Roadmap is the index. If the active milestone's
description, openQuestions, or status is now wrong, update roadmap.json even though retro is the usual updater. Plan-edit is allowed to update roadmap when the cause is a plan edit.
- Other milestones' roadmap entries. If a structural change (added/removed/renamed milestone) ripples to other entries'
openQuestions or purpose, update those too. This is the "M3 ์์ โ M1234 ์ํ" pattern that v1 did automatically and v2 must do explicitly.
- Decisions can be invalidated. If a removed/changed task is referenced in any
decisions/D*.md ์ํฅ๋ฐ๋ ํ์ผ list, mark that decision as needing review (add a ๊ฒํ ํ์: {date} โ {reason} line).
- Vision is sacred. If a change seems to require editing
vision.json, stop and ask the user. Do not auto-edit vision.
- Show the propagation report to the user before saving (see Output Format).
If no other files need changes, say so explicitly: Cross-file check: ์ํฅ๋ฐ๋ ๋ค๋ฅธ ํ์ผ ์์. This proves the check was done, not skipped.
Output Format
Update project-plan.json
Change only the modified fields and append a change record to the editHistory array:
{
"editHistory": [
{
"editedAt": "{ISO-8601}",
"changes": [
{ "type": "add_task", "target": "{taskId}", "description": "{what was added}" },
{ "type": "modify_task", "target": "{taskId}", "field": "{fieldName}", "from": "{oldValue}", "to": "{newValue}" }
]
}
]
}
Output Change Summary
Use this structure (fill from actual edits โ do not copy literal labels):
Plan updated:
[+] Task added: "{task name}" ({task id}, {difficulty}/{model}, wave {n})
[~] {field} changed: "{task name}" {from}โ{to}
[โป] Wave recalculated: Sprint {id} (wave {n}โ{m})
Before: {n} tasks | {model breakdown}
After: {n} tasks | {model breakdown}
ํจ๊ป ๊ฐฑ์ ๋ ํ์ผ (cross-file propagation):
[โป] {file path} โ {what was updated and why}
[โ] {file path}, {file path} โ ์ํฅ ์์
๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์๋์ด์. ์ถ๊ฐ๋ก ๊ณ ์น ๋ถ๋ถ์ด ์์ผ๋ฉด ๋งํด์ฃผ์ธ์, ์์ผ๋ฉด /taskforge-execute๋ก ์งํํ์ธ์.
Markers: [+] add, [-] remove, [~] modify, [โป] recalculated/propagated, [โ] checked, no change.
If a file would need a vision-level change, do not auto-edit. Instead show:
โ ๏ธ ์ด ์์ ์ด vision.json๊น์ง ์ํฅ์ ์ค ์ ์์ด์:
- successCriteria์ "{ํญ๋ชฉ}"์ด ์ด๋ฒ ๋ณ๊ฒฝ๊ณผ ๋ชจ์๋ผ ๋ณด์
๋๋ค.
vision์ ํจ๋ถ๋ก ๋ฐ๊พธ๋ฉด ์ ๋๋ ํ์ผ์ด๋ผ ์ฌ์ฉ์ ํ์ธ์ด ํ์ํด์. ์ด๋ป๊ฒ ํ ๊น์?
- vision์ ๊ทธ๋๋ก ๋๊ณ ์ด ๋ณ๊ฒฝ์ ์ทจ์
- vision๋ ํจ๊ป ์
๋ฐ์ดํธ (์ด์ ์ค๋ช
ํ์)
Notes
- Ask for clarification if the edit request is ambiguous
- For restructuring an entire milestone, suggest running
/taskforge-retro first (if the milestone is finishing) or re-running /taskforge-plan (if the plan needs full regeneration)
- Warn when trying to modify an already-completed task: "์ด ์์
์ ์ด๋ฏธ ์๋ฃ๋์ด์. ์์ ํ๋ฉด handoff์ ๊ฒ์ฆ ๊ฒฐ๊ณผ๊ฐ ๋ฌดํจํ๋ฉ๋๋ค. ์งํํ ๊น์?"
- Editing tasks in an in-progress sprint also requires updating execution-state
- If
estimatedMinutes is raised above 35, automatically suggest splitting the task instead