v0.2.17
## Performance improvements This pre-release focuses on reducing allocation, locking, scanning, and idle work across Termy's terminal core and desktop application. ### Core runtime - Added a borrowed fast path for ordinary PTY data in the OSC interceptor, avoiding copies and byte-by-byte parser work when no OSC sequence is present. - Made empty terminal event drains and no-damage frame snapshots allocation-free. - Reduced the native event polling scratch capacity from 1024 events to 8, cutting per-pane retained memory. - Reworked full and partial frame snapshots to build their final cell buffers in one pass. - Changed OSC 8 hyperlink hit-testing from collecting the visible grid to scanning only the requested row. - Removed redundant string allocations when building searchable terminal lines. - Preserved wakeup coalescing semantics while making the empty-drain fast path cheaper. ### Desktop application - Added a terminal layout and resize signature so unchanged renders skip repeated geometry walks, terminal locks, and resize calls. - Deferred pane ID and active-pane string cloning until a terminal actually yields events. - Cached alternate-screen state instead of taking an additional terminal lock during rendering. - Removed render timing calls from normal sessions unless render metrics are enabled. - Disabled plain wakeup signals for stashed workspace panes, reducing background workspace wake storms while preserving metadata, exit, and damage handling. - Avoided temporary native-tab allocations during terminal size synchronization. ### Validation - 180 `termy_core` tests passed. - 628 desktop application tests passed. - FFI and benchmark-tool test suites passed. - Clippy passed for all targets with warnings denied. - Formatting, repository boundary checks, and diff checks passed. - The steady-scroll benchmark gate passed with unchanged 8.33 ms p50/p95 frame times and zero hitches. The benchmark harness remains noisy, so this release does not claim a synthetic percentage speedup.