What outcome should OpenMuse handle?
Delegate a specific milestone within an existing goal, follow its task, inspect the saved result, and decide whether that milestone is complete.
For example, a goal might contain “Analyze September spending.” Completing the analysis should make its result available from that original milestone. The user should not have to reconcile an unchecked milestone with a newly appended, completed entry for the same work.
This would make goal progress reflect the user's milestones while keeping task completion separate from confirmation that the milestone was achieved.
Current behavior and reproduction
Checked current main at 205cc386:
A local service-level probe on that exact commit reproduced the gap without a model or Google account, using the sample-app setup from tests/workflows.test.ts:
- Create a goal with one milestone, “Analyze September spending.”
- Create a
finance task with the same title and that goalId, passing a valid one-row CSV:
date,description,amount,category
2026-09-01,Coffee,10.00,Food
- Run
agent.worker.tick() and read the task and goal back.
Observed: the task succeeds and saves one artifact. The goal now has two identically titled milestones: the original remains done: false; a second entry, whose ID is the task ID, is done: true. This is the current goal-level behavior; there is no supported field for selecting the original milestone. The probe verified persisted service behavior, not a live UI or model interaction.
Proposed behavior
Keep the first slice small and reuse the existing task and goal interfaces:
- Add an optional
milestoneId alongside goalId on a delegated task and its creation input. The server validates that the goal belongs to the authenticated owner and the milestone belongs to that goal. Link by stable ID, never title or array position.
- Add “Delegate” to an incomplete milestone. Open the existing delegation flow with its goal/milestone context, then show linked task status and an “Open task” entry that uses the current task detail and saved artifacts.
- On success, keep the linked milestone unchecked until the user marks it complete. Reuse the existing manual checkbox; people must also remain able to mark work completed outside OpenMuse. Completion should not depend on a model declaring success.
- For tasks with an explicit milestone link, do not append a synthetic completed milestone. Preserve existing persisted records and behavior for tasks without that link.
- Make repeated delivery of the same delegation request idempotent. An explicit later delegation may create another task; retain earlier task/result links rather than permanently deduplicating by milestone ID.
Task status, result links, and milestone completion can be derived from the existing records. No separate evidence store or new planning engine is needed.
How would we verify it works?
These are proposed acceptance criteria; only the current-behavior probe above has been executed.
Scope and related work
Out of scope: automatic replanning, scheduling, new connectors, automatically completing the whole goal, historical data cleanup, or a general workboard.
#70 preserves the existing goal when accepting a goal-planning idea. This proposal adds the next relationship: a task targeting a specific existing milestone within that goal. It does not duplicate that fix.
#53 covers a broader downstream workboard direction; this proposal can be coordinated with that effort without requiring the larger subsystem.
Would an optional task milestoneId plus the existing manual completion control be an acceptable first implementation?
What outcome should OpenMuse handle?
Delegate a specific milestone within an existing goal, follow its task, inspect the saved result, and decide whether that milestone is complete.
For example, a goal might contain “Analyze September spending.” Completing the analysis should make its result available from that original milestone. The user should not have to reconcile an unchecked milestone with a newly appended, completed entry for the same work.
This would make goal progress reflect the user's milestones while keeping task completion separate from confirmation that the milestone was achieved.
Current behavior and reproduction
Checked current
mainat 205cc386:AgentTaskhasgoalId, but no milestone reference. A milestone hasid,title, anddone.GoalCardprovides goal-level “Plan next steps,” task cards, and manual milestone checkboxes, but no way to delegate a particular milestone.publishOutcome()appends a completed milestone keyed by the task ID rather than linking an existing one.A local service-level probe on that exact commit reproduced the gap without a model or Google account, using the sample-app setup from
tests/workflows.test.ts:financetask with the same title and thatgoalId, passing a valid one-row CSV:agent.worker.tick()and read the task and goal back.Observed: the task succeeds and saves one artifact. The goal now has two identically titled milestones: the original remains
done: false; a second entry, whose ID is the task ID, isdone: true. This is the current goal-level behavior; there is no supported field for selecting the original milestone. The probe verified persisted service behavior, not a live UI or model interaction.Proposed behavior
Keep the first slice small and reuse the existing task and goal interfaces:
milestoneIdalongsidegoalIdon a delegated task and its creation input. The server validates that the goal belongs to the authenticated owner and the milestone belongs to that goal. Link by stable ID, never title or array position.Task status, result links, and milestone completion can be derived from the existing records. No separate evidence store or new planning engine is needed.
How would we verify it works?
These are proposed acceptance criteria; only the current-behavior probe above has been executed.
Scope and related work
Out of scope: automatic replanning, scheduling, new connectors, automatically completing the whole goal, historical data cleanup, or a general workboard.
#70 preserves the existing goal when accepting a goal-planning idea. This proposal adds the next relationship: a task targeting a specific existing milestone within that goal. It does not duplicate that fix.
#53 covers a broader downstream workboard direction; this proposal can be coordinated with that effort without requiring the larger subsystem.
Would an optional task
milestoneIdplus the existing manual completion control be an acceptable first implementation?