blob: 1cbe1843c9b0d742d369354db6fc7a35f10314c8 [file] [log] [blame] [view]
# Git Concurrency Solution: Per-Agent Repository Clones
## Problem Statement
Git is not thread-safe, which creates critical race conditions when multiple AI agents try to perform Git operations concurrently:
- **Repository Corruption**: Multiple agents modifying the same `.git` folder simultaneously
- **Branch Conflicts**: Agents creating branches with the same names or overwriting each other's work
- **Push Failures**: Concurrent pushes causing merge conflicts and failed operations
- **Index Lock Errors**: Git index.lock conflicts when multiple processes access the repository
## Solution: Per-Agent Git Clones
Instead of using mutexes (which would serialize all Git operations and hurt performance), we give each agent its own Git repository clone:
```
workspace/
├── agent-backend-engineer/ # Backend engineer's clone
├── .git/
├── tasks/
└── ...
├── agent-frontend-engineer/ # Frontend engineer's clone
├── .git/
├── tasks/
└── ...
└── agent-qa-engineer/ # QA engineer's clone
├── .git/
├── tasks/
└── ...
```
## Key Benefits
### 🚀 **True Concurrency**
- Multiple agents can work simultaneously without blocking each other
- No waiting for Git lock releases
- Scales to hundreds of concurrent agents
### 🛡️ **Complete Isolation**
- Each agent has its own `.git` directory and working tree
- No shared state or race conditions
- Agent failures don't affect other agents
### 🔄 **Automatic Synchronization**
- Each clone automatically pulls latest changes before creating branches
- All branches push to the same remote repository
- PRs are created against the main repository
### 🧹 **Easy Cleanup**
- `staff cleanup-clones` removes all agent workspaces
- Clones are recreated on-demand when agents start working
- No manual Git state management required
## Implementation Details
### CloneManager (`git/clone_manager.go`)
```go
type CloneManager struct {
baseRepoURL string // Source repository URL
workspacePath string // Base workspace directory
agentClones map[string]string // agent name -> clone path
mu sync.RWMutex // Thread-safe map access
}
```
**Key Methods:**
- `GetAgentClonePath(agentName)` - Get/create agent's clone directory
- `RefreshAgentClone(agentName)` - Pull latest changes for an agent
- `CleanupAgentClone(agentName)` - Remove specific agent's clone
- `CleanupAllClones()` - Remove all agent clones
### Agent Integration
Each agent's Git operations are automatically routed to its dedicated clone:
```go
// Get agent's dedicated Git clone
clonePath, err := am.cloneManager.GetAgentClonePath(agent.Name)
if err != nil {
return fmt.Errorf("failed to get agent clone: %w", err)
}
// All Git operations use the agent's clone directory
gitCmd := func(args ...string) *exec.Cmd {
return exec.CommandContext(ctx, "git", append([]string{"-C", clonePath}, args...)...)
}
```
## Workflow Example
1. **Agent Starts Task**:
```bash
Agent backend-engineer gets task: "Add user authentication"
Creating clone: workspace/agent-backend-engineer/
```
2. **Concurrent Operations**:
```bash
# These happen simultaneously without conflicts:
Agent backend-engineer: git clone -> workspace/agent-backend-engineer/
Agent frontend-engineer: git clone -> workspace/agent-frontend-engineer/
Agent qa-engineer: git clone -> workspace/agent-qa-engineer/
```
3. **Branch Creation**:
```bash
# Each agent creates branches in their own clone:
backend-engineer: git checkout -b task-123-auth-backend
frontend-engineer: git checkout -b task-124-auth-ui
qa-engineer: git checkout -b task-125-auth-tests
```
4. **Concurrent Pushes**:
```bash
# All agents push to origin simultaneously:
git push -u origin task-123-auth-backend # ✅ Success
git push -u origin task-124-auth-ui # ✅ Success
git push -u origin task-125-auth-tests # ✅ Success
```
## Management Commands
### List Agent Clones
```bash
staff list-agents # Shows which agents are running and their clone status
```
### Cleanup All Clones
```bash
staff cleanup-clones # Removes all agent workspace directories
```
### Monitor Disk Usage
```bash
du -sh workspace/ # Check total workspace disk usage
```
## Resource Considerations
### Disk Space
- Each clone uses ~repository size (typically 10-100MB per agent)
- For 10 agents with 50MB repo = ~500MB total
- Use `staff cleanup-clones` to free space when needed
### Network Usage
- Initial clone downloads full repository
- Subsequent `git pull` operations are incremental
- All agents share the same remote repository
### Performance
- Clone creation: ~2-5 seconds per agent (one-time cost)
- Git operations: Full speed, no waiting for locks
- Parallel processing: Linear scalability with agent count
## Comparison to Alternatives
| Solution | Concurrency | Complexity | Performance | Risk |
|----------|-------------|------------|-------------|------|
| **Per-Agent Clones** | ✅ Full | 🟡 Medium | ✅ High | 🟢 Low |
| Global Git Mutex | ❌ None | 🟢 Low | ❌ Poor | 🟡 Medium |
| File Locking | 🟡 Limited | 🔴 High | 🟡 Medium | 🔴 High |
| Separate Repositories | ✅ Full | 🔴 Very High | ✅ High | 🔴 High |
## Future Enhancements
- **Lazy Cleanup**: Auto-remove unused clones after N days
- **Clone Sharing**: Share clones between agents with similar tasks
- **Compressed Clones**: Use `git clone --depth=1` for space efficiency
- **Remote Workspaces**: Support for distributed agent execution
The per-agent clone solution provides the optimal balance of performance, safety, and maintainability for concurrent AI agent operations.