- Branch collision problem and real-world example - Three solutions: sequential, git worktree, orchestrator pattern - Sub-agent task template with git rules - Pre-commit hook handling for multi-agent - Secret scanning SOP - Orchestrator checklist
5 KiB
Multi-Agent Git Workflow Guide
Lessons learned from the VK v2.0 sprint where multiple AI agents worked on the same repository simultaneously.
The Problem: Branch Collisions
When you spawn multiple sub-agents (via sessions_spawn or similar) and they all work on the same git repository, they share a single working directory. This causes:
- Branch stomping: Agent A creates
feat/task-a, Agent B createsfeat/task-b, butgit checkoutin Agent B switches the entire working directory — Agent A's uncommitted changes are now on the wrong branch or lost. - Mixed commits: Both agents stage and commit files. Pre-commit hooks run against ALL staged files, including the other agent's work. Lint/typecheck failures from incomplete work block commits.
- Merge confusion: Changes from different features end up interleaved in the same branch history.
Real Example
During the v2.0 sprint, two Sonnet sub-agents were spawned in parallel:
- Sonnet-1:
feat/markdown-rendering-63(frontend React work) - Sonnet-2:
feat/cli-usage-reporting-50(CLI TypeScript work)
Both worked in ~/Projects/veritas-kanban. Sonnet-2's CLI changes ended up staged alongside Sonnet-1's React changes. The pre-commit hook tried to lint MarkdownText.tsx (Sonnet-1's file) during Sonnet-2's commit and failed because the file wasn't complete yet.
Solutions
Option 1: Sequential Execution (Simplest)
Run sub-agents one at a time on the same repo. Each agent:
- Creates a feature branch
- Does its work
- Commits and merges to main
- Main agent spawns the next sub-agent
Pros: No conflicts, no complexity Cons: Slower (no parallelism)
Best for: Small teams, tasks that touch overlapping files
Option 2: Git Worktrees (Recommended for Parallel)
Git worktrees let you have multiple working directories for the same repo, each on a different branch:
# Create worktrees for each agent
git worktree add ../vk-agent-1 -b feat/task-a
git worktree add ../vk-agent-2 -b feat/task-b
# Each sub-agent works in its own directory
# Agent 1 → ~/Projects/vk-agent-1/
# Agent 2 → ~/Projects/vk-agent-2/
# After work is done, merge from the main repo
cd ~/Projects/veritas-kanban
git merge feat/task-a
git merge feat/task-b
# Clean up
git worktree remove ../vk-agent-1
git worktree remove ../vk-agent-2
Pros: True parallelism, no branch conflicts, each agent has isolated workspace Cons: More setup, disk space, orchestrator must manage worktree lifecycle
Best for: Large sprints, independent features, CI/CD parallel builds
Option 3: Orchestrator Does Heavy Lifting, Delegates Light Tasks
The orchestrator (main agent) works directly on the repo for complex tasks. Sub-agents handle:
- Independent research (no git needed)
- Documentation writing (separate files)
- Code review (read-only)
- Tasks in different repos
Pros: Minimal coordination overhead Cons: Limited parallelism on same repo
Best for: Mixed workloads where some tasks don't need the repo
Sub-Agent Task Template
When spawning a sub-agent that touches a git repo, include these instructions:
## Git Rules
1. Create your feature branch: `git checkout -b feat/your-branch`
2. Work ONLY in your branch
3. Before committing: run secret scan on ALL changed files
4. Use `--no-verify` if pre-commit hooks fail on other agents' files
5. After committing, switch back to main: `git checkout main`
6. Do NOT modify files outside your feature scope
Pre-Commit Hook Handling
VK uses lint-staged which runs ESLint on all staged files. When multiple agents stage files:
- Problem: Agent A's half-written file fails Agent B's lint check
- Fix: Use
git commit --no-verifywhen you've verified your own files are clean - Better fix: Use worktrees so each agent has its own staging area
Secret Scanning
MANDATORY before every commit, regardless of agent:
grep -rn "password\|secret\|token\|apiKey\|appPassword\|sk-\|pplx-\|xai-" <changed-files>
Filter out false positives (variable names like tokenProvider, inputTokens, etc.) but NEVER skip the scan.
Orchestrator Checklist
When managing a multi-agent sprint:
- Decide: sequential or parallel?
- If parallel: set up worktrees before spawning
- Give each agent a clear branch name convention
- Include git rules in every sub-agent task prompt
- After each agent finishes: review, secret scan, merge to main
- Clean up feature branches and worktrees
- Run full test suite after all merges
Lessons Learned
- "Mental notes" don't work for stateless agents — write everything to files
- Pre-commit hooks are global — they see ALL staged files, not just yours
- Branch names must be unique — two agents creating
feat/my-feature= disaster - Orchestrator must verify merges — sub-agents can't see each other's work
- Sequential is faster than fixing parallel mistakes — when in doubt, go serial
- Secret scans are non-negotiable — one leaked key = delete git history (expensive)