summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.tasks/race-test.jsonl11
-rw-r--r--Omni/Task.hs4
-rw-r--r--Omni/Task/Core.hs3
3 files changed, 17 insertions, 1 deletions
diff --git a/.tasks/race-test.jsonl b/.tasks/race-test.jsonl
new file mode 100644
index 0000000..2e17f9c
--- /dev/null
+++ b/.tasks/race-test.jsonl
@@ -0,0 +1,11 @@
+{"taskCreatedAt":"2025-11-22T21:33:54.752434373Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2byx1t8z1","taskNamespace":null,"taskParent":null,"taskPriority":"P2","taskStatus":"Open","taskTitle":"Parent Epic","taskType":"Epic","taskUpdatedAt":"2025-11-22T21:33:54.752434373Z"}
+{"taskCreatedAt":"2025-11-22T21:33:54.752758527Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2byx1t8z1.1","taskNamespace":null,"taskParent":"t-1o2byx1t8z1","taskPriority":"P2","taskStatus":"Open","taskTitle":"Child 1","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T21:33:54.752758527Z"}
+{"taskCreatedAt":"2025-11-22T21:33:54.753099701Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2byx1t8z1.2","taskNamespace":null,"taskParent":"t-1o2byx1t8z1","taskPriority":"P2","taskStatus":"Open","taskTitle":"Child 2","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T21:33:54.753099701Z"}
+{"taskCreatedAt":"2025-11-22T21:33:54.753550846Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2byx1t8z1.3","taskNamespace":null,"taskParent":"t-1o2byx1t8z1","taskPriority":"P2","taskStatus":"Open","taskTitle":"Child 3","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T21:33:54.753550846Z"}
+{"taskCreatedAt":"2025-11-22T21:33:54.754014451Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2byx1t8z1.4","taskNamespace":null,"taskParent":"t-1o2byx1t8z1","taskPriority":"P2","taskStatus":"Open","taskTitle":"Child 4","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T21:33:54.754014451Z"}
+{"taskCreatedAt":"2025-11-22T21:33:54.754634988Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2byx1t8z1.5","taskNamespace":null,"taskParent":"t-1o2byx1t8z1","taskPriority":"P2","taskStatus":"Open","taskTitle":"Child 5","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T21:33:54.754634988Z"}
+{"taskCreatedAt":"2025-11-22T21:33:54.755593469Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2byx1t8z1.6","taskNamespace":null,"taskParent":"t-1o2byx1t8z1","taskPriority":"P2","taskStatus":"Open","taskTitle":"Child 6","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T21:33:54.755593469Z"}
+{"taskCreatedAt":"2025-11-22T21:33:54.756272977Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2byx1t8z1.7","taskNamespace":null,"taskParent":"t-1o2byx1t8z1","taskPriority":"P2","taskStatus":"Open","taskTitle":"Child 7","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T21:33:54.756272977Z"}
+{"taskCreatedAt":"2025-11-22T21:33:54.757042926Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2byx1t8z1.8","taskNamespace":null,"taskParent":"t-1o2byx1t8z1","taskPriority":"P2","taskStatus":"Open","taskTitle":"Child 8","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T21:33:54.757042926Z"}
+{"taskCreatedAt":"2025-11-22T21:33:54.757893206Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2byx1t8z1.9","taskNamespace":null,"taskParent":"t-1o2byx1t8z1","taskPriority":"P2","taskStatus":"Open","taskTitle":"Child 9","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T21:33:54.757893206Z"}
+{"taskCreatedAt":"2025-11-22T21:33:54.758810786Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2byx1t8z1.10","taskNamespace":null,"taskParent":"t-1o2byx1t8z1","taskPriority":"P2","taskStatus":"Open","taskTitle":"Child 10","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T21:33:54.758810786Z"}
diff --git a/Omni/Task.hs b/Omni/Task.hs
index 8abf551..82449db 100644
--- a/Omni/Task.hs
+++ b/Omni/Task.hs
@@ -435,6 +435,10 @@ unitTests =
-- Both should be ready since Related doesn't block
(taskId task1 `elem` map taskId ready) Test.@?= True
(taskId task2 `elem` map taskId ready) Test.@?= True,
+ Test.unit "ready tasks exclude epics" <| do
+ epic <- createTask "Epic task" Epic Nothing Nothing P2 [] Nothing
+ ready <- getReadyTasks
+ (taskId epic `notElem` map taskId ready) Test.@?= True,
Test.unit "child task gets sequential ID" <| do
parent <- createTask "Parent" Epic Nothing Nothing P2 [] Nothing
child1 <- createTask "Child 1" WorkTask (Just (taskId parent)) Nothing P2 [] Nothing
diff --git a/Omni/Task/Core.hs b/Omni/Task/Core.hs
index ebf5390..2f2cccb 100644
--- a/Omni/Task/Core.hs
+++ b/Omni/Task/Core.hs
@@ -454,7 +454,8 @@ getReadyTasks = do
-- Only Blocks and ParentChild dependencies block ready work
blockingDepIds task = [depId dep | dep <- taskDependencies task, depType dep `elem` [Blocks, ParentChild]]
isReady task =
- not (isParent (taskId task))
+ taskType task /= Epic
+ && not (isParent (taskId task))
&& all (`elem` doneIds) (blockingDepIds task)
pure <| filter isReady openTasks