Repository navigation
Milestones are created like tasks: --milestone on add and propose, n as quick propose, ordinary triage - #194
Merged
Merged
Conversation
A milestone was the one task with its own creation path: the Milestones tab's `n` wrote the row itself, title only and forced parked, and no CLI verb set the flag, so neither the quick-propose agent nor a planning session could file one. Milestones now go through Store::create_task with the flag set, land in proposed, and take the ordinary triage verdicts. `add`, `propose` and `set` gain --milestone (set also --no-milestone); the flag implies human. A title matching an open milestone in the same project is refused, naming the existing id. On the Milestones tab n, N and ctrl-n are the usual quick propose, planning session and form, filing a milestone; Enter on a proposed milestone opens triage. Refine is refused on a milestone, since it rewrites a body into a dispatch brief. DESIGN.md §3/§5/§6/§8/§9 and the voro-cli skill record the change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JucWMJtXg7aMWSP8wSdnLX
A refused `set` could leave the milestone flag changed, because the flag moved in its own write before the rest of the edit. It now changes in the same transaction (Store::update_task_and_milestone), which also refuses flagging a task outside proposed, parked or ready, and runs the duplicate-title check on renames and on flagging, with case folded and whitespace runs collapsed. The TUI menu offers a milestone a human task's transitions, park and unpark included, so a parked milestone with no blockers is no longer stuck. The milestone editor form defaults to the task form's state. `triage <milestone> refine` without a note prints the milestone refusal. DESIGN.md §3/§6 now say CLI triage of a proposed milestone is allowed and later moves are the operator's in the TUI. The `start` help line is back in its column. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JucWMJtXg7aMWSP8wSdnLX
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Milestones used to be the one kind of task with their own way in. On the Milestones tab,
nwrote the row itself, title only and forced intoparked, and no CLI verb set the flag. Milestones now go through the ordinary task path: they are filed through the CLI, land inproposed, and the operator triages them.Changes
addandproposetake--milestone.settakes--milestoneand--no-milestone, and the flag change happens in the same transaction as the rest of the edit (Store::update_task_and_milestone). Setting the flag also setshuman. Only aproposed,parkedorreadytask can be flagged. A title matching another open milestone in the project is refused, naming the existing milestone's id. Titles are compared with case folded and runs of whitespace collapsed. The check runs on create, on rename and on flagging.voro triagegives a proposed milestone the three verdicts, with their ordinary effects. Every later CLI transition verb still refuses a milestone. In the TUI, the menu offers a milestone the transitions a human task gets, park and unpark included. The one exception: a ready milestone is passed as done in one step, where a human task would offerstart.n,Nandctrl-nare the quick propose, the planning session and the$EDITORform, each filing a milestone:voro add --milestone, keep the title to four words or fewer, and write the body as the acceptance statement.⏎on a proposed milestone opens triage.triage <milestone> refinewithout--noteprints that refusal. Proposed task #649 adds a milestone version of the refine prompt.Review items and their tests
row_lineplacement and its cockpit tests are kept; itscreate_milestonecalls now pass a state. The whole suite passes after the rebase.setchanges nothing:cli::tests::a_failed_set_changes_nothing_on_a_milestone(the--no-milestone --agent clauderepro)milestone::tests::a_refused_edit_leaves_the_milestone_flag_as_it_was(both directions)milestone::tests::a_rename_or_a_flag_onto_an_open_milestones_title_is_refusedcovers create, rename and flag.cli::tests::a_failed_set_changes_nothing_on_a_milestonecoversset --title.ctrl-nform's default state:editor::tests::human_parses_defaults_and_rejects_junkasserts both forms default to one state.app::milestones::tests::an_unblocked_parked_milestone_unparks_and_parks_from_the_tabapp::milestones::tests::the_tab_state_key_offers_a_parked_milestone_unpark_and_abandonmilestone::tests::only_a_ready_milestone_closes_and_a_parked_one_offers_unpark_and_abandoncli::tests::transition_verbs_on_a_milestone_name_the_milestones_tabshows the CLI refusals stay.milestone::tests::only_a_proposed_parked_or_ready_task_becomes_a_milestonecli::tests::set_milestone_is_refused_on_a_running_task(a human task, which previously skipped the check)cli::tests::a_proposed_milestone_triaged_ready_readies_or_parks_on_its_blockersexercises CLI triage.starthelp line is realigned:cli::tests::the_start_help_line_sits_in_the_description_column.triage <milestone> refinewithout a note:cli::tests::refine_without_a_note_on_a_milestone_names_the_milestone_refusal.Verification
cargo test --workspacepasses: 550 tests in voro, 425 in voro-core, and 1 integration test.cargo clippy --workspace --all-targets -- -D warningsis clean. I also ran the item 1 repro and item 8 with the built binary against a scratch--db. The failedsetexits 1 and the milestone stays flagged.