OpenRiot v7.9.43 — The Construct Remembers Where It Was Standing

“The construct knew what was open. It had always known. Firefox on the left. Thunar stacked above Text Editor on the right. Btop in the corner. Every window had a position scraped from the i3 tree and written to disk before the lights went out. But when the power came back, the construct launched everything into the right workspace and forgot where it was supposed to stand. Firefox filled the screen. Alacritty took whatever was left. The machine was awake but blind. We fixed the memory. We taught the construct to remember. When it closes its eyes and opens them again, every window is exactly where it was before the darkness. The Feds would call this ‘session persistence.’ We call it not being an amnesiac.” — The OpenRiot Crew, somewhere in the Sprawl, v7.9.43


Release Overview

Two themes. Two kinds of memory.

First: the construct’s visual memory. We taught the lock screen four new pieces of art — four new walls for the machine to wear when it’s guarding the gates. Forty-five, forty-seven, forty-eight, fifty-one. The lock screen shuffle got meaner. More variety. More ways to tell whoever’s standing at the keyboard that this machine has taste and you’re not getting past it.

Second: the construct’s spatial memory. When you reboot, every window comes back to the right workspace — Firefox on 1, Alacritty on 2, Thunar exactly where you left it. That’s been working since v7.9.39. But the windows forgot their positions. Firefox filled the screen instead of sitting on the left at 64% width. The vertical split on workspace 2 flattened into a 50/50 default. The construct had amnesia about layout.

We fixed it. The construct now saves the i3 layout tree for each workspace — every split, every ratio, every container — and replays it on startup before a single window launches. The Turing Police would call this ‘desktop state serialization with deterministic replay.’ We call it remembering where the windows go.


🎨 Four New Lock Screen Walls

Lock screen images 45, 47, 48, and 51 are now in the rotation. Each one was converted to .webp and dropped into /Locked/. The filterStealth function still strips stealth-marked images when the construct is operating in normal mode. The shuffle has more teeth now.

The walls themselves? Not your problem. The construct wears what it wants. Your job is to not be at the keyboard when they’re showing.


🗣️ Signal: Binary Pinned, Binary Copied

The gurk build script (scripts/gurk.sh) got a small but meaningful upgrade. The binary now builds with a pinned commit (GURK_COMMIT) so the construct doesn’t drift when upstream pushes changes that break the OpenBSD SIGSEGV patch. The script also gained a prompt: “Copy binary to source tree? [y/N].” Say yes, and install/gurk lands in config/bin/ — where the construct expects it — without manual copying.

The Turing Police would put gurk in a snap package with five runtime dependencies and a telemetry ping. We put it in a shell script that asks politely.


⌨️ Lock Screen: No More Finger Race

There was a time.Sleep() in the lock screen code. A small one. A polite one. But small enough that fast typists — the kind who unlock their machine in half a second — could race past it and hit the password field before i3lock was ready. The result: “wrong password” on a perfectly typed passphrase.

We removed the sleep. We removed the time and syscall imports that came with it. The lock screen now takes input the instant it’s ready. If you type fast, it listens fast.

The Turing Police would have blamed your typing speed. We blamed our code and deleted five lines.


💾 Clone: It Knows When It’s Finished

When you ran Full Backup, the construct would dutifully rsync everything, create skeleton directories, install boot blocks on the target drive, and then… show the last line of rsync output as the final message. “387,291 files transferred.” That’s not “done.” That’s a progress report pretending to be a conclusion.

Now the construct announces its final phase properly: “Finalizing Clone…” appears when it starts installing boot blocks. “Clone complete. /dev/sd3 is bootable.” appears when the drive is actually finished. The progress log tells a story with a beginning, a middle, and an end — not a burst of rsync stderr and a shrug.


🎯 Migration: The Cancel Button Now Means Cancel

Two related bugs in the Migrate TUI. First: when you hit Escape during a Full Backup, the construct said “Canceling clone…” and then… kept going. Rsync finished. Boot blocks installed. The cancel flag was set but the goroutine never checked it. The construct completed the clone and then wondered why you were staring at it.

Fixed. The cloneCancel flag now triggers an actual error return. The UI shows “ERROR: cancelled” instead of pretending the operation succeeded. If you cancel, the construct stops.

Second: the alignment of the error box was wrong. The emoji characters in titles like “🚫 Migration In Progress” take up two display columns but four bytes. The old code counted bytes. The new code counts display width. The box renders perfectly on every terminal.


🗜️ Softraid: The Partition Letter Problem

Encrypted external drives don’t always put their RAID partition on sdXa. Sometimes it’s on d. Sometimes it’s on a letter that doesn’t start with a. The old code hardcoded device+"a" and failed on drives where the partition landed elsewhere.

Fixed. The construct now reads disklabel to find the actual RAID partition letter, and feeds that to bioctl instead of guessing. It also knows which softraid volume belongs to which physical chunk — so when it detaches a volume, it detaches only the right one. Never the root drive. Never the wrong drive.

The old code had a fallback path that scanned dmesg and tried to detach every softraid volume on the bus. We removed it. The construct now detaches surgically or not at all.


📐 Window Layout: The Memory Upgrade

This is the headline. The construct now saves the full i3 layout tree for each workspace — every split, every container, every percent — and writes it alongside the window snapshot during shutdown. On startup, it replays the layout via i3-msg append_layout before launching a single application. When the windows appear, they fill the placeholders exactly where they belong.

Two new commands make this testable:

  • openriot --save-layout — saves the current layout to disk
  • openriot --test-layout — reads the saved layout and prints what would be restored, without launching a single window

The existing --window-restore command (run on login) now uses the saved layouts to restore tiled window positions. The construct remembers where it was standing.


🧾 Files Changed

File Change
Locked/45.webp NEW — Lock screen wallpaper
Locked/47.webp NEW — Lock screen wallpaper
Locked/48.webp NEW — Lock screen wallpaper
Locked/51.webp NEW — Lock screen wallpaper
config/bin/gurk UPDATED — gurk binary, pinned commit
scripts/gurk.sh FIX — Added GURK_COMMIT pin;
  added “Copy to source tree” prompt
source/lock/lock.go FIX — Removed typing delay that
  could race past i3lock; removed
  unused time and syscall imports
source/disk/backend.go FIXfindRAIDPartition() finds
  actual RAID partition letter;
  FindRootDrive() returns root device;
  regex in parseBioctlOutput fixed
  to capture non-a partition letters
source/disk/update.go FIXmountCmd uses actual RAID
  partition instead of hardcoded a;
  detachSoftraidChunk no longer
  blind-detaches every volume on bus;
  root guard prevents detaching
  internal softraid volumes
source/migrate/clone.go FIX — “Finalizing Clone…” message
  before boot block install; “Clone
  complete. /dev/sdX is bootable.”
source/migrate/errors.go FIX — Padding calculations use
  display width instead of byte count
  for emoji alignment
source/migrate/model.go FIX — Cancel during clone/dump
  now shows ERROR screen instead of
  pretending the operation succeeded;
  cancel messages say “cancelled by
  user” instead of “Canceling…”
source/window/snapshot.go NEWSaveLayout() now saves i3
  layout tree per workspace; Restore
  Layout() applies layouts before
  launching apps; TestLayout()
  validates without launching windows
source/commands/commands.go NEW--save-layout and
  --test-layout CLI commands
source/go.mod UPDATED — Added go-runewidth dep

🗣️ Final Words

“The construct closed its eyes. It opened them. Firefox was on the left where it belonged. Thunar was on the right, stacked above Text Editor at exactly the split that was there before the power went out. The softraid volume on the backup drive attached cleanly, on the actual partition it was supposed to. The clone finished, announced itself, and offered the target drive by name. The cancel button meant what it said. The error boxes lined up their borders without a single misaligned emoji. The construct had learned to remember. Not just what was open, but where it was standing. The Turing Police would need a court order to restore their desktop state. We used a hundred lines of Go and a JSON tree.” — The OpenRiot Crew, after the construct woke up right, v7.9.43