Skip to content

Milestones are created like tasks: --milestone on add and propose, n as quick propose, ordinary triage - #194

Merged
MJohnson459 merged 2 commits into
mainfrom
milestone-create-path-v2
Sep 29, 2026
Merged

MJohnson459 merged 2 commits into
mainfrom
milestone-create-path-v2

Conversation

@MJohnson459

Copy link
Copy Markdown
Contributor

Milestones used to be the one kind of task with their own way in. On the Milestones tab, n wrote the row itself, title only and forced into parked, and no CLI verb set the flag. Milestones now go through the ordinary task path: they are filed through the CLI, land in proposed, and the operator triages them.

Changes

  • Creation. add and propose take --milestone. set takes --milestone and --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 sets human. Only a proposed, parked or ready task 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.
  • Triage and transitions. voro triage gives 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 offer start.
  • Milestones tab. n, N and ctrl-n are the quick propose, the planning session and the $EDITOR form, each filing a milestone:
    • The agent prompts tell the agent to file with voro add --milestone, keep the title to four words or fewer, and write the body as the acceptance statement.
    • The form defaults to the task form's state.
    • None of the three writes a row itself.
    • ⏎ on a proposed milestone opens triage.
  • Refine. Refine is refused on a milestone, and triage <milestone> refine without --note prints that refusal. Proposed task #649 adds a milestone version of the refine prompt.
  • Docs. DESIGN.md §3, §5, §6, §8 and §9 are updated, as is the voro-cli skill's Milestones section.

Review items and their tests

  1. Rebased onto origin/main (e711776). Main's row_line placement and its cockpit tests are kept; its create_milestone calls now pass a state. The whole suite passes after the rebase.
  2. A failed set changes nothing:
    • cli::tests::a_failed_set_changes_nothing_on_a_milestone (the --no-milestone --agent claude repro)
    • milestone::tests::a_refused_edit_leaves_the_milestone_flag_as_it_was (both directions)
  3. The duplicate-title guard with folded case and collapsed whitespace:
    • milestone::tests::a_rename_or_a_flag_onto_an_open_milestones_title_is_refused covers create, rename and flag.
    • cli::tests::a_failed_set_changes_nothing_on_a_milestone covers set --title.
  4. The ctrl-n form's default state: editor::tests::human_parses_defaults_and_rejects_junk asserts both forms default to one state.
  5. Human-task transitions in the TUI:
    • app::milestones::tests::an_unblocked_parked_milestone_unparks_and_parks_from_the_tab
    • app::milestones::tests::the_tab_state_key_offers_a_parked_milestone_unpark_and_abandon
    • milestone::tests::only_a_ready_milestone_closes_and_a_parked_one_offers_unpark_and_abandon
    • cli::tests::transition_verbs_on_a_milestone_name_the_milestones_tab shows the CLI refusals stay.
  6. Flagging refused outside proposed, parked or ready:
    • milestone::tests::only_a_proposed_parked_or_ready_task_becomes_a_milestone
    • cli::tests::set_milestone_is_refused_on_a_running_task (a human task, which previously skipped the check)
  7. DESIGN.md §3 and §6 corrected: a proposed milestone takes its triage verdict from the CLI or the TUI, and every later move, passing it as done above all, is the operator's in the TUI. cli::tests::a_proposed_milestone_triaged_ready_readies_or_parks_on_its_blockers exercises CLI triage.
  8. The start help line is realigned: cli::tests::the_start_help_line_sits_in_the_description_column.
  9. triage <milestone> refine without a note: cli::tests::refine_without_a_note_on_a_milestone_names_the_milestone_refusal.

Verification

cargo test --workspace passes: 550 tests in voro, 425 in voro-core, and 1 integration test. cargo clippy --workspace --all-targets -- -D warnings is clean. I also ran the item 1 repro and item 8 with the built binary against a scratch --db. The failed set exits 1 and the milestone stays flagged.

MJohnson459 and others added 2 commits September 29, 2026 22:56
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
@MJohnson459
MJohnson459 merged commit 16fd564 into main Sep 29, 2026
7 checks passed
@MJohnson459
MJohnson459 deleted the milestone-create-path-v2 branch September 29, 2026 22:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant