diff --git a/README.md b/README.md
index bdff8b3..2e4d8c3 100644
--- a/README.md
+++ b/README.md
@@ -164,12 +164,17 @@ with the dock button, or the window narrow enough (< 900 px, "compact mode") for
overlay on the plot, open or not -- the same readouts appear on **one line under the plot**, above the badge bar (the
*readouts strip*): a **Cursors** button (opens the `cursors` page) and one chip per cursor line (its name and
its *delta* value), then a **Measures** button (opens the `measure` page) and one chip per measurement (the
-signal's colour chip, the type, the value; a click opens its dialog; "no measurements" when there are none).
+signal's colour chip, the type, the value; a click opens its dialog). Each of the two groups is there only
+with something to read -- the Cursors group with the cursors switched on, the Measures group with at least one
+measurement, the separator with both -- and **with neither, the strip is not shown at all**.
It is a **fixed 26 px** high and its chips are as wide as the dock's cells (name 6 characters, type 10, value
9, the full text in the tooltip); what does not fit scrolls sideways with no bar taking height. With the
-cursors off the chips are insensitive and read `--`, as the dock's cells do. It is the **third reader of the
+cursors off their chips are insensitive and read `--`, as the dock's cells do (the group is hidden then, so this is
+not seen). It is the **third reader of the
same strings** (the setters that write the dock's labels write the strip's), and it is shown exactly when
-`!show-sidebar || collapsed`: in a wide window it is hidden while the dock is shown beside the plot (so the
+`(!show-sidebar || collapsed)` **and** (the cursors are on **or** there is a measurement) -- a deliberate
+exception to "disable, do not hide": an empty line under the plot is 26 px of nothing, and the dock, which keeps
+both blocks on screen, is where the empty state is shown. In a wide window it is hidden while the dock is shown beside the plot (so the
plot never loses its 26 px to both), and in a collapsed window it stays on screen even with the dock overlaid,
so the measurements and cursors remain visible in compact mode. The **Events** block is a heading with a
**Manage** button over a short list of the cached events, newest first -- one compact row each, never a
diff --git a/docs/USER-GUIDE.md b/docs/USER-GUIDE.md
index 8d314be..edc7f74 100644
--- a/docs/USER-GUIDE.md
+++ b/docs/USER-GUIDE.md
@@ -22,7 +22,7 @@ The window is a plot with three things around it:
- the **dock** on the right, which the dock button in the header bar (`s`) shows and hides: read-only
**Readouts** of the cursors and of the measurements, each with an **Edit** button that opens its
page, and an **Events** block. With the dock hidden, or in a narrow window where the dock slides over the plot, the readouts show in a
- one-line strip under the plot instead (the cursors' deltas and each measurement's value; **Cursors** and **Measures** open the pages).
+ one-line strip under the plot instead (the cursors' deltas and each measurement's value; **Cursors** and **Measures** open the pages); the strip is there only while the cursors are on or there is a measurement.
## 1. Connecting
diff --git a/docs/claude/architecture.md b/docs/claude/architecture.md
index b893637..ee24973 100644
--- a/docs/claude/architecture.md
+++ b/docs/claude/architecture.md
@@ -137,9 +137,13 @@ touching the data path.
**The readouts strip** (`readouts_strip` in `main-window.ui`, between `plot_overlay` and `badge_bar` in
`left_column`; filled by `ui_dock.cpp`) carries the same readouts when the dock is not beside the plot: a flat
**Cursors** button and one chip (`who` + delta) per cursor line, then a **Measures** button and one chip per
- measurement. `sync_readouts_strip()` shows it exactly when `!adw_overlay_split_view_get_show_sidebar() ||
- adw_overlay_split_view_get_collapsed()` -- the Dock button put the dock away, or the window is collapsed and
- the dock is an overlay on the plot (the strip stays on screen even while that overlay is open). The tick
+ measurement. `sync_readouts_strip()` shows it exactly when `(!adw_overlay_split_view_get_show_sidebar() ||
+ adw_overlay_split_view_get_collapsed())` **and** (the cursors toggle is active **or** `app.measures` is
+ non-empty) -- the Dock button put the dock away, or the window is collapsed and the dock is an overlay on the
+ plot (the strip stays on screen even while that overlay is open), and there is something to read. Inside, the
+ Cursors group (`strip_cursor_group`) is shown with the cursors on, the Measures group (`strip_measure_group`)
+ with measurements, the separator (`strip_sep`) with both; with neither the strip is hidden. Besides the tick,
+ the cursors toggle handler and `rebuild_measures_pane()` call it, so a toggle or an add/delete shows at once. The tick
calls it right after re-asserting `sidebar_wanted` and *before* `set_collapsed()` (so the split view's own
collapse-time `show-sidebar` write is never read); that means the `collapsed` it reads is the previous
frame's, and the strip follows a collapse or a widening one tick late, never through a wrong state. Its labels (`strip_cursor_who`, `strip_cursor_deltas`, `strip_measure_labels`) are rebuilt by
diff --git a/docs/claude/invariants-plot-and-layout.md b/docs/claude/invariants-plot-and-layout.md
index e72d415..ca9562f 100644
--- a/docs/claude/invariants-plot-and-layout.md
+++ b/docs/claude/invariants-plot-and-layout.md
@@ -148,20 +148,25 @@ Part of [CLAUDE.md](../../CLAUDE.md). These are rules that cost a defect to lear
characters, which made the readouts' minimum width 304 px; that pushed the sidebar to 304 px
(`dock_w=304`) and defeated the 280 pin. Widening any cell is the same
trap -- read `[readouts] ... dock_w=` (must be 280) and the `dock cursors:` / `dock measures:` `fits=`, and for the Events block `dock events: ... dock_w=` (268).
-- **The readouts strip is a fixed 26 px, scrolls sideways, and is shown whenever the dock is not beside the plot.**
+- **The readouts strip is a fixed 26 px, scrolls sideways, and is shown only when the dock is not beside the plot and there is something to read.**
`readouts_strip` (a `GtkScrolledWindow`, `height-request` 26, horizontal `external`, vertical `never`) sits
in `left_column` between `plot_overlay` and `badge_bar`. Its height is a request and not a measurement of
its chips (the buttons are trimmed by `button.udpscope-strip-button` in `ui_widgets.cpp`, or Adwaita's
34 px flat button would push it past 26), the chips' cells are fixed-width ellipsized labels like the
dock's, and an overflow scrolls with no bar taking height: "layout must not depend on content" for the
- strip, the same as for the badge bar. It is *visible* exactly when `show-sidebar` is false **or** the split view is `collapsed`
+ strip, the same as for the badge bar. It is *visible* exactly when (`show-sidebar` is false **or** the split view is `collapsed`)
+ **and** (the cursors are on **or** there is a measurement)
(`sync_readouts_strip()`, from the tick after the wish is re-asserted and before `set_collapsed()` -- so
`show-sidebar` is the wish and not the split view's collapse-time write, and `collapsed` is the previous
- frame's value). Hidden only with a wide window and the dock beside the plot, so the plot's 26 px go to one
- pane of readouts and never both; in a collapsed window the dock is an overlay on the plot and the strip
+ frame's value). Hidden with a wide window and the dock beside the plot, so the plot's 26 px go to one
+ pane of readouts and never both, and hidden with nothing to read (cursors off, no measurement). That last
+ is a deliberate, user-requested exception to "disable, do not hide": an empty strip is 26 px of nothing, and
+ the dock keeps both blocks on screen so the empty state is never invisible; the strip's two groups and the
+ separator follow the same rule (`strip_cursor_group` with the cursors, `strip_measure_group` with
+ measurements, `strip_sep` with both). In a collapsed window the dock is an overlay on the plot and the strip
stays, overlay open or not. The plot is 26 px shorter while it shows; that is the dock's and the window's
state moving the layout, not content. Reading `h=26` with `visible=1` (and `h=0` with `visible=0`) in
- `strip:` is the assertion, and `visible_ok=1` that `visible` equals `expected`.
+ `strip:` is the assertion, `visible_ok=1` that `visible` equals `expected` and `groups_ok=1` that the groups agree.
- **Trace slots are identified by signal name, not channel index.** Enabling a signal
or a new CONFIG renumbers the channel list, so an index would silently re-point a
trace at another signal.
diff --git a/docs/claude/invariants-readouts-and-cursors.md b/docs/claude/invariants-readouts-and-cursors.md
index b49d9e0..31133d8 100644
--- a/docs/claude/invariants-readouts-and-cursors.md
+++ b/docs/claude/invariants-readouts-and-cursors.md
@@ -66,8 +66,12 @@ Part of [CLAUDE.md](../../CLAUDE.md). These are rules that cost a defect to lear
dock cell without going through those two setters leaves the strip stale. The strip keeps the dock's
rules: the same fixed-width ellipsized cells (who 6, type 10, value 9 characters, full text in the
tooltip), the delta cell reads `--` on the same branches, and the cursor chips are *insensitive* with the
- cursors off and never hidden -- through `dock_set_cursors_sensitive()`, which writes the dock's grid and the
+ cursors off -- through `dock_set_cursors_sensitive()`, which writes the dock's grid and the
strip's chip box together; a second `gtk_widget_set_sensitive()` on either is two spellings of one state.
+ The one place the strip hides what the dock only disables: with the cursors off the strip's Cursors group is
+ not shown, with no measurement its Measures group is not, and with neither the strip is not (the dock keeps
+ both blocks, `no measurements` included; the strip has no placeholder). That is
+ `sync_readouts_strip()`, not a sensitivity.
`[cursors-probe]` / `[measures-probe]` `strip: ... same_text=1` asserts it.
- **`format_measure()` is the one formatter for both panes, and its SI prefix does not depend on
there being a unit.** The cursors pane's values and the measurements pane's `text=` go through
diff --git a/docs/claude/probe-readings.md b/docs/claude/probe-readings.md
index f213677..38266e4 100644
--- a/docs/claude/probe-readings.md
+++ b/docs/claude/probe-readings.md
@@ -1845,16 +1845,20 @@ These ride on the `[cursors-probe]` readings (every state line gets a `dock curs
## `strip:` (the readouts strip)
```
-[cursors-probe]