Files
kugetsu/docs/agent-concurrency-benchmark.md

4.0 KiB

Agent Concurrency Benchmark

Date: 2026-04-01
Hardware: 8GB RAM, 16 CPU cores

Test Results

Limit (PM+Dev) Status Rejection Test Notes
1 ✓ Works 1 dev rejected (PM=1, at limit) Too strict for normal use
3 ✓ Works 4th dev rejected (PM + 3 devs = 4, at limit) Recommended
5 ✓ Works 6th dev rejected (PM + 5 devs = 6, at limit) Works, monitor memory

Architecture

OpenCode is a cloud client - agents run on OpenCode's server (MiniMax), not locally.

┌─────────────────┐         ┌─────────────────┐
│   Local Host    │         │   OpenCode      │
│                 │  HTTPS  │   Server        │
│  kugetsu CLI    │◄───────►│   (MiniMax)     │
│  worktrees/     │  API    │   Agents run    │
│  sessions/      │  Key    │   here          │
│  opencode.db    │         │                 │
└─────────────────┘         └─────────────────┘
     ~4MB per agent             Server-side
     (worktree only)            memory (unknown)

Memory Analysis

Local Memory (Measurable)

Component Memory Notes
Per worktree ~600KB Git repository clone
Sessions dir ~28KB JSON metadata
opencode.db ~93MB Local cache (148 sessions, 10K+ messages)
Total 5 agents ~4MB Worktrees only, negligible

Conclusion: Local RAM does NOT limit agent count. A 1GB or 2GB system can run MAX=10 agents.

Server Memory (Not Measurable)

  • OpenCode server runs on MiniMax's infrastructure
  • No local process to measure RSS/memory
  • Agent computation happens server-side
  • Memory limit determined by OpenCode service, not local hardware

Local Bottleneck

The only local constraint is MAX_CONCURRENT_AGENTS limit, which:

  • Counts session files (PM + dev agents)
  • Enforced in kugetsu before spawning
  • Prevents resource overload on OpenCode server

Behavior

With MAX_CONCURRENT_AGENTS=N:

  • PM agent counts toward the limit (along with all dev agents)
  • At limit: NEW sessions are REJECTED
  • Existing sessions can ALWAYS be continued (--continue doesn't count toward limit)
  • PM is still accessible when at limit (user can wait or cancel tasks)

Configuration

Default limit is set to 5 concurrent agents in skills/kugetsu/scripts/kugetsu:

MAX_CONCURRENT_AGENTS="${MAX_CONCURRENT_AGENTS:-5}"

The limit can be overridden via environment variable:

MAX_CONCURRENT_AGENTS=3 kugetsu start <issue> <message>

Implementation

Session counting approach (vs broken slot mechanism):

# Count all session files except base.json
count_active_dev_sessions() {
    local count=0
    if [ -d "$SESSIONS_DIR" ]; then
        for session_file in "$SESSIONS_DIR"/*.json; do
            if [ -f "$session_file" ]; then
                local filename=$(basename "$session_file")
                if [ "$filename" != "base.json" ]; then
                    count=$((count + 1))
                fi
            fi
        done
    fi
    echo "$count"
}

Session Files

~/.kugetsu/sessions/
  base.json                    - base session (NOT counted)
  pm-agent.json                - PM agent (COUNTED)
  github.com-user-repo#1.json  - dev agent (COUNTED)
  github.com-user-repo#2.json  - dev agent (COUNTED)

Recommendations

  • 1 agent: Too strict - just PM + 0 dev agents
  • 3 agents: Recommended - PM + 2 dev agents, leaves room for PM to coordinate
  • 5 agents: Works - PM + 4 dev agents, monitor OpenCode service limits
  • More than 5: Not tested - depends on OpenCode server capacity

Session Cleanup

Sessions persist until explicitly destroyed:

  • kugetsu destroy <issue-ref> - destroy specific session
  • kugetsu destroy --pm-agent -y - destroy PM agent
  • PM should destroy sessions after PR merged (on natural breakpoints)