summaryrefslogtreecommitdiff
path: root/internal/executor/executor.go
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-03-04 21:25:34 +0000
committerPeter Stone <thepeterstone@gmail.com>2026-03-04 21:25:34 +0000
commit6511d6e0ff139495413c7848a9b4aabb9d9ee4e2 (patch)
tree95bd6a0efc0ace206a5716da62a5956491cb46e7 /internal/executor/executor.go
parent3962597950421e422b6e1ce57764550f5600ded6 (diff)
Add READY state for human-in-the-loop verification
Top-level tasks now land in READY after successful execution instead of going directly to COMPLETED. Subtasks (with parent_task_id) skip the gate and remain COMPLETED. Users accept or reject via new API endpoints: POST /api/tasks/{id}/accept → READY → COMPLETED POST /api/tasks/{id}/reject → READY → PENDING (with rejection_comment) - task: add StateReady, RejectionComment field, update ValidTransition - storage: migrate rejection_comment column, add RejectTask method - executor: route top-level vs subtask to READY vs COMPLETED - api: /accept and /reject handlers with 409 on invalid state Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/executor/executor.go')
-rw-r--r--internal/executor/executor.go9
1 files changed, 7 insertions, 2 deletions
diff --git a/internal/executor/executor.go b/internal/executor/executor.go
index 68ebdf3..d25d3b4 100644
--- a/internal/executor/executor.go
+++ b/internal/executor/executor.go
@@ -149,8 +149,13 @@ func (p *Pool) execute(ctx context.Context, t *task.Task) {
p.store.UpdateTaskState(t.ID, task.StateFailed)
}
} else {
- exec.Status = "COMPLETED"
- p.store.UpdateTaskState(t.ID, task.StateCompleted)
+ if t.ParentTaskID == "" {
+ exec.Status = "READY"
+ p.store.UpdateTaskState(t.ID, task.StateReady)
+ } else {
+ exec.Status = "COMPLETED"
+ p.store.UpdateTaskState(t.ID, task.StateCompleted)
+ }
}
if updateErr := p.store.UpdateExecution(exec); updateErr != nil {