Update with log/slog logging

Change-Id: Ie86d7082bb50576fdfbd898c44bd2905e389c399
diff --git a/server/agent/manager.go b/server/agent/manager.go
index 45b0965..88bfe21 100644
--- a/server/agent/manager.go
+++ b/server/agent/manager.go
@@ -3,7 +3,7 @@
 import (
 	"context"
 	"fmt"
-	"log"
+	"log/slog"
 	"os"
 	"os/exec"
 	"path/filepath"
@@ -30,16 +30,21 @@
 	subtaskService  *subtasks.SubtaskService
 	isRunning       map[string]bool
 	stopChannels    map[string]chan struct{}
+	logger          *slog.Logger
 }
 
 // NewManager creates a new agent manager
-func NewManager(cfg *config.Config, taskManager tm.TaskManager) (*Manager, error) {
+func NewManager(cfg *config.Config, taskManager tm.TaskManager, logger *slog.Logger) (*Manager, error) {
+	if logger == nil {
+		logger = slog.Default()
+	}
 	// Create auto-assigner
 	autoAssigner := assignment.NewAutoAssigner(cfg.Agents)
 
 	// Create GitHub PR provider
 	githubConfig := git.GitHubConfig{
-		Token: cfg.GitHub.Token,
+		Token:  cfg.GitHub.Token,
+		Logger: logger,
 	}
 	prProvider := git.NewGitHubPullRequestProvider(cfg.GitHub.Owner, cfg.GitHub.Repo, githubConfig)
 
@@ -57,6 +62,7 @@
 		cloneManager: cloneManager,
 		isRunning:    make(map[string]bool),
 		stopChannels: make(map[string]chan struct{}),
+		logger:       logger,
 	}
 
 	// Initialize agents
@@ -111,6 +117,7 @@
 		m.config.GitHub.Owner,
 		m.config.GitHub.Repo,
 		m.cloneManager,
+		m.logger,
 	)
 
 	return nil
@@ -177,7 +184,10 @@
 
 	go m.runAgentLoop(agent, loopInterval, stopChan)
 
-	log.Printf("Started agent %s (%s) with %s model", agentName, agent.Role, agent.Model)
+	m.logger.Info("Started agent", 
+		slog.String("name", agentName), 
+		slog.String("role", agent.Role), 
+		slog.String("model", agent.Model))
 	return nil
 }
 
@@ -191,7 +201,7 @@
 	delete(m.stopChannels, agentName)
 	m.isRunning[agentName] = false
 
-	log.Printf("Stopped agent %s", agentName)
+	m.logger.Info("Stopped agent", slog.String("name", agentName))
 	return nil
 }
 
@@ -203,11 +213,13 @@
 	for {
 		select {
 		case <-stopChan:
-			log.Printf("Agent %s stopping", agent.Name)
+			m.logger.Info("Agent stopping", slog.String("name", agent.Name))
 			return
 		case <-ticker.C:
 			if err := m.processAgentTasks(agent); err != nil {
-				log.Printf("Error processing tasks for agent %s: %v", agent.Name, err)
+				m.logger.Error("Error processing tasks for agent", 
+					slog.String("agent", agent.Name), 
+					slog.String("error", err.Error()))
 			}
 		}
 	}
@@ -225,16 +237,22 @@
 		return fmt.Errorf("failed to get tasks for agent %s: %w", agent.Name, err)
 	}
 
-	log.Printf("Processing %d tasks for agent %s", len(tasks), agent.Name)
+	m.logger.Info("Processing tasks for agent", 
+		slog.Int("task_count", len(tasks)), 
+		slog.String("agent", agent.Name))
 
 	for _, task := range tasks {
 		if task.Status == tm.StatusToDo || task.Status == tm.StatusPending {
 			if err := m.processTask(agent, task); err != nil {
-				log.Printf("Error processing task %s: %v", task.ID, err)
+				m.logger.Error("Error processing task", 
+					slog.String("task_id", task.ID), 
+					slog.String("error", err.Error()))
 				// Mark task as failed
 				task.Status = tm.StatusFailed
 				if err := m.taskManager.UpdateTask(task); err != nil {
-					log.Printf("Error updating failed task %s: %v", task.ID, err)
+					m.logger.Error("Error updating failed task", 
+						slog.String("task_id", task.ID), 
+						slog.String("error", err.Error()))
 				}
 				agent.Stats.TasksFailed++
 			} else {
@@ -256,7 +274,10 @@
 	ctx := context.Background()
 	startTime := time.Now()
 
-	log.Printf("Agent %s processing task %s: %s", agent.Name, task.ID, task.Title)
+	m.logger.Info("Agent processing task", 
+		slog.String("agent", agent.Name), 
+		slog.String("task_id", task.ID), 
+		slog.String("title", task.Title))
 
 	// Mark task as in progress
 	task.Status = tm.StatusInProgress
@@ -267,9 +288,11 @@
 
 	// Check if this task should generate subtasks (with LLM decision)
 	if m.shouldGenerateSubtasks(task) {
-		log.Printf("LLM determined task %s should generate subtasks", task.ID)
+		m.logger.Info("LLM determined task should generate subtasks", slog.String("task_id", task.ID))
 		if err := m.generateSubtasksForTask(ctx, task); err != nil {
-			log.Printf("Warning: Failed to generate subtasks for task %s: %v", task.ID, err)
+			m.logger.Warn("Failed to generate subtasks for task", 
+				slog.String("task_id", task.ID), 
+				slog.String("error", err.Error()))
 			// Continue with normal processing if subtask generation fails
 		} else {
 			// Task has been converted to subtask management, mark as completed
@@ -283,7 +306,9 @@
 				return fmt.Errorf("failed to update task with subtasks: %w", err)
 			}
 
-			log.Printf("Task %s converted to subtasks by agent %s using LLM analysis", task.ID, agent.Name)
+			m.logger.Info("Task converted to subtasks by agent using LLM analysis", 
+				slog.String("task_id", task.ID), 
+				slog.String("agent", agent.Name))
 			return nil
 		}
 	}
@@ -326,7 +351,11 @@
 		agent.Stats.AvgTime = (agent.Stats.AvgTime + duration.Milliseconds()) / 2
 	}
 
-	log.Printf("Task %s completed by agent %s in %v. PR: %s", task.ID, agent.Name, duration, prURL)
+	m.logger.Info("Task completed by agent", 
+		slog.String("task_id", task.ID), 
+		slog.String("agent", agent.Name), 
+		slog.Duration("duration", duration), 
+		slog.String("pr_url", prURL))
 	return nil
 }
 
@@ -415,11 +444,15 @@
 		return fmt.Errorf("failed to get agent clone: %w", err)
 	}
 
-	log.Printf("Agent %s working in clone: %s", agent.Name, clonePath)
+	m.logger.Info("Agent working in clone", 
+		slog.String("agent", agent.Name), 
+		slog.String("clone_path", clonePath))
 
 	// Refresh the clone with latest changes
 	if err := m.cloneManager.RefreshAgentClone(agent.Name); err != nil {
-		log.Printf("Warning: Failed to refresh clone for agent %s: %v", agent.Name, err)
+		m.logger.Warn("Failed to refresh clone for agent", 
+			slog.String("agent", agent.Name), 
+			slog.String("error", err.Error()))
 	}
 
 	// All Git operations use the agent's clone directory
@@ -490,7 +523,9 @@
 		return fmt.Errorf("failed to push branch: %w", err)
 	}
 
-	log.Printf("Agent %s successfully pushed branch %s", agent.Name, branchName)
+	m.logger.Info("Agent successfully pushed branch", 
+		slog.String("agent", agent.Name), 
+		slog.String("branch", branchName))
 	return nil
 }
 
@@ -583,7 +618,10 @@
 	}
 
 	explanation := m.autoAssigner.GetRecommendationExplanation(task, agentName)
-	log.Printf("Auto-assigned task %s to %s: %s", taskID, agentName, explanation)
+	m.logger.Info("Auto-assigned task to agent", 
+		slog.String("task_id", taskID), 
+		slog.String("agent", agentName), 
+		slog.String("explanation", explanation))
 
 	return nil
 }
@@ -631,7 +669,9 @@
 	ctx := context.Background()
 	decision, err := m.subtaskService.ShouldGenerateSubtasks(ctx, task)
 	if err != nil {
-		log.Printf("Warning: Failed to get LLM subtask decision for task %s: %v", task.ID, err)
+		m.logger.Warn("Failed to get LLM subtask decision for task", 
+			slog.String("task_id", task.ID), 
+			slog.String("error", err.Error()))
 		// Fallback to simple heuristics
 		return task.Priority == tm.PriorityHigh || len(task.Description) > 200
 	}
@@ -639,11 +679,14 @@
 	// Update task to mark as evaluated
 	task.SubtasksEvaluated = true
 	if err := m.taskManager.UpdateTask(task); err != nil {
-		log.Printf("Warning: Failed to update task evaluation status: %v", err)
+		m.logger.Warn("Failed to update task evaluation status", slog.String("error", err.Error()))
 	}
 
-	log.Printf("LLM subtask decision for task %s: needs_subtasks=%v, complexity=%d, reasoning=%s", 
-		task.ID, decision.NeedsSubtasks, decision.ComplexityScore, decision.Reasoning)
+	m.logger.Info("LLM subtask decision for task", 
+		slog.String("task_id", task.ID), 
+		slog.Bool("needs_subtasks", decision.NeedsSubtasks), 
+		slog.Int("complexity_score", decision.ComplexityScore), 
+		slog.String("reasoning", decision.Reasoning))
 
 	return decision.NeedsSubtasks
 }
@@ -670,13 +713,20 @@
 	task.SubtasksPRURL = prURL
 	task.SubtasksGenerated = true
 
-	log.Printf("Generated subtask PR for task %s: %s", task.ID, prURL)
-	log.Printf("Proposed %d subtasks and %d new agents for task %s", len(analysis.Subtasks), len(analysis.AgentCreations), task.ID)
+	m.logger.Info("Generated subtask PR for task", 
+		slog.String("task_id", task.ID), 
+		slog.String("pr_url", prURL))
+	m.logger.Info("Proposed subtasks and new agents for task", 
+		slog.String("task_id", task.ID), 
+		slog.Int("subtask_count", len(analysis.Subtasks)), 
+		slog.Int("new_agent_count", len(analysis.AgentCreations)))
 	
 	// Log proposed new agents if any
 	if len(analysis.AgentCreations) > 0 {
 		for _, agent := range analysis.AgentCreations {
-			log.Printf("Proposed new agent: %s with skills: %v", agent.Role, agent.Skills)
+			m.logger.Info("Proposed new agent", 
+				slog.String("role", agent.Role), 
+				slog.Any("skills", agent.Skills))
 		}
 	}
 
@@ -700,19 +750,21 @@
 	// Close all LLM providers
 	for _, agent := range m.agents {
 		if err := agent.Provider.Close(); err != nil {
-			log.Printf("Error closing provider for agent %s: %v", agent.Name, err)
+			m.logger.Error("Error closing provider for agent", 
+				slog.String("agent", agent.Name), 
+				slog.String("error", err.Error()))
 		}
 	}
 
 	// Cleanup all agent Git clones
 	if err := m.cloneManager.CleanupAllClones(); err != nil {
-		log.Printf("Error cleaning up agent clones: %v", err)
+		m.logger.Error("Error cleaning up agent clones", slog.String("error", err.Error()))
 	}
 
 	// Cleanup subtask service
 	if m.subtaskService != nil {
 		if err := m.subtaskService.Close(); err != nil {
-			log.Printf("Error closing subtask service: %v", err)
+			m.logger.Error("Error closing subtask service", slog.String("error", err.Error()))
 		}
 	}
 
diff --git a/server/cmd/commands/root.go b/server/cmd/commands/root.go
index 63e0d8f..ade7c53 100644
--- a/server/cmd/commands/root.go
+++ b/server/cmd/commands/root.go
@@ -79,7 +79,7 @@
 	taskManager = git_tm.NewGitTaskManagerWithLogger(gitInterface, "../", logger)
 
 	// Initialize agent manager
-	agentManager, err = agent.NewManager(cfg, taskManager)
+	agentManager, err = agent.NewManager(cfg, taskManager, logger)
 	if err != nil {
 		return fmt.Errorf("failed to initialize agent manager: %w", err)
 	}
diff --git a/server/git/github.go b/server/git/github.go
index 63424f1..6555b69 100644
--- a/server/git/github.go
+++ b/server/git/github.go
@@ -5,6 +5,7 @@
 	"context"
 	"encoding/json"
 	"fmt"
+	"log/slog"
 	"net/http"
 	"time"
 )
@@ -14,6 +15,7 @@
 	Token      string
 	BaseURL    string // Default: https://api.github.com
 	HTTPClient *http.Client
+	Logger     *slog.Logger
 }
 
 // GitHubPullRequestProvider implements PullRequestProvider for GitHub
@@ -21,6 +23,7 @@
 	config GitHubConfig
 	owner  string
 	repo   string
+	logger *slog.Logger
 }
 
 // NewGitHubPullRequestProvider creates a new GitHub pull request provider
@@ -31,11 +34,15 @@
 	if config.HTTPClient == nil {
 		config.HTTPClient = &http.Client{Timeout: 30 * time.Second}
 	}
+	if config.Logger == nil {
+		config.Logger = slog.Default()
+	}
 
 	return &GitHubPullRequestProvider{
 		config: config,
 		owner:  owner,
 		repo:   repo,
+		logger: config.Logger,
 	}
 }
 
@@ -123,11 +130,15 @@
 		return nil, fmt.Errorf("failed to marshal request body: %w", err)
 	}
 
-	// Debug logging for request data
-	fmt.Printf("DEBUG: Creating PR with data: %s\n", string(jsonBody))
+	// Log PR creation with structured data
+	g.logger.Info("Creating GitHub PR",
+		slog.String("url", fmt.Sprintf("%s/repos/%s/%s/pulls", g.config.BaseURL, g.owner, g.repo)),
+		slog.String("title", options.Title),
+		slog.String("head_branch", options.HeadBranch),
+		slog.String("base_branch", options.BaseBranch),
+		slog.Any("labels", options.Labels))
 
 	url := fmt.Sprintf("%s/repos/%s/%s/pulls", g.config.BaseURL, g.owner, g.repo)
-	fmt.Printf("DEBUG: POST URL: %s\n", url)
 	
 	req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewBuffer(jsonBody))
 	if err != nil {
diff --git a/server/server/server.go b/server/server/server.go
index 8b5fae7..f03327a 100644
--- a/server/server/server.go
+++ b/server/server/server.go
@@ -52,7 +52,7 @@
 
 	// Create agent manager with config
 	var err error
-	s.manager, err = agent.NewManager(s.config, taskManager)
+	s.manager, err = agent.NewManager(s.config, taskManager, s.logger)
 	if err != nil {
 		return fmt.Errorf("failed to create agent manager: %w", err)
 	}
diff --git a/server/staff b/server/staff
new file mode 100755
index 0000000..701a6e8
--- /dev/null
+++ b/server/staff
Binary files differ
diff --git a/server/subtasks/service.go b/server/subtasks/service.go
index c1a1bc9..d704a33 100644
--- a/server/subtasks/service.go
+++ b/server/subtasks/service.go
@@ -4,7 +4,7 @@
 	"context"
 	"encoding/json"
 	"fmt"
-	"log"
+	"log/slog"
 	"os"
 	"os/exec"
 	"path/filepath"
@@ -25,10 +25,14 @@
 	githubOwner    string
 	githubRepo     string
 	cloneManager   *git.CloneManager
+	logger         *slog.Logger
 }
 
 // NewSubtaskService creates a new subtask service
-func NewSubtaskService(provider llm.LLMProvider, taskManager tm.TaskManager, agentRoles []string, prProvider git.PullRequestProvider, githubOwner, githubRepo string, cloneManager *git.CloneManager) *SubtaskService {
+func NewSubtaskService(provider llm.LLMProvider, taskManager tm.TaskManager, agentRoles []string, prProvider git.PullRequestProvider, githubOwner, githubRepo string, cloneManager *git.CloneManager, logger *slog.Logger) *SubtaskService {
+	if logger == nil {
+		logger = slog.Default()
+	}
 	return &SubtaskService{
 		llmProvider:  provider,
 		taskManager:  taskManager,
@@ -37,6 +41,7 @@
 		githubOwner:  githubOwner,
 		githubRepo:   githubRepo,
 		cloneManager: cloneManager,
+		logger:       logger,
 	}
 }
 
@@ -334,7 +339,7 @@
 	
 	// Validate agent assignments and handle new agent creation
 	if err := s.validateAndHandleAgentAssignments(analysis); err != nil {
-		log.Printf("Warning during agent assignment handling: %v", err)
+		s.logger.Warn("Warning during agent assignment handling", slog.String("error", err.Error()))
 	}
 	
 	return analysis, nil
@@ -385,8 +390,10 @@
 	
 	for i := range analysis.Subtasks {
 		if !availableRoles[analysis.Subtasks[i].AssignedTo] {
-			log.Printf("Warning: Unknown agent role '%s' for subtask '%s', assigning to %s", 
-				analysis.Subtasks[i].AssignedTo, analysis.Subtasks[i].Title, defaultRole)
+			s.logger.Warn("Unknown agent role for subtask, using default", 
+				slog.String("unknown_role", analysis.Subtasks[i].AssignedTo),
+				slog.String("subtask_title", analysis.Subtasks[i].Title),
+				slog.String("assigned_role", defaultRole))
 			analysis.Subtasks[i].AssignedTo = defaultRole
 		}
 	}
@@ -421,7 +428,7 @@
 
 	// Generate branch name for subtask proposal
 	branchName := fmt.Sprintf("subtasks/%s-proposal", analysis.ParentTaskID)
-	log.Printf("Creating subtask PR with branch: %s", branchName)
+	s.logger.Info("Creating subtask PR", slog.String("branch", branchName))
 
 	// Create Git branch and commit subtask proposal
 	if err := s.createSubtaskBranch(ctx, analysis, branchName); err != nil {
@@ -442,7 +449,7 @@
 
 	// Determine base branch (try main first, fallback to master)
 	baseBranch := s.determineBaseBranch(ctx)
-	log.Printf("Using base branch: %s", baseBranch)
+	s.logger.Info("Using base branch", slog.String("base_branch", baseBranch))
 
 	// Create the pull request
 	options := git.PullRequestOptions{
@@ -454,7 +461,10 @@
 		Draft:       false,
 	}
 
-	log.Printf("Creating PR with options: title=%s, head=%s, base=%s", options.Title, options.HeadBranch, options.BaseBranch)
+	s.logger.Info("Creating PR with options",
+		slog.String("title", options.Title),
+		slog.String("head_branch", options.HeadBranch),
+		slog.String("base_branch", options.BaseBranch))
 
 	pr, err := s.prProvider.CreatePullRequest(ctx, options)
 	if err != nil {
@@ -462,7 +472,7 @@
 	}
 
 	prURL := fmt.Sprintf("https://github.com/%s/%s/pull/%d", s.githubOwner, s.githubRepo, pr.Number)
-	log.Printf("Generated subtask proposal PR: %s", prURL)
+	s.logger.Info("Generated subtask proposal PR", slog.String("pr_url", prURL))
 
 	return prURL, nil
 }
@@ -476,7 +486,7 @@
 	// Get clone path to check branches
 	clonePath, err := s.cloneManager.GetAgentClonePath("subtask-service")
 	if err != nil {
-		log.Printf("Warning: failed to get clone path for base branch detection: %v", err)
+		s.logger.Warn("Failed to get clone path for base branch detection", slog.String("error", err.Error()))
 		return "main"
 	}
 
@@ -498,7 +508,7 @@
 	}
 
 	// Default to main if neither can be detected
-	log.Printf("Warning: Could not determine base branch, defaulting to 'main'")
+	s.logger.Warn("Could not determine base branch, defaulting to 'main'")
 	return "main"
 }
 
@@ -654,7 +664,7 @@
 		}
 	}
 	
-	log.Printf("Updated parent task %s to completed status", analysis.ParentTaskID)
+	s.logger.Info("Updated parent task to completed status", slog.String("task_id", analysis.ParentTaskID))
 	return nil
 }
 
@@ -741,7 +751,7 @@
 	// Pull latest changes
 	cmd = gitCmd("pull", "origin")
 	if err := cmd.Run(); err != nil {
-		log.Printf("Warning: failed to pull latest changes: %v", err)
+		s.logger.Warn("Failed to pull latest changes", slog.String("error", err.Error()))
 	}
 
 	// Delete branch if it exists (cleanup from previous attempts)
@@ -775,7 +785,7 @@
 	// Track parent task file for staging
 	parentRelativeFile := filepath.Join("operations", "tasks", fmt.Sprintf("%s.md", analysis.ParentTaskID))
 	stagedFiles = append(stagedFiles, parentRelativeFile)
-	log.Printf("Updated parent task file: %s", parentRelativeFile)
+	s.logger.Info("Updated parent task file", slog.String("file", parentRelativeFile))
 
 	// Create a file for each subtask
 	for i, subtask := range analysis.Subtasks {
@@ -790,7 +800,7 @@
 		// Track file for staging
 		relativeFile := filepath.Join("operations", "tasks", fmt.Sprintf("%s.md", taskID))
 		stagedFiles = append(stagedFiles, relativeFile)
-		log.Printf("Created subtask file: %s", relativeFile)
+		s.logger.Info("Created subtask file", slog.String("file", relativeFile))
 	}
 
 	// Stage all subtask files
@@ -825,7 +835,7 @@
 		return fmt.Errorf("failed to push branch: %w", err)
 	}
 
-	log.Printf("Created subtask proposal branch: %s", branchName)
+	s.logger.Info("Created subtask proposal branch", slog.String("branch", branchName))
 	return nil
 }
 
diff --git a/server/subtasks/service_test.go b/server/subtasks/service_test.go
index 0a8e473..08dd72a 100644
--- a/server/subtasks/service_test.go
+++ b/server/subtasks/service_test.go
@@ -81,7 +81,7 @@
 	mockProvider := NewMockLLMProvider([]string{})
 	agentRoles := []string{"backend", "frontend", "qa"}
 	
-	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
 	
 	if service == nil {
 		t.Fatal("NewSubtaskService returned nil")
@@ -107,7 +107,7 @@
 
 	mockProvider := NewMockLLMProvider([]string{decisionResponse})
 	agentRoles := []string{"backend", "frontend", "qa"}
-	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
 	
 	// Test the parseSubtaskDecision method directly since ShouldGenerateSubtasks is used by manager
 	decision, err := service.parseSubtaskDecision(decisionResponse)
@@ -166,7 +166,7 @@
 
 	mockProvider := NewMockLLMProvider([]string{jsonResponse})
 	agentRoles := []string{"backend", "frontend", "qa", "ceo"} // Include CEO for agent creation
-	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
 	
 	task := &tm.Task{
 		ID:          "test-task-123",
@@ -267,7 +267,7 @@
 	
 	mockProvider := NewMockLLMProvider([]string{invalidResponse})
 	agentRoles := []string{"backend", "frontend"}
-	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
 	
 	task := &tm.Task{
 		ID:    "test-task-123",
@@ -303,7 +303,7 @@
 
 	mockProvider := NewMockLLMProvider([]string{jsonResponse})
 	agentRoles := []string{"backend", "frontend"}
-	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
 	
 	task := &tm.Task{
 		ID:    "test-task-123",
@@ -323,7 +323,7 @@
 
 func TestGenerateSubtaskPR(t *testing.T) {
 	mockProvider := NewMockLLMProvider([]string{})
-	service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil)
+	service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil, nil)
 	
 	analysis := &tm.SubtaskAnalysis{
 		ParentTaskID:        "task-123",
@@ -357,7 +357,7 @@
 func TestBuildSubtaskAnalysisPrompt(t *testing.T) {
 	mockProvider := NewMockLLMProvider([]string{})
 	agentRoles := []string{"backend", "frontend", "qa"}
-	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
 	
 	task := &tm.Task{
 		Title:       "Build authentication system",
@@ -388,7 +388,7 @@
 func TestGetSubtaskAnalysisSystemPrompt(t *testing.T) {
 	mockProvider := NewMockLLMProvider([]string{})
 	agentRoles := []string{"backend", "frontend", "qa", "devops"}
-	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
 	
 	systemPrompt := service.getSubtaskAnalysisSystemPrompt()
 	
@@ -412,7 +412,7 @@
 func TestIsValidAgentRole(t *testing.T) {
 	mockProvider := NewMockLLMProvider([]string{})
 	agentRoles := []string{"backend", "frontend", "qa"}
-	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+	service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
 	
 	if !service.isValidAgentRole("backend") {
 		t.Error("'backend' should be a valid agent role")
@@ -433,7 +433,7 @@
 
 func TestParseSubtaskAnalysis_Priority(t *testing.T) {
 	mockProvider := NewMockLLMProvider([]string{})
-	service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil)
+	service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil, nil)
 	
 	tests := []struct {
 		input    string
@@ -485,7 +485,7 @@
 
 func TestGenerateSubtaskFile(t *testing.T) {
 	mockProvider := NewMockLLMProvider([]string{})
-	service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil)
+	service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil, nil)
 	
 	subtask := tm.SubtaskProposal{
 		Title:          "Implement API endpoints",
@@ -552,7 +552,7 @@
 
 func TestUpdateParentTaskAsCompleted(t *testing.T) {
 	mockProvider := NewMockLLMProvider([]string{})
-	service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil)
+	service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil, nil)
 	
 	// Create a temporary task file for testing
 	taskContent := `---
@@ -639,7 +639,7 @@
 
 func TestClose(t *testing.T) {
 	mockProvider := NewMockLLMProvider([]string{})
-	service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil)
+	service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil, nil)
 	
 	err := service.Close()
 	if err != nil {
@@ -666,7 +666,7 @@
 }`
 
 	mockProvider := NewMockLLMProvider([]string{jsonResponse})
-	service := NewSubtaskService(mockProvider, nil, []string{"backend", "frontend"}, nil, "example", "repo", nil)
+	service := NewSubtaskService(mockProvider, nil, []string{"backend", "frontend"}, nil, "example", "repo", nil, nil)
 	
 	task := &tm.Task{
 		ID:          "benchmark-task",