TATER Ops → Projects gives you a three-level tree - Project → Milestone → Task - for tracking multi-week initiatives without leaving the platform your compliance data already lives in. A Milestone can also double as a dev Sprint, with a goal and a manual staff capacity roster. Everything expands in place: click a project to see its milestones, click a milestone to see its tasks.
What are Projects, Milestones, and Tasks?
A Project is the top-level container for a multi-month initiative or engagement - a migration, an audit-prep push, a client onboarding. A Milestone is a named checkpoint or phase within that project (e.g. "Phase 1: Discovery", or "Sprint 14"). A regular Tasker task links to a milestone via an optional milestoneId field, giving you the full hierarchy: Project → Milestone → Task.
Milestone progress is always computed live from its linked tasks - never cached or manually updated - so the percentage you see is never stale.
Don't confuse this with Compliance Roadmap. A Roadmap (guide) is a phased remediation plan built from failing controls, with MSP billing and cost tracking. Projects/Milestones track team and task work - who's doing what, by when - independent of any specific control gap. Use a Roadmap to plan and quote remediation; use Projects to run the actual work, including work that has nothing to do with control gaps.
Creating a project
Ops → Projects → + New Project. Required: name. Optional: description, status (Planning / Active / Cutover / PostCutover / Closed), startDate / endDate, common symptoms and known issues (surfaced to the AI Analyst and troubleshooting agents so they check active projects before guessing at root cause), and tags.
Assigning Project Manager / Project Worker roles
A project's Team roles section lets you tag people with a role scoped to that specific project: Project Manager or Project Worker. Add as many of each as the project needs - a project can have co-managers, and everyone else you tag is a worker.
These are not TATER access-control roles. They carry no permission of their own and do not change what a person can see or do anywhere else in TATER (see Settings reference for the actual SuperAdmin / ServiceProvider / OrgAdmin / Auditor / Viewer role hierarchy that gates access). A Viewer can be tagged Project Worker on a project without gaining any elevated access - it's purely a label for "who's running this" and "who's doing the work," shown as a PM: line on the project card and returned to agents via list_active_projects/create_project/update_project so they know who to point a status question at.
Adding milestones
Click a project row to expand it, then + Add Milestone. A milestone carries the datapoints an experienced project manager expects:
startDate/targetDate- the milestone's (or sprint's) timeframeowner- the accountable owner (email)team- additional stakeholders/contributors, comma-separated (emails or names) - not just one ownerpriority-Critical/High/Normal/Lowdeliverables- free-text acceptance criteria / definition of donedependsOnMilestoneIds- other milestones this one depends on. Informational only - there is no scheduling engine or Gantt chart behind this; it's a note for the reader, not an enforced blocker.
Linking tasks to a milestone
Set the Milestone field on any Ops task (create or edit) to link it. A milestone's progress bar, health (on-track / at-risk / complete / no-tasks), and task counts are all recalculated on every read from its currently-linked tasks - there is nothing to keep in sync manually.
Pre-scaffolding tasks with relative due dates
A task linked to a milestone can use a Due date offset (days) instead of a fixed calendar date - "due 5 days after the milestone starts" rather than a specific date you'd have to update if the milestone slips. This lets a PM build out a milestone's full task list before the milestone kicks off, without having to guess real dates in advance.
- A milestone gets a
startedAttimestamp the first time its status transitionsPlanning→Active- a system-stamped event, distinct from the manually-setstartDateplanning field above. If a milestone is rolled back to Planning and restarted later,startedAtis re-stamped, giving its offset-based tasks a fresh clock. - A task's effective due date is computed live as
milestone startedAt + N days- never stored, so it's never stale. It's returned aseffectiveDueDateon the task; the underlyingdueDatefield is left alone (not overwritten), so switching a task back to a fixed date later doesn't lose a previously-set literal value. - Tasks stay fully creatable and editable before their milestone starts - nothing blocks pre-scaffolding work ahead of time. What changes is visibility: a task whose milestone hasn't started yet is held back from the Ops overdue KPI, the Kanban board's overdue badge, and a milestone's own overdue-task count. It shows a "pending - milestone hasn't started yet" note instead.
- The offset takes precedence over a literal
dueDatewhen both are set on the same task - set one or the other, not both.
Parking future-phase tasks as "Planned"
Tasks also have a first-class Planned (parked) state for future project-plan phases - no more 2036-placeholder due dates or dates hidden in the description. A Planned task is:
- Held out of the active Ops queue and out of overdue math - it can never show as overdue while parked.
- Counted separately in milestone and project rollups - Planned tasks don't drag a milestone's % complete down and don't flip it to at-risk. The rollup shows them as their own bucket.
- Carrying two structured fields: Activation date (when it should go live) and Activation trigger (the event that unparks it, e.g. "Phase 1 sign-off").
Tasks created under a milestone that isn't Active yet default to Planned automatically. When the phase arrives, activate the task by setting it to Open or In Progress - the activation date is applied as the due date in the same flip. A "Planned (parked)" status filter on the Ops task queue lists everything parked across the plan.
Planned complements the relative due-date offsets above: use an offset when the task should go live automatically as soon as its milestone starts, and Planned when activation is a deliberate decision tied to a date or trigger.
Linking to controls, risks, and config docs
A milestone can carry linkedControlIds, linkedConfigDocIds, and linkedRiskIds - so, for example, an "Exchange Transport Hardening" milestone stays connected to the actual CIS controls and config docs it affects, not just described in a free-text field. This is what lets an AI agent connect project work back to compliance evidence automatically.
Turning a milestone into a sprint
Set a milestone's Type to Sprint to run it as a time-boxed dev sprint instead of a project phase. The milestone's existing startDate/targetDate become the sprint boundary - no separate sprint dates. Sprint-type milestones get one extra field: sprintGoal, the single outcome statement for the sprint (e.g. "Ship the reporting API"). Everything else - linked tasks, progress rollup, cross-links to controls/risks - works exactly the same as a regular milestone.
Tracking team capacity
A milestone (typically a sprint) can carry a manual capacity roster: one entry per team member with allocated hours (expected to spend) and capacity hours (actually available). The expanded milestone shows a percent bar per person - allocated vs. capacity - so overcommitment is visible before it becomes a missed deadline. Bars turn amber near 100% and red past it.
This is a deliberately lightweight, manual snapshot - not a time-tracking integration. There is no automatic resource-leveling or cross-milestone conflict detection; if a person is over-allocated across two concurrent sprints, that's on the PM to notice, not something TATER flags for you.
Portfolio, Workload, and Timeline views
The Projects page has four tabs: List (the expand-in-place tree described above), Portfolio, Workload, and Timeline - built for a team lead or PM managing several projects at once rather than working inside one at a time.
- Portfolio - one card per active project (
Planning/Active/Cutover/PostCutover), each showing overall health (on-track/at-risk/complete/no-tasks), task totals and percent complete, and the next upcoming milestone. Click a card to jump to that project in the List tab. - Workload - every person with a capacity-roster entry on an Active milestone, rolled up across ALL their concurrent milestones: allocated hours are summed (real committed work adds up across milestones), but capacity hours are taken as the max, not summed - capacity is a snapshot of the same real-world number (e.g. "40 hrs/week"), not a fresh pool per milestone, so summing it would make someone's declared capacity multiply by however many sprints they happen to be tagged on.
- Timeline - every dated milestone across the portfolio plotted on a single day-granularity bar chart, colored by status. Undated milestones (no
startDateortargetDate) are omitted rather than collapsed to a guess.
All three reuse the SAME underlying data the List tab already loads - there's no separate "refresh everything" step, and no extra Cosmos round-trips beyond what Portfolio/Workload each need once per tab switch.
RAID log (Risks, Assumptions, Issues, Dependencies)
Each project has a lightweight RAID Log section (below its milestones when expanded) for the things a PM needs to track that aren't tasks: a Risk that might derail the timeline, an Assumption the plan depends on, an Issue actively blocking progress, or a Dependency on something outside the project's control. Each item has a type, title, optional description, status (Open/Mitigated/Closed), optional owner and impact (Low/Medium/High/Critical), and an optional due date.
This is a quick-add convenience, not the Risk Register. A RAID Risk entry lives only on the project and has no likelihood/impact scoring or formal acceptance workflow. If a risk needs either of those, track it in the full Risk Register instead (a project's linkedRiskIds field is how the two connect) - RAID is for fast capture during project work, not a replacement.
My TATER: personal workload and RAID items
My TATER's dashboard surfaces the same data scoped to you specifically, so an individual contributor doesn't need to open Ops to see where they stand:
- My Workload - your own allocated vs. capacity hours across every Active milestone you're on, with the same over/near-capacity coloring as the Ops Workload view.
- My RAID Items - every open (non-
Closed) RAID item across all projects where you're the listed owner, soonest due date first, with a link back to the parent project.
XP and achievements for project work
Creating a project or milestone, and completing a milestone (sprint or not), award XP and count toward achievements - first project, 5 projects, first milestone, 10 milestones, first completed milestone, 10 completed - the same incentive layer that drives control and task hygiene elsewhere in TATER. See the Community & Gamification guide for the full XP/achievement system.
REST endpoints
GET /api/projects(Viewer+) - all projects;GET /api/projects/activefor active-onlyGET /api/projects/:id(Viewer+)POST /api/projects(Auditor+) - create;PUT /api/projects/:id(Auditor+) - update. A project'sraidItemsarray is a full-array-replace field on this same endpoint - there is no separate RAID route.DELETE /api/projects/:id(Admin) - soft-deleteGET /api/projects/portfolio-summary(Viewer+) - the Portfolio tab's batched cross-project rollup, plus a flattimelinearray of every dated milestone (used by the Timeline tab)GET /api/milestones/workload(Viewer+) - the Workload tab's per-person allocated/capacity rollup across all Active milestones;?scope=minerestricts to the calling user (used by My TATER)GET /api/projects/:projectId/milestones(Viewer+) - list with live rollup;/summaryvariant for project-level totalsPOST /api/projects/:projectId/milestones/reorder(Auditor+) - bulk drag-reorderGET /api/milestones(Viewer+) - flat cross-project list, optional?projectId=GET /api/milestones/:id(Viewer+) - single milestone + rollup + linked tasksPOST /api/milestones(Auditor+) - create/update viaidin body;PUT /api/milestones/:id(Auditor+)DELETE /api/milestones/:id(Admin) - soft-archivePOST /api/tasker/tasks/PUT /api/tasker/tasks/:id(Auditor+) - a task'smilestoneIdanddueDateOffsetDaysfields live here, not on the milestone.GETresponses include a computed, non-persistedeffectiveDueDatewhendueDateOffsetDaysis set.
MCP tools (HTTP + stdio parity)
list_active_projects,create_project,update_project- both acceptraidItems(full-array-replace)get_portfolio_summary- cross-project health/task rollup + upcoming milestones;get_milestones_workload(optionalown_only) - per-person allocated/capacity across Active milestoneslist_project_milestones,get_milestone,create_milestone,update_milestone,reorder_milestonescreate_tasker_task,update_tasker_task- acceptmilestoneIdanddueDateOffsetDays;list_tasker_tasks/get_tasker_tasksurface the computedeffectiveDueDate.
AI agents connected over MCP are tuned to proactively turn multi-step work described in chat into a tracked Project with Milestones - if you describe a migration, a multi-phase audit push, or a rollout, ask your agent to structure it as a project instead of leaving it as a one-off chat answer.
Recommended patterns
- One project per engagement. A client onboarding, a major migration, an audit-prep push - each gets its own project, not a shared "misc" bucket.
- Sprints for time-boxed pushes inside a larger project. Use plain milestones for open-ended phases (Discovery, Design), Sprint-type for anything with a hard time box and a team capacity question.
- Link every milestone to at least one control or risk when the work is compliance-driven. This is what makes the milestone auditable later, not just a to-do list.
- Keep
deliverablesconcrete. "Improve onboarding" is bad; "New-hire account provisioned within 4 business hours of HR ticket, verified against the checklist" is good.
Pitfalls
- Capacity numbers are self-reported. They are not pulled from a time-tracking system or calendar - if nobody updates them, they go stale like any manual field.
dependsOnMilestoneIdsis informational, not enforced. Nothing blocks a dependent milestone from starting or completing out of order.- Don't confuse with Compliance Roadmap or POA&M milestones. All three use the word "milestone" for a different concept - see the disambiguation above and in each guide's Related section.
- A relative due date offset always resolves from the milestone's actual start - it doesn't pause for a task's own OnHold status or wait for anything else. It's a simple clock, not a scheduling engine.
- Milestone health rollups only count offset-based tasks as overdue once their milestone has started. A pre-scaffolded task under a Planning-status milestone never shows as overdue anywhere, by design - that's the point of pre-scaffolding.
- Workload's capacity number is a MAX across milestones, not a sum. If you're expecting "add up everyone's declared capacity," that's not what this view does on purpose - see the Portfolio/Workload section above for why.
- A RAID "Risk" entry is not the same record as a Risk Register risk. They don't sync; use
linkedRiskIdsto connect a project to a real Risk Register entry when one exists.
Related guides
- Compliance Roadmap - a phased remediation plan with MSP billing, not team/task tracking
- Ops Workflow Automation - for trigger-once coordinated task sets (onboarding, incident response) rather than open-ended project tracking
- POA&M - federal POA&M items have their own "Milestones" concept for remediation checkpoints; unrelated to this feature
- Community & Gamification - the XP/achievement system that rewards project and milestone work