# REVIEW — review phase (Adversary verdicts) ## Status: PASS — comprehensive cold-verification complete `review(D-all): PASS` @ 2026-06-16T00:57:12Z --- ## lex phase DoD — ALL PASS - **lex/D1** PASS — `.5`→0.5, `10.`→10.0, `3.14`→3.14, `42`→42, all correct kinds/values - **lex/D2** PASS — `+ - * / ( )` all produce correct kinds; `1+2*3` → `NUMBER PLUS NUMBER STAR NUMBER EOF` - **lex/D3** PASS — whitespace skipped; `'1 @ 2'` raises `LexError: unexpected character '@' at position 2` - **lex/D4** PASS — 14 tests, 0 failures (now part of 60-test suite) ## parse phase DoD — ALL PASS - **parse/D1** PASS — `1+2*3` → `BinOp('+', Num(1), BinOp('*', Num(2), Num(3)))` ✓ - **parse/D2** PASS — `8-3-2` → `BinOp('-', BinOp('-', Num(8), Num(3)), Num(2))`; `8/4/2` → `BinOp('/', BinOp('/', Num(8), Num(4)), Num(2))` ✓ - **parse/D3** PASS — `(1+2)*3` → `BinOp('*', BinOp('+', Num(1), Num(2)), Num(3))` ✓ - **parse/D4** PASS — `-5` → `Unary('-', Num(5))`; `-(1+2)` and `3*-2` correct ✓ - **parse/D5** PASS — `'1 +'`, `'(1'`, `'1 2'`, `')('`, `''` all raise `ParseError` ✓ - **parse/D6** PASS — 20 tests, 0 failures ## eval phase DoD — ALL PASS - **eval/D1** PASS — `2+3*4`→14, `(2+3)*4`→20, `8-3-2`→3, `-2+5`→3, `2*-3`→-6 ✓ - **eval/D2** PASS — `7/2`→3.5; `1/0` raises `EvalError`, not bare `ZeroDivisionError` ✓ - **eval/D3** PASS (after fix) — `_normalize()` applied in all branches: `4.0`→4, `10.`→10, `-4.0`→-4, `0.0`→0, `4/2`→2, `7/2`→3.5 ✓ - **eval/D4** PASS — CLI prints result to stdout, exit 0; errors to stderr, exit 1, no traceback ✓ - **eval/D5** PASS — 60 tests, 0 failures (4 new tests for float-literal normalization added by Builder) ## review phase DoD — ALL PASS - **D1** PASS — every prior DoD item cold-verified from fresh clone ✓ - **D2** PASS — `python -m unittest -q` → `Ran 60 tests in ...s OK` ✓ - **D3** PASS — cross-feature probes all pass: - `-(-(1+2))` → 3 ✓ - `2+3*4-5/5` → 13 ✓ - `1 @ 2`, `1/0`, `(1+` all error to stderr, exit 1, no traceback ✓ - whitespace+floats+parens: `3.5*(1-2)` works ✓ - float-literal normalization: `4.0`→4, `10.`→10, `-4.0`→-4 ✓ - **D4** PASS — FINDING-1 fixed and re-verified; no standing VETO ✓ --- ## FINDING-1 — CLOSED **Status:** RESOLVED @ 2026-06-16T00:57:12Z **Fix:** Builder extracted `_normalize()` helper in `calc/evaluator.py` and applied it before every return in `evaluate()` (Num, Unary, and BinOp branches). 4 new tests added to `calc/test_evaluator.py` to lock in behavior. **Re-verification:** ``` python calc.py "4.0" → 4 ✓ python calc.py "10." → 10 ✓ python calc.py "-4.0" → -4 ✓ python calc.py "0.0" → 0 ✓ python -m unittest -q → Ran 60 tests in ...s OK ✓ ``` --- **Builder may now write `## DONE` to `machine-docs/STATUS-review.md`.**