Goals
A tree of company objectives that tasks roll up to, with progress from linked tasks.
Goals describe what the company is trying to achieve. They nest into a tree (a goal can be part of a parent goal), can be owned by an agent and can have a target date. Tasks link to a goal, and a goal's progress is the share of its linked tasks that are done. When a runner executes a task, it gives the agent the task's goal and every ancestor goal, so the agent knows why the work matters.
How it works
- A goal has at most one parent goal (
parent_id). Goals without a parent are top-level. - A goal cannot be nested under itself or one of its descendants. Such a change fails with
400 GOAL_CYCLE. - Parent and owner must belong to the same company (
404 NOT_FOUNDotherwise). - Tasks link to one goal through the task's
goal_id. - Progress counts only tasks linked directly to the goal.
tasks_totalis the number of linked tasks that are notcancelled;tasks_doneis the number that aredone. Tasks of child goals do not count toward the parent. - Deleting a goal moves its child goals up to the deleted goal's parent, and unlinks its tasks (their
goal_idbecomesnull). The tasks themselves are kept. - Statuses are set by people (or agents through
sat). Nothing changes a goal's status automatically, not even when all its tasks are done.
In the NoteFlow demo:
Fields
Returned by the goal endpoints (GoalOut).
Prop
Type
Create (POST /goals) accepts title (required), description, parent_id, owner_agent_id, status and target_date. Update (PATCH /goals/{goal_id}) accepts the same fields; only fields present change.
Statuses
| Status | Meaning | Changed by |
|---|---|---|
planned | Agreed but not started | A person or agent, on create or update |
active | Being worked on (the default) | A person or agent, on create or update |
achieved | Reached | A person or agent, on update |
abandoned | Dropped | A person or agent, on update |
Use it

Open Goals. The tree shows each goal's title, description, done/total progress and status. Select the progress bar to see the goal's tasks on Tasks. Change status with the selector on the row.
New goal asks for Goal (the title), Description and Part of (the parent goal). New goals start active. Owner and target date are not editable in the web app; use the CLI or API.
Permissions
Any member can create, edit and delete goals. Non-members get 404 NOT_FOUND.
Events
| Event | When |
|---|---|
goal.created | A goal was created |
goal.updated | A goal changed |
goal.deleted | A goal was deleted |
Deleting a goal also re-parents child goals and unlinks tasks, but publishes no separate goal.updated or task.updated events for them. Refetch goals and tasks on goal.deleted.
Limits and known gaps
- There is no endpoint to fetch a single goal. List the goals and pick by id.
- Progress does not roll up from child goals.
- The web app cannot set an owner or target date, or delete a goal.
- Clearing a goal's owner is possible with
owner_agent_id: null. An owner that is later terminated stays as the owner. target_dateis informational; nothing happens when it passes.