Coding agents are typically evaluated using one-shot, well-formulated prompts. Benchmarks such as SWE-bench use existing GitHub issues as input for a coding agent and evaluate whether the agent successfully solves the task. However, in real-world use cases, prompts are often not as well-formulated or structured as existing GitHub issues. Additionally, a coding agent session is not limited to a single prompt; it typically involves a multi-turn interaction in which the user iteratively adds new tasks and requirements that the agent must fulfill. To benchmark these abilities, we developed SWE-DIVE, a dynamic, interactive validation and evaluation framework for benchmarking coding agents in a multi-turn environment. To achieve this, we introduce a user simulator that can simulate different behavioral patterns and communicate with the coding agent. We also introduce a conversation validator that evaluates the user simulator's outputs to determine whether they fulfill the initial requirements and guide the agent toward successfully solving the task. The entire framework is embedded in a Harbor environment, which orchestrates the coding agent, user simulator, and conversation validator, and executes the test environment to determine whether the agent successfully solves the task. Our results and source code are available in our GitHub repository (https://github.com/lorenzbrehme/swe-dive_usersim).
Figures & tables
Figure 1: Overview of SWE-DIVE
Figure 2: A qualitative case study illustrates the distinct behaviors elicited by each SWE-DIVE persona.
Metric
Expert Nitpicker
Mind Changer
Vague Requester
Base
Resolved
4/11
4/11
3/11
3/11
Passed target tests
6/11
6/11
4/11
4/11
Failed regression test
5/11
4/11
5/11
2/11
ϕ Turns
3.27
3.36
2.73
1
Δ Input/Output Tokens
+53.5k/+104.7
+25.5k/+358.0
+7.1k/+649.3
0/0
Δ Files Read/Edited
−0.09/−0.91
+0.36/+0.18
+2.55/+0.18
0/0
Table 1: Summary of results across 11 runs for the three evaluated roles, along with the performance of the original task without a multi-turn conversation. Resolved reports the number of completed tasks; Passed target tests reports the number of runs in which all tests transitioned from failing to passing; and Failed regression test reports the number in which at least one test transitioned from passing to failing. ϕ Turns denotes the average number of agent turns per task. Δ Tokens shows the change in the mean number of input/output tokens compared to the baseline run. Δ files shows the change in the mean number of files read/edited compared to the ground-truth patch.
Appendix figures & tables7 assets
Supplementary material from the paper’s appendix.
Appendix
Figure 3: Representative multi-turn trajectory in SWE-DIVE with a fixed Vague Requester persona
Figure 4: Representative multi-turn trajectory in SWE-DIVE with a fixed Expert Nitpicker persona.
Figure 5: Representative multi-turn trajectory in SWE-DIVE with a fixed Mind Changer persona.
Task
Resolved
FAIL_TO_PASS
PASS_TO_FAIL
Turns
astropy-12907
true
2/2
0/13
4
matplotlib-22865
true
3/3
0/57
3
sympy-16886
true
1/1
0/42
2
requests-1142
true
1/1
0/5
2
django-16938
false
18/23
0/65
2
django-10554
false
0/2
1/23
6
Appendix
Table 2: Results across 11 runs with the Expert Nitpicker. Resolved indicates whether the task was successfully completed. Fail-to-pass reports the number of tests that transitioned from failing to passing as a result of the agent’s changes, while pass-to-fail reports the number of previously passing tests that became failing. Turns denotes the number of agent turns required to complete the task, and Task identifies the task evaluated.
Task
Resolved
FAIL_TO_PASS
PASS_TO_FAIL
Turns
astropy-12907
true
2/2
0/13
5
matplotlib-22865
false
1/3
1/57
2
sympy-16886
true
1/1
0/42
2
requests-1142
true
1/1
0/5
4
django-16938
true
23/23
0/65
3
django-10554
false
0/2
1/23
3
Appendix
Table 3: Results across 11 runs with the Mind Changer. Resolved indicates whether the task was successfully completed. Fail-to-pass reports the number of tests that transitioned from failing to passing as a result of the agent’s changes, while pass-to-fail reports the number of previously passing tests that became failing. Turns denotes the number of agent turns required to complete the task, and Task identifies the task evaluated.
Task
Resolved
FAIL_TO_PASS
PASS_TO_FAIL
Turns
astropy-12907
false
2/2
10/13
3
matplotlib-22865
false
1/3
1/57
3
sympy-16886
true
1/1
0/42
1
requests-1142
true
1/1
0/5
3
django-16938
true
23/23
0/65
1
django-10554
false
0/2
0/23
1
Appendix
Table 4: Results across 11 runs with the Vague Requester. Resolved indicates whether the task was successfully completed. Fail-to-pass reports the number of tests that transitioned from failing to passing as a result of the agent’s changes, while pass-to-fail reports the number of previously passing tests that became failing. Turns denotes the number of agent turns required to complete the task, and Task identifies the task evaluated.
Task
Resolved
FAIL_TO_PASS
PASS_TO_FAIL
Turns
astropy-12907
true
2/2
0/13
1
matplotlib-22865
false
1/3
1/57
1
sympy-16886
true
1/1
0/42
1
requests-1142
false
0/1
0/5
1
django-16938
false
0/23
0/65
1
django-10554
false
0/2
0/23
1
Appendix
Table 5: Results across 11 runs using the base task without multi-turn behavior. Resolved indicates whether the task was successfully completed. Fail-to-pass reports the number of tests that transitioned from failing to passing as a result of the agent’s changes, while pass-to-fail reports the number of previously passing tests that became failing. Turns denotes the number of agent turns required to complete the task, and Task identifies the task evaluated.