# 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 ` 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 ` 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. --- ## How to revert this campaign's installs Entries reverted in **reverse order** (entry 5 → 4 → 3 → 2 → 1): ```sh ssh ohm.fritz.box ' set -e # ----- 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).