_operator_token in grammar/terms.py now resolves a fused indexed application through model.py:_split_fused_indexed_operator instead of re-deriving the boundary against its own copy of the operator registry. The prefix loop and the cache that only it used (_operator_keys, the load_operators import) are gone. The model is asked only for the split it already owns, so the accessor and the model agree on exactly which fused tokens round-trip.

Rewrote the ratio test so it guards the binary-operator route into _ir_tokens: it asserts the ratio key is collected from the parse and selects its concept, and it fails when binary operators are excluded from the token set. Replaced the scratch-copy template test with one that reads the shipped registry: a ratio, a difference and a product name each select their own template, and a plain name selects none of the three.

Measure: the five gate files run 67 passed, 5 xfailed, EXIT=0 against 66 passed, 5 xfailed, EXIT=0 at base (no added failures). Three mutations each fail with EXIT=1: routing _operator_token back to the raw string fails test_indexed_derivative_selects_its_operator_concept; excluding binary operators from _ir_tokens fails test_binary_operator_key_reaches_the_convention_tokens; dropping the binary-operator keying from template_bases fails test_shipped_templates_are_selected_for_their_operator_names.