diff --git a/README.md b/README.md
index 7071683..b25653d 100644
--- a/README.md
+++ b/README.md
@@ -2393,8 +2393,9 @@ now — they are listed so they are not mistaken for anything else:
signal list — in one scrolling column; with four of them open in a 320 px sidebar every
section was short of room, and finding one meant scrolling past the others. The built
sidebar is a **Measure** tab (the cursors readout and the measurements) and a **Signals**
- tab (the trigger and the channels), **each a pill with its own glyph and no text** — the ruler
- for Measure, a channel list for Signals — with the words kept as each pill's tooltip and
+ tab (the trigger and the channels), **each a pill with its own glyph and no text** — the
+ cursors and the ruler for Measure, the trigger and the channel list for Signals — with the words
+ kept as each pill's tooltip and
accessible name. The design spec had the switcher showing *titles* and neither page an
`icon-name`; `narrow` alone does not do it (libadwaita still draws a label beside the icon,
measured), so the pages carry an empty title and the pills are named in code. With the math
diff --git a/docs/claude/invariants-gtk-and-chrome.md b/docs/claude/invariants-gtk-and-chrome.md
index 52df618..02b8c07 100644
--- a/docs/claude/invariants-gtk-and-chrome.md
+++ b/docs/claude/invariants-gtk-and-chrome.md
@@ -55,14 +55,21 @@ Part of [CLAUDE.md](../../CLAUDE.md). These are rules that cost a defect to lear
binary.** No icon theme has a glyph for an oscilloscope trigger, a pair of cursors or a
measurement ruler, and the stock names those buttons used to carry said something else
entirely: a *record dot* for the trigger and three different **magnifiers** for cursors,
- measurements and math. `src/icons/scalable/actions/udpscope-{trigger,cursors,measure,events,resize-rows,signals}-symbolic.svg`
- are the six action icons. `udpscope-math-symbolic` left with the toolbar toggle that was its last
+ measurements and math. `src/icons/scalable/actions/udpscope-{trigger,cursors,measure,events,resize-rows,tab-measure,tab-signals}-symbolic.svg`
+ are the seven action icons. `udpscope-math-symbolic` left with the toolbar toggle that was its last
user; `udpscope-measure-symbolic` **stayed**, because the Preferences window's Plot page carries it --
an icon with a live user is not an orphan, whatever the toggle that introduced it did -- and it is
- *also* the Measure tab's icon. `udpscope-signals-symbolic` was drawn for the Signals tab: three rows of
- a colour chip and a name, which is what that tab mostly is, and deliberately *not* a second copy of the
- trigger glyph (one shape with two meanings in one window is worse than a new one). Its bars are all one
- length because unequal ones read as a bar chart, and a chart is not a list. Beside them in
+ the Preferences window's icon, not the tab's.
+
+ The two **tabs** got glyphs of their own, and each is a *pair* rather than one of the icons above:
+ `udpscope-tab-measure-symbolic` is the cursors and the ruler they read against, and
+ `udpscope-tab-signals-symbolic` is the trigger's edge above the channel list it acts on. They are not
+ reuses because a glyph the toolbar already carries means two things the moment a tab shows it too. Both
+ are 16px composites with four features each, which is about the limit of this size: the Signals list is
+ two rows and not three, so the edge and the list get half the cell each, and the bars in it are all one
+ length because unequal ones read as a bar chart, and a chart is not a list. Their ink fractions (32% and
+ 36%) sit inside the range the icons above set, which is the check that a composite has not turned into a
+ blot. Beside them in
`src/icons/scalable/apps/` are the two
**application** icons, `org.udpscope.app.svg` (128px colour artwork) and
`org.udpscope.app-symbolic.svg` (16px). The `apps` context is where an icon theme keeps an
@@ -71,7 +78,7 @@ Part of [CLAUDE.md](../../CLAUDE.md). These are rules that cost a defect to lear
into `$XDG_DATA_HOME/icons/hicolor/scalable/apps` and `.../symbolic/apps` — those installed
copies are what makes `Icon=org.udpscope.app` in the desktop entry resolve (a desktop shell
cannot read a GResource compiled into the binary).
- All eight are bundled by `src/icons/udpscope.gresource.xml` (CMake runs
+ All nine are bundled by `src/icons/udpscope.gresource.xml` (CMake runs
`glib-compile-resources`) and reached through **one**
`gtk_icon_theme_add_resource_path()` in `run_ui()`, right after `adw_init()` — not at the top
of `build_toolbar()`, where it used to be: there are two consumers now (the window's own icon,
diff --git a/docs/claude/probe-readings.md b/docs/claude/probe-readings.md
index d1f8278..cb4d269 100644
--- a/docs/claude/probe-readings.md
+++ b/docs/claude/probe-readings.md
@@ -364,7 +364,7 @@ Two lines of the self-check output are assertions in disguise:
other half — both pills carry a tooltip and an accessible name set by `name_side_tabs()`, so an
icon-only pill is not an anonymous button — and `pills=0` means nothing is mapped, which makes the
rest of the line meaningless rather than a pass. `policy=narrow` is read rather than assumed.
-- `page icons: measure=udpscope-measure-symbolic(ok) signals=udpscope-signals-symbolic(ok)` (in the exit
+- `page icons: measure=udpscope-tab-measure-symbolic(ok) signals=udpscope-tab-signals-symbolic(ok)` (in the exit
dump, beside `toolbar icons:`) — each tab's own glyph and `gtk_icon_theme_has_icon()`'s verdict, read
on the first tick for the same reason the toolbar's are. **Both must read `(ok)`**: the page titles are
empty on purpose, so an icon that does not resolve leaves a *blank* pill, and a blank pill looks
diff --git a/docs/claude/verification.md b/docs/claude/verification.md
index ac90b72..5cf2aa4 100644
--- a/docs/claude/verification.md
+++ b/docs/claude/verification.md
@@ -16,9 +16,9 @@ xvfb-run -a env UDPSCOPE_EXIT_AFTER_MS=8000 UDPSCOPE_ENABLE_ALL_MS=1000 \
Two baselines every run is read against. A clean build emits **four** warnings and no more: two
`-Wmissing-field-initializers` on `MathNode::source` and `-Woverlength-strings` on **both**
generated GResource `.c` files — the help pages' (**514660** bytes) and the icons', whose blob is
-**9842** against C99's 4095-byte string-literal limit with the six action icons and the two app icons
+**11309** against C99's 4095-byte string-literal limit with the seven action icons and the two app icons
that remain (a note about a generated file, which GCC itself supports) -- re-measured when
-the tab work changed the set (that icon left, `udpscope-signals-symbolic` arrived, and this file's
+the tab work changed the set (that icon left, the two tab glyphs arrived, and this file's
help page was rewritten), which did not move the count; re-measure by touching each `*.gresource.xml`
under `src/` and rebuilding. The fifth warning that used to appear here was an unused
`output_built` in `math_probe()`; it was **deleted** as dead code — redundant with the
diff --git a/src/icons/scalable/actions/udpscope-signals-symbolic.svg b/src/icons/scalable/actions/udpscope-signals-symbolic.svg
deleted file mode 100644
index 134ab8c..0000000
--- a/src/icons/scalable/actions/udpscope-signals-symbolic.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
diff --git a/src/icons/scalable/actions/udpscope-tab-measure-symbolic.svg b/src/icons/scalable/actions/udpscope-tab-measure-symbolic.svg
new file mode 100644
index 0000000..4a3a303
--- /dev/null
+++ b/src/icons/scalable/actions/udpscope-tab-measure-symbolic.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/src/icons/scalable/actions/udpscope-tab-signals-symbolic.svg b/src/icons/scalable/actions/udpscope-tab-signals-symbolic.svg
new file mode 100644
index 0000000..ffdcca9
--- /dev/null
+++ b/src/icons/scalable/actions/udpscope-tab-signals-symbolic.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/src/icons/udpscope.gresource.xml b/src/icons/udpscope.gresource.xml
index a9900b1..1370c9f 100644
--- a/src/icons/udpscope.gresource.xml
+++ b/src/icons/udpscope.gresource.xml
@@ -20,7 +20,8 @@
scalable/actions/udpscope-trigger-symbolic.svgscalable/actions/udpscope-cursors-symbolic.svgscalable/actions/udpscope-measure-symbolic.svg
- scalable/actions/udpscope-signals-symbolic.svg
+ scalable/actions/udpscope-tab-measure-symbolic.svg
+ scalable/actions/udpscope-tab-signals-symbolic.svgscalable/actions/udpscope-events-symbolic.svgscalable/actions/udpscope-resize-rows-symbolic.svgscalable/apps/org.udpscope.app.svg
diff --git a/src/ui/main-window.ui b/src/ui/main-window.ui
index 3c366fa..628ba55 100644
--- a/src/ui/main-window.ui
+++ b/src/ui/main-window.ui
@@ -60,10 +60,12 @@
`select_side_tab()` and the session file, and the words are re-attached to the pills in
code — tooltip and accessible name — by `name_side_tabs()` on the first tick, so an
icon-only pill is still a named thing rather than an anonymous button.
- Each page's icon is its own glyph: `udpscope-measure-symbolic` is the ruler the
- measurements used as a toggle, and `udpscope-signals-symbolic` is the channel list,
- drawn for this tab rather than reusing the toolbar's trigger icon — one glyph
- meaning two things in one window is worse than a new one. -->
+ Each page's icon is a glyph of its own, and each one is a *pair*: the Measure tab is
+ `udpscope-tab-measure-symbolic` (the cursors and the ruler they read against), and the
+ Signals tab is `udpscope-tab-signals-symbolic` (the trigger's edge and the channel list
+ below it). They are drawn for the tabs rather than reusing the icons the toolbar and the
+ Preferences window already carry: a glyph the toolbar uses for one thing means two things
+ the moment a tab shows it too. -->