Plain Tab now navigates instead of being pure dead weight: the global
handler dispatches lh:kbd-cycle-fields and each composer-bearing
surface answers with its own chain, gathered from live DOM at event
time (the docks mount and unmount — refs would go stale):
- chat: reading-thinking → the active dock's field → the composer,
visual order, wrap; Tab from anywhere else focuses the first live
field (navigate in)
- new-session + home: the composer is the whole chain — Tab navigates
into it
Shift+Tab is untouched (the thinking-level cycle keeps it — owner
ruling); the quiz dock's rows↔thinking Tab claim stops propagation at
document level, so a claimed Tab never reaches the dispatch — no
double act.
1427 tests, tsc, lint, build green.