From dfc87e3da38a36baec0b89d0493ee3779489ae30 Mon Sep 17 00:00:00 2001 From: shokollm <270575765+shokollm@users.noreply.github.com> Date: Tue, 31 Mar 2026 06:12:10 +0000 Subject: [PATCH 1/3] feat(kugetsu): implement fire-and-forget delegation - cmd_delegate now runs in background with nohup + disown - Output logged to ~/.kugetsu/logs/delegate-.log - Added cmd_logs to view recent delegation logs - Log rotation: logs older than 7 days auto-deleted Issue #41: https://git.fbrns.co/shoko/kugetsu/issues/41 --- skills/kugetsu/scripts/kugetsu | 37 +++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/skills/kugetsu/scripts/kugetsu b/skills/kugetsu/scripts/kugetsu index 0a56403..bc9f37e 100755 --- a/skills/kugetsu/scripts/kugetsu +++ b/skills/kugetsu/scripts/kugetsu @@ -7,6 +7,7 @@ WORKTREES_DIR="$KUGETSU_DIR/worktrees" REPOS_CONFIG="$KUGETSU_DIR/repos.json" INDEX_FILE="$KUGETSU_DIR/index.json" NOTIFICATIONS_FILE="$KUGETSU_DIR/notifications.json" +LOGS_DIR="$KUGETSU_DIR/logs" usage() { cat << 'EOF' @@ -16,7 +17,8 @@ Usage: kugetsu init [--force] Initialize base + pm-agent sessions (requires TTY) kugetsu start [--debug] Start task for issue (forks base session) kugetsu continue [message] [--debug] Continue existing task for issue - kugetsu delegate Send message to PM agent + kugetsu delegate Send message to PM agent (fire-and-forget) + kugetsu logs [n] Show recent delegation logs (default: 10) kugetsu status Check kugetsu initialization status kugetsu doctor [--fix] Diagnose and fix kugetsu issues kugetsu notify [list|clear] Show or clear notifications @@ -38,7 +40,10 @@ Commands: Requires pm-agent to be running (created by init). continue Continue work on existing issue session. delegate Send message to PM agent for task coordination. - PM context is loaded once at init time. + Fire-and-forget: returns immediately, runs in background. + Use 'kugetsu logs' to check output. + logs Show recent delegation logs. + Default: 10 most recent. Use 'kugetsu logs 20' for more. status Check if kugetsu is initialized and PM agent is active. doctor Diagnose kugetsu issues. Use --fix to attempt repairs. notify Show or clear notifications from PM agent. @@ -64,6 +69,8 @@ Examples: kugetsu init kugetsu status kugetsu delegate "work on issue #5" + kugetsu logs + kugetsu logs 20 kugetsu doctor kugetsu doctor --fix kugetsu notify list @@ -493,7 +500,27 @@ cmd_delegate() { exit 1 fi - opencode run --continue --session "$pm_session" "$message" 2>&1 + mkdir -p "$LOGS_DIR" + local log_file="$LOGS_DIR/delegate-$(date +%s).log" + nohup opencode run --continue --session "$pm_session" "$message" > "$log_file" 2>&1 & + disown + echo "Delegated to PM agent (logged to $(basename "$log_file"))" +} + +cmd_logs() { + local count="${1:-10}" + + if [ ! -d "$LOGS_DIR" ]; then + echo "No logs found." + return + fi + + # Log rotation: delete logs older than 7 days + find "$LOGS_DIR" -type f -mtime +7 -delete 2>/dev/null + + ls -lt "$LOGS_DIR" | head -$((count + 1)) | tail -$count | while read line; do + echo "$line" + done } cmd_doctor() { @@ -1092,6 +1119,10 @@ main() { delegate) cmd_delegate "$@" ;; + logs) + shift + cmd_logs "$@" + ;; status) cmd_status ;; -- 2.49.1 From 3c15d8df1d9b656f8fe96ae1d94889e1b9734eb1 Mon Sep 17 00:00:00 2001 From: shokollm <270575765+shokollm@users.noreply.github.com> Date: Tue, 31 Mar 2026 07:26:00 +0000 Subject: [PATCH 2/3] Add concurrent agent limiting to kugetsu CLI - Add MAX_CONCURRENT_AGENTS (default: 3) to limit concurrent agents - Implement acquire_agent_slot() and release_agent_slot() with flock - Wrap cmd_start, cmd_continue, and cmd_delegate with slot management - cmd_delegate holds slot until background task completes (fire-and-forget + blocking) - Add basic concurrency tests to test suite --- skills/kugetsu/scripts/kugetsu | 72 ++++++- skills/kugetsu/tests/test-kugetsu-v2.sh | 195 +++++++++++++++++- .../parallel_capacity_test.cpython-314.pyc | Bin 0 -> 33757 bytes .../results/report_20260331_035130.md | 29 +++ .../results/report_20260331_035345.md | 38 ++++ .../results/report_20260331_040751.md | 27 +++ .../results/results_20260331_035130.json | 107 ++++++++++ .../results/results_20260331_035345.json | 107 ++++++++++ .../results/results_20260331_040751.json | 65 ++++++ .../results/summary_20260331_035130.csv | 6 + .../results/summary_20260331_035345.csv | 6 + .../results/summary_20260331_040751.csv | 4 + 12 files changed, 652 insertions(+), 4 deletions(-) create mode 100644 tools/parallel-capacity-test/__pycache__/parallel_capacity_test.cpython-314.pyc create mode 100644 tools/parallel-capacity-test/results/report_20260331_035130.md create mode 100644 tools/parallel-capacity-test/results/report_20260331_035345.md create mode 100644 tools/parallel-capacity-test/results/report_20260331_040751.md create mode 100644 tools/parallel-capacity-test/results/results_20260331_035130.json create mode 100644 tools/parallel-capacity-test/results/results_20260331_035345.json create mode 100644 tools/parallel-capacity-test/results/results_20260331_040751.json create mode 100644 tools/parallel-capacity-test/results/summary_20260331_035130.csv create mode 100644 tools/parallel-capacity-test/results/summary_20260331_035345.csv create mode 100644 tools/parallel-capacity-test/results/summary_20260331_040751.csv diff --git a/skills/kugetsu/scripts/kugetsu b/skills/kugetsu/scripts/kugetsu index bc9f37e..efc4b38 100755 --- a/skills/kugetsu/scripts/kugetsu +++ b/skills/kugetsu/scripts/kugetsu @@ -8,6 +8,56 @@ REPOS_CONFIG="$KUGETSU_DIR/repos.json" INDEX_FILE="$KUGETSU_DIR/index.json" NOTIFICATIONS_FILE="$KUGETSU_DIR/notifications.json" LOGS_DIR="$KUGETSU_DIR/logs" +MAX_CONCURRENT_AGENTS="${MAX_CONCURRENT_AGENTS:-3}" +AGENT_COUNT_FILE="$KUGETSU_DIR/.agent_count" +AGENT_LOCK_FILE="$KUGETSU_DIR/.agent_lock" + +acquire_agent_slot() { + local timeout="${1:-300}" + local waited=0 + ( + flock -w 1 200 || { echo "Error: Could not acquire lock" >&2; exit 1; } + local count + count=$(cat "$AGENT_COUNT_FILE" 2>/dev/null || echo 0) + if [ "$count" -lt "$MAX_CONCURRENT_AGENTS" ]; then + echo $((count + 1)) > "$AGENT_COUNT_FILE" + exit 0 + fi + exit 1 + ) 200>"$AGENT_LOCK_FILE" + local result=$? + if [ $result -ne 0 ]; then + local count + count=$(cat "$AGENT_COUNT_FILE" 2>/dev/null || echo 0) + if [ $waited -ge $timeout ]; then + echo "Error: Timeout waiting for agent slot (max: $MAX_CONCURRENT_AGENTS, current: $count)" >&2 + fi + return 1 + fi + return 0 +} + +release_agent_slot() { + ( + flock -w 1 200 || true + local count + count=$(cat "$AGENT_COUNT_FILE" 2>/dev/null || echo 0) + if [ "$count" -gt 0 ]; then + echo $((count - 1)) > "$AGENT_COUNT_FILE" + fi + ) 200>"$AGENT_LOCK_FILE" +} + +run_with_limit() { + local log_file="$1" + shift + local cmd=("$@") + ( + "${cmd[@]}" >> "$log_file" 2>&1 + release_agent_slot + ) & + disown +} usage() { cat << 'EOF' @@ -83,6 +133,7 @@ EOF ensure_dirs() { mkdir -p "$SESSIONS_DIR" + [ -f "$AGENT_COUNT_FILE" ] || echo 0 > "$AGENT_COUNT_FILE" } ensure_worktree_dir() { @@ -502,7 +553,11 @@ cmd_delegate() { mkdir -p "$LOGS_DIR" local log_file="$LOGS_DIR/delegate-$(date +%s).log" - nohup opencode run --continue --session "$pm_session" "$message" > "$log_file" 2>&1 & + if ! acquire_agent_slot; then + echo "Error: Max concurrent agents ($MAX_CONCURRENT_AGENTS) reached. Try again later." >&2 + exit 1 + fi + nohup sh -c "opencode run --continue --session '$pm_session' '$message' >> '$log_file' 2>&1; release_agent_slot" > /dev/null 2>&1 & disown echo "Delegated to PM agent (logged to $(basename "$log_file"))" } @@ -796,11 +851,19 @@ cmd_start() { local before_set="${before_sessions//$'\n'/|}" echo "Forking session for '$issue_ref'..." + if ! acquire_agent_slot; then + echo "Error: Max concurrent agents ($MAX_CONCURRENT_AGENTS) reached. Try again later." >&2 + remove_worktree_for_issue "$issue_ref" + exit 1 + fi + trap release_agent_slot EXIT if [ "$DEBUG_MODE" = true ]; then opencode run --fork --session "$base_session_id" "$message" --workdir "$worktree_path" 2>&1 | tee "$SESSIONS_DIR/$session_file.debug.log" else opencode run --fork --session "$base_session_id" "$message" --workdir "$worktree_path" 2>&1 fi + release_agent_slot + trap - EXIT local after_sessions=$(opencode session list 2>/dev/null | grep -oP '^ses_\w+' | sort) local new_session_id="" @@ -869,6 +932,11 @@ cmd_continue() { local worktree_path=$(python3 -c "import json; print(json.load(open('$session_path')).get('worktree_path', ''))" 2>/dev/null || echo "") echo "Continuing session for '$session_name'..." + if ! acquire_agent_slot; then + echo "Error: Max concurrent agents ($MAX_CONCURRENT_AGENTS) reached. Try again later." >&2 + exit 1 + fi + trap release_agent_slot EXIT if [ -n "$worktree_path" ] && [ -d "$worktree_path" ]; then echo "Using worktree: $worktree_path" if [ "$DEBUG_MODE" = true ]; then @@ -883,6 +951,8 @@ cmd_continue() { opencode run --continue --session "$opencode_session_id" "$message" fi fi + release_agent_slot + trap - EXIT } cmd_list() { diff --git a/skills/kugetsu/tests/test-kugetsu-v2.sh b/skills/kugetsu/tests/test-kugetsu-v2.sh index 004a41f..ebdef7b 100644 --- a/skills/kugetsu/tests/test-kugetsu-v2.sh +++ b/skills/kugetsu/tests/test-kugetsu-v2.sh @@ -444,7 +444,15 @@ echo "" # Test 27: delegate when pm-agent missing echo "--- Test: delegate (pm-agent missing) ---" -setup_mock_base +cleanup +mkdir -p ~/.kugetsu/sessions ~/.kugetsu/worktrees +cat > ~/.kugetsu/index.json << EOF +{ + "base": "$TEST_BASE_SESSION_ID", + "pm_agent": null, + "issues": {} +} +EOF OUTPUT=$($KUGETSU delegate "test" 2>&1 || true) if echo "$OUTPUT" | grep -q "Error: PM agent session"; then pass "delegate fails when PM agent not found" @@ -486,6 +494,50 @@ else fi echo "" +# Test 31: logs when no logs directory +echo "--- Test: logs (no directory) ---" +cleanup +OUTPUT=$($KUGETSU logs 2>&1 || true) +if echo "$OUTPUT" | grep -q "No logs found"; then + pass "logs returns 'No logs found' when directory missing" +else + fail "logs no directory: got '$OUTPUT', expected 'No logs found'" +fi +echo "" + +# Test 32: delegate is fire-and-forget (returns immediately) +echo "--- Test: delegate is fire-and-forget ---" +setup_mock_base +mkdir -p ~/.kugetsu/logs +START=$(date +%s) +OUTPUT=$($KUGETSU delegate "test fire-and-forget" 2>&1 || true) +END=$(date +%s) +ELAPSED=$((END - START)) +if echo "$OUTPUT" | grep -q "Delegated to PM agent"; then + if [ $ELAPSED -lt 2 ]; then + pass "delegate returns immediately (< 2s)" + else + fail "delegate took ${ELAPSED}s, expected < 2s" + fi +else + fail "delegate output unexpected: $OUTPUT" +fi +echo "" + +# Test 33: delegate creates log file +echo "--- Test: delegate creates log file ---" +setup_mock_base +LOG_COUNT_BEFORE=$(ls ~/.kugetsu/logs/*.log 2>/dev/null | wc -l) +$KUGETSU delegate "test log file" 2>&1 || true +sleep 1 +LOG_COUNT_AFTER=$(ls ~/.kugetsu/logs/*.log 2>/dev/null | wc -l) +if [ $LOG_COUNT_AFTER -gt $LOG_COUNT_BEFORE ]; then + pass "delegate creates log file" +else + fail "delegate did not create log file" +fi +echo "" + # Cleanup cleanup @@ -495,10 +547,147 @@ echo "Passed: $PASS" echo "Failed: $FAIL" echo "" +ORIGINAL_FAIL=$FAIL + +# ============================================================================ +# CONCURRENCY LIMIT TESTS +# ============================================================================ + +echo "" +echo "=== Concurrency Limit Tests ===" +echo "" + +# Create mock opencode that just sleeps briefly and exits +MOCK_OPENCODE="/tmp/mock_opencode.sh" +cat > "$MOCK_OPENCODE" << 'MOCK' +#!/bin/bash +sleep 0.3 +exit 0 +MOCK +chmod +x "$MOCK_OPENCODE" + +# Create a temporary test script for concurrency tests +cat > /tmp/test-concurrency.sh << 'EOF' +#!/bin/bash +set -euo pipefail + +KUGETSU="./skills/kugetsu/scripts/kugetsu" +PASS=0 +FAIL=0 + +test_cleanup() { + rm -rf ~/.kugetsu/sessions/* ~/.kugetsu/worktrees/* ~/.kugetsu/index.json ~/.kugetsu/logs/* ~/.kugetsu/.agent_count ~/.kugetsu/.agent_lock 2>/dev/null || true +} + +pass() { + echo "PASS: $1" + PASS=$((PASS + 1)) +} + +fail() { + echo "FAIL: $1" + FAIL=$((FAIL + 1)) +} + +setup_mock_sessions() { + mkdir -p ~/.kugetsu/sessions ~/.kugetsu/worktrees ~/.kugetsu/logs + cat > ~/.kugetsu/index.json << INDEX +{ + "base": "ses_test_base_123", + "pm_agent": "ses_test_pm_456", + "issues": {} +} +INDEX + echo '{"type": "base", "opencode_session_id": "ses_test_base_123", "created_at": "2026-03-29T18:00:00+02:00", "state": "idle"}' > ~/.kugetsu/sessions/base.json + echo '{"type": "pm_agent", "opencode_session_id": "ses_test_pm_456", "created_at": "2026-03-29T18:00:00+02:00", "state": "idle"}' > ~/.kugetsu/sessions/pm-agent.json +} + +# Test C1: Agent count file is initialized to 0 +echo "--- Test: agent count file initialized ---" +test_cleanup +mkdir -p ~/.kugetsu/sessions ~/.kugetsu/worktrees +$KUGETSU list > /dev/null 2>&1 || true +if [ -f ~/.kugetsu/.agent_count ]; then + COUNT=$(cat ~/.kugetsu/.agent_count) + if [ "$COUNT" = "0" ]; then + pass "agent count file initialized to 0" + else + fail "agent count file initialized to $COUNT, expected 0" + fi +else + fail "agent count file not created" +fi +echo "" + +# Test C2: MAX_CONCURRENT_AGENTS defaults to 3 +echo "--- Test: MAX_CONCURRENT_AGENTS defaults to 3 ---" +# Just grep for it and check if '3' appears +if grep -q 'MAX_CONCURRENT_AGENTS="3"' "$KUGETSU" || grep -q "MAX_CONCURRENT_AGENTS='3'" "$KUGETSU" || grep -q 'MAX_CONCURRENT_AGENTS=3' "$KUGETSU"; then + pass "MAX_CONCURRENT_AGENTS defaults to 3" +else + fail "MAX_CONCURRENT_AGENTS default not found" +fi +echo "" + +# Test C3: Agent count file increments and decrements properly +echo "--- Test: agent count increments and decrements ---" +test_cleanup +setup_mock_sessions + +# Initialize count to 0 +echo 0 > ~/.kugetsu/.agent_count + +# Verify initial state +INITIAL=$(cat ~/.kugetsu/.agent_count) +if [ "$INITIAL" = "0" ]; then + pass "agent count starts at 0" +else + fail "agent count start was $INITIAL" +fi + +# After any kugetsu command runs, count should be properly managed +$KUGETSU list > /dev/null 2>&1 + +# Verify count is still 0 (no slot leak) +AFTER=$(cat ~/.kugetsu/.agent_count) +if [ "$AFTER" = "0" ]; then + pass "agent count stays 0 after list (no leak)" +else + fail "agent count after list was $AFTER, expected 0" +fi +echo "" + +# Cleanup +test_cleanup +rm -f /tmp/mock_opencode.sh 2>/dev/null || true + +echo "" +echo "=== Concurrency Test Summary ===" +echo "Passed: $PASS" +echo "Failed: $FAIL" +echo "" + if [ $FAIL -eq 0 ]; then - echo "All tests passed!" + echo "All concurrency tests passed!" exit 0 else - echo "Some tests failed." + echo "Some concurrency tests failed." + exit 1 +fi +EOF + +chmod +x /tmp/test-concurrency.sh +bash /tmp/test-concurrency.sh +CONCURRENCY_RESULT=$? +rm -f /tmp/test-concurrency.sh /tmp/mock_opencode.sh 2>/dev/null + +# Combined result +if [ $ORIGINAL_FAIL -eq 0 ] && [ $CONCURRENCY_RESULT -eq 0 ]; then + echo "" + echo "=== ALL TESTS PASSED ===" + exit 0 +else + echo "" + echo "=== SOME TESTS FAILED ===" exit 1 fi \ No newline at end of file diff --git a/tools/parallel-capacity-test/__pycache__/parallel_capacity_test.cpython-314.pyc b/tools/parallel-capacity-test/__pycache__/parallel_capacity_test.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..827a4b75f1cb4a4ac00b926921a71dcb4ce01457 GIT binary patch literal 33757 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 literal 0 HcmV?d00001 diff --git a/tools/parallel-capacity-test/results/report_20260331_035130.md b/tools/parallel-capacity-test/results/report_20260331_035130.md new file mode 100644 index 0000000..094b985 --- /dev/null +++ b/tools/parallel-capacity-test/results/report_20260331_035130.md @@ -0,0 +1,29 @@ +# Parallel Capacity Test Report + +**Generated:** 2026-03-31 03:51:30 + +## Summary + +| Agents | Duration | Success | Failed | Timeout | Avg Response | Peak Mem (MB) | Mem/Agent | Cost Score | +|--------|----------|---------|--------|---------|--------------|---------------|-----------|------------| +| 1 | 1.0s | 0 | 1 | 0 | 0.0s | 2177MB | -0.0MB | 0.00 | +| 2 | 1.0s | 0 | 2 | 0 | 0.0s | 2176MB | 0.3MB | 0.00 | +| 3 | 1.0s | 0 | 3 | 0 | 0.0s | 2175MB | 0.1MB | 0.00 | +| 5 | 1.0s | 0 | 5 | 0 | 0.0s | 2175MB | 0.0MB | 0.00 | +| 8 | 1.0s | 0 | 8 | 0 | 0.0s | 2176MB | 0.2MB | 0.00 | + +## Cost Analysis + +| Metric | Value | +|--------|-------| +| Baseline Memory | 2177.1 MB | +| Avg Memory per Agent | 0.1 MB | +| Memory Limit | 1024 MB | +| Estimated Max Capacity | 9729 agents | + +## Key Findings + +## Recommendations + +2. **Monitor closely:** 5+ agents +3. **Implement circuit breaker** when failure rate exceeds threshold diff --git a/tools/parallel-capacity-test/results/report_20260331_035345.md b/tools/parallel-capacity-test/results/report_20260331_035345.md new file mode 100644 index 0000000..d6faaf6 --- /dev/null +++ b/tools/parallel-capacity-test/results/report_20260331_035345.md @@ -0,0 +1,38 @@ +# Parallel Capacity Test Report + +**Generated:** 2026-03-31 03:53:45 + +## Summary + +| Agents | Duration | Success | Failed | Timeout | Avg Response | Peak Mem (MB) | Mem/Agent | Cost Score | +|--------|----------|---------|--------|---------|--------------|---------------|-----------|------------| +| 1 | 7.0s | 1 | 0 | 0 | 6.3s | 2547MB | 363.6MB | 2.55 | +| 2 | 13.0s | 2 | 0 | 0 | 9.2s | 2889MB | 350.0MB | 9.11 | +| 3 | 8.0s | 3 | 0 | 0 | 6.3s | 3233MB | 340.4MB | 8.19 | +| 5 | 12.0s | 5 | 0 | 0 | 6.7s | 3912MB | 340.3MB | 20.49 | +| 8 | 62.5s | 0 | 0 | 8 | 60.0s | 4033MB | 223.4MB | 111.69 | + +## Cost Analysis + +| Metric | Value | +|--------|-------| +| Baseline Memory | 2183.3 MB | +| Avg Memory per Agent | 323.5 MB | +| Memory Limit | 1024 MB | +| Estimated Max Capacity | 3 agents | + +## Key Findings + +### Optimal Configuration +- **5 agents** achieved perfect success rate + - Average response time: 6.7s + - Peak CPU: 0.0% + - Peak Memory: 3911.8MB (0.0%) + - Memory per agent: 340.3MB + - Cost score: 20.49 + +## Recommendations + +1. **Recommended max agents:** 5 for stable operation +2. **Monitor closely:** 5+ agents +3. **Implement circuit breaker** when failure rate exceeds threshold diff --git a/tools/parallel-capacity-test/results/report_20260331_040751.md b/tools/parallel-capacity-test/results/report_20260331_040751.md new file mode 100644 index 0000000..6d8171a --- /dev/null +++ b/tools/parallel-capacity-test/results/report_20260331_040751.md @@ -0,0 +1,27 @@ +# Parallel Capacity Test Report + +**Generated:** 2026-03-31 04:07:51 + +## Summary + +| Agents | Duration | Success | Failed | Timeout | Avg Response | Peak Mem (MB) | Mem/Agent | Cost Score | +|--------|----------|---------|--------|---------|--------------|---------------|-----------|------------| +| 1 | 1.0s | 0 | 1 | 0 | 0.0s | 2461MB | 1.9MB | 0.00 | +| 2 | 1.0s | 0 | 2 | 0 | 0.0s | 2464MB | 0.5MB | 0.00 | +| 3 | 1.0s | 0 | 3 | 0 | 0.0s | 2444MB | 0.1MB | 0.00 | + +## Cost Analysis + +| Metric | Value | +|--------|-------| +| Baseline Memory | 2458.8 MB | +| Avg Memory per Agent | 0.8 MB | +| Memory Limit | 1024 MB | +| Estimated Max Capacity | 1241 agents | + +## Key Findings + +## Recommendations + +2. **Monitor closely:** 5+ agents +3. **Implement circuit breaker** when failure rate exceeds threshold diff --git a/tools/parallel-capacity-test/results/results_20260331_035130.json b/tools/parallel-capacity-test/results/results_20260331_035130.json new file mode 100644 index 0000000..9c151e3 --- /dev/null +++ b/tools/parallel-capacity-test/results/results_20260331_035130.json @@ -0,0 +1,107 @@ +[ + { + "agent_count": 1, + "total_duration": 1.0135109424591064, + "success_count": 0, + "failed_count": 1, + "timeout_count": 0, + "avg_response_time": 0.011479854583740234, + "stddev_response_time": 0, + "min_response_time": 0.011479854583740234, + "max_response_time": 0.011479854583740234, + "peak_cpu_percent": 0.0, + "avg_cpu_percent": 0.0, + "peak_memory_mb": 2177.1123046875, + "avg_memory_mb": 2177.10498046875, + "peak_memory_percent": 0.0, + "avg_memory_percent": 0.0, + "peak_opencode_procs": 0, + "baseline_memory_mb": 2177.1162109375, + "memory_per_agent_mb": -0.00390625, + "total_cost_score": 0 + }, + { + "agent_count": 2, + "total_duration": 1.0150294303894043, + "success_count": 0, + "failed_count": 2, + "timeout_count": 0, + "avg_response_time": 0.004192829132080078, + "stddev_response_time": 0.0006507473410082039, + "min_response_time": 0.0037326812744140625, + "max_response_time": 0.004652976989746094, + "peak_cpu_percent": 0.0, + "avg_cpu_percent": 0.0, + "peak_memory_mb": 2175.671875, + "avg_memory_mb": 2175.529296875, + "peak_memory_percent": 0.0, + "avg_memory_percent": 0.0, + "peak_opencode_procs": 0, + "baseline_memory_mb": 2175.13671875, + "memory_per_agent_mb": 0.267578125, + "total_cost_score": 0.0005431993436068297 + }, + { + "agent_count": 3, + "total_duration": 1.0151348114013672, + "success_count": 0, + "failed_count": 3, + "timeout_count": 0, + "avg_response_time": 0.00410922368367513, + "stddev_response_time": 0.0005485598755713246, + "min_response_time": 0.0034792423248291016, + "max_response_time": 0.004481315612792969, + "peak_cpu_percent": 0.0, + "avg_cpu_percent": 0.0, + "peak_memory_mb": 2175.234375, + "avg_memory_mb": 2175.171875, + "peak_memory_percent": 0.0, + "avg_memory_percent": 0.0, + "peak_opencode_procs": 0, + "baseline_memory_mb": 2174.984375, + "memory_per_agent_mb": 0.08333333333333333, + "total_cost_score": 0.0002537837028503418 + }, + { + "agent_count": 5, + "total_duration": 1.0233359336853027, + "success_count": 0, + "failed_count": 5, + "timeout_count": 0, + "avg_response_time": 0.003859806060791016, + "stddev_response_time": 0.0005061271938518695, + "min_response_time": 0.003265857696533203, + "max_response_time": 0.004559516906738281, + "peak_cpu_percent": 0.0, + "avg_cpu_percent": 0.0, + "peak_memory_mb": 2174.8115234375, + "avg_memory_mb": 2174.765625, + "peak_memory_percent": 0.0, + "avg_memory_percent": 0.0, + "peak_opencode_procs": 0, + "baseline_memory_mb": 2174.7197265625, + "memory_per_agent_mb": 0.018359375, + "total_cost_score": 9.393904078751803e-05 + }, + { + "agent_count": 8, + "total_duration": 1.0180647373199463, + "success_count": 0, + "failed_count": 8, + "timeout_count": 0, + "avg_response_time": 0.0040419697761535645, + "stddev_response_time": 0.0005073540280823215, + "min_response_time": 0.0034415721893310547, + "max_response_time": 0.004962921142578125, + "peak_cpu_percent": 0.0, + "avg_cpu_percent": 0.0, + "peak_memory_mb": 2175.9697265625, + "avg_memory_mb": 2175.328125, + "peak_memory_percent": 0.0, + "avg_memory_percent": 0.0, + "peak_opencode_procs": 0, + "baseline_memory_mb": 2174.6826171875, + "memory_per_agent_mb": 0.160888671875, + "total_cost_score": 0.0013103606677614152 + } +] \ No newline at end of file diff --git a/tools/parallel-capacity-test/results/results_20260331_035345.json b/tools/parallel-capacity-test/results/results_20260331_035345.json new file mode 100644 index 0000000..3a39459 --- /dev/null +++ b/tools/parallel-capacity-test/results/results_20260331_035345.json @@ -0,0 +1,107 @@ +[ + { + "agent_count": 1, + "total_duration": 7.013643741607666, + "success_count": 1, + "failed_count": 0, + "timeout_count": 0, + "avg_response_time": 6.2816431522369385, + "stddev_response_time": 0, + "min_response_time": 6.2816431522369385, + "max_response_time": 6.2816431522369385, + "peak_cpu_percent": 0.0, + "avg_cpu_percent": 0.0, + "peak_memory_mb": 2546.8349609375, + "avg_memory_mb": 2439.7982177734375, + "peak_memory_percent": 0.0, + "avg_memory_percent": 0.0, + "peak_opencode_procs": 0, + "baseline_memory_mb": 2183.2587890625, + "memory_per_agent_mb": 363.576171875, + "total_cost_score": 2.549993742468767 + }, + { + "agent_count": 2, + "total_duration": 13.01965594291687, + "success_count": 2, + "failed_count": 0, + "timeout_count": 0, + "avg_response_time": 9.241770267486572, + "stddev_response_time": 4.460840653831581, + "min_response_time": 6.087479591369629, + "max_response_time": 12.396060943603516, + "peak_cpu_percent": 0.0, + "avg_cpu_percent": 0.0, + "peak_memory_mb": 2889.0400390625, + "avg_memory_mb": 2659.376727764423, + "peak_memory_percent": 0.0, + "avg_memory_percent": 0.0, + "peak_opencode_procs": 0, + "baseline_memory_mb": 2189.068359375, + "memory_per_agent_mb": 349.98583984375, + "total_cost_score": 9.113390439316863 + }, + { + "agent_count": 3, + "total_duration": 8.017883539199829, + "success_count": 3, + "failed_count": 0, + "timeout_count": 0, + "avg_response_time": 6.328219811121623, + "stddev_response_time": 1.4813371254887444, + "min_response_time": 4.74861478805542, + "max_response_time": 7.686349391937256, + "peak_cpu_percent": 0.0, + "avg_cpu_percent": 0.0, + "peak_memory_mb": 3233.111328125, + "avg_memory_mb": 2848.880425347222, + "peak_memory_percent": 0.0, + "avg_memory_percent": 0.0, + "peak_opencode_procs": 0, + "baseline_memory_mb": 2211.83984375, + "memory_per_agent_mb": 340.423828125, + "total_cost_score": 8.188435823624488 + }, + { + "agent_count": 5, + "total_duration": 12.039501190185547, + "success_count": 5, + "failed_count": 0, + "timeout_count": 0, + "avg_response_time": 6.650626277923584, + "stddev_response_time": 2.765260504640065, + "min_response_time": 4.714812755584717, + "max_response_time": 11.523208379745483, + "peak_cpu_percent": 0.0, + "avg_cpu_percent": 0.0, + "peak_memory_mb": 3911.77734375, + "avg_memory_mb": 2996.949669471154, + "peak_memory_percent": 0.0, + "avg_memory_percent": 0.0, + "peak_opencode_procs": 0, + "baseline_memory_mb": 2210.08203125, + "memory_per_agent_mb": 340.3390625, + "total_cost_score": 20.487562740176916 + }, + { + "agent_count": 8, + "total_duration": 62.496517181396484, + "success_count": 0, + "failed_count": 0, + "timeout_count": 8, + "avg_response_time": 60, + "stddev_response_time": 0.0, + "min_response_time": 60, + "max_response_time": 60, + "peak_cpu_percent": 0.0, + "avg_cpu_percent": 0.0, + "peak_memory_mb": 4033.01171875, + "avg_memory_mb": 3940.566368689904, + "peak_memory_percent": 0.0, + "avg_memory_percent": 0.0, + "peak_opencode_procs": 0, + "baseline_memory_mb": 2245.8857421875, + "memory_per_agent_mb": 223.3907470703125, + "total_cost_score": 111.68914929955825 + } +] \ No newline at end of file diff --git a/tools/parallel-capacity-test/results/results_20260331_040751.json b/tools/parallel-capacity-test/results/results_20260331_040751.json new file mode 100644 index 0000000..778701f --- /dev/null +++ b/tools/parallel-capacity-test/results/results_20260331_040751.json @@ -0,0 +1,65 @@ +[ + { + "agent_count": 1, + "total_duration": 1.0171289443969727, + "success_count": 0, + "failed_count": 1, + "timeout_count": 0, + "avg_response_time": 0.005397796630859375, + "stddev_response_time": 0, + "min_response_time": 0.005397796630859375, + "max_response_time": 0.005397796630859375, + "peak_cpu_percent": 0.0, + "avg_cpu_percent": 0.0, + "peak_memory_mb": 2460.7001953125, + "avg_memory_mb": 2459.75439453125, + "peak_memory_percent": 0.0, + "avg_memory_percent": 0.0, + "peak_opencode_procs": 0, + "baseline_memory_mb": 2458.80859375, + "memory_per_agent_mb": 1.8916015625, + "total_cost_score": 0.001924002700485289 + }, + { + "agent_count": 2, + "total_duration": 1.0177080631256104, + "success_count": 0, + "failed_count": 2, + "timeout_count": 0, + "avg_response_time": 0.004194378852844238, + "stddev_response_time": 0.0005352649760883542, + "min_response_time": 0.003815889358520508, + "max_response_time": 0.004572868347167969, + "peak_cpu_percent": 0.0, + "avg_cpu_percent": 0.0, + "peak_memory_mb": 2464.1708984375, + "avg_memory_mb": 2463.69287109375, + "peak_memory_percent": 0.0, + "avg_memory_percent": 0.0, + "peak_opencode_procs": 0, + "baseline_memory_mb": 2463.21484375, + "memory_per_agent_mb": 0.47802734375, + "total_cost_score": 0.0009729845642577857 + }, + { + "agent_count": 3, + "total_duration": 1.016812801361084, + "success_count": 0, + "failed_count": 3, + "timeout_count": 0, + "avg_response_time": 0.00549777348836263, + "stddev_response_time": 0.0004058027330303703, + "min_response_time": 0.0052263736724853516, + "max_response_time": 0.0059642791748046875, + "peak_cpu_percent": 0.0, + "avg_cpu_percent": 0.0, + "peak_memory_mb": 2443.9794921875, + "avg_memory_mb": 2443.8232421875, + "peak_memory_percent": 0.0, + "avg_memory_percent": 0.0, + "peak_opencode_procs": 0, + "baseline_memory_mb": 2443.6669921875, + "memory_per_agent_mb": 0.10416666666666667, + "total_cost_score": 0.00031775400042533875 + } +] \ No newline at end of file diff --git a/tools/parallel-capacity-test/results/summary_20260331_035130.csv b/tools/parallel-capacity-test/results/summary_20260331_035130.csv new file mode 100644 index 0000000..3f4bc52 --- /dev/null +++ b/tools/parallel-capacity-test/results/summary_20260331_035130.csv @@ -0,0 +1,6 @@ +agents,duration,success,failed,timeout,avg_response,stddev,min_response,max_response,peak_cpu,avg_cpu,peak_mem_mb,avg_mem_mb,peak_mem_pct,avg_mem_pct,peak_procs,baseline_mem,mem_per_agent,cost_score +1,1.01,0,1,0,0.01,0.00,0.01,0.01,0.0,0.0,2177.1,2177.1,0.0,0.0,0,2177.1,-0.0,0.00 +2,1.02,0,2,0,0.00,0.00,0.00,0.00,0.0,0.0,2175.7,2175.5,0.0,0.0,0,2175.1,0.3,0.00 +3,1.02,0,3,0,0.00,0.00,0.00,0.00,0.0,0.0,2175.2,2175.2,0.0,0.0,0,2175.0,0.1,0.00 +5,1.02,0,5,0,0.00,0.00,0.00,0.00,0.0,0.0,2174.8,2174.8,0.0,0.0,0,2174.7,0.0,0.00 +8,1.02,0,8,0,0.00,0.00,0.00,0.00,0.0,0.0,2176.0,2175.3,0.0,0.0,0,2174.7,0.2,0.00 diff --git a/tools/parallel-capacity-test/results/summary_20260331_035345.csv b/tools/parallel-capacity-test/results/summary_20260331_035345.csv new file mode 100644 index 0000000..1c99909 --- /dev/null +++ b/tools/parallel-capacity-test/results/summary_20260331_035345.csv @@ -0,0 +1,6 @@ +agents,duration,success,failed,timeout,avg_response,stddev,min_response,max_response,peak_cpu,avg_cpu,peak_mem_mb,avg_mem_mb,peak_mem_pct,avg_mem_pct,peak_procs,baseline_mem,mem_per_agent,cost_score +1,7.01,1,0,0,6.28,0.00,6.28,6.28,0.0,0.0,2546.8,2439.8,0.0,0.0,0,2183.3,363.6,2.55 +2,13.02,2,0,0,9.24,4.46,6.09,12.40,0.0,0.0,2889.0,2659.4,0.0,0.0,0,2189.1,350.0,9.11 +3,8.02,3,0,0,6.33,1.48,4.75,7.69,0.0,0.0,3233.1,2848.9,0.0,0.0,0,2211.8,340.4,8.19 +5,12.04,5,0,0,6.65,2.77,4.71,11.52,0.0,0.0,3911.8,2996.9,0.0,0.0,0,2210.1,340.3,20.49 +8,62.50,0,0,8,60.00,0.00,60.00,60.00,0.0,0.0,4033.0,3940.6,0.0,0.0,0,2245.9,223.4,111.69 diff --git a/tools/parallel-capacity-test/results/summary_20260331_040751.csv b/tools/parallel-capacity-test/results/summary_20260331_040751.csv new file mode 100644 index 0000000..bd351d8 --- /dev/null +++ b/tools/parallel-capacity-test/results/summary_20260331_040751.csv @@ -0,0 +1,4 @@ +agents,duration,success,failed,timeout,avg_response,stddev,min_response,max_response,peak_cpu,avg_cpu,peak_mem_mb,avg_mem_mb,peak_mem_pct,avg_mem_pct,peak_procs,baseline_mem,mem_per_agent,cost_score +1,1.02,0,1,0,0.01,0.00,0.01,0.01,0.0,0.0,2460.7,2459.8,0.0,0.0,0,2458.8,1.9,0.00 +2,1.02,0,2,0,0.00,0.00,0.00,0.00,0.0,0.0,2464.2,2463.7,0.0,0.0,0,2463.2,0.5,0.00 +3,1.02,0,3,0,0.01,0.00,0.01,0.01,0.0,0.0,2444.0,2443.8,0.0,0.0,0,2443.7,0.1,0.00 -- 2.49.1 From da52a4bd9b048a9e6372f6d9b23cde85ea1b5b4f Mon Sep 17 00:00:00 2001 From: shokollm <270575765+shokollm@users.noreply.github.com> Date: Tue, 31 Mar 2026 08:12:50 +0000 Subject: [PATCH 3/3] chore: add .gitignore and remove cached test results Ignore __pycache__/, results/, and *.pyc files Remove already tracked test results from git tracking --- .gitignore | 6 + .../parallel_capacity_test.cpython-314.pyc | Bin 33757 -> 0 bytes .../results/report_20260331_035130.md | 29 ----- .../results/report_20260331_035345.md | 38 ------- .../results/report_20260331_040751.md | 27 ----- .../results/results_20260331_035130.json | 107 ------------------ .../results/results_20260331_035345.json | 107 ------------------ .../results/results_20260331_040751.json | 65 ----------- .../results/summary_20260331_035130.csv | 6 - .../results/summary_20260331_035345.csv | 6 - .../results/summary_20260331_040751.csv | 4 - 11 files changed, 6 insertions(+), 389 deletions(-) create mode 100644 .gitignore delete mode 100644 tools/parallel-capacity-test/__pycache__/parallel_capacity_test.cpython-314.pyc delete mode 100644 tools/parallel-capacity-test/results/report_20260331_035130.md delete mode 100644 tools/parallel-capacity-test/results/report_20260331_035345.md delete mode 100644 tools/parallel-capacity-test/results/report_20260331_040751.md delete mode 100644 tools/parallel-capacity-test/results/results_20260331_035130.json delete mode 100644 tools/parallel-capacity-test/results/results_20260331_035345.json delete mode 100644 tools/parallel-capacity-test/results/results_20260331_040751.json delete mode 100644 tools/parallel-capacity-test/results/summary_20260331_035130.csv delete mode 100644 tools/parallel-capacity-test/results/summary_20260331_035345.csv delete mode 100644 tools/parallel-capacity-test/results/summary_20260331_040751.csv diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba757c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +__pycache__/ +*/__pycache__/ +results/ +*/results/ +*.pyc + diff --git a/tools/parallel-capacity-test/__pycache__/parallel_capacity_test.cpython-314.pyc b/tools/parallel-capacity-test/__pycache__/parallel_capacity_test.cpython-314.pyc deleted file mode 100644 index 827a4b75f1cb4a4ac00b926921a71dcb4ce01457..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33757 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 diff --git a/tools/parallel-capacity-test/results/report_20260331_035130.md b/tools/parallel-capacity-test/results/report_20260331_035130.md deleted file mode 100644 index 094b985..0000000 --- a/tools/parallel-capacity-test/results/report_20260331_035130.md +++ /dev/null @@ -1,29 +0,0 @@ -# Parallel Capacity Test Report - -**Generated:** 2026-03-31 03:51:30 - -## Summary - -| Agents | Duration | Success | Failed | Timeout | Avg Response | Peak Mem (MB) | Mem/Agent | Cost Score | -|--------|----------|---------|--------|---------|--------------|---------------|-----------|------------| -| 1 | 1.0s | 0 | 1 | 0 | 0.0s | 2177MB | -0.0MB | 0.00 | -| 2 | 1.0s | 0 | 2 | 0 | 0.0s | 2176MB | 0.3MB | 0.00 | -| 3 | 1.0s | 0 | 3 | 0 | 0.0s | 2175MB | 0.1MB | 0.00 | -| 5 | 1.0s | 0 | 5 | 0 | 0.0s | 2175MB | 0.0MB | 0.00 | -| 8 | 1.0s | 0 | 8 | 0 | 0.0s | 2176MB | 0.2MB | 0.00 | - -## Cost Analysis - -| Metric | Value | -|--------|-------| -| Baseline Memory | 2177.1 MB | -| Avg Memory per Agent | 0.1 MB | -| Memory Limit | 1024 MB | -| Estimated Max Capacity | 9729 agents | - -## Key Findings - -## Recommendations - -2. **Monitor closely:** 5+ agents -3. **Implement circuit breaker** when failure rate exceeds threshold diff --git a/tools/parallel-capacity-test/results/report_20260331_035345.md b/tools/parallel-capacity-test/results/report_20260331_035345.md deleted file mode 100644 index d6faaf6..0000000 --- a/tools/parallel-capacity-test/results/report_20260331_035345.md +++ /dev/null @@ -1,38 +0,0 @@ -# Parallel Capacity Test Report - -**Generated:** 2026-03-31 03:53:45 - -## Summary - -| Agents | Duration | Success | Failed | Timeout | Avg Response | Peak Mem (MB) | Mem/Agent | Cost Score | -|--------|----------|---------|--------|---------|--------------|---------------|-----------|------------| -| 1 | 7.0s | 1 | 0 | 0 | 6.3s | 2547MB | 363.6MB | 2.55 | -| 2 | 13.0s | 2 | 0 | 0 | 9.2s | 2889MB | 350.0MB | 9.11 | -| 3 | 8.0s | 3 | 0 | 0 | 6.3s | 3233MB | 340.4MB | 8.19 | -| 5 | 12.0s | 5 | 0 | 0 | 6.7s | 3912MB | 340.3MB | 20.49 | -| 8 | 62.5s | 0 | 0 | 8 | 60.0s | 4033MB | 223.4MB | 111.69 | - -## Cost Analysis - -| Metric | Value | -|--------|-------| -| Baseline Memory | 2183.3 MB | -| Avg Memory per Agent | 323.5 MB | -| Memory Limit | 1024 MB | -| Estimated Max Capacity | 3 agents | - -## Key Findings - -### Optimal Configuration -- **5 agents** achieved perfect success rate - - Average response time: 6.7s - - Peak CPU: 0.0% - - Peak Memory: 3911.8MB (0.0%) - - Memory per agent: 340.3MB - - Cost score: 20.49 - -## Recommendations - -1. **Recommended max agents:** 5 for stable operation -2. **Monitor closely:** 5+ agents -3. **Implement circuit breaker** when failure rate exceeds threshold diff --git a/tools/parallel-capacity-test/results/report_20260331_040751.md b/tools/parallel-capacity-test/results/report_20260331_040751.md deleted file mode 100644 index 6d8171a..0000000 --- a/tools/parallel-capacity-test/results/report_20260331_040751.md +++ /dev/null @@ -1,27 +0,0 @@ -# Parallel Capacity Test Report - -**Generated:** 2026-03-31 04:07:51 - -## Summary - -| Agents | Duration | Success | Failed | Timeout | Avg Response | Peak Mem (MB) | Mem/Agent | Cost Score | -|--------|----------|---------|--------|---------|--------------|---------------|-----------|------------| -| 1 | 1.0s | 0 | 1 | 0 | 0.0s | 2461MB | 1.9MB | 0.00 | -| 2 | 1.0s | 0 | 2 | 0 | 0.0s | 2464MB | 0.5MB | 0.00 | -| 3 | 1.0s | 0 | 3 | 0 | 0.0s | 2444MB | 0.1MB | 0.00 | - -## Cost Analysis - -| Metric | Value | -|--------|-------| -| Baseline Memory | 2458.8 MB | -| Avg Memory per Agent | 0.8 MB | -| Memory Limit | 1024 MB | -| Estimated Max Capacity | 1241 agents | - -## Key Findings - -## Recommendations - -2. **Monitor closely:** 5+ agents -3. **Implement circuit breaker** when failure rate exceeds threshold diff --git a/tools/parallel-capacity-test/results/results_20260331_035130.json b/tools/parallel-capacity-test/results/results_20260331_035130.json deleted file mode 100644 index 9c151e3..0000000 --- a/tools/parallel-capacity-test/results/results_20260331_035130.json +++ /dev/null @@ -1,107 +0,0 @@ -[ - { - "agent_count": 1, - "total_duration": 1.0135109424591064, - "success_count": 0, - "failed_count": 1, - "timeout_count": 0, - "avg_response_time": 0.011479854583740234, - "stddev_response_time": 0, - "min_response_time": 0.011479854583740234, - "max_response_time": 0.011479854583740234, - "peak_cpu_percent": 0.0, - "avg_cpu_percent": 0.0, - "peak_memory_mb": 2177.1123046875, - "avg_memory_mb": 2177.10498046875, - "peak_memory_percent": 0.0, - "avg_memory_percent": 0.0, - "peak_opencode_procs": 0, - "baseline_memory_mb": 2177.1162109375, - "memory_per_agent_mb": -0.00390625, - "total_cost_score": 0 - }, - { - "agent_count": 2, - "total_duration": 1.0150294303894043, - "success_count": 0, - "failed_count": 2, - "timeout_count": 0, - "avg_response_time": 0.004192829132080078, - "stddev_response_time": 0.0006507473410082039, - "min_response_time": 0.0037326812744140625, - "max_response_time": 0.004652976989746094, - "peak_cpu_percent": 0.0, - "avg_cpu_percent": 0.0, - "peak_memory_mb": 2175.671875, - "avg_memory_mb": 2175.529296875, - "peak_memory_percent": 0.0, - "avg_memory_percent": 0.0, - "peak_opencode_procs": 0, - "baseline_memory_mb": 2175.13671875, - "memory_per_agent_mb": 0.267578125, - "total_cost_score": 0.0005431993436068297 - }, - { - "agent_count": 3, - "total_duration": 1.0151348114013672, - "success_count": 0, - "failed_count": 3, - "timeout_count": 0, - "avg_response_time": 0.00410922368367513, - "stddev_response_time": 0.0005485598755713246, - "min_response_time": 0.0034792423248291016, - "max_response_time": 0.004481315612792969, - "peak_cpu_percent": 0.0, - "avg_cpu_percent": 0.0, - "peak_memory_mb": 2175.234375, - "avg_memory_mb": 2175.171875, - "peak_memory_percent": 0.0, - "avg_memory_percent": 0.0, - "peak_opencode_procs": 0, - "baseline_memory_mb": 2174.984375, - "memory_per_agent_mb": 0.08333333333333333, - "total_cost_score": 0.0002537837028503418 - }, - { - "agent_count": 5, - "total_duration": 1.0233359336853027, - "success_count": 0, - "failed_count": 5, - "timeout_count": 0, - "avg_response_time": 0.003859806060791016, - "stddev_response_time": 0.0005061271938518695, - "min_response_time": 0.003265857696533203, - "max_response_time": 0.004559516906738281, - "peak_cpu_percent": 0.0, - "avg_cpu_percent": 0.0, - "peak_memory_mb": 2174.8115234375, - "avg_memory_mb": 2174.765625, - "peak_memory_percent": 0.0, - "avg_memory_percent": 0.0, - "peak_opencode_procs": 0, - "baseline_memory_mb": 2174.7197265625, - "memory_per_agent_mb": 0.018359375, - "total_cost_score": 9.393904078751803e-05 - }, - { - "agent_count": 8, - "total_duration": 1.0180647373199463, - "success_count": 0, - "failed_count": 8, - "timeout_count": 0, - "avg_response_time": 0.0040419697761535645, - "stddev_response_time": 0.0005073540280823215, - "min_response_time": 0.0034415721893310547, - "max_response_time": 0.004962921142578125, - "peak_cpu_percent": 0.0, - "avg_cpu_percent": 0.0, - "peak_memory_mb": 2175.9697265625, - "avg_memory_mb": 2175.328125, - "peak_memory_percent": 0.0, - "avg_memory_percent": 0.0, - "peak_opencode_procs": 0, - "baseline_memory_mb": 2174.6826171875, - "memory_per_agent_mb": 0.160888671875, - "total_cost_score": 0.0013103606677614152 - } -] \ No newline at end of file diff --git a/tools/parallel-capacity-test/results/results_20260331_035345.json b/tools/parallel-capacity-test/results/results_20260331_035345.json deleted file mode 100644 index 3a39459..0000000 --- a/tools/parallel-capacity-test/results/results_20260331_035345.json +++ /dev/null @@ -1,107 +0,0 @@ -[ - { - "agent_count": 1, - "total_duration": 7.013643741607666, - "success_count": 1, - "failed_count": 0, - "timeout_count": 0, - "avg_response_time": 6.2816431522369385, - "stddev_response_time": 0, - "min_response_time": 6.2816431522369385, - "max_response_time": 6.2816431522369385, - "peak_cpu_percent": 0.0, - "avg_cpu_percent": 0.0, - "peak_memory_mb": 2546.8349609375, - "avg_memory_mb": 2439.7982177734375, - "peak_memory_percent": 0.0, - "avg_memory_percent": 0.0, - "peak_opencode_procs": 0, - "baseline_memory_mb": 2183.2587890625, - "memory_per_agent_mb": 363.576171875, - "total_cost_score": 2.549993742468767 - }, - { - "agent_count": 2, - "total_duration": 13.01965594291687, - "success_count": 2, - "failed_count": 0, - "timeout_count": 0, - "avg_response_time": 9.241770267486572, - "stddev_response_time": 4.460840653831581, - "min_response_time": 6.087479591369629, - "max_response_time": 12.396060943603516, - "peak_cpu_percent": 0.0, - "avg_cpu_percent": 0.0, - "peak_memory_mb": 2889.0400390625, - "avg_memory_mb": 2659.376727764423, - "peak_memory_percent": 0.0, - "avg_memory_percent": 0.0, - "peak_opencode_procs": 0, - "baseline_memory_mb": 2189.068359375, - "memory_per_agent_mb": 349.98583984375, - "total_cost_score": 9.113390439316863 - }, - { - "agent_count": 3, - "total_duration": 8.017883539199829, - "success_count": 3, - "failed_count": 0, - "timeout_count": 0, - "avg_response_time": 6.328219811121623, - "stddev_response_time": 1.4813371254887444, - "min_response_time": 4.74861478805542, - "max_response_time": 7.686349391937256, - "peak_cpu_percent": 0.0, - "avg_cpu_percent": 0.0, - "peak_memory_mb": 3233.111328125, - "avg_memory_mb": 2848.880425347222, - "peak_memory_percent": 0.0, - "avg_memory_percent": 0.0, - "peak_opencode_procs": 0, - "baseline_memory_mb": 2211.83984375, - "memory_per_agent_mb": 340.423828125, - "total_cost_score": 8.188435823624488 - }, - { - "agent_count": 5, - "total_duration": 12.039501190185547, - "success_count": 5, - "failed_count": 0, - "timeout_count": 0, - "avg_response_time": 6.650626277923584, - "stddev_response_time": 2.765260504640065, - "min_response_time": 4.714812755584717, - "max_response_time": 11.523208379745483, - "peak_cpu_percent": 0.0, - "avg_cpu_percent": 0.0, - "peak_memory_mb": 3911.77734375, - "avg_memory_mb": 2996.949669471154, - "peak_memory_percent": 0.0, - "avg_memory_percent": 0.0, - "peak_opencode_procs": 0, - "baseline_memory_mb": 2210.08203125, - "memory_per_agent_mb": 340.3390625, - "total_cost_score": 20.487562740176916 - }, - { - "agent_count": 8, - "total_duration": 62.496517181396484, - "success_count": 0, - "failed_count": 0, - "timeout_count": 8, - "avg_response_time": 60, - "stddev_response_time": 0.0, - "min_response_time": 60, - "max_response_time": 60, - "peak_cpu_percent": 0.0, - "avg_cpu_percent": 0.0, - "peak_memory_mb": 4033.01171875, - "avg_memory_mb": 3940.566368689904, - "peak_memory_percent": 0.0, - "avg_memory_percent": 0.0, - "peak_opencode_procs": 0, - "baseline_memory_mb": 2245.8857421875, - "memory_per_agent_mb": 223.3907470703125, - "total_cost_score": 111.68914929955825 - } -] \ No newline at end of file diff --git a/tools/parallel-capacity-test/results/results_20260331_040751.json b/tools/parallel-capacity-test/results/results_20260331_040751.json deleted file mode 100644 index 778701f..0000000 --- a/tools/parallel-capacity-test/results/results_20260331_040751.json +++ /dev/null @@ -1,65 +0,0 @@ -[ - { - "agent_count": 1, - "total_duration": 1.0171289443969727, - "success_count": 0, - "failed_count": 1, - "timeout_count": 0, - "avg_response_time": 0.005397796630859375, - "stddev_response_time": 0, - "min_response_time": 0.005397796630859375, - "max_response_time": 0.005397796630859375, - "peak_cpu_percent": 0.0, - "avg_cpu_percent": 0.0, - "peak_memory_mb": 2460.7001953125, - "avg_memory_mb": 2459.75439453125, - "peak_memory_percent": 0.0, - "avg_memory_percent": 0.0, - "peak_opencode_procs": 0, - "baseline_memory_mb": 2458.80859375, - "memory_per_agent_mb": 1.8916015625, - "total_cost_score": 0.001924002700485289 - }, - { - "agent_count": 2, - "total_duration": 1.0177080631256104, - "success_count": 0, - "failed_count": 2, - "timeout_count": 0, - "avg_response_time": 0.004194378852844238, - "stddev_response_time": 0.0005352649760883542, - "min_response_time": 0.003815889358520508, - "max_response_time": 0.004572868347167969, - "peak_cpu_percent": 0.0, - "avg_cpu_percent": 0.0, - "peak_memory_mb": 2464.1708984375, - "avg_memory_mb": 2463.69287109375, - "peak_memory_percent": 0.0, - "avg_memory_percent": 0.0, - "peak_opencode_procs": 0, - "baseline_memory_mb": 2463.21484375, - "memory_per_agent_mb": 0.47802734375, - "total_cost_score": 0.0009729845642577857 - }, - { - "agent_count": 3, - "total_duration": 1.016812801361084, - "success_count": 0, - "failed_count": 3, - "timeout_count": 0, - "avg_response_time": 0.00549777348836263, - "stddev_response_time": 0.0004058027330303703, - "min_response_time": 0.0052263736724853516, - "max_response_time": 0.0059642791748046875, - "peak_cpu_percent": 0.0, - "avg_cpu_percent": 0.0, - "peak_memory_mb": 2443.9794921875, - "avg_memory_mb": 2443.8232421875, - "peak_memory_percent": 0.0, - "avg_memory_percent": 0.0, - "peak_opencode_procs": 0, - "baseline_memory_mb": 2443.6669921875, - "memory_per_agent_mb": 0.10416666666666667, - "total_cost_score": 0.00031775400042533875 - } -] \ No newline at end of file diff --git a/tools/parallel-capacity-test/results/summary_20260331_035130.csv b/tools/parallel-capacity-test/results/summary_20260331_035130.csv deleted file mode 100644 index 3f4bc52..0000000 --- a/tools/parallel-capacity-test/results/summary_20260331_035130.csv +++ /dev/null @@ -1,6 +0,0 @@ -agents,duration,success,failed,timeout,avg_response,stddev,min_response,max_response,peak_cpu,avg_cpu,peak_mem_mb,avg_mem_mb,peak_mem_pct,avg_mem_pct,peak_procs,baseline_mem,mem_per_agent,cost_score -1,1.01,0,1,0,0.01,0.00,0.01,0.01,0.0,0.0,2177.1,2177.1,0.0,0.0,0,2177.1,-0.0,0.00 -2,1.02,0,2,0,0.00,0.00,0.00,0.00,0.0,0.0,2175.7,2175.5,0.0,0.0,0,2175.1,0.3,0.00 -3,1.02,0,3,0,0.00,0.00,0.00,0.00,0.0,0.0,2175.2,2175.2,0.0,0.0,0,2175.0,0.1,0.00 -5,1.02,0,5,0,0.00,0.00,0.00,0.00,0.0,0.0,2174.8,2174.8,0.0,0.0,0,2174.7,0.0,0.00 -8,1.02,0,8,0,0.00,0.00,0.00,0.00,0.0,0.0,2176.0,2175.3,0.0,0.0,0,2174.7,0.2,0.00 diff --git a/tools/parallel-capacity-test/results/summary_20260331_035345.csv b/tools/parallel-capacity-test/results/summary_20260331_035345.csv deleted file mode 100644 index 1c99909..0000000 --- a/tools/parallel-capacity-test/results/summary_20260331_035345.csv +++ /dev/null @@ -1,6 +0,0 @@ -agents,duration,success,failed,timeout,avg_response,stddev,min_response,max_response,peak_cpu,avg_cpu,peak_mem_mb,avg_mem_mb,peak_mem_pct,avg_mem_pct,peak_procs,baseline_mem,mem_per_agent,cost_score -1,7.01,1,0,0,6.28,0.00,6.28,6.28,0.0,0.0,2546.8,2439.8,0.0,0.0,0,2183.3,363.6,2.55 -2,13.02,2,0,0,9.24,4.46,6.09,12.40,0.0,0.0,2889.0,2659.4,0.0,0.0,0,2189.1,350.0,9.11 -3,8.02,3,0,0,6.33,1.48,4.75,7.69,0.0,0.0,3233.1,2848.9,0.0,0.0,0,2211.8,340.4,8.19 -5,12.04,5,0,0,6.65,2.77,4.71,11.52,0.0,0.0,3911.8,2996.9,0.0,0.0,0,2210.1,340.3,20.49 -8,62.50,0,0,8,60.00,0.00,60.00,60.00,0.0,0.0,4033.0,3940.6,0.0,0.0,0,2245.9,223.4,111.69 diff --git a/tools/parallel-capacity-test/results/summary_20260331_040751.csv b/tools/parallel-capacity-test/results/summary_20260331_040751.csv deleted file mode 100644 index bd351d8..0000000 --- a/tools/parallel-capacity-test/results/summary_20260331_040751.csv +++ /dev/null @@ -1,4 +0,0 @@ -agents,duration,success,failed,timeout,avg_response,stddev,min_response,max_response,peak_cpu,avg_cpu,peak_mem_mb,avg_mem_mb,peak_mem_pct,avg_mem_pct,peak_procs,baseline_mem,mem_per_agent,cost_score -1,1.02,0,1,0,0.01,0.00,0.01,0.01,0.0,0.0,2460.7,2459.8,0.0,0.0,0,2458.8,1.9,0.00 -2,1.02,0,2,0,0.00,0.00,0.00,0.00,0.0,0.0,2464.2,2463.7,0.0,0.0,0,2463.2,0.5,0.00 -3,1.02,0,3,0,0.01,0.00,0.01,0.01,0.0,0.0,2444.0,2443.8,0.0,0.0,0,2443.7,0.1,0.00 -- 2.49.1