_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.