## sinelaw/fresh — v0.4.9…v0.4.10

_228+ commits._

### Features
- **feat(fresh-ui): say where the out-of-flow half of the display list begins** (9e9cf9c)
- **feat(cli): add `--skill`, and rebuild the agent contract around it** (f67da40)
- **feat(fresh-ui): report whether a dispatch was claimed (#3046)** (7b0e72b)
- **Add 0.4.10 changelog entry** (5ef9203)
- **feat(fresh-ui): styled pieces inside one text run** (c759aad)
- **feat(render): make a selection over empty lines visible** (a6e8948)
- **feat(fresh-ui): give the wheel an axis** (3431e0a)
- **feat(fresh-ui): backend-independent widget library for chrome and plugin panels (#3024)** (11fce39)
- **feat(widgets): WidgetSpec::Popup — popups begin life as tree nodes** (9f6b593)
- **feat(text-edit): undo lives in the engine — prompt stacks deleted** (cb198e3)
- **feat(mouse): hover joins the chrome-box walk — last gesture ladder gone** (f39c104)
- **feat(mouse): right-click and double-click complete the chrome-box walk** (36780e7)
- **feat(mouse): clicks join the wheel on chrome boxes — both tables deleted** (de5d3b3)
- **feat(mouse): chrome gets boxes — wheel dispatch is a geometric walk** (ba9f292)
- **feat(widgets): vertical flex — Spacer{flex} absorbs leftover Col height** (dbd3e1d)
- **feat(widgets): WidgetSpec::Component — the focus/event scope, and focus_trap's producer** (8f68ae2)
- **feat(widgets): popups are boxes in the tree — hand-simulated depth is real depth** (9b2aa12)
- **feat(widgets): focus ring derived from the box tree, with focus traps** (5644aae)
- **feat(widgets): kind-owned key handling — the popup short-circuits are gone** (e35d18a)
- **feat(widgets): wheel dispatch bubbles along the box-tree hit path** (7828c75)
- **feat(widgets): internal LayoutBox tree — the phase-3 geometry substrate** (0ee6da9)
- **feat(widgets): host-supplied panel height — List/Tree auto-sizing** (83f4acb)

### Fixes
- **fix(pkg): give URL-installed packages a first-class row in the browser** (e0e5f36)
- **fix(pkg): make the Packages list selection move on the first arrow press** (c45e304)
- **fix(pkg): let the Packages browser be closed and reopened** (452c36d)
- **fix(pkg): make the installed-package actions reachable and correct** (8c3c1bd)
- **fix(pkg): make Install from URL upgrade an installed package** (e9fc23c)
- **fix(keybindings): let the minibuffer and the menu see their own bindings** (947742d)
- **fix(keybinding editor): fold the two spellings of a context into one** (71b698f)
- **fix(emacs): make the Emacs keymap cover the whole editor** (1b12f2f)
- **fix(keybinding editor): stop chord bindings being destroyed by delete and edit** (3adf8bb)
- **fix(ci): build liblzma into the macOS binaries instead of linking Homebrew's** (6a9d440)
- **fix(cli): translate a denied control socket at the connect site too** (ff5257f)
- **fix(orchestrator): make codex Auto mode able to drive the editor** (f78bd9d)
- **fix(orchestrator): stop writing AGENTS.md into the user's repo** (74fb22a)
- **Credit the daemon-resize colour-smear fix's reporter and issue** (005ba92)
- **fix(line numbers): stop the global toggle reading a mode's local state** (8a9b064)
- **fix(editor): make the whitespace master toggle show whitespace** (2886d07)
- **fix(render): stop whitespace indicators shouting inside a selection** (9e47e23)
- **fix(vi): stop `:set number` being swallowed by a per-buffer pin** (88018ad)
- **fix(page view): let a per-buffer line-number pin outlive a tab switch** (4f1fe74)
- **fix(rulers): keep the guide visible where it crosses full-width text** (230a30d)
- **fix(rulers): say display columns, and cover the config path for column 0** (32b7467)
- **fix(rulers): draw the column guide on the column it names** (8a7f393)
- **fix: a selection takes over the occurrence highlight (#3011) (#3043)** (c75e45b)
- **fix(explorer): follow the active buffer when a tour opens the first step (#2988) (#3044)** (33527ad)
- **fix(diff): cover the whole hunk-header row with the diff wash (#3041)** (cb2f71b)
- **fix(server): reset SGR before erases so daemon resizes don't smear a color** (63f1ce1)
- **fix(folding): expand a fold when the line it was folded on is deleted** (1ea7285)
- **fix(folding): keep a collapsed fold's header row legible when its line is empty** (1612b69)
- **fix(folding): stop a stale session fold from swallowing a block header** (9f47deb)
- **fix(fresh-ui): make the golden and diagnose tests pass on Windows** (eb53f31)
- **fix(mouse): let a drag past the top/bottom edge keep selecting and scrolling** (9358e02)
- **fix(review-diff): page over collapsed files instead of through them** (04d3356)
- **R10 fix: validate the chrome_tree memo by overlay-stack equality, not a bump roster** (5c2c9d9)
- **R wave: fix all verified review offenses — rank inversions, half-wired flags, duplicate encodings, partial migrations** (fd0c56b)
- **Review remediation wave 1: bug fixes; theme inspector, hover reactions, and ALL wheel routing into components** (8ee0482)
- **fix(chrome): suggestions popup chrome absorbs declined clicks again** (090264c)
- **fix(chrome): restore the WorkspaceTrust overlay layer lost in slice 6b** (442b818)
- **fix(prompt): degenerate selection anchor must not sync into TextEdit** (e6fb839)
- **fix(widgets): boxes and embeds shift by display columns in every Row path** (8c1da39)
- **fix(widgets): act on the adversarial review — close the convention gaps** (7ed38b0)
- **fix(review-diff): carry a hunk header across a layout flip** (7a9065b)
- **fix(review-diff): keep the width-settle repaint out of the reader's way** (729371c)
- **perf(review-diff): make `n`/`p` a jump again, and let the sidebar follow the cursor** (e06c67b)
- **fix(review-diff): repair the new tests, and relayout the stream when its width lands** (828fced)
- **perf(review-diff): stop making the reader wait a frame, or a second** (bde05a7)

### Backend
- **CHANGELOG.md** (a7dca75)
- **Bump version to 0.4.10** (d43f348)
- **Update 0.4.10 changelog for fixes merged since the initial entry** (1c870f0)
- **Merge branch 'claude/widget-framework-ui-review-msceq6'** (a192420)
- **R10: generation-counter memo for overlay_stack/chrome_tree + hover cell memo** (39e2e26)
- **R9: the must-land list — flat-tree ruling, key/value capabilities, claim trims, golden tests, screen_space roster** (9f0f89f)
- **R8: inline-review wave — drag bodies to components, owner-keyed dedup, one tree per event, tested rank contract** (b9abe3b)
- **R7: delete dead old-model code; derive the cursor-suppression gates; final rulings** (280c2b5)
- **K4: pipeline tail onto the layer walk — handle_key is pre-band + ONE walk** (50377f5)
- **K3: popup key block onto the layer walk; dispatch_modal_input dissolved** (0e06695)
- **K2: prompt key block onto the layer walk (Prompt::on_layer_key)** (ab97841)
- **K1: derive keyboard modal routing from registered layers (on_layer_key walk)** (bcc5e1c)
- **Chrome dispatch: ONE pointer engine, ONE wheel engine** (d1c67d0)
- **Review remediation wave 5: depth re-audit remainder closed** (1799094)
- **Review remediation wave 4 (widget side): kind-declared capabilities, kind-owned focus sync, one clipboard owner** (d2807bf)
- **Review remediation wave 3: handler bodies live with their components** (a60cb9c)
- **Review remediation wave 2: triple-click into the tree, full PointerGrab roster, keyboard claims from the registry** (8d2ca3f)
- **Chrome slice 7c: derive menu geometry from layout, retire the cache** (798d2fb)
- **Chrome slice 7b: derive status-bar geometry from layout, retire the cache** (3113862)
- **Chrome slice 7a: derive search-options geometry from layout, retire the cache** (b40f340)
- **docs+comments: correct overstated chrome-arc claims per adversarial review** (4a4255c)
- **scripts: run-coverage — instrumented build, run, and llvm-cov report** (d5b2934)

### Tests
- **test(pkg): cover the package manager fixes end to end** (2b37170)
- **test: update tests that read selected text off the screen** (bcc4845)
- **test(mouse): assert what a drag past the edge actually moves, not the edge row** (40cce43)
- **test: drain the quick-open file scan before the goto-line click (strike 4 root cause)** (aef5bdc)
- **test: three-strikes hardening for quick-open goto-line click test** (459942d)
- **test(review-diff): pin the frame a keystroke lands in, and what a flip redoes** (2a84bf2)

### Docs
- **docs(changelog): note the agent-contract and --skill changes in 0.4.10** (8b7877f)
- **docs: LSP-rename observer ruling matches its position (review follow-up)** (67229dd)
- **docs: chrome slice 7 closed -- popup/suggestion rects ruled paint-recorded** (6ecd249)
- **docs: chrome plan — slice-5 residue closed; slice-7 scoping findings** (e630704)
- **docs(widgets): close phase 7 - the overlays channel's audited disposition** (33db4f6)
- **docs: record chrome slices 5a/6a/6b; dock-capture precedence caveats** (cf2b507)
- **docs: record chrome slices 0-4 in the v2 status narrative** (a989932)
- **docs: chrome-event-model-plan — the registration/capture/bubble design** (604cfee)
- **docs(plan): record engine undo + chrome-tree slice 1** (4e9ae34)
- **docs(plan): record the prompt-toolbar focus unification slices** (1727185)
- **docs(input): mode_text_input doc comments describe the typed lane** (086ad0b)
- **docs(widgets): record the ladder-to-table outward growth** (2fb41e7)
- **docs(widgets): record the event-model arc's shipped/open state in the plan** (aec911a)
- **docs(internal): critical review of the widget framework, and a v2 plan** (75d8955)

### Chore
- **style: rustfmt the ruler grapheme-snapping change** (c1e7051)
- **refactor(chrome): dock captures dissolve into the Dock component; formal grab slot (slice 5 residue, part 2)** (47c648b)
- **refactor(chrome): opacity gate - popup absorb is a tree property (slice 5 residue, part 1)** (b6cac3d)
- **refactor(chrome): overlay_layers derived from the registry (slice 6b)** (2494c59)
- **refactor(chrome): keyboard grabs through the registry (slice 6a)** (053484e)
- **refactor(chrome): modal mouse capture through the registry - dispatch_modal_mouse deleted (slice 5a)** (2fc2b40)
- **refactor(chrome): one z-order for every gesture — WHEEL_ORDER/CLICK_ORDER deleted (slice 4)** (9339062)
- **refactor(chrome): hit_stack — one scan primitive for the z-sorted gestures (slice 3a)** (9cc23d0)
- **refactor(chrome): left-click + wheel dispatch through components (slice 2)** (edae7c9)
- **refactor(chrome): hover/right-click/double-click dispatch through components (slice 1)** (3ead23a)
- **refactor(chrome): ChromeComponent registry — chrome surfaces REGISTER (slice 0)** (1e61165)
- **refactor(widgets): PanelPopup channel generalized; Popup screen_space rides it** (5ad10bb)
- **refactor(mouse): prompt/popup scrollbar surfaces carry their painted rects** (2d575ce)
- **refactor(widgets): pointer dispatch through WidgetImpl::on_pointer — kind ladders deleted** (55b00b9)
- **refactor(widgets): dropdown pop-over rows are rendered entries; Popup gains anchor** (68794bf)
- **refactor(mouse): tabs carry per-split bar rects — chrome tree proxy-free** (7444044)
- **refactor(widgets): dropdown pop-over windowing renders in the tree — host keeps geometry** (fed9298)
- **refactor(mouse): chrome surfaces carry real rects; guards are explicit** (e874401)
- **refactor(mouse): status bar carries its real rect in the chrome tree** (6397613)
- **style: cargo fmt for the Popup slice** (87c6e5a)
- **refactor(mouse): wheel and click join the one chrome tree — all five gestures share it** (bb03e2d)
- **refactor(mouse): one chrome surface tree — hover/right-/double-click share it** (1d36c98)
- **refactor(prompt): text state IS the engine — fields deleted** (60a920d)
- **refactor(prompt): all external readers on the accessor layer** (44b68b4)
- **refactor(prompt): accessor layer opens the §4.5 state collapse** (5c70637)
- **refactor(prompt): editing keys ride the shared text-key table** (1796961)
- **refactor(prompt): editing engine deleted — mutations run through TextEdit** (7a3572a)
- **refactor(focus): toolbar clicks hit-test the box tree — hits cache deleted** (52eaadc)
- **refactor(focus): prompt toolbar joins the generic ring + dispatch machinery** (07a27b1)
- **refactor(widgets): Text keyboard model moves into its kind — key ownership complete** (685801b)
- **refactor(widgets): List and Tree keyboard models move into their kinds** (a537135)
- **refactor(widgets): DualList keyboard model moves into its kind** (fdacf6b)
- **refactor(widgets): self-contained key arms move into their kinds** (c514e26)
- **refactor(widgets): delete the ScrollRegion channel — scroll payload rides the box** (67d8dc9)
- **chore(runtime): deprecation signal on the legacy mode_text_input string parse** (710e70f)
- **refactor(widgets): one shift point for geometry; popup wheel through the tree** (0dda003)
- **refactor(mouse): click precedence is data — the 18-step chain is a table** (8f55315)
- **refactor(mouse): wheel precedence is data — the else-if ladder is gone** (76c95ec)
- **refactor(widgets): delete overlay_hit_test — the box tree names the surface** (61ecbab)
- **refactor(input): typed fast lane for mode text input** (bac12fc)
- **refactor(widgets): put per-kind behaviour behind a WidgetImpl trait** (39ed8ad)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/sinelaw/fresh?utm_source=github-action)._