diff --git a/cmd/task/main.go b/cmd/task/main.go
index d7853699eacdd6406531057c77fe0b3c8670c9c7..d65bbc215762363852ff9b0e50f28c81a478e1e6 100644
--- a/cmd/task/main.go
+++ b/cmd/task/main.go
@@ -107,7 +107,7 @@ func main() {
 	)
 	{
 		taskSvc = task.New(storage, storage, cache, logger)
-		taskListSvc = tasklist.New(storage, storage, logger)
+		taskListSvc = tasklist.New(storage, storage, cache, logger)
 		healthSvc = health.New()
 	}
 
diff --git a/design/design.go b/design/design.go
index f45c623c174bc345c7962ee523d1fefb796895fe..5d00d67e622e655271d7c4e1bb42298d64077604 100644
--- a/design/design.go
+++ b/design/design.go
@@ -72,12 +72,12 @@ var _ = Service("taskList", func() {
 		})
 	})
 
-	Method("TaskListResult", func() {
-		Description("TaskListResult retrieves a taskList result containing all tasks' unique IDs and statuses from the Cache service.")
-		Payload(TaskListResultRequest)
-		Result(TaskListStatus)
+	Method("TaskListStatus", func() {
+		Description("TaskListStatus retrieves a taskList status containing all tasks' unique IDs and statuses from the Cache service.")
+		Payload(TaskListStatusRequest)
+		Result(TaskListStatusResponse)
 		HTTP(func() {
-			GET("/v1/taskListResult/{taskListID}")
+			GET("/v1/taskListStatus/{taskListID}")
 			Response(StatusOK)
 			Response(StatusCreated, func() {
 				Tag("status", "created")
diff --git a/design/types.go b/design/types.go
index d8ee8780c205483ce9efa38dab5c5517c17cc5aa..963958847a65f58e0ee6773e3f452cfec2ada48d 100644
--- a/design/types.go
+++ b/design/types.go
@@ -34,12 +34,12 @@ var CreateTaskListResult = Type("CreateTaskListResult", func() {
 	Required("taskListID")
 })
 
-var TaskListResultRequest = Type("TaskListResultRequest", func() {
+var TaskListStatusRequest = Type("TaskListStatusRequest", func() {
 	Field(1, "taskListID", String, "Unique taskList identifier.")
 	Required("taskListID")
 })
 
-var TaskListStatus = Type("TaskListStatus", func() {
+var TaskListStatusResponse = Type("TaskListStatusResponse", func() {
 	Field(1, "id", String, "Unique taskList identifier.", func() {
 		Example("9cc9f504-2b7f-4e24-ac59-653e9533840a")
 	})
diff --git a/docs/task-list.md b/docs/task-list.md
index 5b2b4fcf9e170d9923132004f31ebbb840d56376..93fc8a0b8475373535265df05c3bc5fe28b05000 100644
--- a/docs/task-list.md
+++ b/docs/task-list.md
@@ -55,9 +55,70 @@ an input to the next. If one task fails to execute, all following tasks are mark
  - Parallel group execution: tasks within the group are executed in parallel and the results are dependant. If a task
 fails to execute, this does not affect the other tasks but the group is marked with failed status.
 
+### Task list State
+
 The state of the task list asynchronous execution is available later on the `result` endpoint:
 ```shell
-curl -v -X GET http://localhost:8082/v1/taskListResult/{taskListID}
+curl -v -X GET http://localhost:8082/v1/taskListStatus/{taskListID}
+```
+The state is returned as an HTTP status code.
+- Status code `200` for `Done` state;
+- Status code `201` for `Created` state;
+- Status code `202` for `Pending` state (the task list is being executed);
+- Status code `207` for `Failed` state (at least one task within the task list has failed).
+
+Example responses:
+
+HTTP Response code `200`: Done
+```json
+{
+  "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502",
+  "status": "done",
+  "groups": [
+    {
+      "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502",
+      "type": "sequential",
+      "status": "done",
+      "tasks": [
+        {
+          "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502",
+          "status": "done"
+        },
+        {
+          "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502",
+          "status": "done"
+        }
+      ]
+    }
+  ]
+}
+
+```
+
+HTTP Response code `207`: Failed
+```json
+{
+  "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502",
+  "status": "failed",
+  "groups": [
+    {
+      "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502",
+      "type": "sequential",
+      "status": "failed",
+      "tasks": [
+        {
+          "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502",
+          "status": "done"
+        },
+        {
+          "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502",
+          "status": "failed"
+        }
+      ]
+    }
+  ]
+}
+
 ```
 
 ### Task list Executor Configuration
diff --git a/gen/http/cli/task/cli.go b/gen/http/cli/task/cli.go
index 6b3a3f3d5d37ba1cb804e2c2ac470f682bb05d76..7d8da6e65411a28f6f6ea2a9baa0b2e99fae75d0 100644
--- a/gen/http/cli/task/cli.go
+++ b/gen/http/cli/task/cli.go
@@ -27,7 +27,7 @@ import (
 func UsageCommands() string {
 	return `health (liveness|readiness)
 task (create|task-result)
-task-list (create|task-list-result)
+task-list (create|task-list-status)
 `
 }
 
@@ -74,8 +74,8 @@ func ParseEndpoint(
 		taskListCreateCacheNamespaceFlag = taskListCreateFlags.String("cache-namespace", "", "")
 		taskListCreateCacheScopeFlag     = taskListCreateFlags.String("cache-scope", "", "")
 
-		taskListTaskListResultFlags          = flag.NewFlagSet("task-list-result", flag.ExitOnError)
-		taskListTaskListResultTaskListIDFlag = taskListTaskListResultFlags.String("task-list-id", "REQUIRED", "Unique taskList identifier.")
+		taskListTaskListStatusFlags          = flag.NewFlagSet("task-list-status", flag.ExitOnError)
+		taskListTaskListStatusTaskListIDFlag = taskListTaskListStatusFlags.String("task-list-id", "REQUIRED", "Unique taskList identifier.")
 	)
 	healthFlags.Usage = healthUsage
 	healthLivenessFlags.Usage = healthLivenessUsage
@@ -87,7 +87,7 @@ func ParseEndpoint(
 
 	taskListFlags.Usage = taskListUsage
 	taskListCreateFlags.Usage = taskListCreateUsage
-	taskListTaskListResultFlags.Usage = taskListTaskListResultUsage
+	taskListTaskListStatusFlags.Usage = taskListTaskListStatusUsage
 
 	if err := flag.CommandLine.Parse(os.Args[1:]); err != nil {
 		return nil, nil, err
@@ -150,8 +150,8 @@ func ParseEndpoint(
 			case "create":
 				epf = taskListCreateFlags
 
-			case "task-list-result":
-				epf = taskListTaskListResultFlags
+			case "task-list-status":
+				epf = taskListTaskListStatusFlags
 
 			}
 
@@ -201,9 +201,9 @@ func ParseEndpoint(
 			case "create":
 				endpoint = c.Create()
 				data, err = tasklistc.BuildCreatePayload(*taskListCreateBodyFlag, *taskListCreateTaskListNameFlag, *taskListCreateCacheNamespaceFlag, *taskListCreateCacheScopeFlag)
-			case "task-list-result":
-				endpoint = c.TaskListResult()
-				data, err = tasklistc.BuildTaskListResultPayload(*taskListTaskListResultTaskListIDFlag)
+			case "task-list-status":
+				endpoint = c.TaskListStatus()
+				data, err = tasklistc.BuildTaskListStatusPayload(*taskListTaskListStatusTaskListIDFlag)
 			}
 		}
 	}
@@ -296,7 +296,7 @@ Usage:
 
 COMMAND:
     create: Create a task list and corresponding tasks and put them in respective queues for execution.
-    task-list-result: TaskListResult retrieves a taskList result containing all tasks' unique IDs and statuses from the Cache service.
+    task-list-status: TaskListStatus retrieves a taskList status containing all tasks' unique IDs and statuses from the Cache service.
 
 Additional help:
     %[1]s task-list COMMAND --help
@@ -316,13 +316,13 @@ Example:
 `, os.Args[0])
 }
 
-func taskListTaskListResultUsage() {
-	fmt.Fprintf(os.Stderr, `%[1]s [flags] task-list task-list-result -task-list-id STRING
+func taskListTaskListStatusUsage() {
+	fmt.Fprintf(os.Stderr, `%[1]s [flags] task-list task-list-status -task-list-id STRING
 
-TaskListResult retrieves a taskList result containing all tasks' unique IDs and statuses from the Cache service.
+TaskListStatus retrieves a taskList status containing all tasks' unique IDs and statuses from the Cache service.
     -task-list-id STRING: Unique taskList identifier.
 
 Example:
-    %[1]s task-list task-list-result --task-list-id "Deserunt dolor et autem quidem fugiat sint."
+    %[1]s task-list task-list-status --task-list-id "Deserunt dolor et autem quidem fugiat sint."
 `, os.Args[0])
 }
diff --git a/gen/http/openapi.json b/gen/http/openapi.json
index 43127d6b53da9be51a4b015bc4a72d551923e9f9..601af302016673200a7a0a9579f49f0f789ffbf7 100644
--- a/gen/http/openapi.json
+++ b/gen/http/openapi.json
@@ -1 +1 @@
-{"swagger":"2.0","info":{"title":"Task Service","description":"The task service is executing tasks created from policies.","version":""},"host":"localhost:8082","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/v1/task/{taskName}":{"post":{"tags":["task"],"summary":"Create task","description":"Create a task and put it in a queue for execution.","operationId":"task#Create","parameters":[{"name":"taskName","in":"path","description":"Task name.","required":true,"type":"string"},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","required":false,"type":"string"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","required":false,"type":"string"},{"name":"any","in":"body","description":"Data contains JSON payload that will be used for task execution.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TaskCreateResponseBody","required":["taskID"]}}},"schemes":["http"]}},"/v1/taskList/{taskListName}":{"post":{"tags":["taskList"],"summary":"Create taskList","description":"Create a task list and corresponding tasks and put them in respective queues for execution.","operationId":"taskList#Create","parameters":[{"name":"taskListName","in":"path","description":"TaskList name.","required":true,"type":"string"},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","required":false,"type":"string"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","required":false,"type":"string"},{"name":"any","in":"body","description":"Data contains JSON payload that will be used for taskList execution.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TaskListCreateResponseBody","required":["taskListID"]}}},"schemes":["http"]}},"/v1/taskListResult/{taskListID}":{"get":{"tags":["taskList"],"summary":"TaskListResult taskList","description":"TaskListResult retrieves a taskList result containing all tasks' unique IDs and statuses from the Cache service.","operationId":"taskList#TaskListResult","parameters":[{"name":"taskListID","in":"path","description":"Unique taskList identifier.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TaskListTaskListResultOKResponseBody","required":["id","status"]}},"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TaskListTaskListResultCreatedResponseBody","required":["id","status"]}},"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/TaskListTaskListResultAcceptedResponseBody","required":["id","status"]}},"207":{"description":"Multi-Status response.","schema":{"$ref":"#/definitions/TaskListTaskListResultMultiStatusResponseBody","required":["id","status"]}}},"schemes":["http"]}},"/v1/taskResult/{taskID}":{"get":{"tags":["task"],"summary":"TaskResult task","description":"TaskResult retrieves task result from the Cache service.","operationId":"task#TaskResult","parameters":[{"name":"taskID","in":"path","description":"Unique task identifier.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"type":"string","format":"binary"}}},"schemes":["http"]}}},"definitions":{"GroupStatusResponseBody":{"title":"GroupStatusResponseBody","type":"object","properties":{"id":{"type":"string","description":"Unique group identifier.","example":"a7d1349d-34b5-4c65-b671-d1aa362fc446"},"status":{"type":"string","description":"Current status of the group","example":"done"},"tasks":{"type":"array","items":{"$ref":"#/definitions/TaskStatusResponseBody"},"description":"Array of TaskStatus","example":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"example":{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"TaskCreateResponseBody":{"title":"TaskCreateResponseBody","type":"object","properties":{"taskID":{"type":"string","description":"Unique task identifier.","example":"Sit asperiores."}},"example":{"taskID":"Iste suscipit exercitationem facilis distinctio asperiores ut."},"required":["taskID"]},"TaskListCreateResponseBody":{"title":"TaskListCreateResponseBody","type":"object","properties":{"taskListID":{"type":"string","description":"Unique taskList identifier.","example":"Ducimus velit."}},"example":{"taskListID":"Et occaecati placeat."},"required":["taskListID"]},"TaskListTaskListResultAcceptedResponseBody":{"title":"TaskListTaskListResultAcceptedResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskListTaskListResultCreatedResponseBody":{"title":"TaskListTaskListResultCreatedResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskListTaskListResultMultiStatusResponseBody":{"title":"TaskListTaskListResultMultiStatusResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskListTaskListResultOKResponseBody":{"title":"TaskListTaskListResultOKResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskStatusResponseBody":{"title":"TaskStatusResponseBody","type":"object","properties":{"id":{"type":"string","description":"Unique task identifier.","example":"d16996cd-1977-42a9-90b2-b4548a35c1b4"},"status":{"type":"string","description":"Current status of the task","example":"done"}},"example":{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}}}}
\ No newline at end of file
+{"swagger":"2.0","info":{"title":"Task Service","description":"The task service is executing tasks created from policies.","version":""},"host":"localhost:8082","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/v1/task/{taskName}":{"post":{"tags":["task"],"summary":"Create task","description":"Create a task and put it in a queue for execution.","operationId":"task#Create","parameters":[{"name":"taskName","in":"path","description":"Task name.","required":true,"type":"string"},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","required":false,"type":"string"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","required":false,"type":"string"},{"name":"any","in":"body","description":"Data contains JSON payload that will be used for task execution.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TaskCreateResponseBody","required":["taskID"]}}},"schemes":["http"]}},"/v1/taskList/{taskListName}":{"post":{"tags":["taskList"],"summary":"Create taskList","description":"Create a task list and corresponding tasks and put them in respective queues for execution.","operationId":"taskList#Create","parameters":[{"name":"taskListName","in":"path","description":"TaskList name.","required":true,"type":"string"},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","required":false,"type":"string"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","required":false,"type":"string"},{"name":"any","in":"body","description":"Data contains JSON payload that will be used for taskList execution.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TaskListCreateResponseBody","required":["taskListID"]}}},"schemes":["http"]}},"/v1/taskListStatus/{taskListID}":{"get":{"tags":["taskList"],"summary":"TaskListStatus taskList","description":"TaskListStatus retrieves a taskList status containing all tasks' unique IDs and statuses from the Cache service.","operationId":"taskList#TaskListStatus","parameters":[{"name":"taskListID","in":"path","description":"Unique taskList identifier.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TaskListTaskListStatusOKResponseBody","required":["id","status"]}},"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TaskListTaskListStatusCreatedResponseBody","required":["id","status"]}},"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/TaskListTaskListStatusAcceptedResponseBody","required":["id","status"]}},"207":{"description":"Multi-Status response.","schema":{"$ref":"#/definitions/TaskListTaskListStatusMultiStatusResponseBody","required":["id","status"]}}},"schemes":["http"]}},"/v1/taskResult/{taskID}":{"get":{"tags":["task"],"summary":"TaskResult task","description":"TaskResult retrieves task result from the Cache service.","operationId":"task#TaskResult","parameters":[{"name":"taskID","in":"path","description":"Unique task identifier.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"type":"string","format":"binary"}}},"schemes":["http"]}}},"definitions":{"GroupStatusResponseBody":{"title":"GroupStatusResponseBody","type":"object","properties":{"id":{"type":"string","description":"Unique group identifier.","example":"a7d1349d-34b5-4c65-b671-d1aa362fc446"},"status":{"type":"string","description":"Current status of the group","example":"done"},"tasks":{"type":"array","items":{"$ref":"#/definitions/TaskStatusResponseBody"},"description":"Array of TaskStatus","example":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"example":{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"TaskCreateResponseBody":{"title":"TaskCreateResponseBody","type":"object","properties":{"taskID":{"type":"string","description":"Unique task identifier.","example":"Sit asperiores."}},"example":{"taskID":"Iste suscipit exercitationem facilis distinctio asperiores ut."},"required":["taskID"]},"TaskListCreateResponseBody":{"title":"TaskListCreateResponseBody","type":"object","properties":{"taskListID":{"type":"string","description":"Unique taskList identifier.","example":"Ducimus velit."}},"example":{"taskListID":"Et occaecati placeat."},"required":["taskListID"]},"TaskListTaskListStatusAcceptedResponseBody":{"title":"TaskListTaskListStatusAcceptedResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskListTaskListStatusCreatedResponseBody":{"title":"TaskListTaskListStatusCreatedResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskListTaskListStatusMultiStatusResponseBody":{"title":"TaskListTaskListStatusMultiStatusResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskListTaskListStatusOKResponseBody":{"title":"TaskListTaskListStatusOKResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskStatusResponseBody":{"title":"TaskStatusResponseBody","type":"object","properties":{"id":{"type":"string","description":"Unique task identifier.","example":"d16996cd-1977-42a9-90b2-b4548a35c1b4"},"status":{"type":"string","description":"Current status of the task","example":"done"}},"example":{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}}}}
\ No newline at end of file
diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml
index 2a2676a5ee016aff4baa7de4b048349146d199a9..146c123cfe4b87233e515dd22263e68a0fbc2e3b 100644
--- a/gen/http/openapi.yaml
+++ b/gen/http/openapi.yaml
@@ -114,14 +114,14 @@ paths:
             - taskListID
       schemes:
       - http
-  /v1/taskListResult/{taskListID}:
+  /v1/taskListStatus/{taskListID}:
     get:
       tags:
       - taskList
-      summary: TaskListResult taskList
-      description: TaskListResult retrieves a taskList result containing all tasks'
+      summary: TaskListStatus taskList
+      description: TaskListStatus retrieves a taskList status containing all tasks'
         unique IDs and statuses from the Cache service.
-      operationId: taskList#TaskListResult
+      operationId: taskList#TaskListStatus
       parameters:
       - name: taskListID
         in: path
@@ -132,28 +132,28 @@ paths:
         "200":
           description: OK response.
           schema:
-            $ref: '#/definitions/TaskListTaskListResultOKResponseBody'
+            $ref: '#/definitions/TaskListTaskListStatusOKResponseBody'
             required:
             - id
             - status
         "201":
           description: Created response.
           schema:
-            $ref: '#/definitions/TaskListTaskListResultCreatedResponseBody'
+            $ref: '#/definitions/TaskListTaskListStatusCreatedResponseBody'
             required:
             - id
             - status
         "202":
           description: Accepted response.
           schema:
-            $ref: '#/definitions/TaskListTaskListResultAcceptedResponseBody'
+            $ref: '#/definitions/TaskListTaskListStatusAcceptedResponseBody'
             required:
             - id
             - status
         "207":
           description: Multi-Status response.
           schema:
-            $ref: '#/definitions/TaskListTaskListResultMultiStatusResponseBody'
+            $ref: '#/definitions/TaskListTaskListStatusMultiStatusResponseBody'
             required:
             - id
             - status
@@ -239,8 +239,8 @@ definitions:
       taskListID: Et occaecati placeat.
     required:
     - taskListID
-  TaskListTaskListResultAcceptedResponseBody:
-    title: TaskListTaskListResultAcceptedResponseBody
+  TaskListTaskListStatusAcceptedResponseBody:
+    title: TaskListTaskListStatusAcceptedResponseBody
     type: object
     properties:
       groups:
@@ -300,8 +300,8 @@ definitions:
     required:
     - id
     - status
-  TaskListTaskListResultCreatedResponseBody:
-    title: TaskListTaskListResultCreatedResponseBody
+  TaskListTaskListStatusCreatedResponseBody:
+    title: TaskListTaskListStatusCreatedResponseBody
     type: object
     properties:
       groups:
@@ -370,8 +370,8 @@ definitions:
     required:
     - id
     - status
-  TaskListTaskListResultMultiStatusResponseBody:
-    title: TaskListTaskListResultMultiStatusResponseBody
+  TaskListTaskListStatusMultiStatusResponseBody:
+    title: TaskListTaskListStatusMultiStatusResponseBody
     type: object
     properties:
       groups:
@@ -440,8 +440,8 @@ definitions:
     required:
     - id
     - status
-  TaskListTaskListResultOKResponseBody:
-    title: TaskListTaskListResultOKResponseBody
+  TaskListTaskListStatusOKResponseBody:
+    title: TaskListTaskListStatusOKResponseBody
     type: object
     properties:
       groups:
diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json
index 5ab27ada65fefff93d33a6ca0cbc68755f771907..8f5099289b24b762f05dc73a122416f2638d3d9e 100644
--- a/gen/http/openapi3.json
+++ b/gen/http/openapi3.json
@@ -1 +1 @@
-{"openapi":"3.0.3","info":{"title":"Task Service","description":"The task service is executing tasks created from policies.","version":"1.0"},"servers":[{"url":"http://localhost:8082","description":"Task Server"}],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}}}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}}}},"/v1/task/{taskName}":{"post":{"tags":["task"],"summary":"Create task","description":"Create a task and put it in a queue for execution.","operationId":"task#Create","parameters":[{"name":"taskName","in":"path","description":"Task name.","required":true,"schema":{"type":"string","description":"Task name.","example":"Voluptas laudantium incidunt autem eaque."},"example":"Fugit ut eius sint earum."},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key namespace","example":"login"},"example":"login"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key scope","example":"user"},"example":"user"}],"requestBody":{"description":"Data contains JSON payload that will be used for task execution.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Data contains JSON payload that will be used for task execution.","example":"Quos aut tempore enim porro.","format":"binary"},"example":"Consequatur nulla praesentium totam."}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaskResult"},"example":{"taskID":"Harum aut autem aliquam dolorem non soluta."}}}}}}},"/v1/taskList/{taskListName}":{"post":{"tags":["taskList"],"summary":"Create taskList","description":"Create a task list and corresponding tasks and put them in respective queues for execution.","operationId":"taskList#Create","parameters":[{"name":"taskListName","in":"path","description":"TaskList name.","required":true,"schema":{"type":"string","description":"TaskList name.","example":"Earum laborum accusamus id nihil."},"example":"Est eveniet dolores."},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key namespace","example":"login"},"example":"login"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key scope","example":"user"},"example":"user"}],"requestBody":{"description":"Data contains JSON payload that will be used for taskList execution.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Data contains JSON payload that will be used for taskList execution.","example":"Excepturi non.","format":"binary"},"example":"Laboriosam cumque."}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaskListResult"},"example":{"taskListID":"Et officiis aut."}}}}}}},"/v1/taskListResult/{taskListID}":{"get":{"tags":["taskList"],"summary":"TaskListResult taskList","description":"TaskListResult retrieves a taskList result containing all tasks' unique IDs and statuses from the Cache service.","operationId":"taskList#TaskListResult","parameters":[{"name":"taskListID","in":"path","description":"Unique taskList identifier.","required":true,"schema":{"type":"string","description":"Unique taskList identifier.","example":"Omnis optio magni sunt aliquid et."},"example":"Dignissimos doloribus rerum occaecati quia ut."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatus"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}},"201":{"description":"Created response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatus"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}},"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatus"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}},"207":{"description":"Multi-Status response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatus"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}}}}},"/v1/taskResult/{taskID}":{"get":{"tags":["task"],"summary":"TaskResult task","description":"TaskResult retrieves task result from the Cache service.","operationId":"task#TaskResult","parameters":[{"name":"taskID","in":"path","description":"Unique task identifier.","required":true,"schema":{"type":"string","description":"Unique task identifier.","example":"Doloremque earum aliquid ipsa."},"example":"Voluptas odit voluptate nobis nam quia quae."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"type":"string","example":"Voluptatem iure qui facilis aut.","format":"binary"},"example":"Maxime facilis."}}}}}}},"components":{"schemas":{"CreateTaskListResult":{"type":"object","properties":{"taskListID":{"type":"string","description":"Unique taskList identifier.","example":"Ut et est aut quae magnam."}},"example":{"taskListID":"Amet sapiente qui non."},"required":["taskListID"]},"CreateTaskResult":{"type":"object","properties":{"taskID":{"type":"string","description":"Unique task identifier.","example":"Qui vitae."}},"example":{"taskID":"Eligendi officiis repudiandae excepturi in ex ratione."},"required":["taskID"]},"GroupStatus":{"type":"object","properties":{"id":{"type":"string","description":"Unique group identifier.","example":"a7d1349d-34b5-4c65-b671-d1aa362fc446"},"status":{"type":"string","description":"Current status of the group","example":"done"},"tasks":{"type":"array","items":{"$ref":"#/components/schemas/TaskStatus"},"description":"Array of TaskStatus","example":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"example":{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"TaskListStatus":{"type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/components/schemas/GroupStatus"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskStatus":{"type":"object","properties":{"id":{"type":"string","description":"Unique task identifier.","example":"d16996cd-1977-42a9-90b2-b4548a35c1b4"},"status":{"type":"string","description":"Current status of the task","example":"done"}},"example":{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}}}},"tags":[{"name":"health","description":"Health service provides health check endpoints."},{"name":"task","description":"Task service provides endpoints to work with tasks."},{"name":"taskList","description":"TaskList service provides endpoints to work with task lists."}]}
\ No newline at end of file
+{"openapi":"3.0.3","info":{"title":"Task Service","description":"The task service is executing tasks created from policies.","version":"1.0"},"servers":[{"url":"http://localhost:8082","description":"Task Server"}],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}}}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}}}},"/v1/task/{taskName}":{"post":{"tags":["task"],"summary":"Create task","description":"Create a task and put it in a queue for execution.","operationId":"task#Create","parameters":[{"name":"taskName","in":"path","description":"Task name.","required":true,"schema":{"type":"string","description":"Task name.","example":"Voluptas laudantium incidunt autem eaque."},"example":"Fugit ut eius sint earum."},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key namespace","example":"login"},"example":"login"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key scope","example":"user"},"example":"user"}],"requestBody":{"description":"Data contains JSON payload that will be used for task execution.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Data contains JSON payload that will be used for task execution.","example":"Quos aut tempore enim porro.","format":"binary"},"example":"Consequatur nulla praesentium totam."}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaskResult"},"example":{"taskID":"Harum aut autem aliquam dolorem non soluta."}}}}}}},"/v1/taskList/{taskListName}":{"post":{"tags":["taskList"],"summary":"Create taskList","description":"Create a task list and corresponding tasks and put them in respective queues for execution.","operationId":"taskList#Create","parameters":[{"name":"taskListName","in":"path","description":"TaskList name.","required":true,"schema":{"type":"string","description":"TaskList name.","example":"Earum laborum accusamus id nihil."},"example":"Est eveniet dolores."},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key namespace","example":"login"},"example":"login"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key scope","example":"user"},"example":"user"}],"requestBody":{"description":"Data contains JSON payload that will be used for taskList execution.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Data contains JSON payload that will be used for taskList execution.","example":"Excepturi non.","format":"binary"},"example":"Laboriosam cumque."}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaskListResult"},"example":{"taskListID":"Et officiis aut."}}}}}}},"/v1/taskListStatus/{taskListID}":{"get":{"tags":["taskList"],"summary":"TaskListStatus taskList","description":"TaskListStatus retrieves a taskList status containing all tasks' unique IDs and statuses from the Cache service.","operationId":"taskList#TaskListStatus","parameters":[{"name":"taskListID","in":"path","description":"Unique taskList identifier.","required":true,"schema":{"type":"string","description":"Unique taskList identifier.","example":"Omnis optio magni sunt aliquid et."},"example":"Dignissimos doloribus rerum occaecati quia ut."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatusResponse"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}},"201":{"description":"Created response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatusResponse"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}},"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatusResponse"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}},"207":{"description":"Multi-Status response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatusResponse"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}}}}},"/v1/taskResult/{taskID}":{"get":{"tags":["task"],"summary":"TaskResult task","description":"TaskResult retrieves task result from the Cache service.","operationId":"task#TaskResult","parameters":[{"name":"taskID","in":"path","description":"Unique task identifier.","required":true,"schema":{"type":"string","description":"Unique task identifier.","example":"Doloremque earum aliquid ipsa."},"example":"Voluptas odit voluptate nobis nam quia quae."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"type":"string","example":"Voluptatem iure qui facilis aut.","format":"binary"},"example":"Maxime facilis."}}}}}}},"components":{"schemas":{"CreateTaskListResult":{"type":"object","properties":{"taskListID":{"type":"string","description":"Unique taskList identifier.","example":"Ut et est aut quae magnam."}},"example":{"taskListID":"Amet sapiente qui non."},"required":["taskListID"]},"CreateTaskResult":{"type":"object","properties":{"taskID":{"type":"string","description":"Unique task identifier.","example":"Qui vitae."}},"example":{"taskID":"Eligendi officiis repudiandae excepturi in ex ratione."},"required":["taskID"]},"GroupStatus":{"type":"object","properties":{"id":{"type":"string","description":"Unique group identifier.","example":"a7d1349d-34b5-4c65-b671-d1aa362fc446"},"status":{"type":"string","description":"Current status of the group","example":"done"},"tasks":{"type":"array","items":{"$ref":"#/components/schemas/TaskStatus"},"description":"Array of TaskStatus","example":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"example":{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"TaskListStatusResponse":{"type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/components/schemas/GroupStatus"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskStatus":{"type":"object","properties":{"id":{"type":"string","description":"Unique task identifier.","example":"d16996cd-1977-42a9-90b2-b4548a35c1b4"},"status":{"type":"string","description":"Current status of the task","example":"done"}},"example":{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}}}},"tags":[{"name":"health","description":"Health service provides health check endpoints."},{"name":"task","description":"Task service provides endpoints to work with tasks."},{"name":"taskList","description":"TaskList service provides endpoints to work with task lists."}]}
\ No newline at end of file
diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml
index 5f2410bff1140b90b9871ea7af5fd284be6f8cf1..d17d648965ac3f2296118f7339a9e6572e5acc30 100644
--- a/gen/http/openapi3.yaml
+++ b/gen/http/openapi3.yaml
@@ -137,14 +137,14 @@ paths:
                 $ref: '#/components/schemas/CreateTaskListResult'
               example:
                 taskListID: Et officiis aut.
-  /v1/taskListResult/{taskListID}:
+  /v1/taskListStatus/{taskListID}:
     get:
       tags:
       - taskList
-      summary: TaskListResult taskList
-      description: TaskListResult retrieves a taskList result containing all tasks'
+      summary: TaskListStatus taskList
+      description: TaskListStatus retrieves a taskList status containing all tasks'
         unique IDs and statuses from the Cache service.
-      operationId: taskList#TaskListResult
+      operationId: taskList#TaskListStatus
       parameters:
       - name: taskListID
         in: path
@@ -161,7 +161,7 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/TaskListStatus'
+                $ref: '#/components/schemas/TaskListStatusResponse'
               example:
                 groups:
                 - id: a7d1349d-34b5-4c65-b671-d1aa362fc446
@@ -189,7 +189,7 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/TaskListStatus'
+                $ref: '#/components/schemas/TaskListStatusResponse'
               example:
                 groups:
                 - id: a7d1349d-34b5-4c65-b671-d1aa362fc446
@@ -217,7 +217,7 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/TaskListStatus'
+                $ref: '#/components/schemas/TaskListStatusResponse'
               example:
                 groups:
                 - id: a7d1349d-34b5-4c65-b671-d1aa362fc446
@@ -263,7 +263,7 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/TaskListStatus'
+                $ref: '#/components/schemas/TaskListStatusResponse'
               example:
                 groups:
                 - id: a7d1349d-34b5-4c65-b671-d1aa362fc446
@@ -390,7 +390,7 @@ components:
           status: done
         - id: d16996cd-1977-42a9-90b2-b4548a35c1b4
           status: done
-    TaskListStatus:
+    TaskListStatusResponse:
       type: object
       properties:
         groups:
diff --git a/gen/http/task_list/client/cli.go b/gen/http/task_list/client/cli.go
index b3fea488aa37bcc93f8967c8c44a776705ab9787..b3449cf7f1e7114502127e44463c24429e85bbde 100644
--- a/gen/http/task_list/client/cli.go
+++ b/gen/http/task_list/client/cli.go
@@ -52,14 +52,14 @@ func BuildCreatePayload(taskListCreateBody string, taskListCreateTaskListName st
 	return res, nil
 }
 
-// BuildTaskListResultPayload builds the payload for the taskList
-// TaskListResult endpoint from CLI flags.
-func BuildTaskListResultPayload(taskListTaskListResultTaskListID string) (*tasklist.TaskListResultRequest, error) {
+// BuildTaskListStatusPayload builds the payload for the taskList
+// TaskListStatus endpoint from CLI flags.
+func BuildTaskListStatusPayload(taskListTaskListStatusTaskListID string) (*tasklist.TaskListStatusRequest, error) {
 	var taskListID string
 	{
-		taskListID = taskListTaskListResultTaskListID
+		taskListID = taskListTaskListStatusTaskListID
 	}
-	v := &tasklist.TaskListResultRequest{}
+	v := &tasklist.TaskListStatusRequest{}
 	v.TaskListID = taskListID
 
 	return v, nil
diff --git a/gen/http/task_list/client/client.go b/gen/http/task_list/client/client.go
index 85ce0ec093f453b75b89dbc8f0f51cc0a91893ad..4bc5df02bd6e9419c971ea460c57ca3f1d1d2324 100644
--- a/gen/http/task_list/client/client.go
+++ b/gen/http/task_list/client/client.go
@@ -20,9 +20,9 @@ type Client struct {
 	// Create Doer is the HTTP client used to make requests to the Create endpoint.
 	CreateDoer goahttp.Doer
 
-	// TaskListResult Doer is the HTTP client used to make requests to the
-	// TaskListResult endpoint.
-	TaskListResultDoer goahttp.Doer
+	// TaskListStatus Doer is the HTTP client used to make requests to the
+	// TaskListStatus endpoint.
+	TaskListStatusDoer goahttp.Doer
 
 	// RestoreResponseBody controls whether the response bodies are reset after
 	// decoding so they can be read again.
@@ -45,7 +45,7 @@ func NewClient(
 ) *Client {
 	return &Client{
 		CreateDoer:          doer,
-		TaskListResultDoer:  doer,
+		TaskListStatusDoer:  doer,
 		RestoreResponseBody: restoreBody,
 		scheme:              scheme,
 		host:                host,
@@ -78,20 +78,20 @@ func (c *Client) Create() goa.Endpoint {
 	}
 }
 
-// TaskListResult returns an endpoint that makes HTTP requests to the taskList
-// service TaskListResult server.
-func (c *Client) TaskListResult() goa.Endpoint {
+// TaskListStatus returns an endpoint that makes HTTP requests to the taskList
+// service TaskListStatus server.
+func (c *Client) TaskListStatus() goa.Endpoint {
 	var (
-		decodeResponse = DecodeTaskListResultResponse(c.decoder, c.RestoreResponseBody)
+		decodeResponse = DecodeTaskListStatusResponse(c.decoder, c.RestoreResponseBody)
 	)
 	return func(ctx context.Context, v interface{}) (interface{}, error) {
-		req, err := c.BuildTaskListResultRequest(ctx, v)
+		req, err := c.BuildTaskListStatusRequest(ctx, v)
 		if err != nil {
 			return nil, err
 		}
-		resp, err := c.TaskListResultDoer.Do(req)
+		resp, err := c.TaskListStatusDoer.Do(req)
 		if err != nil {
-			return nil, goahttp.ErrRequestError("taskList", "TaskListResult", err)
+			return nil, goahttp.ErrRequestError("taskList", "TaskListStatus", err)
 		}
 		return decodeResponse(resp)
 	}
diff --git a/gen/http/task_list/client/encode_decode.go b/gen/http/task_list/client/encode_decode.go
index 039233fa76cca534b124596950649d188223c455..7f5bc119a002da0c6476876d47d7020e3d26acee 100644
--- a/gen/http/task_list/client/encode_decode.go
+++ b/gen/http/task_list/client/encode_decode.go
@@ -107,23 +107,23 @@ func DecodeCreateResponse(decoder func(*http.Response) goahttp.Decoder, restoreB
 	}
 }
 
-// BuildTaskListResultRequest instantiates a HTTP request object with method
-// and path set to call the "taskList" service "TaskListResult" endpoint
-func (c *Client) BuildTaskListResultRequest(ctx context.Context, v interface{}) (*http.Request, error) {
+// BuildTaskListStatusRequest instantiates a HTTP request object with method
+// and path set to call the "taskList" service "TaskListStatus" endpoint
+func (c *Client) BuildTaskListStatusRequest(ctx context.Context, v interface{}) (*http.Request, error) {
 	var (
 		taskListID string
 	)
 	{
-		p, ok := v.(*tasklist.TaskListResultRequest)
+		p, ok := v.(*tasklist.TaskListStatusRequest)
 		if !ok {
-			return nil, goahttp.ErrInvalidType("taskList", "TaskListResult", "*tasklist.TaskListResultRequest", v)
+			return nil, goahttp.ErrInvalidType("taskList", "TaskListStatus", "*tasklist.TaskListStatusRequest", v)
 		}
 		taskListID = p.TaskListID
 	}
-	u := &url.URL{Scheme: c.scheme, Host: c.host, Path: TaskListResultTaskListPath(taskListID)}
+	u := &url.URL{Scheme: c.scheme, Host: c.host, Path: TaskListStatusTaskListPath(taskListID)}
 	req, err := http.NewRequest("GET", u.String(), nil)
 	if err != nil {
-		return nil, goahttp.ErrInvalidURL("taskList", "TaskListResult", u.String(), err)
+		return nil, goahttp.ErrInvalidURL("taskList", "TaskListStatus", u.String(), err)
 	}
 	if ctx != nil {
 		req = req.WithContext(ctx)
@@ -132,10 +132,10 @@ func (c *Client) BuildTaskListResultRequest(ctx context.Context, v interface{})
 	return req, nil
 }
 
-// DecodeTaskListResultResponse returns a decoder for responses returned by the
-// taskList TaskListResult endpoint. restoreBody controls whether the response
+// DecodeTaskListStatusResponse returns a decoder for responses returned by the
+// taskList TaskListStatus endpoint. restoreBody controls whether the response
 // body should be restored after having been read.
-func DecodeTaskListResultResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (interface{}, error) {
+func DecodeTaskListStatusResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (interface{}, error) {
 	return func(resp *http.Response) (interface{}, error) {
 		if restoreBody {
 			b, err := ioutil.ReadAll(resp.Body)
@@ -152,70 +152,70 @@ func DecodeTaskListResultResponse(decoder func(*http.Response) goahttp.Decoder,
 		switch resp.StatusCode {
 		case http.StatusMultiStatus:
 			var (
-				body TaskListResultMultiStatusResponseBody
+				body TaskListStatusMultiStatusResponseBody
 				err  error
 			)
 			err = decoder(resp).Decode(&body)
 			if err != nil {
-				return nil, goahttp.ErrDecodingError("taskList", "TaskListResult", err)
+				return nil, goahttp.ErrDecodingError("taskList", "TaskListStatus", err)
 			}
-			err = ValidateTaskListResultMultiStatusResponseBody(&body)
+			err = ValidateTaskListStatusMultiStatusResponseBody(&body)
 			if err != nil {
-				return nil, goahttp.ErrValidationError("taskList", "TaskListResult", err)
+				return nil, goahttp.ErrValidationError("taskList", "TaskListStatus", err)
 			}
-			res := NewTaskListResultTaskListStatusMultiStatus(&body)
+			res := NewTaskListStatusResponseMultiStatus(&body)
 			res.Status = "failed"
 			return res, nil
 		case http.StatusCreated:
 			var (
-				body TaskListResultCreatedResponseBody
+				body TaskListStatusCreatedResponseBody
 				err  error
 			)
 			err = decoder(resp).Decode(&body)
 			if err != nil {
-				return nil, goahttp.ErrDecodingError("taskList", "TaskListResult", err)
+				return nil, goahttp.ErrDecodingError("taskList", "TaskListStatus", err)
 			}
-			err = ValidateTaskListResultCreatedResponseBody(&body)
+			err = ValidateTaskListStatusCreatedResponseBody(&body)
 			if err != nil {
-				return nil, goahttp.ErrValidationError("taskList", "TaskListResult", err)
+				return nil, goahttp.ErrValidationError("taskList", "TaskListStatus", err)
 			}
-			res := NewTaskListResultTaskListStatusCreated(&body)
+			res := NewTaskListStatusResponseCreated(&body)
 			res.Status = "created"
 			return res, nil
 		case http.StatusAccepted:
 			var (
-				body TaskListResultAcceptedResponseBody
+				body TaskListStatusAcceptedResponseBody
 				err  error
 			)
 			err = decoder(resp).Decode(&body)
 			if err != nil {
-				return nil, goahttp.ErrDecodingError("taskList", "TaskListResult", err)
+				return nil, goahttp.ErrDecodingError("taskList", "TaskListStatus", err)
 			}
-			err = ValidateTaskListResultAcceptedResponseBody(&body)
+			err = ValidateTaskListStatusAcceptedResponseBody(&body)
 			if err != nil {
-				return nil, goahttp.ErrValidationError("taskList", "TaskListResult", err)
+				return nil, goahttp.ErrValidationError("taskList", "TaskListStatus", err)
 			}
-			res := NewTaskListResultTaskListStatusAccepted(&body)
+			res := NewTaskListStatusResponseAccepted(&body)
 			res.Status = "pending"
 			return res, nil
 		case http.StatusOK:
 			var (
-				body TaskListResultOKResponseBody
+				body TaskListStatusOKResponseBody
 				err  error
 			)
 			err = decoder(resp).Decode(&body)
 			if err != nil {
-				return nil, goahttp.ErrDecodingError("taskList", "TaskListResult", err)
+				return nil, goahttp.ErrDecodingError("taskList", "TaskListStatus", err)
 			}
-			err = ValidateTaskListResultOKResponseBody(&body)
+			err = ValidateTaskListStatusOKResponseBody(&body)
 			if err != nil {
-				return nil, goahttp.ErrValidationError("taskList", "TaskListResult", err)
+				return nil, goahttp.ErrValidationError("taskList", "TaskListStatus", err)
 			}
-			res := NewTaskListResultTaskListStatusOK(&body)
+			res := NewTaskListStatusResponseOK(&body)
 			return res, nil
 		default:
 			body, _ := ioutil.ReadAll(resp.Body)
-			return nil, goahttp.ErrInvalidResponse("taskList", "TaskListResult", resp.StatusCode, string(body))
+			return nil, goahttp.ErrInvalidResponse("taskList", "TaskListStatus", resp.StatusCode, string(body))
 		}
 	}
 }
diff --git a/gen/http/task_list/client/paths.go b/gen/http/task_list/client/paths.go
index ffe9998cace94691d4b97e2d7c5c8debd708cc1e..1409e86fb538f04ee09088fc8b2a9430b0ca2dcb 100644
--- a/gen/http/task_list/client/paths.go
+++ b/gen/http/task_list/client/paths.go
@@ -16,7 +16,7 @@ func CreateTaskListPath(taskListName string) string {
 	return fmt.Sprintf("/v1/taskList/%v", taskListName)
 }
 
-// TaskListResultTaskListPath returns the URL path to the taskList service TaskListResult HTTP endpoint.
-func TaskListResultTaskListPath(taskListID string) string {
-	return fmt.Sprintf("/v1/taskListResult/%v", taskListID)
+// TaskListStatusTaskListPath returns the URL path to the taskList service TaskListStatus HTTP endpoint.
+func TaskListStatusTaskListPath(taskListID string) string {
+	return fmt.Sprintf("/v1/taskListStatus/%v", taskListID)
 }
diff --git a/gen/http/task_list/client/types.go b/gen/http/task_list/client/types.go
index 0aac928cea6267732c3a6ffb0cf3d481e38cdcfb..6233bd9199aa079cb82b1d931482e7931dd6eb24 100644
--- a/gen/http/task_list/client/types.go
+++ b/gen/http/task_list/client/types.go
@@ -19,9 +19,9 @@ type CreateResponseBody struct {
 	TaskListID *string `form:"taskListID,omitempty" json:"taskListID,omitempty" xml:"taskListID,omitempty"`
 }
 
-// TaskListResultMultiStatusResponseBody is the type of the "taskList" service
-// "TaskListResult" endpoint HTTP response body.
-type TaskListResultMultiStatusResponseBody struct {
+// TaskListStatusMultiStatusResponseBody is the type of the "taskList" service
+// "TaskListStatus" endpoint HTTP response body.
+type TaskListStatusMultiStatusResponseBody struct {
 	// Unique taskList identifier.
 	ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"`
 	// Current status of the taskList
@@ -30,9 +30,9 @@ type TaskListResultMultiStatusResponseBody struct {
 	Groups []*GroupStatusResponseBody `form:"groups,omitempty" json:"groups,omitempty" xml:"groups,omitempty"`
 }
 
-// TaskListResultCreatedResponseBody is the type of the "taskList" service
-// "TaskListResult" endpoint HTTP response body.
-type TaskListResultCreatedResponseBody struct {
+// TaskListStatusCreatedResponseBody is the type of the "taskList" service
+// "TaskListStatus" endpoint HTTP response body.
+type TaskListStatusCreatedResponseBody struct {
 	// Unique taskList identifier.
 	ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"`
 	// Current status of the taskList
@@ -41,9 +41,9 @@ type TaskListResultCreatedResponseBody struct {
 	Groups []*GroupStatusResponseBody `form:"groups,omitempty" json:"groups,omitempty" xml:"groups,omitempty"`
 }
 
-// TaskListResultAcceptedResponseBody is the type of the "taskList" service
-// "TaskListResult" endpoint HTTP response body.
-type TaskListResultAcceptedResponseBody struct {
+// TaskListStatusAcceptedResponseBody is the type of the "taskList" service
+// "TaskListStatus" endpoint HTTP response body.
+type TaskListStatusAcceptedResponseBody struct {
 	// Unique taskList identifier.
 	ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"`
 	// Current status of the taskList
@@ -52,9 +52,9 @@ type TaskListResultAcceptedResponseBody struct {
 	Groups []*GroupStatusResponseBody `form:"groups,omitempty" json:"groups,omitempty" xml:"groups,omitempty"`
 }
 
-// TaskListResultOKResponseBody is the type of the "taskList" service
-// "TaskListResult" endpoint HTTP response body.
-type TaskListResultOKResponseBody struct {
+// TaskListStatusOKResponseBody is the type of the "taskList" service
+// "TaskListStatus" endpoint HTTP response body.
+type TaskListStatusOKResponseBody struct {
 	// Unique taskList identifier.
 	ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"`
 	// Current status of the taskList
@@ -91,10 +91,10 @@ func NewCreateTaskListResultOK(body *CreateResponseBody) *tasklist.CreateTaskLis
 	return v
 }
 
-// NewTaskListResultTaskListStatusMultiStatus builds a "taskList" service
-// "TaskListResult" endpoint result from a HTTP "MultiStatus" response.
-func NewTaskListResultTaskListStatusMultiStatus(body *TaskListResultMultiStatusResponseBody) *tasklist.TaskListStatus {
-	v := &tasklist.TaskListStatus{
+// NewTaskListStatusResponseMultiStatus builds a "taskList" service
+// "TaskListStatus" endpoint result from a HTTP "MultiStatus" response.
+func NewTaskListStatusResponseMultiStatus(body *TaskListStatusMultiStatusResponseBody) *tasklist.TaskListStatusResponse {
+	v := &tasklist.TaskListStatusResponse{
 		ID:     *body.ID,
 		Status: *body.Status,
 	}
@@ -108,10 +108,10 @@ func NewTaskListResultTaskListStatusMultiStatus(body *TaskListResultMultiStatusR
 	return v
 }
 
-// NewTaskListResultTaskListStatusCreated builds a "taskList" service
-// "TaskListResult" endpoint result from a HTTP "Created" response.
-func NewTaskListResultTaskListStatusCreated(body *TaskListResultCreatedResponseBody) *tasklist.TaskListStatus {
-	v := &tasklist.TaskListStatus{
+// NewTaskListStatusResponseCreated builds a "taskList" service
+// "TaskListStatus" endpoint result from a HTTP "Created" response.
+func NewTaskListStatusResponseCreated(body *TaskListStatusCreatedResponseBody) *tasklist.TaskListStatusResponse {
+	v := &tasklist.TaskListStatusResponse{
 		ID:     *body.ID,
 		Status: *body.Status,
 	}
@@ -125,10 +125,10 @@ func NewTaskListResultTaskListStatusCreated(body *TaskListResultCreatedResponseB
 	return v
 }
 
-// NewTaskListResultTaskListStatusAccepted builds a "taskList" service
-// "TaskListResult" endpoint result from a HTTP "Accepted" response.
-func NewTaskListResultTaskListStatusAccepted(body *TaskListResultAcceptedResponseBody) *tasklist.TaskListStatus {
-	v := &tasklist.TaskListStatus{
+// NewTaskListStatusResponseAccepted builds a "taskList" service
+// "TaskListStatus" endpoint result from a HTTP "Accepted" response.
+func NewTaskListStatusResponseAccepted(body *TaskListStatusAcceptedResponseBody) *tasklist.TaskListStatusResponse {
+	v := &tasklist.TaskListStatusResponse{
 		ID:     *body.ID,
 		Status: *body.Status,
 	}
@@ -142,10 +142,10 @@ func NewTaskListResultTaskListStatusAccepted(body *TaskListResultAcceptedRespons
 	return v
 }
 
-// NewTaskListResultTaskListStatusOK builds a "taskList" service
-// "TaskListResult" endpoint result from a HTTP "OK" response.
-func NewTaskListResultTaskListStatusOK(body *TaskListResultOKResponseBody) *tasklist.TaskListStatus {
-	v := &tasklist.TaskListStatus{
+// NewTaskListStatusResponseOK builds a "taskList" service "TaskListStatus"
+// endpoint result from a HTTP "OK" response.
+func NewTaskListStatusResponseOK(body *TaskListStatusOKResponseBody) *tasklist.TaskListStatusResponse {
+	v := &tasklist.TaskListStatusResponse{
 		ID:     *body.ID,
 		Status: *body.Status,
 	}
@@ -167,9 +167,9 @@ func ValidateCreateResponseBody(body *CreateResponseBody) (err error) {
 	return
 }
 
-// ValidateTaskListResultMultiStatusResponseBody runs the validations defined
-// on TaskListResultMulti-StatusResponseBody
-func ValidateTaskListResultMultiStatusResponseBody(body *TaskListResultMultiStatusResponseBody) (err error) {
+// ValidateTaskListStatusMultiStatusResponseBody runs the validations defined
+// on TaskListStatusMulti-StatusResponseBody
+func ValidateTaskListStatusMultiStatusResponseBody(body *TaskListStatusMultiStatusResponseBody) (err error) {
 	if body.ID == nil {
 		err = goa.MergeErrors(err, goa.MissingFieldError("id", "body"))
 	}
@@ -179,9 +179,9 @@ func ValidateTaskListResultMultiStatusResponseBody(body *TaskListResultMultiStat
 	return
 }
 
-// ValidateTaskListResultCreatedResponseBody runs the validations defined on
-// TaskListResultCreatedResponseBody
-func ValidateTaskListResultCreatedResponseBody(body *TaskListResultCreatedResponseBody) (err error) {
+// ValidateTaskListStatusCreatedResponseBody runs the validations defined on
+// TaskListStatusCreatedResponseBody
+func ValidateTaskListStatusCreatedResponseBody(body *TaskListStatusCreatedResponseBody) (err error) {
 	if body.ID == nil {
 		err = goa.MergeErrors(err, goa.MissingFieldError("id", "body"))
 	}
@@ -191,9 +191,9 @@ func ValidateTaskListResultCreatedResponseBody(body *TaskListResultCreatedRespon
 	return
 }
 
-// ValidateTaskListResultAcceptedResponseBody runs the validations defined on
-// TaskListResultAcceptedResponseBody
-func ValidateTaskListResultAcceptedResponseBody(body *TaskListResultAcceptedResponseBody) (err error) {
+// ValidateTaskListStatusAcceptedResponseBody runs the validations defined on
+// TaskListStatusAcceptedResponseBody
+func ValidateTaskListStatusAcceptedResponseBody(body *TaskListStatusAcceptedResponseBody) (err error) {
 	if body.ID == nil {
 		err = goa.MergeErrors(err, goa.MissingFieldError("id", "body"))
 	}
@@ -203,9 +203,9 @@ func ValidateTaskListResultAcceptedResponseBody(body *TaskListResultAcceptedResp
 	return
 }
 
-// ValidateTaskListResultOKResponseBody runs the validations defined on
-// TaskListResultOKResponseBody
-func ValidateTaskListResultOKResponseBody(body *TaskListResultOKResponseBody) (err error) {
+// ValidateTaskListStatusOKResponseBody runs the validations defined on
+// TaskListStatusOKResponseBody
+func ValidateTaskListStatusOKResponseBody(body *TaskListStatusOKResponseBody) (err error) {
 	if body.ID == nil {
 		err = goa.MergeErrors(err, goa.MissingFieldError("id", "body"))
 	}
diff --git a/gen/http/task_list/server/encode_decode.go b/gen/http/task_list/server/encode_decode.go
index 1766a79f08acf5abe52d05512c8746c6f98b2ec4..20ca784942a5b088f13f737d28571dc7bc7954ab 100644
--- a/gen/http/task_list/server/encode_decode.go
+++ b/gen/http/task_list/server/encode_decode.go
@@ -67,39 +67,39 @@ func DecodeCreateRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.
 	}
 }
 
-// EncodeTaskListResultResponse returns an encoder for responses returned by
-// the taskList TaskListResult endpoint.
-func EncodeTaskListResultResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, interface{}) error {
+// EncodeTaskListStatusResponse returns an encoder for responses returned by
+// the taskList TaskListStatus endpoint.
+func EncodeTaskListStatusResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, interface{}) error {
 	return func(ctx context.Context, w http.ResponseWriter, v interface{}) error {
-		res, _ := v.(*tasklist.TaskListStatus)
+		res, _ := v.(*tasklist.TaskListStatusResponse)
 		if res.Status == "failed" {
 			enc := encoder(ctx, w)
-			body := NewTaskListResultMultiStatusResponseBody(res)
+			body := NewTaskListStatusMultiStatusResponseBody(res)
 			w.WriteHeader(http.StatusMultiStatus)
 			return enc.Encode(body)
 		}
 		if res.Status == "created" {
 			enc := encoder(ctx, w)
-			body := NewTaskListResultCreatedResponseBody(res)
+			body := NewTaskListStatusCreatedResponseBody(res)
 			w.WriteHeader(http.StatusCreated)
 			return enc.Encode(body)
 		}
 		if res.Status == "pending" {
 			enc := encoder(ctx, w)
-			body := NewTaskListResultAcceptedResponseBody(res)
+			body := NewTaskListStatusAcceptedResponseBody(res)
 			w.WriteHeader(http.StatusAccepted)
 			return enc.Encode(body)
 		}
 		enc := encoder(ctx, w)
-		body := NewTaskListResultOKResponseBody(res)
+		body := NewTaskListStatusOKResponseBody(res)
 		w.WriteHeader(http.StatusOK)
 		return enc.Encode(body)
 	}
 }
 
-// DecodeTaskListResultRequest returns a decoder for requests sent to the
-// taskList TaskListResult endpoint.
-func DecodeTaskListResultRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (interface{}, error) {
+// DecodeTaskListStatusRequest returns a decoder for requests sent to the
+// taskList TaskListStatus endpoint.
+func DecodeTaskListStatusRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (interface{}, error) {
 	return func(r *http.Request) (interface{}, error) {
 		var (
 			taskListID string
@@ -107,7 +107,7 @@ func DecodeTaskListResultRequest(mux goahttp.Muxer, decoder func(*http.Request)
 			params = mux.Vars(r)
 		)
 		taskListID = params["taskListID"]
-		payload := NewTaskListResultRequest(taskListID)
+		payload := NewTaskListStatusRequest(taskListID)
 
 		return payload, nil
 	}
diff --git a/gen/http/task_list/server/paths.go b/gen/http/task_list/server/paths.go
index d00af8a7ef452988e0e7caec0e51d8035b499b5f..ccdd062b3b76273771d5a5cf5f2d0b68919884cf 100644
--- a/gen/http/task_list/server/paths.go
+++ b/gen/http/task_list/server/paths.go
@@ -16,7 +16,7 @@ func CreateTaskListPath(taskListName string) string {
 	return fmt.Sprintf("/v1/taskList/%v", taskListName)
 }
 
-// TaskListResultTaskListPath returns the URL path to the taskList service TaskListResult HTTP endpoint.
-func TaskListResultTaskListPath(taskListID string) string {
-	return fmt.Sprintf("/v1/taskListResult/%v", taskListID)
+// TaskListStatusTaskListPath returns the URL path to the taskList service TaskListStatus HTTP endpoint.
+func TaskListStatusTaskListPath(taskListID string) string {
+	return fmt.Sprintf("/v1/taskListStatus/%v", taskListID)
 }
diff --git a/gen/http/task_list/server/server.go b/gen/http/task_list/server/server.go
index 0689f32a88bdad16b1000185e1998c02a1415558..648c3f3ead27c3fbba1576ad0868f9f49102529a 100644
--- a/gen/http/task_list/server/server.go
+++ b/gen/http/task_list/server/server.go
@@ -20,7 +20,7 @@ import (
 type Server struct {
 	Mounts         []*MountPoint
 	Create         http.Handler
-	TaskListResult http.Handler
+	TaskListStatus http.Handler
 }
 
 // ErrorNamer is an interface implemented by generated error structs that
@@ -57,10 +57,10 @@ func New(
 	return &Server{
 		Mounts: []*MountPoint{
 			{"Create", "POST", "/v1/taskList/{taskListName}"},
-			{"TaskListResult", "GET", "/v1/taskListResult/{taskListID}"},
+			{"TaskListStatus", "GET", "/v1/taskListStatus/{taskListID}"},
 		},
 		Create:         NewCreateHandler(e.Create, mux, decoder, encoder, errhandler, formatter),
-		TaskListResult: NewTaskListResultHandler(e.TaskListResult, mux, decoder, encoder, errhandler, formatter),
+		TaskListStatus: NewTaskListStatusHandler(e.TaskListStatus, mux, decoder, encoder, errhandler, formatter),
 	}
 }
 
@@ -70,13 +70,13 @@ func (s *Server) Service() string { return "taskList" }
 // Use wraps the server handlers with the given middleware.
 func (s *Server) Use(m func(http.Handler) http.Handler) {
 	s.Create = m(s.Create)
-	s.TaskListResult = m(s.TaskListResult)
+	s.TaskListStatus = m(s.TaskListStatus)
 }
 
 // Mount configures the mux to serve the taskList endpoints.
 func Mount(mux goahttp.Muxer, h *Server) {
 	MountCreateHandler(mux, h.Create)
-	MountTaskListResultHandler(mux, h.TaskListResult)
+	MountTaskListStatusHandler(mux, h.TaskListStatus)
 }
 
 // Mount configures the mux to serve the taskList endpoints.
@@ -135,21 +135,21 @@ func NewCreateHandler(
 	})
 }
 
-// MountTaskListResultHandler configures the mux to serve the "taskList"
-// service "TaskListResult" endpoint.
-func MountTaskListResultHandler(mux goahttp.Muxer, h http.Handler) {
+// MountTaskListStatusHandler configures the mux to serve the "taskList"
+// service "TaskListStatus" endpoint.
+func MountTaskListStatusHandler(mux goahttp.Muxer, h http.Handler) {
 	f, ok := h.(http.HandlerFunc)
 	if !ok {
 		f = func(w http.ResponseWriter, r *http.Request) {
 			h.ServeHTTP(w, r)
 		}
 	}
-	mux.Handle("GET", "/v1/taskListResult/{taskListID}", f)
+	mux.Handle("GET", "/v1/taskListStatus/{taskListID}", f)
 }
 
-// NewTaskListResultHandler creates a HTTP handler which loads the HTTP request
-// and calls the "taskList" service "TaskListResult" endpoint.
-func NewTaskListResultHandler(
+// NewTaskListStatusHandler creates a HTTP handler which loads the HTTP request
+// and calls the "taskList" service "TaskListStatus" endpoint.
+func NewTaskListStatusHandler(
 	endpoint goa.Endpoint,
 	mux goahttp.Muxer,
 	decoder func(*http.Request) goahttp.Decoder,
@@ -158,13 +158,13 @@ func NewTaskListResultHandler(
 	formatter func(err error) goahttp.Statuser,
 ) http.Handler {
 	var (
-		decodeRequest  = DecodeTaskListResultRequest(mux, decoder)
-		encodeResponse = EncodeTaskListResultResponse(encoder)
+		decodeRequest  = DecodeTaskListStatusRequest(mux, decoder)
+		encodeResponse = EncodeTaskListStatusResponse(encoder)
 		encodeError    = goahttp.ErrorEncoder(encoder, formatter)
 	)
 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 		ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept"))
-		ctx = context.WithValue(ctx, goa.MethodKey, "TaskListResult")
+		ctx = context.WithValue(ctx, goa.MethodKey, "TaskListStatus")
 		ctx = context.WithValue(ctx, goa.ServiceKey, "taskList")
 		payload, err := decodeRequest(r)
 		if err != nil {
diff --git a/gen/http/task_list/server/types.go b/gen/http/task_list/server/types.go
index 3b4aefe5ac4ddb025a2762244e38266c3fba179c..0bbdb6c9ffbb65ab7e17d51467755565e13bf190 100644
--- a/gen/http/task_list/server/types.go
+++ b/gen/http/task_list/server/types.go
@@ -18,9 +18,9 @@ type CreateResponseBody struct {
 	TaskListID string `form:"taskListID" json:"taskListID" xml:"taskListID"`
 }
 
-// TaskListResultMultiStatusResponseBody is the type of the "taskList" service
-// "TaskListResult" endpoint HTTP response body.
-type TaskListResultMultiStatusResponseBody struct {
+// TaskListStatusMultiStatusResponseBody is the type of the "taskList" service
+// "TaskListStatus" endpoint HTTP response body.
+type TaskListStatusMultiStatusResponseBody struct {
 	// Unique taskList identifier.
 	ID string `form:"id" json:"id" xml:"id"`
 	// Current status of the taskList
@@ -29,9 +29,9 @@ type TaskListResultMultiStatusResponseBody struct {
 	Groups []*GroupStatusResponseBody `form:"groups,omitempty" json:"groups,omitempty" xml:"groups,omitempty"`
 }
 
-// TaskListResultCreatedResponseBody is the type of the "taskList" service
-// "TaskListResult" endpoint HTTP response body.
-type TaskListResultCreatedResponseBody struct {
+// TaskListStatusCreatedResponseBody is the type of the "taskList" service
+// "TaskListStatus" endpoint HTTP response body.
+type TaskListStatusCreatedResponseBody struct {
 	// Unique taskList identifier.
 	ID string `form:"id" json:"id" xml:"id"`
 	// Current status of the taskList
@@ -40,9 +40,9 @@ type TaskListResultCreatedResponseBody struct {
 	Groups []*GroupStatusResponseBody `form:"groups,omitempty" json:"groups,omitempty" xml:"groups,omitempty"`
 }
 
-// TaskListResultAcceptedResponseBody is the type of the "taskList" service
-// "TaskListResult" endpoint HTTP response body.
-type TaskListResultAcceptedResponseBody struct {
+// TaskListStatusAcceptedResponseBody is the type of the "taskList" service
+// "TaskListStatus" endpoint HTTP response body.
+type TaskListStatusAcceptedResponseBody struct {
 	// Unique taskList identifier.
 	ID string `form:"id" json:"id" xml:"id"`
 	// Current status of the taskList
@@ -51,9 +51,9 @@ type TaskListResultAcceptedResponseBody struct {
 	Groups []*GroupStatusResponseBody `form:"groups,omitempty" json:"groups,omitempty" xml:"groups,omitempty"`
 }
 
-// TaskListResultOKResponseBody is the type of the "taskList" service
-// "TaskListResult" endpoint HTTP response body.
-type TaskListResultOKResponseBody struct {
+// TaskListStatusOKResponseBody is the type of the "taskList" service
+// "TaskListStatus" endpoint HTTP response body.
+type TaskListStatusOKResponseBody struct {
 	// Unique taskList identifier.
 	ID string `form:"id" json:"id" xml:"id"`
 	// Current status of the taskList
@@ -89,10 +89,10 @@ func NewCreateResponseBody(res *tasklist.CreateTaskListResult) *CreateResponseBo
 	return body
 }
 
-// NewTaskListResultMultiStatusResponseBody builds the HTTP response body from
-// the result of the "TaskListResult" endpoint of the "taskList" service.
-func NewTaskListResultMultiStatusResponseBody(res *tasklist.TaskListStatus) *TaskListResultMultiStatusResponseBody {
-	body := &TaskListResultMultiStatusResponseBody{
+// NewTaskListStatusMultiStatusResponseBody builds the HTTP response body from
+// the result of the "TaskListStatus" endpoint of the "taskList" service.
+func NewTaskListStatusMultiStatusResponseBody(res *tasklist.TaskListStatusResponse) *TaskListStatusMultiStatusResponseBody {
+	body := &TaskListStatusMultiStatusResponseBody{
 		ID:     res.ID,
 		Status: res.Status,
 	}
@@ -105,10 +105,10 @@ func NewTaskListResultMultiStatusResponseBody(res *tasklist.TaskListStatus) *Tas
 	return body
 }
 
-// NewTaskListResultCreatedResponseBody builds the HTTP response body from the
-// result of the "TaskListResult" endpoint of the "taskList" service.
-func NewTaskListResultCreatedResponseBody(res *tasklist.TaskListStatus) *TaskListResultCreatedResponseBody {
-	body := &TaskListResultCreatedResponseBody{
+// NewTaskListStatusCreatedResponseBody builds the HTTP response body from the
+// result of the "TaskListStatus" endpoint of the "taskList" service.
+func NewTaskListStatusCreatedResponseBody(res *tasklist.TaskListStatusResponse) *TaskListStatusCreatedResponseBody {
+	body := &TaskListStatusCreatedResponseBody{
 		ID:     res.ID,
 		Status: res.Status,
 	}
@@ -121,10 +121,10 @@ func NewTaskListResultCreatedResponseBody(res *tasklist.TaskListStatus) *TaskLis
 	return body
 }
 
-// NewTaskListResultAcceptedResponseBody builds the HTTP response body from the
-// result of the "TaskListResult" endpoint of the "taskList" service.
-func NewTaskListResultAcceptedResponseBody(res *tasklist.TaskListStatus) *TaskListResultAcceptedResponseBody {
-	body := &TaskListResultAcceptedResponseBody{
+// NewTaskListStatusAcceptedResponseBody builds the HTTP response body from the
+// result of the "TaskListStatus" endpoint of the "taskList" service.
+func NewTaskListStatusAcceptedResponseBody(res *tasklist.TaskListStatusResponse) *TaskListStatusAcceptedResponseBody {
+	body := &TaskListStatusAcceptedResponseBody{
 		ID:     res.ID,
 		Status: res.Status,
 	}
@@ -137,10 +137,10 @@ func NewTaskListResultAcceptedResponseBody(res *tasklist.TaskListStatus) *TaskLi
 	return body
 }
 
-// NewTaskListResultOKResponseBody builds the HTTP response body from the
-// result of the "TaskListResult" endpoint of the "taskList" service.
-func NewTaskListResultOKResponseBody(res *tasklist.TaskListStatus) *TaskListResultOKResponseBody {
-	body := &TaskListResultOKResponseBody{
+// NewTaskListStatusOKResponseBody builds the HTTP response body from the
+// result of the "TaskListStatus" endpoint of the "taskList" service.
+func NewTaskListStatusOKResponseBody(res *tasklist.TaskListStatusResponse) *TaskListStatusOKResponseBody {
+	body := &TaskListStatusOKResponseBody{
 		ID:     res.ID,
 		Status: res.Status,
 	}
@@ -166,10 +166,10 @@ func NewCreateTaskListRequest(body interface{}, taskListName string, cacheNamesp
 	return res
 }
 
-// NewTaskListResultRequest builds a taskList service TaskListResult endpoint
+// NewTaskListStatusRequest builds a taskList service TaskListStatus endpoint
 // payload.
-func NewTaskListResultRequest(taskListID string) *tasklist.TaskListResultRequest {
-	v := &tasklist.TaskListResultRequest{}
+func NewTaskListStatusRequest(taskListID string) *tasklist.TaskListStatusRequest {
+	v := &tasklist.TaskListStatusRequest{}
 	v.TaskListID = taskListID
 
 	return v
diff --git a/gen/task_list/client.go b/gen/task_list/client.go
index 72bb221fcd4488da8b6a33abd31996d26e399453..d877a52535b4c7ff6a6a8a8f5477b9d87bb34d96 100644
--- a/gen/task_list/client.go
+++ b/gen/task_list/client.go
@@ -16,14 +16,14 @@ import (
 // Client is the "taskList" service client.
 type Client struct {
 	CreateEndpoint         goa.Endpoint
-	TaskListResultEndpoint goa.Endpoint
+	TaskListStatusEndpoint goa.Endpoint
 }
 
 // NewClient initializes a "taskList" service client given the endpoints.
-func NewClient(create, taskListResult goa.Endpoint) *Client {
+func NewClient(create, taskListStatus goa.Endpoint) *Client {
 	return &Client{
 		CreateEndpoint:         create,
-		TaskListResultEndpoint: taskListResult,
+		TaskListStatusEndpoint: taskListStatus,
 	}
 }
 
@@ -37,12 +37,12 @@ func (c *Client) Create(ctx context.Context, p *CreateTaskListRequest) (res *Cre
 	return ires.(*CreateTaskListResult), nil
 }
 
-// TaskListResult calls the "TaskListResult" endpoint of the "taskList" service.
-func (c *Client) TaskListResult(ctx context.Context, p *TaskListResultRequest) (res *TaskListStatus, err error) {
+// TaskListStatus calls the "TaskListStatus" endpoint of the "taskList" service.
+func (c *Client) TaskListStatus(ctx context.Context, p *TaskListStatusRequest) (res *TaskListStatusResponse, err error) {
 	var ires interface{}
-	ires, err = c.TaskListResultEndpoint(ctx, p)
+	ires, err = c.TaskListStatusEndpoint(ctx, p)
 	if err != nil {
 		return
 	}
-	return ires.(*TaskListStatus), nil
+	return ires.(*TaskListStatusResponse), nil
 }
diff --git a/gen/task_list/endpoints.go b/gen/task_list/endpoints.go
index 7af1fef229827f5d823f5848edbb4274dbd77e00..98659ce6197c558b4a80e649eb887da4d3ee90df 100644
--- a/gen/task_list/endpoints.go
+++ b/gen/task_list/endpoints.go
@@ -16,21 +16,21 @@ import (
 // Endpoints wraps the "taskList" service endpoints.
 type Endpoints struct {
 	Create         goa.Endpoint
-	TaskListResult goa.Endpoint
+	TaskListStatus goa.Endpoint
 }
 
 // NewEndpoints wraps the methods of the "taskList" service with endpoints.
 func NewEndpoints(s Service) *Endpoints {
 	return &Endpoints{
 		Create:         NewCreateEndpoint(s),
-		TaskListResult: NewTaskListResultEndpoint(s),
+		TaskListStatus: NewTaskListStatusEndpoint(s),
 	}
 }
 
 // Use applies the given middleware to all the "taskList" service endpoints.
 func (e *Endpoints) Use(m func(goa.Endpoint) goa.Endpoint) {
 	e.Create = m(e.Create)
-	e.TaskListResult = m(e.TaskListResult)
+	e.TaskListStatus = m(e.TaskListStatus)
 }
 
 // NewCreateEndpoint returns an endpoint function that calls the method
@@ -42,11 +42,11 @@ func NewCreateEndpoint(s Service) goa.Endpoint {
 	}
 }
 
-// NewTaskListResultEndpoint returns an endpoint function that calls the method
-// "TaskListResult" of service "taskList".
-func NewTaskListResultEndpoint(s Service) goa.Endpoint {
+// NewTaskListStatusEndpoint returns an endpoint function that calls the method
+// "TaskListStatus" of service "taskList".
+func NewTaskListStatusEndpoint(s Service) goa.Endpoint {
 	return func(ctx context.Context, req interface{}) (interface{}, error) {
-		p := req.(*TaskListResultRequest)
-		return s.TaskListResult(ctx, p)
+		p := req.(*TaskListStatusRequest)
+		return s.TaskListStatus(ctx, p)
 	}
 }
diff --git a/gen/task_list/service.go b/gen/task_list/service.go
index 7d8d7f7d82c20b6578c598c6d55ccbcaf486319d..3c82eda7634d6f616ff5315d4eae1fb862397157 100644
--- a/gen/task_list/service.go
+++ b/gen/task_list/service.go
@@ -16,9 +16,9 @@ type Service interface {
 	// Create a task list and corresponding tasks and put them in respective queues
 	// for execution.
 	Create(context.Context, *CreateTaskListRequest) (res *CreateTaskListResult, err error)
-	// TaskListResult retrieves a taskList result containing all tasks' unique IDs
+	// TaskListStatus retrieves a taskList status containing all tasks' unique IDs
 	// and statuses from the Cache service.
-	TaskListResult(context.Context, *TaskListResultRequest) (res *TaskListStatus, err error)
+	TaskListStatus(context.Context, *TaskListStatusRequest) (res *TaskListStatusResponse, err error)
 }
 
 // ServiceName is the name of the service as defined in the design. This is the
@@ -29,7 +29,7 @@ const ServiceName = "taskList"
 // MethodNames lists the service method names as defined in the design. These
 // are the same values that are set in the endpoint request contexts under the
 // MethodKey key.
-var MethodNames = [2]string{"Create", "TaskListResult"}
+var MethodNames = [2]string{"Create", "TaskListStatus"}
 
 // CreateTaskListRequest is the payload type of the taskList service Create
 // method.
@@ -60,16 +60,16 @@ type GroupStatus struct {
 	Tasks []*TaskStatus
 }
 
-// TaskListResultRequest is the payload type of the taskList service
-// TaskListResult method.
-type TaskListResultRequest struct {
+// TaskListStatusRequest is the payload type of the taskList service
+// TaskListStatus method.
+type TaskListStatusRequest struct {
 	// Unique taskList identifier.
 	TaskListID string
 }
 
-// TaskListStatus is the result type of the taskList service TaskListResult
-// method.
-type TaskListStatus struct {
+// TaskListStatusResponse is the result type of the taskList service
+// TaskListStatus method.
+type TaskListStatusResponse struct {
 	// Unique taskList identifier.
 	ID string
 	// Current status of the taskList
diff --git a/internal/listexecutor/listexecutor.go b/internal/listexecutor/listexecutor.go
index b05bad414c12af2880cfce1296ea5c4473bbe1eb..29615ad89a23598290f01e7b0e9055485d74e1a0 100644
--- a/internal/listexecutor/listexecutor.go
+++ b/internal/listexecutor/listexecutor.go
@@ -3,6 +3,7 @@ package listexecutor
 import (
 	"bytes"
 	"context"
+	"encoding/json"
 	"io"
 	"net/http"
 	"sync"
@@ -11,6 +12,8 @@ import (
 	"go.uber.org/zap"
 
 	"code.vereign.com/gaiax/tsa/golib/errors"
+	"code.vereign.com/gaiax/tsa/golib/ptr"
+	goatasklist "code.vereign.com/gaiax/tsa/task/gen/task_list"
 	taskpkg "code.vereign.com/gaiax/tsa/task/internal/service/task"
 	"code.vereign.com/gaiax/tsa/task/internal/service/tasklist"
 )
@@ -125,13 +128,17 @@ func (l *ListExecutor) Execute(ctx context.Context, list *tasklist.TaskList) {
 	list.State = taskpkg.Pending
 	list.StartedAt = time.Now()
 
+	var state goatasklist.TaskListStatusResponse
+
 	// execute groups sequentially
 	for i := range list.Groups {
-		if err := l.executeGroup(ctx, &list.Groups[i]); err != nil {
+		groupState, err := l.executeGroup(ctx, &list.Groups[i])
+		if err != nil {
 			logger.Error("error executing group", zap.Error(err))
 			list.Groups[i].State = taskpkg.Failed
 			list.State = taskpkg.Failed
 		}
+		state.Groups = append(state.Groups, groupState)
 	}
 
 	if list.State != taskpkg.Failed {
@@ -139,6 +146,20 @@ func (l *ListExecutor) Execute(ctx context.Context, list *tasklist.TaskList) {
 	}
 	list.FinishedAt = time.Now()
 
+	state.ID = list.ID
+	state.Status = string(list.State)
+
+	value, err := json.Marshal(state)
+	if err != nil {
+		logger.Error("error marshaling taskList state", zap.Error(err))
+	} else {
+		if err := l.cache.Set(ctx, list.ID, list.CacheNamespace, list.CacheScope, value); err != nil {
+			logger.Error("error storing taskList state in cache", zap.Error(err))
+		} else {
+			logger.Debug("taskList state is stored in cache")
+		}
+	}
+
 	if err := l.storage.SaveTaskListHistory(ctx, list); err != nil {
 		logger.Error("error saving taskList history", zap.Error(err))
 	} else {
@@ -150,7 +171,7 @@ func (l *ListExecutor) Execute(ctx context.Context, list *tasklist.TaskList) {
 	}
 }
 
-func (l *ListExecutor) executeGroup(ctx context.Context, group *tasklist.Group) error {
+func (l *ListExecutor) executeGroup(ctx context.Context, group *tasklist.Group) (*goatasklist.GroupStatus, error) {
 	switch exec := group.Execution; exec {
 	case sequential:
 		return l.executeSequential(ctx, group)
@@ -158,19 +179,22 @@ func (l *ListExecutor) executeGroup(ctx context.Context, group *tasklist.Group)
 		return l.executeParallel(ctx, group)
 	}
 
-	return errors.New("unknown type of group execution")
+	return nil, errors.New("unknown type of group execution")
 }
 
-func (l *ListExecutor) executeSequential(ctx context.Context, group *tasklist.Group) error {
+func (l *ListExecutor) executeSequential(ctx context.Context, group *tasklist.Group) (*goatasklist.GroupStatus, error) {
 	group.State = taskpkg.Pending
+	var state goatasklist.GroupStatus
 
 	tasks, err := l.storage.GetGroupTasks(ctx, group)
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	req := group.Request
 	for _, task := range tasks {
+		taskState := goatasklist.TaskStatus{ID: &task.ID}
+
 		logger := l.logger.With(
 			zap.String("taskID", task.ID),
 			zap.String("taskName", task.Name),
@@ -179,6 +203,8 @@ func (l *ListExecutor) executeSequential(ctx context.Context, group *tasklist.Gr
 		// mark all subsequent tasks as failed if one task already failed
 		if group.State == taskpkg.Failed {
 			task.State = taskpkg.Failed
+			taskState.Status = ptr.String(taskpkg.Failed)
+			state.Tasks = append(state.Tasks, &taskState)
 			continue
 		}
 
@@ -186,12 +212,17 @@ func (l *ListExecutor) executeSequential(ctx context.Context, group *tasklist.Gr
 		err := l.executeTask(ctx, task)
 		if err != nil {
 			task.State = taskpkg.Failed
+			taskState.Status = ptr.String(taskpkg.Failed)
+			state.Tasks = append(state.Tasks, &taskState)
 			group.State = taskpkg.Failed
 			logger.Error("error executing task", zap.Error(err))
 			continue
 		}
 		logger.Debug("task execution completed successfully")
 
+		taskState.Status = ptr.String(string(task.State))
+		state.Tasks = append(state.Tasks, &taskState)
+
 		// pass the response from current task as an input to the next task
 		req = task.Response
 
@@ -223,21 +254,29 @@ func (l *ListExecutor) executeSequential(ctx context.Context, group *tasklist.Gr
 		group.State = taskpkg.Done
 	}
 
-	return nil
+	state.ID = &group.ID
+	state.Status = ptr.String(string(group.State))
+
+	return &state, nil
 }
 
-func (l *ListExecutor) executeParallel(ctx context.Context, group *tasklist.Group) error {
+func (l *ListExecutor) executeParallel(ctx context.Context, group *tasklist.Group) (*goatasklist.GroupStatus, error) {
 	group.State = taskpkg.Pending
+	var state goatasklist.GroupStatus
 
 	tasks, err := l.storage.GetGroupTasks(ctx, group)
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	var wg sync.WaitGroup
 	for _, task := range tasks {
 		wg.Add(1)
 		go func(t *taskpkg.Task) {
+			taskState := goatasklist.TaskStatus{
+				ID: &t.ID,
+			}
+
 			defer wg.Done()
 			logger := l.logger.With(
 				zap.String("taskID", t.ID),
@@ -248,12 +287,17 @@ func (l *ListExecutor) executeParallel(ctx context.Context, group *tasklist.Grou
 
 			if err := l.executeTask(ctx, t); err != nil {
 				t.State = taskpkg.Failed
+				taskState.Status = ptr.String(taskpkg.Failed)
+				state.Tasks = append(state.Tasks, &taskState)
 				group.State = taskpkg.Failed
 				logger.Error("error executing task", zap.Error(err))
 				return
 			}
 			logger.Debug("task execution completed successfully")
 
+			taskState.Status = ptr.String(string(t.State))
+			state.Tasks = append(state.Tasks, &taskState)
+
 			if err := l.cache.Set(
 				ctx,
 				t.ID,
@@ -286,7 +330,10 @@ func (l *ListExecutor) executeParallel(ctx context.Context, group *tasklist.Grou
 		group.State = taskpkg.Done
 	}
 
-	return nil
+	state.ID = &group.ID
+	state.Status = ptr.String(string(group.State))
+
+	return &state, nil
 }
 
 func (l *ListExecutor) executeTask(ctx context.Context, task *taskpkg.Task) error {
diff --git a/internal/service/tasklist/service.go b/internal/service/tasklist/service.go
index 5542a7d24eace9e0d4782eea171151a4a46b4603..2fc94f5d4131a4938d7cba593fe0a3ab9cfe5d6d 100644
--- a/internal/service/tasklist/service.go
+++ b/internal/service/tasklist/service.go
@@ -1,6 +1,7 @@
 package tasklist
 
 import (
+	"bytes"
 	"context"
 	"encoding/json"
 	"time"
@@ -9,34 +10,45 @@ import (
 	"go.uber.org/zap"
 
 	"code.vereign.com/gaiax/tsa/golib/errors"
+	"code.vereign.com/gaiax/tsa/golib/ptr"
 	goatasklist "code.vereign.com/gaiax/tsa/task/gen/task_list"
 	"code.vereign.com/gaiax/tsa/task/internal/service/task"
 )
 
 //go:generate counterfeiter . Storage
 //go:generate counterfeiter . Queue
+//go:generate counterfeiter . Cache
 
 // Storage for retrieving predefined task templates.
 type Storage interface {
 	TaskListTemplate(ctx context.Context, taskListName string) (*Template, error)
 	TaskTemplates(ctx context.Context, names []string) (map[string]*task.Task, error)
+	TaskList(ctx context.Context, taskListID string) (*TaskList, error)
+	TaskListHistory(ctx context.Context, taskListID string) (*TaskList, error)
+	GetGroupTasks(ctx context.Context, group *Group) ([]*task.Task, error)
 }
 
 type Queue interface {
 	AddTaskList(ctx context.Context, taskList *TaskList, tasks []*task.Task) error
 }
 
+type Cache interface {
+	Get(ctx context.Context, key, namespace, scope string) ([]byte, error)
+}
+
 type Service struct {
 	storage Storage
 	queue   Queue
+	cache   Cache
 
 	logger *zap.Logger
 }
 
-func New(template Storage, queue Queue, logger *zap.Logger) *Service {
+func New(template Storage, queue Queue, cache Cache, logger *zap.Logger) *Service {
 	return &Service{
 		storage: template,
 		queue:   queue,
+		cache:   cache,
 		logger:  logger,
 	}
 }
@@ -105,6 +117,59 @@ func (s *Service) Create(ctx context.Context, req *goatasklist.CreateTaskListReq
 	}, nil
 }
 
+// TaskListStatus retrieves a taskList result containing all tasks' unique IDs
+// and statuses from the Cache service.
+func (s *Service) TaskListStatus(ctx context.Context, req *goatasklist.TaskListStatusRequest) (res *goatasklist.TaskListStatusResponse, err error) {
+	if req.TaskListID == "" {
+		return nil, errors.New(errors.BadRequest, "missing taskListID")
+	}
+
+	logger := s.logger.With(zap.String("taskListID", req.TaskListID))
+
+	var list *TaskList
+	list, err = s.storage.TaskListHistory(ctx, req.TaskListID)
+	if err != nil && !errors.Is(errors.NotFound, err) {
+		logger.Error("error getting taskList from history collection", zap.Error(err))
+		return nil, err
+	}
+
+	if list == nil {
+		list, err = s.storage.TaskList(ctx, req.TaskListID)
+		if err != nil {
+			if errors.Is(errors.NotFound, err) {
+				return nil, errors.New("taskList is not found", err)
+			}
+			logger.Error("error getting taskList from taskLists collection", zap.Error(err))
+			return nil, err
+		}
+	}
+
+	var result *goatasklist.TaskListStatusResponse
+	if list.State != task.Done && list.State != task.Failed {
+		// taskList is not executed yet
+		result, err = s.calculateState(ctx, list)
+		if err != nil {
+			logger.Error("error calculating taskList state", zap.Error(err))
+			return nil, err
+		}
+	} else {
+		// taskList is already executed
+		var value []byte
+		value, err = s.cache.Get(ctx, list.ID, list.CacheNamespace, list.CacheScope)
+		if err != nil {
+			logger.Error("error getting taskList result from cache", zap.Error(err))
+			return nil, err
+		}
+
+		if err := json.NewDecoder(bytes.NewReader(value)).Decode(&result); err != nil {
+			logger.Error("error decoding result from cache", zap.Error(err))
+			return nil, errors.New("error decoding result from cache", err)
+		}
+	}
+
+	return result, nil
+}
+
 func createGroups(t *Template, req []byte) []Group {
 	var groups []Group
 	for _, group := range t.Groups {
@@ -163,6 +228,36 @@ func createTasks(t *TaskList, templates map[string]*task.Task) ([]*task.Task, er
 	return tasks, nil
 }
 
+func (s *Service) calculateState(ctx context.Context, list *TaskList) (*goatasklist.TaskListStatusResponse, error) {
+	result := &goatasklist.TaskListStatusResponse{
+		ID:     list.ID,
+		Status: string(list.State),
+	}
+
+	for i := range list.Groups {
+		groupState := goatasklist.GroupStatus{
+			ID:     &list.Groups[i].ID,
+			Status: ptr.String(string(list.Groups[i].State)),
+		}
+
+		tasks, err := s.storage.GetGroupTasks(ctx, &list.Groups[i])
+		if err != nil {
+			return nil, err
+		}
+		for j := range tasks {
+			taskState := goatasklist.TaskStatus{
+				ID:     &tasks[j].ID,
+				Status: ptr.String(string(tasks[j].State)),
+			}
+			groupState.Tasks = append(groupState.Tasks, &taskState)
+		}
+
+		result.Groups = append(result.Groups, &groupState)
+	}
+
+	return result, nil
+}
+
 // taskNamesFromTaskListTemplate returns the names of all tasks within
 // one taskList template
 func taskNamesFromTaskListTemplate(template *Template) []string {
diff --git a/internal/service/tasklist/service_test.go b/internal/service/tasklist/service_test.go
index 9dd3b39e39b25076f55f206661264627f2917c07..7e71903497891b26408f6876a134e4ab6d05a336 100644
--- a/internal/service/tasklist/service_test.go
+++ b/internal/service/tasklist/service_test.go
@@ -15,7 +15,7 @@ import (
 )
 
 func TestNew(t *testing.T) {
-	svc := tasklist.New(nil, nil, zap.NewNop())
+	svc := tasklist.New(nil, nil, nil, zap.NewNop())
 	assert.Implements(t, (*goatasklist.Service)(nil), svc)
 }
 
@@ -120,7 +120,7 @@ func Test_Create(t *testing.T) {
 
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
-			svc := tasklist.New(test.storage, test.queue, zap.NewNop())
+			svc := tasklist.New(test.storage, test.queue, nil, zap.NewNop())
 			res, err := svc.Create(context.Background(), test.req)
 			if err != nil {
 				assert.NotEmpty(t, test.errtext)
@@ -138,3 +138,181 @@ func Test_Create(t *testing.T) {
 		})
 	}
 }
+
+func Test_TaskListStatus(t *testing.T) {
+	tests := []struct {
+		name    string
+		req     *goatasklist.TaskListStatusRequest
+		storage *tasklistfakes.FakeStorage
+		queue   *tasklistfakes.FakeQueue
+		cache   *tasklistfakes.FakeCache
+
+		errkind errors.Kind
+		errtext string
+	}{
+		{
+			name:    "missing taskList ID",
+			req:     &goatasklist.TaskListStatusRequest{},
+			errkind: errors.BadRequest,
+			errtext: "missing taskListID",
+		},
+		{
+			name: "error getting taskList form history collection",
+			req:  &goatasklist.TaskListStatusRequest{TaskListID: "d16996cd-1977-42a9-90b2-b4548a35c1b4"},
+			storage: &tasklistfakes.FakeStorage{
+				TaskListHistoryStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) {
+					return nil, errors.New("some error")
+				},
+			},
+			errkind: errors.Unknown,
+			errtext: "some error",
+		},
+		{
+			name: "taskList not found",
+			req:  &goatasklist.TaskListStatusRequest{TaskListID: "d16996cd-1977-42a9-90b2-b4548a35c1b4"},
+			storage: &tasklistfakes.FakeStorage{
+				TaskListHistoryStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) {
+					return nil, errors.New(errors.NotFound)
+				},
+				TaskListStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) {
+					return nil, errors.New(errors.NotFound)
+				},
+			},
+			errkind: errors.NotFound,
+			errtext: "taskList is not found",
+		},
+		{
+			name: "error getting taskList from taskLists collection",
+			req:  &goatasklist.TaskListStatusRequest{TaskListID: "d16996cd-1977-42a9-90b2-b4548a35c1b4"},
+			storage: &tasklistfakes.FakeStorage{
+				TaskListHistoryStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) {
+					return nil, errors.New(errors.NotFound)
+				},
+				TaskListStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) {
+					return nil, errors.New("some error")
+				},
+			},
+			errkind: errors.Unknown,
+			errtext: "some error",
+		},
+		{
+			name: "error calculating taskList state",
+			req:  &goatasklist.TaskListStatusRequest{TaskListID: "d16996cd-1977-42a9-90b2-b4548a35c1b4"},
+			storage: &tasklistfakes.FakeStorage{
+				TaskListHistoryStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) {
+					return pendingTaskList, nil
+				},
+				GetGroupTasksStub: func(ctx context.Context, group *tasklist.Group) ([]*task.Task, error) {
+					return nil, errors.New("some error")
+				},
+			},
+			errkind: errors.Unknown,
+			errtext: "some error",
+		},
+		{
+			name: "error getting taskList from cache",
+			req:  &goatasklist.TaskListStatusRequest{TaskListID: "d16996cd-1977-42a9-90b2-b4548a35c1b4"},
+			storage: &tasklistfakes.FakeStorage{
+				TaskListHistoryStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) {
+					return doneTaskList, nil
+				},
+			},
+			cache: &tasklistfakes.FakeCache{
+				GetStub: func(ctx context.Context, key, namespace, scope string) ([]byte, error) {
+					return nil, errors.New("some cache error")
+				},
+			},
+			errkind: errors.Unknown,
+			errtext: "some cache error",
+		},
+		{
+			name: "successfully get taskList state on pending task",
+			req:  &goatasklist.TaskListStatusRequest{TaskListID: "d16996cd-1977-42a9-90b2-b4548a35c1b4"},
+			storage: &tasklistfakes.FakeStorage{
+				TaskListHistoryStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) {
+					return pendingTaskList, nil
+				},
+				GetGroupTasksStub: func(ctx context.Context, group *tasklist.Group) ([]*task.Task, error) {
+					return []*task.Task{}, nil
+				},
+			},
+		},
+		{
+			name: "successfully get taskList state on executed task",
+			req:  &goatasklist.TaskListStatusRequest{TaskListID: "d16996cd-1977-42a9-90b2-b4548a35c1b4"},
+			storage: &tasklistfakes.FakeStorage{
+				TaskListHistoryStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) {
+					return doneTaskList, nil
+				},
+			},
+			cache: &tasklistfakes.FakeCache{
+				GetStub: func(ctx context.Context, key, namespace, scope string) ([]byte, error) {
+					return doneTaskState, nil
+				},
+			},
+		},
+	}
+
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			svc := tasklist.New(test.storage, test.queue, test.cache, zap.NewNop())
+			res, err := svc.TaskListStatus(context.Background(), test.req)
+			if err != nil {
+				assert.NotEmpty(t, test.errtext)
+				e, ok := err.(*errors.Error)
+				assert.True(t, ok)
+				assert.Equal(t, test.errkind, e.Kind)
+				assert.Contains(t, e.Error(), test.errtext)
+				assert.Nil(t, res)
+			} else {
+				assert.Empty(t, test.errtext)
+				assert.NotNil(t, res)
+				assert.NotEmpty(t, res.ID)
+				assert.NotEmpty(t, res.Status)
+				assert.NotEmpty(t, res.Groups)
+			}
+		})
+	}
+}
+
+//nolint:gosec
+var pendingTaskList = &tasklist.TaskList{
+	ID:    "16996cd-1977-42a9-90b2-b4548a35c1b4",
+	State: "pending",
+	Groups: []tasklist.Group{
+		{
+			ID:    "074076d5-c995-4d2d-8d38-da57360453d4",
+			Tasks: []string{"createdTask", "createdTask2"},
+			State: "created",
+		},
+	},
+}
+
+//nolint:gosec
+var doneTaskList = &tasklist.TaskList{
+	ID:    "16996cd-1977-42a9-90b2-b4548a35c1b4",
+	State: "done",
+}
+
+//nolint:gosec
+var doneTaskState = []byte(`{
+  "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502",
+  "status": "done",
+  "groups": [
+	{
+	  "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502",
+	  "type": "sequential",
+	  "status": "done",
+	  "tasks": [
+		{
+		  "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502",
+		  "status": "done"
+		},
+		{
+		  "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502",
+		  "status": "done"
+		}
+	  ]
+	}
+  ]
+}`)
diff --git a/internal/service/tasklist/tasklistfakes/fake_cache.go b/internal/service/tasklist/tasklistfakes/fake_cache.go
new file mode 100644
index 0000000000000000000000000000000000000000..2f636bdb059b5e8cc84bd827b91bbc65e67a8d37
--- /dev/null
+++ b/internal/service/tasklist/tasklistfakes/fake_cache.go
@@ -0,0 +1,123 @@
+// Code generated by counterfeiter. DO NOT EDIT.
+package tasklistfakes
+
+import (
+	"context"
+	"sync"
+
+	"code.vereign.com/gaiax/tsa/task/internal/service/tasklist"
+)
+
+type FakeCache struct {
+	GetStub        func(context.Context, string, string, string) ([]byte, error)
+	getMutex       sync.RWMutex
+	getArgsForCall []struct {
+		arg1 context.Context
+		arg2 string
+		arg3 string
+		arg4 string
+	}
+	getReturns struct {
+		result1 []byte
+		result2 error
+	}
+	getReturnsOnCall map[int]struct {
+		result1 []byte
+		result2 error
+	}
+	invocations      map[string][][]interface{}
+	invocationsMutex sync.RWMutex
+}
+
+func (fake *FakeCache) Get(arg1 context.Context, arg2 string, arg3 string, arg4 string) ([]byte, error) {
+	fake.getMutex.Lock()
+	ret, specificReturn := fake.getReturnsOnCall[len(fake.getArgsForCall)]
+	fake.getArgsForCall = append(fake.getArgsForCall, struct {
+		arg1 context.Context
+		arg2 string
+		arg3 string
+		arg4 string
+	}{arg1, arg2, arg3, arg4})
+	stub := fake.GetStub
+	fakeReturns := fake.getReturns
+	fake.recordInvocation("Get", []interface{}{arg1, arg2, arg3, arg4})
+	fake.getMutex.Unlock()
+	if stub != nil {
+		return stub(arg1, arg2, arg3, arg4)
+	}
+	if specificReturn {
+		return ret.result1, ret.result2
+	}
+	return fakeReturns.result1, fakeReturns.result2
+}
+
+func (fake *FakeCache) GetCallCount() int {
+	fake.getMutex.RLock()
+	defer fake.getMutex.RUnlock()
+	return len(fake.getArgsForCall)
+}
+
+func (fake *FakeCache) GetCalls(stub func(context.Context, string, string, string) ([]byte, error)) {
+	fake.getMutex.Lock()
+	defer fake.getMutex.Unlock()
+	fake.GetStub = stub
+}
+
+func (fake *FakeCache) GetArgsForCall(i int) (context.Context, string, string, string) {
+	fake.getMutex.RLock()
+	defer fake.getMutex.RUnlock()
+	argsForCall := fake.getArgsForCall[i]
+	return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4
+}
+
+func (fake *FakeCache) GetReturns(result1 []byte, result2 error) {
+	fake.getMutex.Lock()
+	defer fake.getMutex.Unlock()
+	fake.GetStub = nil
+	fake.getReturns = struct {
+		result1 []byte
+		result2 error
+	}{result1, result2}
+}
+
+func (fake *FakeCache) GetReturnsOnCall(i int, result1 []byte, result2 error) {
+	fake.getMutex.Lock()
+	defer fake.getMutex.Unlock()
+	fake.GetStub = nil
+	if fake.getReturnsOnCall == nil {
+		fake.getReturnsOnCall = make(map[int]struct {
+			result1 []byte
+			result2 error
+		})
+	}
+	fake.getReturnsOnCall[i] = struct {
+		result1 []byte
+		result2 error
+	}{result1, result2}
+}
+
+func (fake *FakeCache) Invocations() map[string][][]interface{} {
+	fake.invocationsMutex.RLock()
+	defer fake.invocationsMutex.RUnlock()
+	fake.getMutex.RLock()
+	defer fake.getMutex.RUnlock()
+	copiedInvocations := map[string][][]interface{}{}
+	for key, value := range fake.invocations {
+		copiedInvocations[key] = value
+	}
+	return copiedInvocations
+}
+
+func (fake *FakeCache) recordInvocation(key string, args []interface{}) {
+	fake.invocationsMutex.Lock()
+	defer fake.invocationsMutex.Unlock()
+	if fake.invocations == nil {
+		fake.invocations = map[string][][]interface{}{}
+	}
+	if fake.invocations[key] == nil {
+		fake.invocations[key] = [][]interface{}{}
+	}
+	fake.invocations[key] = append(fake.invocations[key], args)
+}
+
+var _ tasklist.Cache = new(FakeCache)
diff --git a/internal/service/tasklist/tasklistfakes/fake_storage.go b/internal/service/tasklist/tasklistfakes/fake_storage.go
index 9ece29b9180862d8281bd5759b4104ff9a731e67..4dd7cf097593ba40b96d8e9ea7731d96914d1a19 100644
--- a/internal/service/tasklist/tasklistfakes/fake_storage.go
+++ b/internal/service/tasklist/tasklistfakes/fake_storage.go
@@ -10,6 +10,48 @@ import (
 )
 
 type FakeStorage struct {
+	GetGroupTasksStub        func(context.Context, *tasklist.Group) ([]*task.Task, error)
+	getGroupTasksMutex       sync.RWMutex
+	getGroupTasksArgsForCall []struct {
+		arg1 context.Context
+		arg2 *tasklist.Group
+	}
+	getGroupTasksReturns struct {
+		result1 []*task.Task
+		result2 error
+	}
+	getGroupTasksReturnsOnCall map[int]struct {
+		result1 []*task.Task
+		result2 error
+	}
+	TaskListStub        func(context.Context, string) (*tasklist.TaskList, error)
+	taskListMutex       sync.RWMutex
+	taskListArgsForCall []struct {
+		arg1 context.Context
+		arg2 string
+	}
+	taskListReturns struct {
+		result1 *tasklist.TaskList
+		result2 error
+	}
+	taskListReturnsOnCall map[int]struct {
+		result1 *tasklist.TaskList
+		result2 error
+	}
+	TaskListHistoryStub        func(context.Context, string) (*tasklist.TaskList, error)
+	taskListHistoryMutex       sync.RWMutex
+	taskListHistoryArgsForCall []struct {
+		arg1 context.Context
+		arg2 string
+	}
+	taskListHistoryReturns struct {
+		result1 *tasklist.TaskList
+		result2 error
+	}
+	taskListHistoryReturnsOnCall map[int]struct {
+		result1 *tasklist.TaskList
+		result2 error
+	}
 	TaskListTemplateStub        func(context.Context, string) (*tasklist.Template, error)
 	taskListTemplateMutex       sync.RWMutex
 	taskListTemplateArgsForCall []struct {
@@ -42,6 +84,201 @@ type FakeStorage struct {
 	invocationsMutex sync.RWMutex
 }
 
+func (fake *FakeStorage) GetGroupTasks(arg1 context.Context, arg2 *tasklist.Group) ([]*task.Task, error) {
+	fake.getGroupTasksMutex.Lock()
+	ret, specificReturn := fake.getGroupTasksReturnsOnCall[len(fake.getGroupTasksArgsForCall)]
+	fake.getGroupTasksArgsForCall = append(fake.getGroupTasksArgsForCall, struct {
+		arg1 context.Context
+		arg2 *tasklist.Group
+	}{arg1, arg2})
+	stub := fake.GetGroupTasksStub
+	fakeReturns := fake.getGroupTasksReturns
+	fake.recordInvocation("GetGroupTasks", []interface{}{arg1, arg2})
+	fake.getGroupTasksMutex.Unlock()
+	if stub != nil {
+		return stub(arg1, arg2)
+	}
+	if specificReturn {
+		return ret.result1, ret.result2
+	}
+	return fakeReturns.result1, fakeReturns.result2
+}
+
+func (fake *FakeStorage) GetGroupTasksCallCount() int {
+	fake.getGroupTasksMutex.RLock()
+	defer fake.getGroupTasksMutex.RUnlock()
+	return len(fake.getGroupTasksArgsForCall)
+}
+
+func (fake *FakeStorage) GetGroupTasksCalls(stub func(context.Context, *tasklist.Group) ([]*task.Task, error)) {
+	fake.getGroupTasksMutex.Lock()
+	defer fake.getGroupTasksMutex.Unlock()
+	fake.GetGroupTasksStub = stub
+}
+
+func (fake *FakeStorage) GetGroupTasksArgsForCall(i int) (context.Context, *tasklist.Group) {
+	fake.getGroupTasksMutex.RLock()
+	defer fake.getGroupTasksMutex.RUnlock()
+	argsForCall := fake.getGroupTasksArgsForCall[i]
+	return argsForCall.arg1, argsForCall.arg2
+}
+
+func (fake *FakeStorage) GetGroupTasksReturns(result1 []*task.Task, result2 error) {
+	fake.getGroupTasksMutex.Lock()
+	defer fake.getGroupTasksMutex.Unlock()
+	fake.GetGroupTasksStub = nil
+	fake.getGroupTasksReturns = struct {
+		result1 []*task.Task
+		result2 error
+	}{result1, result2}
+}
+
+func (fake *FakeStorage) GetGroupTasksReturnsOnCall(i int, result1 []*task.Task, result2 error) {
+	fake.getGroupTasksMutex.Lock()
+	defer fake.getGroupTasksMutex.Unlock()
+	fake.GetGroupTasksStub = nil
+	if fake.getGroupTasksReturnsOnCall == nil {
+		fake.getGroupTasksReturnsOnCall = make(map[int]struct {
+			result1 []*task.Task
+			result2 error
+		})
+	}
+	fake.getGroupTasksReturnsOnCall[i] = struct {
+		result1 []*task.Task
+		result2 error
+	}{result1, result2}
+}
+
+func (fake *FakeStorage) TaskList(arg1 context.Context, arg2 string) (*tasklist.TaskList, error) {
+	fake.taskListMutex.Lock()
+	ret, specificReturn := fake.taskListReturnsOnCall[len(fake.taskListArgsForCall)]
+	fake.taskListArgsForCall = append(fake.taskListArgsForCall, struct {
+		arg1 context.Context
+		arg2 string
+	}{arg1, arg2})
+	stub := fake.TaskListStub
+	fakeReturns := fake.taskListReturns
+	fake.recordInvocation("TaskList", []interface{}{arg1, arg2})
+	fake.taskListMutex.Unlock()
+	if stub != nil {
+		return stub(arg1, arg2)
+	}
+	if specificReturn {
+		return ret.result1, ret.result2
+	}
+	return fakeReturns.result1, fakeReturns.result2
+}
+
+func (fake *FakeStorage) TaskListCallCount() int {
+	fake.taskListMutex.RLock()
+	defer fake.taskListMutex.RUnlock()
+	return len(fake.taskListArgsForCall)
+}
+
+func (fake *FakeStorage) TaskListCalls(stub func(context.Context, string) (*tasklist.TaskList, error)) {
+	fake.taskListMutex.Lock()
+	defer fake.taskListMutex.Unlock()
+	fake.TaskListStub = stub
+}
+
+func (fake *FakeStorage) TaskListArgsForCall(i int) (context.Context, string) {
+	fake.taskListMutex.RLock()
+	defer fake.taskListMutex.RUnlock()
+	argsForCall := fake.taskListArgsForCall[i]
+	return argsForCall.arg1, argsForCall.arg2
+}
+
+func (fake *FakeStorage) TaskListReturns(result1 *tasklist.TaskList, result2 error) {
+	fake.taskListMutex.Lock()
+	defer fake.taskListMutex.Unlock()
+	fake.TaskListStub = nil
+	fake.taskListReturns = struct {
+		result1 *tasklist.TaskList
+		result2 error
+	}{result1, result2}
+}
+
+func (fake *FakeStorage) TaskListReturnsOnCall(i int, result1 *tasklist.TaskList, result2 error) {
+	fake.taskListMutex.Lock()
+	defer fake.taskListMutex.Unlock()
+	fake.TaskListStub = nil
+	if fake.taskListReturnsOnCall == nil {
+		fake.taskListReturnsOnCall = make(map[int]struct {
+			result1 *tasklist.TaskList
+			result2 error
+		})
+	}
+	fake.taskListReturnsOnCall[i] = struct {
+		result1 *tasklist.TaskList
+		result2 error
+	}{result1, result2}
+}
+
+func (fake *FakeStorage) TaskListHistory(arg1 context.Context, arg2 string) (*tasklist.TaskList, error) {
+	fake.taskListHistoryMutex.Lock()
+	ret, specificReturn := fake.taskListHistoryReturnsOnCall[len(fake.taskListHistoryArgsForCall)]
+	fake.taskListHistoryArgsForCall = append(fake.taskListHistoryArgsForCall, struct {
+		arg1 context.Context
+		arg2 string
+	}{arg1, arg2})
+	stub := fake.TaskListHistoryStub
+	fakeReturns := fake.taskListHistoryReturns
+	fake.recordInvocation("TaskListHistory", []interface{}{arg1, arg2})
+	fake.taskListHistoryMutex.Unlock()
+	if stub != nil {
+		return stub(arg1, arg2)
+	}
+	if specificReturn {
+		return ret.result1, ret.result2
+	}
+	return fakeReturns.result1, fakeReturns.result2
+}
+
+func (fake *FakeStorage) TaskListHistoryCallCount() int {
+	fake.taskListHistoryMutex.RLock()
+	defer fake.taskListHistoryMutex.RUnlock()
+	return len(fake.taskListHistoryArgsForCall)
+}
+
+func (fake *FakeStorage) TaskListHistoryCalls(stub func(context.Context, string) (*tasklist.TaskList, error)) {
+	fake.taskListHistoryMutex.Lock()
+	defer fake.taskListHistoryMutex.Unlock()
+	fake.TaskListHistoryStub = stub
+}
+
+func (fake *FakeStorage) TaskListHistoryArgsForCall(i int) (context.Context, string) {
+	fake.taskListHistoryMutex.RLock()
+	defer fake.taskListHistoryMutex.RUnlock()
+	argsForCall := fake.taskListHistoryArgsForCall[i]
+	return argsForCall.arg1, argsForCall.arg2
+}
+
+func (fake *FakeStorage) TaskListHistoryReturns(result1 *tasklist.TaskList, result2 error) {
+	fake.taskListHistoryMutex.Lock()
+	defer fake.taskListHistoryMutex.Unlock()
+	fake.TaskListHistoryStub = nil
+	fake.taskListHistoryReturns = struct {
+		result1 *tasklist.TaskList
+		result2 error
+	}{result1, result2}
+}
+
+func (fake *FakeStorage) TaskListHistoryReturnsOnCall(i int, result1 *tasklist.TaskList, result2 error) {
+	fake.taskListHistoryMutex.Lock()
+	defer fake.taskListHistoryMutex.Unlock()
+	fake.TaskListHistoryStub = nil
+	if fake.taskListHistoryReturnsOnCall == nil {
+		fake.taskListHistoryReturnsOnCall = make(map[int]struct {
+			result1 *tasklist.TaskList
+			result2 error
+		})
+	}
+	fake.taskListHistoryReturnsOnCall[i] = struct {
+		result1 *tasklist.TaskList
+		result2 error
+	}{result1, result2}
+}
+
 func (fake *FakeStorage) TaskListTemplate(arg1 context.Context, arg2 string) (*tasklist.Template, error) {
 	fake.taskListTemplateMutex.Lock()
 	ret, specificReturn := fake.taskListTemplateReturnsOnCall[len(fake.taskListTemplateArgsForCall)]
@@ -180,6 +417,12 @@ func (fake *FakeStorage) TaskTemplatesReturnsOnCall(i int, result1 map[string]*t
 func (fake *FakeStorage) Invocations() map[string][][]interface{} {
 	fake.invocationsMutex.RLock()
 	defer fake.invocationsMutex.RUnlock()
+	fake.getGroupTasksMutex.RLock()
+	defer fake.getGroupTasksMutex.RUnlock()
+	fake.taskListMutex.RLock()
+	defer fake.taskListMutex.RUnlock()
+	fake.taskListHistoryMutex.RLock()
+	defer fake.taskListHistoryMutex.RUnlock()
 	fake.taskListTemplateMutex.RLock()
 	defer fake.taskListTemplateMutex.RUnlock()
 	fake.taskTemplatesMutex.RLock()
diff --git a/internal/storage/storage.go b/internal/storage/storage.go
index cc16df1cd4392949218e17a91b7ab8995395864d..4a8d1ffaf7089f11273e316f45336238d833579e 100644
--- a/internal/storage/storage.go
+++ b/internal/storage/storage.go
@@ -315,3 +315,45 @@ func (s *Storage) SaveTaskListHistory(ctx context.Context, taskList *tasklist.Ta
 	b := backoff.WithContext(backoff.NewExponentialBackOff(), ctx)
 	return backoff.Retry(insert, b)
 }
+
+// TaskList retrieves a tasklist.TaskList from taskLists collection by ID
+func (s *Storage) TaskList(ctx context.Context, taskListID string) (*tasklist.TaskList, error) {
+	result := s.taskLists.FindOne(ctx, bson.M{
+		"id": taskListID,
+	})
+
+	if result.Err() != nil {
+		if strings.Contains(result.Err().Error(), "no documents in result") {
+			return nil, errors.New(errors.NotFound, "taskList not found")
+		}
+		return nil, result.Err()
+	}
+
+	var list tasklist.TaskList
+	if err := result.Decode(&list); err != nil {
+		return nil, err
+	}
+
+	return &list, nil
+}
+
+// TaskListHistory retrieves a tasklist.TaskList from taskListHistory collection by ID
+func (s *Storage) TaskListHistory(ctx context.Context, taskListID string) (*tasklist.TaskList, error) {
+	result := s.taskListHistory.FindOne(ctx, bson.M{
+		"id": taskListID,
+	})
+
+	if result.Err() != nil {
+		if strings.Contains(result.Err().Error(), "no documents in result") {
+			return nil, errors.New(errors.NotFound, "taskList not found")
+		}
+		return nil, result.Err()
+	}
+
+	var list tasklist.TaskList
+	if err := result.Decode(&list); err != nil {
+		return nil, err
+	}
+
+	return &list, nil
+}