f448c651ce
Drilling into a cell fixed its coordinates on Axis::Page, which put them in the tile bar and under [ and ] as if the user could move them. They are constraints of the drill, not dimensions to page through. They now land on Axis::Filter. The variant splits one question into two, and picking the wrong one is the trap this introduces. "What data is visible" is View::filtering_cats -- Page and Filter both constrain -- and GridLayout and add-record-row ask it. "What can the user act on" is categories_on(Axis::Page) for [/] and View::tileable_cats for the three tile-select sites. Both predicates are named on Axis (filters_data, is_user_assignable) rather than left as tests against the variant, so a third variant does not silently join the wrong side. Axis::next maps Filter to itself and no navigable axis rotates into it, so neither tile select nor cycle-axis can hand out a Filter assignment. The .improv grammar gains a filter keyword and round-trips a selection with it. Filter only ever occurs in the _Drill view, which is never written -- but the alternative to supporting it was silently writing a Filter axis out as some other axis. Worth recording: adding the variant produced exactly one compile error outside axis.rs. improvise-rml had already collapsed the four scattered display matches into one file, so the consolidation paid for itself on the very next ticket. Closes improvise-dz8 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V69PGQfMJuGRmtSWpfVAqn