# ADR-0136.S.1 — Rate/Event Statement Parsing **Status:** Accepted — *regex patterns scheduled for removal under [ADR-0164](./ADR-0164-incremental-comprehension-reader.md) Phase 3; closed-set vocabulary preserved as lexicon seed* **Parent:** ADR-0136 (Statement Layer Corridor) — see [ADR-0136 §Amendment 2026-05-26](./ADR-0136-statement-layer-corridor.md) **Date:** 2026-05-23 ## Context The GSM8K refusal taxonomy (`evals/gsm8k_math/train_sample/v1/refusal_taxonomy.json`) reveals that 23/50 cases are blocked by context-filler sentences (correctly refused — no parseable numeric state), while 4/50 have rate/capacity/price as their primary barrier. The remaining cases are compound-statement, distributive-multiply, and diverse long-tail shapes. This ADR targets the 4 rate-class cases with two closed statement shapes. ## Taxonomy Finding | Primary barrier | Cases | S.1 scope? | |------------------------|-------|------------| | `context_filler` | 23 | No — correctly refused | | rate/capacity/price | 4 | **Yes** | | `compound_statement` | 5 | No | | `distributive_multiply`| 1 (+5 secondary) | No | | diverse long-tail | 17 | No | ## Closed Verb Sets **Capacity verbs:** shuck, pick, pack, make, produce, type, read, write, paint, run, score, answer, complete (+ third-person -s forms). **Earnings verbs:** make, earn, receive, get, charge (+ third-person -s forms). No regex wildcards for verbs — every admitted verb is explicitly listed in a frozen set. Sentences with verbs outside the closed set are refused (not wrong). ## Short-Circuit Rationale Both rate shapes bypass the Cartesian-product candidate graph because the rate computation is a direct `rate × time` multiplication with unit conversion, not a graph of initial-possessions and operations. The short-circuit runs before `_filtered_statement_choices` so that rate-shaped sentences don't trigger the "no admissible candidate" refusal. Actor matching is required: capacity questions with pronouns (`he`/`she`) accept any actor; named-actor questions require case-insensitive match. Mismatched actors produce refusal, not wrong answers. ## Honest GSM8K Claim - **Pre-S.1:** 0/50 admitted (all refused). - **Post-S.1:** 1/50 admitted — `gsm8k-0014` (Bob shucks oysters) with answer 240.0 (correct). - **admitted_wrong = 0** (safety rail preserved). The other 3 rate-class cases remain blocked by context-filler sentences in their opening statements; the rate parsing behind them is irrelevant until those sentences parse. ## Deferred - Context-filler gated problems (23 cases — needs semantic classification of narrative scene-setter sentences). - Conditional branching (overtime rules, e.g. "if she works more than 8 hours"). - Percentage/interest rates (10% simple interest). - Multi-statement earnings (duration asserted in a separate sentence from the rate — needs general duration-statement parser). ## Evidence - Axis lane: `evals/math_capability_axes/S1_rate_events/v1/` — 20/20 pass, wrong=0. - B3 bounded-grammar lane: unchanged (wrong=0). - GSM8K candidate-graph probe: wrong=0, admitted=1/50. - Tests: `tests/test_adr_0136_S1_rate_events.py` — ≥15 tests including B3 regression guard and GSM8K admitted_wrong=0 rail.