Milestones became real files. A plan is still a directory, but each milestone now lives in a directory of its own with its own file — its tasks, its definition of done, its verification command — and that file, not a slice of the plan, is what develop hands a coding agent. The agent gets the one milestone it is working on instead of the whole plan, which is both a tighter contract and a much smaller context.
Milestone files
- Each milestone is its own file. A plan directory now holds
milestones/M{nn}-{title}/M{nn}-{title}.md, one per milestone. Groom writes them as it drafts; the## Milestonestable inindex.mdand the plan's story-point total are generated from those files and are never hand-kept. Milestone titles in that table link to their files, so a plan browses as a tree in Obsidian. - Develop briefs by path, not by body. A worker is handed its milestone file as the contract with
index.mdalongside as context — never the whole plan to read through. The agent implements it, runs that milestone's own verification until it is green, and makes the repo commit; develop then checks the returned diff against the definition of done, ticks the boxes the diff earns, and moves the milestone on. Whoever ran the verification is the one who saw it run. - A stopped sprint resumes mid-plan. Each milestone carries its own status —
pending → in-progress → done, plusblocked— as real run state. Pick a sprint back up in a later session and it continues at the first milestone that is notdone, rather than at the top of the plan. - A rejected attempt keeps its notes. When a diff falls short of the definition of done, develop writes what it checked, what was wrong, and what the next attempt must do into a
feedback.mdbeside that milestone file, then briefs a fresh agent with both paths. That file also counts the attempts, and it survives the session.
Plans are seeded, not typed
Groom creates the plan directory from a config-declared scaffold tree, so a fresh index.md arrives complete — with a real created timestamp and the repo commit stamped at creation rather than filled in by hand — and each milestone file is seeded the same way. The frontmatter shape lives in config alone, so a plan template describes the plan, not the boilerplate around it.
Other changes
- Fixed a code-review bug where a plan whose
code_reviews:was written inline lost its history when a review closed. booping scaffoldandbooping frontmatter-updatenow answer with a unified diff of what they changed and stay silent about files that did not move, so a rendered prompt acts on the receipt instead of reading the file back.booping scaffolddecides per file: an existing target is skipped and named,--forceoverwrites, and a destination already holding part of the tree no longer aborts the run.booping frontmatter-updatewrites scalars with their YAML type, sosp=23lands as an integer.- Every CLI subcommand is now specified by an end-to-end contract corpus instead of unit tests reaching into internals; its case format and sandboxed runner were extracted and published as the standalone
pytest-txtarpytest plugin. - Retired the build stage — the shipped skill and agent shells are hand-authored and rendered at load time — along with the unimplemented
debug-templatecommand. - Documentation, feature index and changelog brought current with all of the above.
Upgrading
No migration ships with this release, and existing vaults need no changes. One caveat: plans groomed before 1.0.1 have no milestone files, so develop finds nothing to execute. Finish in-flight sprints before upgrading, or re-groom the plan afterwards.