fix: increase stdoutDrainTimeout from 100ms to 500ms

Resolves intermittent "completed without agent_message output" errors
when Claude CLI exits before all stdout data is read.

- internal/executor/executor.go:43
- internal/app/app.go:27
- Add benchmark script for stability testing

Generated with SWE-Agent.ai

Co-Authored-By: SWE-Agent.ai <noreply@swe-agent.ai>
This commit is contained in:
cexll
2026-01-25 17:45:38 +08:00
parent 326ad85c74
commit 1afeca88ae
3 changed files with 45 additions and 2 deletions

View File

@@ -24,7 +24,7 @@ const (
stdoutCloseReasonWait = "wait-done"
stdoutCloseReasonDrain = "drain-timeout"
stdoutCloseReasonCtx = "context-cancel"
stdoutDrainTimeout = 100 * time.Millisecond
stdoutDrainTimeout = 500 * time.Millisecond
)
// Test hooks for dependency injection

View File

@@ -40,7 +40,7 @@ const (
stdoutCloseReasonWait = "wait-done"
stdoutCloseReasonDrain = "drain-timeout"
stdoutCloseReasonCtx = "context-cancel"
stdoutDrainTimeout = 100 * time.Millisecond
stdoutDrainTimeout = 500 * time.Millisecond
)
// Hook points (tests can override inside this package).

View File

@@ -0,0 +1,43 @@
#!/bin/bash
# Benchmark script for Claude CLI stability test
# Tests if the stdoutDrainTimeout fix resolves intermittent failures
set -euo pipefail
RUNS=${1:-100}
FAIL_COUNT=0
SUCCESS_COUNT=0
TIMEOUT_COUNT=0
echo "Running $RUNS iterations..."
echo "---"
for i in $(seq 1 $RUNS); do
result=$(timeout 30 codeagent --backend claude --skip-permissions 'say OK' 2>&1) || true
if echo "$result" | grep -q 'without agent_message'; then
((FAIL_COUNT++))
echo "[$i] FAIL: without agent_message"
elif echo "$result" | grep -q 'timeout'; then
((TIMEOUT_COUNT++))
echo "[$i] TIMEOUT"
elif echo "$result" | grep -q 'OK\|ok'; then
((SUCCESS_COUNT++))
printf "\r[$i] OK "
else
((FAIL_COUNT++))
echo "[$i] FAIL: unexpected output"
echo "$result" | head -3
fi
done
echo ""
echo "---"
echo "Results ($RUNS runs):"
echo " Success: $SUCCESS_COUNT ($(echo "scale=1; $SUCCESS_COUNT * 100 / $RUNS" | bc)%)"
echo " Fail: $FAIL_COUNT ($(echo "scale=1; $FAIL_COUNT * 100 / $RUNS" | bc)%)"
echo " Timeout: $TIMEOUT_COUNT ($(echo "scale=1; $TIMEOUT_COUNT * 100 / $RUNS" | bc)%)"
if [ $FAIL_COUNT -gt 0 ]; then
exit 1
fi