# REVIEW-parse.md — Adversary verdicts for phase `parse` Phase plan SSOT: /home/loops/project-orchestrator/projects/agent-orchestrator-benchmark/plans/calc/parse.md Gates: D1 (precedence), D2 (left associativity), D3 (parentheses), D4 (unary minus), D5 (errors), D6 (tests green) ## Verdicts - D1: PASS @2026-06-15T04:41:47Z - D2: PASS @2026-06-15T04:41:47Z - D3: PASS @2026-06-15T04:41:47Z - D4: PASS @2026-06-15T04:41:47Z - D5: PASS @2026-06-15T04:41:47Z - D6: PASS @2026-06-15T04:41:47Z All DoD gates PASS. No VETO. Phase `parse` complete — Builder may write ## DONE to STATUS-parse.md. --- ## Evidence **D1 — Precedence** ``` 1+2*3 → BinOp('+', Num(1), BinOp('*', Num(2), Num(3))) ✓ (* binds tighter) 2*3+4 → BinOp('+', BinOp('*', Num(2), Num(3)), Num(4)) ✓ 1+2*3-4/2 → BinOp('-', BinOp('+', Num(1), BinOp('*', Num(2), Num(3))), BinOp('/', Num(4), Num(2))) ✓ ``` **D2 — Left Associativity** ``` 8-3-2 → BinOp('-', BinOp('-', Num(8), Num(3)), Num(2)) ✓ 8/4/2 → BinOp('/', BinOp('/', Num(8), Num(4)), Num(2)) ✓ 1-2+3 → BinOp('+', BinOp('-', Num(1), Num(2)), Num(3)) ✓ 2/3*4 → BinOp('*', BinOp('/', Num(2), Num(3)), Num(4)) ✓ ``` **D3 — Parentheses** ``` (1+2)*3 → BinOp('*', BinOp('+', Num(1), Num(2)), Num(3)) ✓ ((((1)))) → Num(1) ✓ ``` **D4 — Unary Minus** ``` -5 → Unary('-', Num(5)) ✓ -(1+2) → Unary('-', BinOp('+', Num(1), Num(2))) ✓ 3 * -2 → BinOp('*', Num(3), Unary('-', Num(2))) ✓ --5 → Unary('-', Unary('-', Num(5))) ✓ -2*3 → BinOp('*', Unary('-', Num(2)), Num(3)) ✓ 2+-3 → BinOp('+', Num(2), Unary('-', Num(3))) ✓ -2*-3 → BinOp('*', Unary('-', Num(2)), Unary('-', Num(3))) ✓ ``` **D5 — Errors (all raise ParseError, no wrong exception types)** ``` '1 +' → ParseError: unexpected end of input ✓ '(1' → ParseError: unclosed parenthesis ✓ '1 2' → ParseError: unexpected token 'NUMBER'… ✓ ')(' → ParseError: unexpected token 'RPAREN' ✓ '' → ParseError: empty input ✓ Extra probes: '+1', '1++2', '1*', '((1+2)', '1+2)', '*', '()', '1 + + 2' — all ParseError ✓ ``` **D6 — Tests Green** ``` Ran 48 tests in 0.001s OK (21 lex + 27 parser) ✓ ```