division by zero crashes

Done

examples/buggy_calc · 2026-11-09 15:04:41 UTC · took 43.8s

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

Usage by agent

Cost per agent
planner: $0.0010 planner planner, Cost: $0.0010 $0.0010 coder: $0.0012 coder coder, Cost: $0.0012 $0.0012 tester: $0.0017 tester tester, Cost: $0.0017 $0.0017 reviewer: $0.0010 reviewer reviewer, Cost: $0.0010 $0.0010
Tokens per agent
  • Cache read
  • Cache write
  • Input
  • Output
planner: 7,969 planner planner, Cache read: 3,867 planner, Cache write: 3,002 planner, Output: 1,092 7,969 coder: 16.9K coder coder, Cache read: 11.4K coder, Cache write: 4,605 coder, Output: 933 16.9K tester: 21.5K tester tester, Cache read: 13.7K tester, Cache write: 6,076 tester, Output: 1,702 21.5K reviewer: 9,030 reviewer reviewer, Cache read: 3,451 reviewer, Cache write: 4,963 reviewer, Output: 610 9,030
View as table
AgentCostCache readCache writeInputOutput
planner$0.00103,8673,00281,092
coder$0.001211,3644,60510933
tester$0.001713,6876,076101,702
reviewer$0.00103,4514,9636610

Timeline

  1. planner iteration 1 Finished 3 calls · 7,969 tokens · $0.0010 · 11.4s

    Loading…

  2. coder iteration 1 Finished 4 calls · 16.9K tokens · $0.0012 · 7.3s

    Loading…

  3. tester iteration 1 Finished 4 calls · 21.5K tokens · $0.0017 · 14.9s

    Loading…

  4. verify iteration 1 Passed 0.5s
    ..............                                                           [100%]
    14 passed in 0.02s
    
  5. reviewer iteration 1 Finished 2 calls · 9,030 tokens · $0.0010 · 9.1s

    Loading…

Final diff

diff --git a/calc.py b/calc.py
index f16c6ca..b7d522d 100644
--- a/calc.py
+++ b/calc.py
@@ -15,6 +15,8 @@ def calculate(left: float, operator: str, right: float) -> float:
     if operator == "*":
         return left * right
     if operator == "/":
+        if right == 0:
+            raise CalculatorError("division by zero")
         return left / right
     raise CalculatorError(f"unknown operator: {operator}")
 
diff --git a/test_calc.py b/test_calc.py
index 856b0c9..9930cb5 100644
--- a/test_calc.py
+++ b/test_calc.py
@@ -23,3 +23,31 @@ def test_main_prints_result(capsys):
 def test_main_reports_unknown_operator(capsys):
     assert main(["1", "%", "2"]) == 1
     assert "unknown operator" in capsys.readouterr().err
+
+
+@pytest.mark.parametrize(("left", "right"), [(1, 0), (0, 0)])
+def test_division_by_zero_raises(left, right):
+    with pytest.raises(CalculatorError, match="division by zero"):
+        calculate(left, "/", right)
+
+
+def test_main_reports_division_by_zero(capsys):
+    assert main(["1", "/", "0"]) == 1
+    assert "division by zero" in capsys.readouterr().err
+
+
+@pytest.mark.parametrize("right", [-0.0, 0.0])
+def test_division_by_negative_or_positive_zero_raises(right):
+    with pytest.raises(CalculatorError, match="division by zero"):
+        calculate(5, "/", right)
+
+
+def test_main_reports_division_by_zero_float_spelling(capsys):
+    assert main(["1", "/", "0.0"]) == 1
+    captured = capsys.readouterr()
+    assert "division by zero" in captured.err
+    assert "Traceback" not in captured.err
+
+
+def test_division_by_tiny_nonzero_still_divides():
+    assert calculate(1, "/", 1e-300) == pytest.approx(1e300)