mean and median crash on an empty list

Done

/home/devdi/devswarm/evals/tasks/empty_input_statistics/repo · 2026-11-09 16:14:28 UTC · took 26.6s

  1. Plan (done)
  2. Code (done)
  3. Test (done)
  4. Review (done)
  5. Finish (done)
Cost
$0.0028
Tests
Passed
Iterations
1
Re-plans
0
LLM calls
10
Prompt read from cache
79%

Usage by agent

Cost per agent
planner: $0.0006 planner planner, Cost: $0.0006 $0.0006 coder: $0.0007 coder coder, Cost: $0.0007 $0.0007 tester: $0.0010 tester tester, Cost: $0.0010 $0.0010 reviewer: $0.0004 reviewer reviewer, Cost: $0.0004 $0.0004
Tokens per agent
  • Cache read
  • Cache write
  • Input
  • Output
planner: 7,322 planner planner, Cache read: 5,625 planner, Cache write: 843 planner, Output: 846 7,322 coder: 11.3K coder coder, Cache read: 8,567 coder, Cache write: 1,863 coder, Output: 843 11.3K tester: 13.4K tester tester, Cache read: 9,644 tester, Cache write: 2,544 tester, Output: 1,233 13.4K reviewer: 3,829 reviewer reviewer, Cache read: 1,727 reviewer, Cache write: 1,702 reviewer, Output: 396 3,829
View as table
AgentCostCache readCache writeInputOutput
planner$0.00065,6258438846
coder$0.00078,5671,8638843
tester$0.00109,6442,54481,233
reviewer$0.00041,7271,7024396

Timeline

  1. planner iteration 1 Finished 3 calls · 7,322 tokens · $0.0006 · 6.0s

    Loading…

  2. coder iteration 1 Finished 3 calls · 11.3K tokens · $0.0007 · 5.3s

    Loading…

  3. tester iteration 1 Finished 3 calls · 13.4K tokens · $0.0010 · 10.6s

    Loading…

  4. verify iteration 1 Passed 0.6s
    .......                                                                  [100%]
    7 passed in 0.02s
    
  5. reviewer iteration 1 Finished 1 calls · 3,829 tokens · $0.0004 · 3.5s

    Loading…

Final diff

diff --git a/stats.py b/stats.py
index 1367357..0aa8739 100644
--- a/stats.py
+++ b/stats.py
@@ -1,8 +1,12 @@
 def mean(values: list[float]) -> float:
+    if not values:
+        return 0.0
     return sum(values) / len(values)
 
 
 def median(values: list[float]) -> float:
+    if not values:
+        return 0.0
     ordered = sorted(values)
     middle = len(ordered) // 2
     if len(ordered) % 2:
diff --git a/test_stats.py b/test_stats.py
index 7b17903..b953ae2 100644
--- a/test_stats.py
+++ b/test_stats.py
@@ -3,8 +3,40 @@ from stats import mean, median
 
 def test_mean():
     assert mean([1, 2, 3]) == 2
+    assert mean([]) == 0.0
 
 
 def test_median():
     assert median([3, 1, 2]) == 2
     assert median([1, 2, 3, 4]) == 2.5
+    assert median([]) == 0.0
+
+
+def test_mean_empty_returns_float():
+    result = mean([])
+    assert isinstance(result, float)
+    assert result == 0.0
+
+
+def test_median_empty_returns_float():
+    result = median([])
+    assert isinstance(result, float)
+    assert result == 0.0
+
+
+def test_mean_single_and_negative_values_unchanged():
+    assert mean([5]) == 5
+    assert mean([-1, 1]) == 0
+    assert mean([1.5, 2.5]) == 2.0
+
+
+def test_median_single_and_unsorted_unchanged():
+    assert median([7]) == 7
+    assert median([4, -2, 10, 0, 3]) == 3
+    assert median([10, 2, 8, 4]) == 6
+
+
+def test_median_does_not_mutate_input():
+    values = [3, 1, 2]
+    median(values)
+    assert values == [3, 1, 2]