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.
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:
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.
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.
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.
Working through the topologically sorted list:
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.
Starting from the project's latest Early Finish date (the end of the project), working backwards through the reverse-sorted task list:
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.
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.
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.
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.
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.
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.
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.
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.
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).
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 values on dependencies are respected during the forward pass:
After Auto Schedule completes, the recommended workflow is:
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.
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.
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.
See also: Critical Path, Dependencies, Calendar View.