Task Scheduling Task Dependencies All tasks are executed in an order such that a task's dependencies are satisfied when it is executed. Dependency relationships between tasks form a directed graph. Conflict Avoidance Sometimes a package installation order exists such that it is possible to avoid having two conflicting packages installed simultaneously. If a currently installed package conflicts with a new package that is planned to be installed, it may be possible to solve the conflict by replacing the installed package with a different package that occupies the same slot. In order to avoid a conflict, a package may need to be uninstalled in advance, rather than through replacement. The following constraints protect inappropriate packages from being chosen for automatic uninstallation: Installed packages that have been pulled into the current dependency graph will not be uninstalled. Due to dependency neglection, other checks may be necessary in order to protect inappropriate packages from being uninstalled. An installed package that is matched by a dependency atom from the "system" set will not be uninstalled in advance since it might not be safe. Such a package will be uninstalled through replacement. An installed package that is matched by a dependency atom from the "world" set will not be uninstalled if the dependency graph does not contain a replacement package that is matched by the same dependency atom. Circular Dependencies TODO: Automatically solve circular dependencies by temporarily disabling conditional dependencies and then rebuilding packages with the conditional dependencies enabled. Parallel Scheduling TODO: Spawn an appropriate number of tasks in parallel when desired.