init
diff --git a/loop/agent.go b/loop/agent.go
new file mode 100644
index 0000000..8e903a2
--- /dev/null
+++ b/loop/agent.go
@@ -0,0 +1,49 @@
+package loop
+
+import (
+	"fmt"
+	"time"
+)
+
+type Agent interface {
+	Run(todo *ToDo) error
+}
+
+type UserAgent struct {
+	pr PromptReader
+}
+
+func (a *UserAgent) Run(todo *ToDo) error {
+	for {
+		items := findActionableItems(todo, "user")
+		if len(items) == 0 {
+			time.Sleep(30 * time.Second)
+			continue
+		}
+		for _, i := range items {
+			fmt.Printf("YOU %s %s: ", i.ID, i.Title)
+			comment, err := a.pr.Read()
+			if err != nil {
+				return err
+			}
+			i.Discussion = append(i.Discussion, Comment{
+				Author:  "user",
+				Comment: comment,
+			})
+			i.AssignedTo = "assistant"
+		}
+	}
+}
+
+func findActionableItems(todo *ToDo, assignedTo string) []*ToDo {
+	for _, i := range todo.Items {
+		ret := findActionableItems(i, assignedTo)
+		if len(ret) > 0 {
+			return ret
+		}
+	}
+	if todo.AssignedTo == assignedTo && !todo.Done {
+		return []*ToDo{todo}
+	}
+	return nil
+}