Files
marfrit 9a023e9264 Phase 0: A1 Wayland baseline + state snapshot — major reframing
3 in-session reps of chromium-fourier 149 / brave_drops_test.html /
Plasma Wayland 6.6.4 (kwin-fourier 6.6.4-3 + qt6-base-fourier
6.11.0-3 carry-overs intact). Tight cluster IQR=0:
drops_total=0, drops_post_warmup=0, frames_total=1685, kwin %CPU
median=0.00, mean=0.04. Perf samples on kwin (~30 over 70s) show
zero composite/dmabuf/GL symbols — only event-loop bookkeeping.

Most likely mechanism: KWin direct-scanout fast-path engaged for
the single-visible-client video case. The campaign's load-bearing
hypothesis ("X11 + non-compositing WM avoids per-frame GL composite
of NV12") is structurally weakened — KWin already avoids that work
under Wayland for this workload. Phase 1 needs to add a
multi-window A1' variant and drm_info-during-playback to confirm
direct-scanout, then revisit matrix cell design.

revert.log entry 6: SDDM autologin + state.conf swap that landed
the Plasma Wayland session for the A1 reps. Backup of original
state.conf preserved at /var/lib/sddm/state.conf.x11-research-bak;
single-command revert documented.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 13:11:15 +00:00

587 lines
23 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# revert.log — campaign-installed state on ohm
This file lists every change this campaign made to ohm's *system
state* during Phase 0 inventory work that was done **purely for
testing and analysis**. To return ohm to the state it was in
before this campaign opened, run the "Revert" commands at the
bottom of this file in order.
This file is updated whenever the campaign installs a package or
mutates a sysctl/service/config. Closing the campaign without
reverting is a deliberate operator decision; if reverted, this
file is the authoritative record of what to undo.
Inherited state from the predecessor (`kwin_overlay_subsurface`)
is **not** in scope here — those carry-overs are documented in
`README.md` § "Carry-overs from predecessor (system state, not
data)" and would be reverted via that campaign's
`phase1_evidence/ohm_tooling_revert_log.md` instead.
---
## Entry 1 — 2026-05-03 ~09:20 CEST
**Trigger:** Phase 0 deliverables 2 + 4 (`x11_inventory_2026-05-03/inventory.md`)
identified missing measurement tools and the absence of a
non-compositing WM. Operator instructed: "fire the installs."
**Driven from:** `mfritsche@noether` over SSH to `ohm.fritz.box`,
passwordless `sudo` (verified before firing).
**Pre-install snapshot:** `pkglist.pre.txt` (1169 packages,
sha256 `fd72bcf6a7289d2f2dd6ce02706240006b534731540bf63f56ee9b666e7be68f`).
**Post-install snapshot:** `pkglist.post.txt` (1180 packages).
**Full pacman transaction log:** `pacman.install.log`.
### What was installed
Single transaction: `sudo pacman -Sy && sudo pacman -S --needed
xorg-xrandr xorg-xev xorg-xinput xorg-xwininfo xorg-xkill sysprof openbox`
| Package | Version | Reason |
|---|---|---|
| xorg-xrandr | 1.5.4-1 | explicit — RandR CLI for output/vblank probing |
| xorg-xev | 1.2.6-2 | explicit — per-window event capture |
| xorg-xinput | 1.6.4-2 | explicit — input-device probe (touchscreen confound) |
| xorg-xwininfo | 1.1.6-2 | explicit — get browser window geometry/wid |
| xorg-xkill | 1.0.7-1 | explicit — clean kill of stuck X clients between reps |
| sysprof | 50.0-2 | explicit — kernel perf alternative w/ flamegraph default |
| openbox | 3.6.1-14 | explicit — non-compositing WM for the without-KWin matrix cell |
| libadwaita | 1:1.9.0-1 | dep of sysprof |
| libdex | 1.1.0-1 | dep of sysprof |
| libpanel | 1.10.4-1 | dep of sysprof |
| startup-notification | 0.12-9 | dep of openbox |
11 added, 0 removed. Cross-checked via `comm -13
pkglist.pre.txt pkglist.post.txt` — exact same 11.
### What was changed (config, not packages)
- **`/etc/sysctl.d/90-x11-research-perf.conf` was created with
`kernel.perf_event_paranoid = 1`, then reverted same session.**
- Created: applied via `sudo sysctl --system`; effective
value went 2 → 1.
- Verification probe revealed the tweak was **not delivering
the promised behavior**: even with `task-clock` (a software
event that should be allowed at paranoid=1), `perf record
-p <Xorg_pid>` on this aarch64 kernel still failed with
"Failure to open any events for recording". Predecessor
pattern confirmed in
`kwin_overlay_subsurface/phase3_protocol.md:121,158,216`:
they used **`sudo perf record`** per-rep, not a sysctl
tweak. Passwordless sudo over SSH already works on ohm so
this is unattended-friendly.
- Reverted: `sudo rm /etc/sysctl.d/90-x11-research-perf.conf`
and `sudo sysctl kernel.perf_event_paranoid=2` (the
`--system` reapply does not reset removed-file values; an
explicit set was required).
- Net state change: **none** (paranoid back at kernel
default 2; `/etc/sysctl.d/` empty again).
- Lesson: the inventory's "set paranoid=1" recommendation
was wrong. Updated `inventory.md` will reflect that the
actual pattern is `sudo perf record -p <pid>` per-rep.
### What was created as a side effect (no operator action)
- `/usr/share/xsessions/openbox.desktop` (shipped by the
`openbox` package). SDDM will list "Openbox" as a session
choice on next greet. Removing the openbox package removes
the .desktop file.
### What was *not* installed (deliberate, operator-decision-pending)
- **firefox** — 2 of the 6 matrix cells reference Firefox
(`C-W-ff-*`, `C-X-ff-*`). Operator decides whether to install
or to mark those cells N/A. If installed later, append a new
entry below.
- **xtrace (X protocol tracer, AUR)** — explicitly marked
optional in `inventory.md`. The matrix's primary metrics
(effective_fps / drops / latency / CPU%) don't require it.
If installed later, append a new entry below.
---
## Entry 2 — 2026-05-03 ~09:30 CEST
**Trigger:** Operator preference for a desktop-environment-flavored
without-KWin testbed alongside the bare openbox cell ("I like
desktop environments. With respect to the test - should xfce or
cinnamon be our test bed?" → "yes add xfce with goodies").
Cinnamon was excluded because Muffin is a mandatory compositor;
XFCE qualifies if `xfwm4`'s built-in compositor is left disabled.
**Driven from:** `mfritsche@noether` over SSH to `ohm.fritz.box`,
passwordless `sudo`.
**Pre-install snapshot:** `pkglist.entry2.pre.txt` (1180 packages,
sha256 `1f72c7ed2f9d476d24d0dfb53fcb387ea39f882c89375d68fc21298313252d78`).
**Post-install snapshot:** `pkglist.entry2.post.txt` (1250 packages).
**Full pacman transaction log:** `pacman.entry2.log`.
### What was installed
Single transaction: `sudo pacman -S --needed xfce4 xfce4-goodies`
(both are package groups; pacman expanded them).
- **50 explicit packages** (the union of the `xfce4` group's 14
members and the `xfce4-goodies` group's 36 members):
exo, garcon, mousepad, parole, ristretto, thunar, thunar-archive-plugin,
thunar-media-tags-plugin, thunar-volman, tumbler, xfburn,
xfce4-appfinder, xfce4-battery-plugin, xfce4-clipman-plugin,
xfce4-cpufreq-plugin, xfce4-cpugraph-plugin, xfce4-dict,
xfce4-diskperf-plugin, xfce4-eyes-plugin, xfce4-fsguard-plugin,
xfce4-genmon-plugin, xfce4-mailwatch-plugin, xfce4-mount-plugin,
xfce4-mpc-plugin, xfce4-netload-plugin, xfce4-notes-plugin,
xfce4-notifyd, xfce4-panel, xfce4-places-plugin,
xfce4-power-manager, xfce4-pulseaudio-plugin, xfce4-screensaver,
xfce4-screenshooter, xfce4-sensors-plugin, xfce4-session,
xfce4-settings, xfce4-smartbookmark-plugin, xfce4-systemload-plugin,
xfce4-taskmanager, xfce4-terminal, xfce4-time-out-plugin,
xfce4-timer-plugin, xfce4-verve-plugin, xfce4-wavelan-plugin,
xfce4-weather-plugin, xfce4-whiskermenu-plugin, xfce4-xkb-plugin,
xfconf, xfdesktop, xfwm4
- **20 transitive deps**:
dbus-glib, elementary-icon-theme, gnome-themes-extra,
gtk-layer-shell, gtksourceview4, libburn, libgtop, libisofs,
libkeybinder3, libmpd, libwnck3, libxfce4ui, libxfce4util,
libxfce4windowing, libxklavier, libxres, polkit-gnome,
xorg-iceauth, xorg-xinit, xorg-xmodmap
70 added, 0 removed. Cross-checked via
`comm -13 pkglist.entry2.pre.txt pkglist.entry2.post.txt` — full
list in `entry2.added.list` (sourced from same diff).
### What was changed (config)
- **`~/.config/xfce4/xfconf/xfce-perchannel-xml/xfwm4.xml` created**
(208 bytes), pre-seeding `general/use_compositing = false`. This
ensures the **first XFCE login lands with xfwm4's built-in GL
compositor disabled**, matching the matrix's "without-KWin =
no compositor in the display path" definition. Without this
pre-seed, `xfwm4` would default to `use_compositing=true` and
the operator would have to remember to toggle it via *Settings
→ Window Manager Tweaks → Compositor* before every measurement
rep — a confound waiting to happen.
The directory tree `~/.config/xfce4/` did not exist before this
write; the entire tree is removable.
### What was created as a side effect (no operator action)
- `/usr/share/xsessions/xfce.desktop` (shipped by `xfce4-session`).
SDDM now lists three X11 sessions: openbox.desktop (entry 1),
plasmax11.desktop (pre-existing), xfce.desktop (this entry).
### After-revert verification
The first-login compositor pre-seed is per-user state in
`~/.config/xfce4/`. The revert procedure deletes the entire
xfce4 user-config tree if (and only if) it contains nothing but
the pre-seeded xfwm4.xml. If the operator logs into XFCE before
revert, xfconfd will populate that tree with other settings
files; the revert then becomes a manual decision.
---
## Entry 3 — 2026-05-03 ~09:45 CEST
**Trigger:** Operator instructed "install both" — closing the two
operator-decision items left open in entry 1's "What was *not*
installed" section: firefox (matrix completeness — 2 of 6 cells
need it) and the X-protocol tracer xtrace.
**Driven from:** `mfritsche@noether` over SSH to `ohm.fritz.box`,
passwordless `sudo` for pacman, regular user for `yay` /
`makepkg`.
**Pre-install snapshot:** `pkglist.entry3.pre.txt` (1250 packages,
sha256 `e73ffdd41b683aaba2ad18efa5ce3e7252577c13b4f0bb14e9de7bdfbfd5e26e`).
**Post-install snapshot:** `pkglist.entry3.post.txt` (1253 packages).
**Transaction logs:** `pacman.entry3a.firefox.log`,
`pacman.entry3b.xtrace.log`.
### What was installed
Two transactions in one entry:
| Package | Version | Source | Reason |
|---|---|---|---|
| firefox | 150.0.1-1 | extra | explicit — matrix's `C-W-ff-*` and `C-X-ff-*` cells |
| mailcap | 2.1.54-2 | extra | dep of firefox |
| xtrace | 1.4.0-2 | AUR | explicit — X protocol tracer (parallel to `WAYLAND_DEBUG=1`) |
3 added, 0 removed.
Firefox was a clean `pacman -S firefox`. xtrace went via
`yay -G xtrace; cd ~/.cache/yay/xtrace; makepkg -s --noconfirm
--ignorearch; sudo pacman -U --noconfirm xtrace-1.4.0-2-aarch64.pkg.tar.zst`.
The `--ignorearch` was needed because the AUR PKGBUILD declares
`arch=('i686' 'x86_64')` only — the package builds cleanly on
aarch64, the maintainer just hasn't updated the array.
### File-conflict probe (no actual conflict)
A pre-install probe suggested AUR `xtrace` would conflict with
glibc's `/usr/bin/xtrace` (glibc ships a syscall-tracer shell
script under that path). Investigation showed the **Arch AUR
PKGBUILD renames the binary to `/usr/bin/x11trace`** specifically
to avoid this collision. Both binaries now coexist:
- `/usr/bin/xtrace` — glibc's syscall/function tracer (5 KB
bash script). Unchanged.
- `/usr/bin/x11trace` — the X protocol tracer (133 KB aarch64
ELF, AUR `xtrace` 1.4.0). New.
The early `pacman -U --overwrite '/usr/bin/xtrace'` flag turned
out to be unnecessary; pacman would have allowed the install
without it because nothing actually overlapped on disk. No
state was overwritten.
### Verification
- `firefox --version` → `Mozilla Firefox 150.0.1`
- `x11trace --version` → `xtrace version 1.4.0`
- `x11trace --help` confirms X-protocol semantics
("Dump all X protocol data being tunneled from a fake X
display to a real one")
- `head -3 /usr/bin/xtrace` still shows the GNU libc copyright
banner — glibc's xtrace untouched.
### What is now fully resolved from earlier "operator-decision-pending"
- ✅ firefox installed → all 6 matrix cells now have a binary
available.
- ✅ xtrace (X protocol tracer) installed at `/usr/bin/x11trace`
→ if any Phase 1 cell wants protocol-level evidence parallel
to the predecessor's `WAYLAND_DEBUG=1`, the instrument is
ready.
---
## Entry 4 — 2026-05-03 ~10:25 CEST
**Trigger:** Operator was in the freshly-switched XFCE session
("Can you rotate the xfce session for me? Right now, left is up
and right is down"). The PineTab2 panel is mounted portrait
(native mode 800×1280@59.98) and XFCE's default rotation
("normal") shows it that way; Plasma X11 / Plasma Wayland have
historically used `right` rotation to present landscape
1280×800. This entry brings XFCE in line.
**Driven from:** `mfritsche@noether` over SSH to `ohm.fritz.box`,
regular user (no sudo needed; per-user state only).
### What was changed
1. **Live rotation applied** to the active XFCE session (session
id 395, Xorg pid 32073, DISPLAY=:0,
XAUTHORITY=/run/user/1001/xauth_QctOSR):
```
xrandr --output DSI-1 --rotate right
```
Result: `Screen 0 ... current 1280 x 800` and `DSI-1
connected 1280x800+0+0 right`. Matches the Plasma X11
orientation.
2. **Persistence: `~/.config/autostart/99-rotate-dsi1.desktop`
created** so every future XFCE login runs the rotation
immediately. File contents:
```
[Desktop Entry]
Type=Application
Name=Rotate DSI-1 to landscape (right)
Comment=Created 2026-05-03 by x11-session-research campaign —
see phase0_evidence/x11_inventory_2026-05-03/revert.log entry 4
Exec=sh -c "xrandr --output DSI-1 --rotate right"
OnlyShowIn=XFCE;
Terminal=false
```
`OnlyShowIn=XFCE` keeps it from running under Plasma X11 /
openbox — those handle their own rotation state.
### Why not via xfconf
XFCE's `displays` xfconf channel was empty
(`xfconf-query -c displays -lv` showed only `/ActiveProfile`
= `Default` with no per-monitor data). xfce4-display-settings
populates that profile on first GUI use; without that population,
writing rotation codes by hand into xfconf is brittle (the
encoding of "right" depends on xfce4-settings version). An
autostart .desktop file is version-independent and easy to
inspect.
If the operator subsequently runs *Settings → Display* in the
XFCE GUI and clicks Save / Apply, xfconf will write a real
profile and the autostart file becomes redundant — at that
point either can stay (no conflict) or the autostart can be
removed.
### What is NOT changed
- No system-wide config touched.
- No package install.
- Plasma X11 and openbox sessions unaffected — `OnlyShowIn=XFCE`
scopes the autostart to XFCE only.
- Touchscreen orientation: **NOT** auto-corrected by this entry.
After rotation, the Goodix Capacitive TouchScreen will likely
report touches in the panel's native (portrait) coordinate
space, so taps land on the wrong screen position. Fix when
it becomes a concern:
```
xinput map-to-output "Goodix Capacitive TouchScreen" DSI-1
```
This is **not auto-applied** in this entry because the matrix
cells use mouse + keyboard for navigation, not touch — and
also because mapping the touchscreen would itself need
another autostart entry. If touch becomes relevant later,
add it as entry 5.
---
## Entry 5 — 2026-05-03 ~10:29 CEST
**Trigger:** Operator confirmed XFCE session alive after entry 4
("xfce-session alive"), then accepted the touchscreen-mapping
follow-up offered in entry 4's "What is NOT changed" note.
**Driven from:** `mfritsche@noether` over SSH to `ohm.fritz.box`,
regular user.
### What was changed
1. **Live mapping applied:**
```
xinput map-to-output "pointer:Goodix Capacitive TouchScreen" DSI-1
```
The `pointer:` prefix is required because the Goodix exposes
both a pointer device (id 13) and a keyboard subdevice
(id 15) — `xinput` needs the disambiguation. Verified by
`xinput list-props`: Coordinate Transformation Matrix
updated to `[0 1 0 / -1 0 1 / 0 0 1]` — the homogeneous
90°-clockwise rotation matrix matching the screen.
2. **Persistence:
`~/.config/autostart/99-rotate-touchscreen.desktop` created**.
Same `OnlyShowIn=XFCE` scoping. The Exec uses `sh -c "sleep 2;
xinput ..."` because XFCE may launch this autostart before
entry 4's xrandr rotation has finished applying — without
the sleep, the xinput remap can race against an unrotated
screen state.
### What is NOT changed
- Other input devices (touchpad, USB mouse, USB keyboard)
unchanged — they don't report panel-relative coordinates so
rotation doesn't affect them.
- Plasma X11 / openbox sessions unaffected
(`OnlyShowIn=XFCE`).
- Wayland sessions unaffected (xinput is X11-only). When KDE
Plasma Wayland next runs, it uses its own
`kwriteconfig5 --file kwinrc` mapping — that's predecessor
state, not touched here.
---
## Entry 6 — 2026-05-03 ~13:25 CEST
**Trigger:** Operator instructed "okay, 2" — the option-2 path
from the conversation: SSH-driven session switch from XFCE
(entry 4 / 5 substrate) to Plasma Wayland for the remaining
Phase 0 deliverables (state snapshot of Plasma Wayland + A1
baseline reps), without operator at the SDDM greeter.
**Driven from:** `mfritsche@noether` over SSH to `ohm.fritz.box`,
passwordless `sudo`.
### What was changed
1. **`/etc/sddm.conf.d/x11-research-autologin.conf` written**
then **removed same session**:
```
[Autologin]
User=mfritsche
Session=plasma.desktop
Relogin=false
```
Removed via `sudo rm` after the autologin succeeded so the
campaign doesn't leave a one-shot config behind.
2. **`/var/lib/sddm/state.conf` modified** (still in place at
end of this entry — see "Lingering state" below):
- Pre-state: `Session=/usr/share/xsessions/xfce.desktop`
(cached from the entry-2 XFCE session being the most
recently used).
- Post-state:
`Session=/usr/share/wayland-sessions/plasma.desktop`.
- Why: SDDM's autologin section was being **overruled** by
the cached last-session in `state.conf` — autologin tried
to start `startxfce4` instead of `startplasma-wayland`
and crashed in a tight retry loop (visible in
`journalctl -u sddm`: `--start startxfce4 ... crashed
(exit code 1)` with new transient sessions appearing every
~3 s). Stopping `sddm`, rewriting the state.conf Session
line, and restarting `sddm` resolved the loop on the
first try — kwin_wayland came up cleanly within ~10 s.
- Backup: `/var/lib/sddm/state.conf.x11-research-bak`
preserves the original line for revert.
3. **The XFCE session (entry 2/4/5 substrate) was terminated**
via `loginctl terminate-session 395`. No cleanup of the
user-side `~/.config/autostart/99-rotate-*.desktop` files
needed — those scope to `OnlyShowIn=XFCE;` and silently
no-op under Plasma Wayland.
### Lingering state
- `/var/lib/sddm/state.conf` continues to point at
`Session=/usr/share/wayland-sessions/plasma.desktop`. **This
is correct for the current session** (Plasma Wayland is now
the most-recently-used). On the next operator-driven session
switch, SDDM will rewrite this file naturally to whatever
the user picks at the greeter; no campaign-side action
needed.
- The pre-campaign content is preserved at
`/var/lib/sddm/state.conf.x11-research-bak` for
audit/revert.
### Verification
After SDDM restart:
- `loginctl show-session 433` → `Type=wayland`, `TTY=tty1`,
`Service=sddm-autologin`, `Desktop=KDE`, `Active=yes`.
- `pgrep -af kwin_wayland` shows
`/usr/bin/kwin_wayland_wrapper --xwayland` (PID 35676) and
`kwin_wayland --wayland-fd 7 --socket wayland-0 --xwayland-fd
...` (PID 35679).
- `/run/user/1001/wayland-0` socket present and lockfile.
### Revert procedure
If campaign needs to fully revert:
```sh
ssh ohm.fritz.box '
sudo systemctl stop sddm
sudo cp /var/lib/sddm/state.conf.x11-research-bak /var/lib/sddm/state.conf
sudo rm -f /var/lib/sddm/state.conf.x11-research-bak
sudo systemctl start sddm
'
```
(The autologin .conf was already removed in-session, so no
extra delete needed there.)
Note: this revert ONLY restores the state.conf to its
pre-campaign contents. It doesn't kill the current session;
the operator can choose whether to log out and back in via
greeter to fully exit Plasma Wayland.
---
## How to revert this campaign's installs
Entries reverted in **reverse order** (entry 6 → 5 → 4 → 3 → 2 → 1):
```sh
ssh ohm.fritz.box '
set -e
# ----- Entry 6 revert: SDDM state.conf restoration -----
if [ -f /var/lib/sddm/state.conf.x11-research-bak ]; then
sudo systemctl stop sddm
sudo cp /var/lib/sddm/state.conf.x11-research-bak /var/lib/sddm/state.conf
sudo rm -f /var/lib/sddm/state.conf.x11-research-bak
sudo systemctl start sddm
fi
# The autologin .conf was already removed in-session.
# ----- Entry 5 revert: touchscreen mapping -----
rm -f ~/.config/autostart/99-rotate-touchscreen.desktop
# Live revert: reset Coordinate Transformation Matrix to identity.
# Only meaningful in an X11 session; harmless if no XFCE running.
if pgrep -x xfwm4 >/dev/null; then
DISPLAY=:0 XAUTHORITY=$(ls /run/user/$(id -u)/xauth_* 2>/dev/null | head -1) \
xinput set-prop "pointer:Goodix Capacitive TouchScreen" \
"Coordinate Transformation Matrix" \
1 0 0 0 1 0 0 0 1 || true
fi
# ----- Entry 4 revert: XFCE rotation -----
rm -f ~/.config/autostart/99-rotate-dsi1.desktop
# Live rotation revert (only if currently in XFCE):
if pgrep -x xfwm4 >/dev/null; then
DISPLAY=:0 XAUTHORITY=$(ls /run/user/$(id -u)/xauth_* 2>/dev/null | head -1) \
xrandr --output DSI-1 --rotate normal || true
fi
# ----- Entry 3 revert: firefox + xtrace -----
sudo pacman -Rsn --noconfirm firefox xtrace
# mailcap was pulled as a firefox dep; -Rs cleans it up if no other
# dependent remains.
# ----- Entry 2 revert: XFCE -----
sudo pacman -Rsn --noconfirm \
exo garcon mousepad parole ristretto thunar \
thunar-archive-plugin thunar-media-tags-plugin thunar-volman tumbler \
xfburn xfce4-appfinder xfce4-battery-plugin xfce4-clipman-plugin \
xfce4-cpufreq-plugin xfce4-cpugraph-plugin xfce4-dict \
xfce4-diskperf-plugin xfce4-eyes-plugin xfce4-fsguard-plugin \
xfce4-genmon-plugin xfce4-mailwatch-plugin xfce4-mount-plugin \
xfce4-mpc-plugin xfce4-netload-plugin xfce4-notes-plugin \
xfce4-notifyd xfce4-panel xfce4-places-plugin xfce4-power-manager \
xfce4-pulseaudio-plugin xfce4-screensaver xfce4-screenshooter \
xfce4-sensors-plugin xfce4-session xfce4-settings \
xfce4-smartbookmark-plugin xfce4-systemload-plugin xfce4-taskmanager \
xfce4-terminal xfce4-time-out-plugin xfce4-timer-plugin \
xfce4-verve-plugin xfce4-wavelan-plugin xfce4-weather-plugin \
xfce4-whiskermenu-plugin xfce4-xkb-plugin xfconf xfdesktop xfwm4
# Per-user xfconf tree: only safe to remove if the operator never
# logged into XFCE (otherwise xfconfd may have written other settings
# the operator would lose). Manual check:
if [ "$(find ~/.config/xfce4 -type f | sort)" = "$HOME/.config/xfce4/xfconf/xfce-perchannel-xml/xfwm4.xml" ]; then
rm -rf ~/.config/xfce4
echo " ~/.config/xfce4 removed (only the pre-seeded xfwm4.xml was there)"
else
echo " ~/.config/xfce4 contains operator-added files; manual review required"
find ~/.config/xfce4 -type f
fi
# ----- Entry 1 revert: measurement tools + openbox -----
sudo pacman -Rsn --noconfirm \
openbox sysprof \
xorg-xrandr xorg-xev xorg-xinput xorg-xwininfo xorg-xkill
# Sysctl: nothing to undo (entry 1's paranoid=1 was already reverted
# in-session — see entry 1 § "What was changed").
# ----- Verification -----
echo "expected pkg count after revert: 1169"
pacman -Qq | wc -l
echo "expected sysctl: kernel.perf_event_paranoid = 2"
sysctl kernel.perf_event_paranoid
echo "expected sessions: only plasmax11.desktop"
ls /usr/share/xsessions/
echo "expected /etc/sysctl.d/: empty"
ls /etc/sysctl.d/
'
```
Sanity-check: `pacman -Qq | wc -l` should report **1169**, matching
`pkglist.pre.txt`. If it reports anything else, the operator
added/removed a package between an entry and the revert;
investigate before declaring revert complete.
---
## Adding a new entry
When a future Phase install/mutation happens, append a new
`## Entry N — YYYY-MM-DD` section above the "How to revert"
section. Re-snapshot `pacman -Qq` into a new
`pkglist.entryN.{pre,post}.txt` so each entry is independently
revertible. Prepend the new entry's revert step to the
"How to revert" block (entries revert in reverse install
order — newest first).