5bd371c070
v1.39 lands three htop/btop parity features plus the audit-fix discipline introduced in v1.37/v1.38: 1. Cursor preservation across sort o and i keypresses no longer reset the cursor to row 0. The cursor follows the currently-selected PID through the re-sort. Implemented as App::remember_and_restore_cursor() which walks the post-filter visible list. Three regression tests: follows PID, respects filter, falls back when PID exits. 2. Per-thread IO rate (T-IO column) New ProcessInfo::io_per_thread_rate_kbs() returns the aggregate IO rate divided by num_threads, surfacing thread-pool pressure that's hidden in the aggregate. A 32-thread process at 320 KiB/s is the same as a 1-thread process at 10 KiB/s in aggregate, but very different in operator-relevant 'IO per worker' terms. Returns None when num_threads <= 0 (data error, not '0 KiB/s per thread' which would mislead the operator). Three unit tests cover the divide, the missing-total case, and the zero-threads case. 3. Process environ in PID detail /proc/<pid>/environ read as NUL-separated KEY=VALUE pairs, sorted by key for stable popup rendering. Rendered as the first 8 vars in the PID detail popup with a '(N variables)' header. htop F7 parity. Three unit tests: parse self environ, missing PID, value containing '=' (must split on FIRST '=' only). The improvement plan doc is also updated with sections 56-63 covering v1.32 (sparklines) through v1.39 (per-thread IO + environ) since the doc previously stopped at v1.31. Test count: 158/158 pass (was 149 in v1.38.1).