Scheduling and Auto Schedule

DPlan's Auto Schedule feature applies Critical Path Method (CPM) to your task network, automatically calculating the earliest possible dates for every task based on their dependencies, durations, and constraints. This section explains the algorithm, all constraint types, and how to use scheduling effectively.

What Auto Schedule Does

When you manually enter dates for tasks, DPlan stores them as-entered — it does not automatically move successor tasks when you change a predecessor's duration. Auto Schedule is the operation that reconciles the entire task network, propagating dates forward from dependencies and respecting constraints, producing the optimal (earliest possible) schedule given your current inputs.

After running Auto Schedule:

Running Auto Schedule

Click SCHEDULE → Auto Schedule in the ribbon. There is no keyboard shortcut by default, but you can invoke it quickly from the ribbon with Alt+S then A (access-key navigation).

Auto Schedule completes in milliseconds for typical projects (up to ~500 tasks). After it runs, the Gantt redraws with updated bar positions. A toast notification confirms: "Schedule updated — N tasks rescheduled."

The pre-schedule state is captured as a single undo step, so you can press Ctrl+Z to revert all date changes at once if the result is not what you expected.

Step-by-Step Algorithm

Phase 1 — Build Dependency Graph

DPlan reads all task dependencies and constructs a directed acyclic graph (DAG) where each node is a task and each directed edge is a Finish-to-Start dependency with its associated lag value. Circular dependencies are detected at this stage and reported as errors — the schedule cannot proceed until circles are broken.

Phase 2 — Topological Sort

The DAG is sorted topologically using Kahn's algorithm so that every task appears after all its predecessors. Tasks with no predecessors (root tasks) appear first. Tasks with no successors (sink tasks) appear last. Within the sorted order, tasks with the same depth level maintain their original row order.

Phase 3 — Forward Pass (Earliest Dates)

Working through the topologically sorted list:

  1. For each task, compute the network early start: the maximum of all predecessors' Early Finish dates, plus the dependency lag.
  2. Apply the task's constraint to determine the actual start date (see Constraint Types below).
  3. Compute Early Finish = Early Start + duration (in working days, skipping non-working days from the calendar).
  4. Store ES and EF on the task.

Phase 4 — Weekend and Holiday Skipping

All date arithmetic skips non-working days. DPlan uses the project calendar (defined in the Calendar view) to determine which days are working days. By default, Saturday and Sunday are non-working. Any holidays or custom non-working days defined in the Calendar are also excluded.

If a calculated start date falls on a non-working day, it is pushed forward to the next working day. End dates are similarly adjusted. A 5-day task starting on a Thursday spans Thursday–Wednesday (skipping Saturday and Sunday), not Thursday–Monday.

If you need 7-day working weeks (e.g., a construction project with weekend shifts), define Saturday and Sunday as working days in the Calendar settings before running Auto Schedule.

Phase 5 — Backward Pass (Late Dates)

Starting from the project's latest Early Finish date (the end of the project), working backwards through the reverse-sorted task list:

  1. For each task, compute the network late finish: the minimum of all successors' Late Start dates, minus the dependency lag.
  2. Apply any deadline constraints (FNLT, MFO) to tighten the late finish if required.
  3. Compute Late Start = Late Finish − duration.
  4. Store LS and LF on the task.

Phase 6 — Float and Critical Path

For each task: Total Float = LS − ES. Tasks where Total Float < 0.6 days are marked critical. See Critical Path for full detail on the threshold and float table.

Phase 7 — Summary Phase Rollup

After all leaf tasks have been scheduled, summary phases are updated: their start date = minimum start of all children; their end date = maximum end of all children; their duration = calendar-day span of that range; their progress = duration-weighted average of children's progress.

If Progress Rollup is enabled in Settings, summary progress is always computed from children and cannot be manually set. If disabled, summary progress is an independent field.

Constraint Types

Constraints let you override pure network logic and anchor a task to a specific date relationship. Set a constraint in the Task Editor under the Constraint field, along with a Constraint Date.

ASAP — As Soon As Possible (Default)

No constraint. The task starts at the earliest date its predecessors allow. Most tasks should use ASAP — it gives Auto Schedule maximum freedom to optimise the schedule.

Example: A development task that should start immediately after design is complete. Set ASAP — when design finishes early, development moves up automatically.

SNET — Start No Earlier Than

The task cannot start before the constraint date, even if its predecessors finish earlier. Auto Schedule will not schedule the task before the constraint date but may schedule it later if predecessors require it.

Example: External testing environment is not available until 15 April. Set SNET = 15 April on the "Integration Testing" task. If all predecessors complete by 10 April, the task still waits until 15 April.

Effect on float: SNET can increase a task's apparent float if the constraint date is later than the network-calculated early start. The task has slack up to the constraint date that appears as float, but it is not usable schedule flexibility — the task cannot start before the constraint.

SNLT — Start No Later Than

The task must start no later than the constraint date. If the network calculates a start date after the constraint date, the task will show negative float — the plan cannot meet this constraint without changes.

Example: A marketing campaign task must begin no later than 1 June to hit a seasonal window. Set SNLT = 1 June. If predecessor tasks run long and push the network start to 5 June, the task shows −4 days float and the critical path routes through it.

FNLT — Finish No Later Than

The task must finish by the constraint date. Drives the backward pass: during the backward pass, LF is set to min(network LF, constraint date).

Example: A deliverable must be submitted to a client by 30 June. Set FNLT = 30 June. If the network calculates a finish date of 5 July, the task shows negative float.

MSO — Must Start On

The task is pinned to an exact start date. Auto Schedule does not move this task. It starts on the MSO date regardless of when predecessors finish.

Example: A training session booked for 10 April. The room, trainer, and invites are all fixed. Set MSO = 10 April. If predecessors run long, the task still starts on 10 April — but the lag between predecessor finish and this task will show as negative float on predecessor tasks.

Note: MSO effectively makes this task an anchor point. Predecessor chains must finish before the MSO date, or they will be shown as late.

MFO — Must Finish On

The task is pinned to an exact finish date. Auto Schedule calculates the task's start as MFO date − duration, regardless of predecessor logic.

Example: A regulatory filing that must be submitted on exactly 31 March (end of financial year). Set MFO = 31 March. With a 10-day duration, the task is automatically scheduled to start on 18 March (10 working days before 31 March).

Anchored Tasks — Skipping Auto Schedule

Tasks with MSO or MFO constraints are considered "anchored" — their dates are fixed by definition and Auto Schedule does not move them. All other tasks without hard constraints will be scheduled relative to the network and to anchored milestones/tasks.

Anchored tasks still participate in float calculation. If an anchored task's fixed date creates a gap in the schedule (predecessors finish earlier), that gap shows as free float on the predecessors. If the anchor date is too late (predecessors cannot finish in time), negative float signals the conflict.

Lag and Lead Interaction with Auto Schedule

Lag and lead values on dependencies are respected during the forward pass:

Pro tip: Use lead on the critical path to fast-track the schedule. Start successor tasks as soon as the predecessor has produced the input they need, not after the predecessor is 100 % complete. Even a 1–2 day lead on several critical tasks can compress the overall schedule by a week.

After Running Auto Schedule

After Auto Schedule completes, the recommended workflow is:

  1. Enable Critical Path highlight (VIEW → Critical Path) and scan for unexpected critical tasks. Tasks you did not expect to be critical may indicate missing dependencies or constraints that need adjustment.
  2. Check for negative float. Any task with negative float (shown with a red indicator in the float table) means the schedule cannot meet a constraint or deadline. Resolve these before proceeding.
  3. Review milestone dates. Check that all milestone dates with MSO constraints still fall where expected. A milestone that has been pushed is a signal that predecessor work has grown.
  4. Check deadline markers. Any task or milestone with a deadline marker that is now later than the marker will show a visual warning on the Gantt.
  5. Save a .dplan file if you are satisfied with the scheduled result — especially before setting it as a new baseline.

Undo Auto Schedule

Auto Schedule captures a single undo snapshot before modifying any task dates. Press Ctrl+Z once to restore all tasks to their pre-schedule dates. This is useful when Auto Schedule produces an unexpected result and you want to inspect the before/after difference.

See Undo and Redo for the full undo documentation.

When to Run Auto Schedule

You should run Auto Schedule whenever:

You do not need to run Auto Schedule for: progress updates, status changes, notes edits, assignee changes, resource assignments (unless those affect duration), or purely cosmetic changes.

Manual Scheduling (Not Using Auto Schedule)

If you prefer to set all dates manually (or you are managing a plan where external factors fix all dates), you can simply not use Auto Schedule. All tasks respect their manually entered dates, and dependency arrows are still drawn on the Gantt for visual reference even without scheduling. The critical path overlay will not be meaningful without a scheduling run, but all other features work normally.

In manual mode, DPlan does not warn you when a successor's start date precedes its predecessor's end date (a scheduling conflict). You must visually inspect the Gantt or run Auto Schedule to detect date conflicts.

See also: Critical Path, Dependencies, Calendar View.