starting new job...
→ running command: cd "/etc/byggsteg/job-clone//heks-linux/trunk" && git reset --hard && git pull
HEAD is now at 4f09678 feat: Pin jointhefreeworld at lambdock 0.12.1
From https://codeberg.org/jjba23/heks-linux
4f09678..c31c5eb trunk -> origin/trunk
Updating 4f09678..c31c5eb
Fast-forward
src/heks-linux/lambdock.scm | 20 +++++---------------
1 file changed, 5 insertions(+), 15 deletions(-)
→ running command: cd /etc/byggsteg/job-clone/heks-linux/trunk && uname -a
Linux wolk-jjba 7.2.11-gnu #1 SMP PREEMPT_DYNAMIC 1 x86_64 GNU/Linux
→ running command: cd /etc/byggsteg/job-clone/heks-linux/trunk && git log --name-status HEAD^..HEAD
commit c31c5ebb10f9093323ca48a08019c4b00d745023
Author: Josep Bigorra <jjbigorra@gmail.com>
Date: Mon Oct 26 16:46:34 2026 +0100
feat: Improve lambdock layout and add trash
M src/heks-linux/lambdock.scm
→ running command: cd /etc/byggsteg/job-clone/heks-linux/trunk && maak test
--------------------------------------------------------------
Maak 0.14.0: the infinitely extensible command runner
Loading tasks from Maak file: /etc/byggsteg/job-clone/heks-linux/trunk/maak.scm
Executing Maak tasks: test
--------------------------------------------------------------
=> Running Maak task: test
Unit tests, run in a hermetic container.
Executing: rm -rfv reports/lcov/coverage*
channels.scm:54:6: warning: channel 'jointhefreeworld' is not trusted
scanning directories for unit tests...
scanning present working directory for unit tests...
shuffled the files with seed 157080811 (replay with VERITAS_SEED=157080811)
found unit tests: (prelude-spec.scm bridges-spec.scm flatpak-spec.scm toon-spec.scm palette-spec.scm dconf-spec.scm gtk-spec.scm waybar-spec.scm mako-spec.scm fontconfig-spec.scm wezterm-spec.scm image-spec.scm zen-spec.scm wallpaper-spec.scm niri-spec.scm rofi-spec.scm)
running unit tests from file: prelude-spec.scm, entrypoint: spec
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-prelude-spec-2
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-prelude-spec-2/symlinked
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-prelude-spec-2/symlinked/repo
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-prelude-spec-2/symlinked/conf
[INFO] [2026-10-26 15:47:00 UTC] Writing config to file: /tmp/heks-prelude-spec-2/symlinked/conf/linked.conf
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-prelude-spec-2/installed
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-prelude-spec-2/installed/nested
[INFO] [2026-10-26 15:47:00 UTC] Writing config to file: /tmp/heks-prelude-spec-2/installed/nested/deep.conf
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-prelude-spec-2/bin
[INFO] [2026-10-26 15:47:00 UTC] Writing config to file: /tmp/heks-prelude-spec-2/bin/script.sh
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-prelude-spec-2/a
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-prelude-spec-2/a/b
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-prelude-spec-2/a/b/c
+----------------------------------------------+
[📑 suite] Prelude Helper Suite
[🧪 test] Key Value Rendering
[⚙️ assert] Pairs should render with the default template
✅ got: host=localhost
port=80
[⚙️ assert] The template should be overridable
✅ got: host = localhost
[⚙️ assert] CSS pairs should render indented
✅ got: color: black;
[🧪 test] List Flattening
[⚙️ assert] Nested lists should be flattened
✅ got: (1 2 3 4 5)
[⚙️ assert] Flattening the empty list should stay empty
✅ got: ()
[🧪 test] Executable Config Files Get Executable Permissions
[⚙️ assert] Passing #o755 should make the file executable
✅ got: 493
[🧪 test] Nested Structures Render As Ini Sections
[⚙️ assert] A nested list should become an INI section header
✅ got:
[settings]
port=8080
[🧪 test] Config Files Install Into Missing Directories
[⚙️ assert] The installer should create its directory tree
✅ got: #t
[⚙️ assert] The installer should write the contents
✅ got: hello
[⚙️ assert] The default permissions should be #o644
✅ got: 420
[🧪 test] Config Files Are Written Through Symlinks
[⚙️ assert] A dotfile linked into a repository should stay linked
✅ got: symlink
[⚙️ assert] Reading through the link should give the new contents
✅ got: new
[⚙️ assert] The file the link points at should be the one rewritten
✅ got: new
[🧪 test] Directory Trees Are Created Recursively
[⚙️ assert] Missing parents should be created, not just the leaf
✅ got: #t
[⚙️ assert] The created leaf should really be a directory
✅ got: #t
ℹ️ info - ran 1 tasks in: 0 seconds, 9297 microseconds
running unit tests from file: bridges-spec.scm, entrypoint: spec
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: Attempting override resolution for module (heks-linux user-settings) with profile 'local-settings'
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: $XDG_CONFIG_HOME empty/unset, falling back to $HOME/.config
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: Checking for override file at: /root/.config/heks-linux/local-settings.scm
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: No override file found at /root/.config/heks-linux/local-settings.scm. Skipping.
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)
+----------------------------------------------+
[📑 suite] bridges test suite
[🧪 test] Bash Bridge String Generation
[⚙️ assert] Bash bridge should start with correct shebang
✅ got: #t
[⚙️ assert] Bash bridge should export the highlight variable
✅ got: #t
[🧪 test] Emacs Bridge Carries The Settings Values
[⚙️ assert] The mono font setting should travel across the bridge
✅ got: Intel One Mono
[⚙️ assert] The clone directory should travel across the bridge
✅ got: ~/Hacking/heks-linux
[🧪 test] Emacs Bridge Elisp Generation
[⚙️ assert] Bridge output should be a list (S-expression)
✅ got: #t
[⚙️ assert] Bridge output should be wrapped in a 'progn
✅ got: progn
[⚙️ assert] Should configure mono font
✅ got: #t
[⚙️ assert] Should configure the sans font
✅ got: #t
[⚙️ assert] Should configure the Emacs theme
✅ got: #t
ℹ️ info - ran 1 tasks in: 0 seconds, 3689 microseconds
running unit tests from file: flatpak-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)
+----------------------------------------------+
[📑 suite] Overrides
[🧪 test] A Duplicate Extra Entry Is Installed Once
[⚙️ assert] The first declaration wins
✅ got: 1
[🧪 test] Category Parameters Are Read At Call Time
[⚙️ assert] Replacing a category removes its apps
✅ got: #f
[⚙️ assert] The default category is back afterwards
✅ got: #t
[🧪 test] Extra Applications Join The Union
[⚙️ assert] An extra application joins the union
✅ got: #t
[🧪 test] An Extra Can Change An Existing Remote
[⚙️ assert] The extra declaration wins over the category
✅ got: flathub-beta
+----------------------------------------------+
[📑 suite] Command Vectors
[🧪 test] Remote Addition Uses The Registered URL
[⚙️ assert] remote-add carries the .flatpakrepo URL
✅ got: (flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo)
[⚙️ assert] The beta repository is known
✅ got: https://dl.flathub.org/beta-repo/flathub-beta.flatpakrepo
[⚙️ assert] An unknown remote is an error
✅ success catching error: misc-error: (#f ~A ~S (flatpak-remote-url: unknown remote: not-a-remote) #f)
[🧪 test] Install Arguments Are Separate Strings
[⚙️ assert] The id and remote are never one shell string
✅ got: (flatpak install --user --assumeyes flathub org.gnome.Boxes)
[⚙️ assert] A custom remote is passed through
✅ got: (flatpak install --user --assumeyes flathub-beta org.gnome.Boxes)
+----------------------------------------------+
[📑 suite] Application Declarations
[🧪 test] Malformed Ids Are Rejected
[⚙️ assert] An underscore in a segment is allowed
✅ got: #t
[⚙️ assert] A bare name is not an id
✅ got: #f
[⚙️ assert] The constructor refuses a bare name
✅ success catching error: misc-error: (#f ~A ~S (flatpak-app: not a Flatpak application id: Boxes) #f)
[⚙️ assert] The constructor refuses whitespace
✅ success catching error: misc-error: (#f ~A ~S (flatpak-app: not a Flatpak application id: org.gnome Boxes) #f)
[🧪 test] The Default Remote Is Flathub
[⚙️ assert] A declaration produces an application record
✅ got: #t
[⚙️ assert] The ordinary entry needs no remote
✅ got: flathub
[⚙️ assert] An application can name another remote
✅ got: flathub-beta
[🧪 test] Symbols And Strings Are Both Accepted
[⚙️ assert] A symbol is coerced to the id string
✅ got: org.gnome.Boxes
[⚙️ assert] Ids are always strings in the catalog
✅ got: #t
+----------------------------------------------+
[📑 suite] Catalog
[🧪 test] Applications Installed By Hand Are Now Declared
[⚙️ assert] Cantata is in the music category
✅ got: #t
[⚙️ assert] ytdn is in the media category
✅ got: #t
[⚙️ assert] Boxes is in the development category
✅ got: #t
[🧪 test] Every Entry Is Installable
[⚙️ assert] Every id passes the form check
✅ got: #t
[⚙️ assert] Every remote can be bootstrapped
✅ got: #t
[🧪 test] The Curated Additions Are Present
[⚙️ assert] LibreOffice fills the office gap
✅ got: #t
[⚙️ assert] KeePassXC fills the password-manager gap
✅ got: #t
[⚙️ assert] Telegram is declared
✅ got: #t
[⚙️ assert] DejaDup covers backups
✅ got: #t
[⚙️ assert] qBittorrent covers torrents
✅ got: #t
[⚙️ assert] Krita covers digital painting
✅ got: #t
[⚙️ assert] HandBrake covers video conversion
✅ got: #t
[⚙️ assert] Steam is declared for gaming
✅ got: #t
[⚙️ assert] RustDesk covers remote support
✅ got: #t
[⚙️ assert] Warehouse manages the Flatpak installation
✅ got: #t
[⚙️ assert] Zen Browser is still declared
✅ got: #t
[🧪 test] The Union Is Sorted And Duplicate-Free
[⚙️ assert] Applications are sorted by id
✅ got: #t
[⚙️ assert] No id is declared twice
✅ got: 61
ℹ️ info - ran 4 tasks in: 0 seconds, 16326 microseconds
running unit tests from file: toon-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-toon-spec-2
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-toon-spec-2/bin
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-toon-spec-2/config
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-toon-spec-2/config/heks-linux
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-toon-spec-2/config/heks-linux/keybindings
[INFO] [2026-10-26 15:47:00 UTC] Retiring the HTML pages heks-toon replaces
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: Attempting override resolution for module (heks-linux toon) with profile 'toon-settings'
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: $XDG_CONFIG_HOME empty/unset, falling back to $HOME/.config
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: Checking for override file at: /root/.config/heks-linux/toon-settings.scm
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: No override file found at /root/.config/heks-linux/toon-settings.scm. Skipping.
[INFO] [2026-10-26 15:47:00 UTC] Removed the retired page launcher: /tmp/heks-toon-spec-2/bin/heks-keybindings
[INFO] [2026-10-26 15:47:00 UTC] Removed the retired page launcher: /tmp/heks-toon-spec-2/bin/heks-wallpaper-gallery
[INFO] [2026-10-26 15:47:00 UTC] Removed the retired page launcher: /tmp/heks-toon-spec-2/bin/heks-palette-gallery
[INFO] [2026-10-26 15:47:00 UTC] Removed the retired page: /tmp/heks-toon-spec-2/config/heks-linux/keybindings/index.html
[INFO] [2026-10-26 15:47:00 UTC] Removed the retired page directory: /tmp/heks-toon-spec-2/config/heks-linux/keybindings
[SUCCESS] [2026-10-26 15:47:00 UTC] Installed heks-toon configuration
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-toon-spec-2
[INFO] [2026-10-26 15:47:00 UTC] Creating directory: /tmp/heks-toon-spec-2/again
[INFO] [2026-10-26 15:47:00 UTC] Retiring the HTML pages heks-toon replaces
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: Attempting override resolution for module (heks-linux toon) with profile 'toon-settings'
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: $XDG_CONFIG_HOME empty/unset, falling back to $HOME/.config
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: Checking for override file at: /root/.config/heks-linux/toon-settings.scm
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: No override file found at /root/.config/heks-linux/toon-settings.scm. Skipping.
[INFO] [2026-10-26 15:47:00 UTC] Removed the retired page launcher: /tmp/heks-toon-spec-2/again/heks-keybindings
[SUCCESS] [2026-10-26 15:47:00 UTC] Installed heks-toon configuration
[INFO] [2026-10-26 15:47:00 UTC] Retiring the HTML pages heks-toon replaces
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: Attempting override resolution for module (heks-linux toon) with profile 'toon-settings'
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: $XDG_CONFIG_HOME empty/unset, falling back to $HOME/.config
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: Checking for override file at: /root/.config/heks-linux/toon-settings.scm
[INFO] [2026-10-26 15:47:00 UTC] load-local-overrides: No override file found at /root/.config/heks-linux/toon-settings.scm. Skipping.
[SUCCESS] [2026-10-26 15:47:00 UTC] Installed heks-toon configuration
+----------------------------------------------+
[📑 suite] heks-toon Suite
[🧪 test] The Pages Are Retired
[⚙️ assert] Every launcher the pages installed should be gone
✅ got: #t
[⚙️ assert] The generated keyboard reference should be gone
✅ got: #t
[⚙️ assert] A launcher this configuration still owns should stay
✅ got: #t
[⚙️ assert] The window is a program, not a generated launcher
✅ got: #t
[🧪 test] The Bar Launches The Views
[⚙️ assert] The question mark opens the reference
✅ got: #t
[⚙️ assert] The palette glyph opens the palette chooser
✅ got: #t
[⚙️ assert] The picture glyph opens the wall chooser
✅ got: #t
[🧪 test] The Views Are One Program
[⚙️ assert] The keyboard reference is the default view
✅ got: heks-toon
[⚙️ assert] The wall chooser names its view
✅ got: heks-toon walls
[⚙️ assert] The palette chooser names its view
✅ got: heks-toon palettes
[⚙️ assert] The documentation view names its view
✅ got: heks-toon docs
[🧪 test] The Window Rule Matches The Program
[⚙️ assert] The application id is the program's own
✅ got: org.jointhefreeworld.heks-toon
[⚙️ assert] Niri should match the window by that id
✅ got: #t
[⚙️ assert] The window should be focused the moment it opens
✅ got: #t
[⚙️ assert] The compositor should blur what is behind the glass
✅ got: #t
[⚙️ assert] Every block should serialize as KDL, not as a record
✅ got: #t
[⚙️ assert] The browser window rule the pages needed should be gone
✅ got: #t
[🧪 test] Retiring A Second Time Is Harmless
[⚙️ assert] The launcher should be gone after both runs
✅ got: #t
[🧪 test] The Command Is A Parameter
[⚙️ assert] An overridden command keeps its view
✅ got: /tmp/heks-toon palettes
[⚙️ assert] An overridden command needs no argument
✅ got: /tmp/heks-toon
[🧪 test] The Bar Asks The Compositor To Spawn The Window
[⚙️ assert] The command should go through niri's spawn first
✅ got: #t
[⚙️ assert] It should fall back to running the program
✅ got: #t
ℹ️ info - ran 1 tasks in: 0 seconds, 64484 microseconds
running unit tests from file: palette-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)
+----------------------------------------------+
[📑 suite] Palette Registry Suite
[🧪 test] Dark And Light Classification
[⚙️ assert] catppuccin-mocha should be a dark palette
✅ got: #t
[⚙️ assert] catppuccin-latte should be a light palette
✅ got: #t
[🧪 test] Every Palette Exposes Its Downstream Themes
[⚙️ assert] Each palette must map to a GTK, icon, cursor and accent theme
✅ got: #t
[⚙️ assert] Each palette must map to a supported lambdock theme
✅ got: #t
[🧪 test] Every Palette Wears A Skeu Icons Theme
[⚙️ assert] Every icon theme should come from the Skeu Icons pack
✅ got: #t
[⚙️ assert] A dark palette should ask for the light-ink variant and a light one for the plain variant
✅ got: #t
[⚙️ assert] The icon theme should follow the palette's own accent
✅ got: #t
[⚙️ assert] A light palette should take the bare accent theme
✅ got: skeu-icons-green
[⚙️ assert] GTK's purple accent should map to the violet enamel
✅ got: skeu-icons-violet-dark
[🧪 test] Registry Is Non Empty And Symbolic
[⚙️ assert] At least one palette should be registered
✅ got: #t
[⚙️ assert] Every palette name should be a symbol
✅ got: #t
[⚙️ assert] Every palette name should be convertible to a string
✅ got: #t
[🧪 test] Unknown Palettes Are Rejected
[⚙️ assert] Looking up an unregistered palette should raise
✅ success catching error: %exception: (#<&message message: "exception ocurred! unknown palette selected: definitely-not-a-palette">)
[🧪 test] Every Palette Exposes A Full Colour Set
[⚙️ assert] Each palette must define primary/text/background colours
✅ got: #t
[🧪 test] Every Palette Exposes App Opacities
[⚙️ assert] Each palette must declare a 0-1 opacity for every app
✅ got: #t
[🧪 test] Colour Converters
[⚙️ assert] hex-to-rgba should convert a hex colour
✅ got: rgba(255, 0, 0, 1)
[⚙️ assert] hex-to-rgba should honour the alpha argument
✅ got: rgba(0, 0, 255, 0.5)
[⚙️ assert] hex-to-rgb should convert a hex colour
✅ got: rgb(0, 255, 0)
[⚙️ assert] hex-to-rgba should fall back on bad input
✅ got: rgba(0, 0, 0, 1)
[🧪 test] Golden Gate Is More Transparent
[⚙️ assert] Both Golden Gate variants must be more transparent than every other palette
✅ got: #t
ℹ️ info - ran 1 tasks in: 0 seconds, 16251 microseconds
running unit tests from file: dconf-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)
+----------------------------------------------+
[📑 suite] dconf test suite
[🧪 test] mk-nested-dconf-writer-commands
[⚙️ assert] Nested settings should flatten into dconf write commands
✅ got: (echo "/org/gnome/desktop/interface/gtk-key-theme --> 'Emacs'" && dconf write "/org/gnome/desktop/interface/gtk-key-theme" "'Emacs'" echo "/org/gnome/desktop/interface/cursor-size --> 24" && dconf write "/org/gnome/desktop/interface/cursor-size" "24" echo "/org/gnome/desktop/interface/enable-animations --> true" && dconf write "/org/gnome/desktop/interface/enable-animations" "true")
[🧪 test] caps-to-ctrl follows its parameter
[⚙️ assert] Disabling caps-to-ctrl must write false, not a hardcoded true
✅ got: #t
[⚙️ assert] Enabling caps-to-ctrl must write true
✅ got: #t
[🧪 test] Heks settings are namespaced and complete
[⚙️ assert] The language should be written under /heks-linux
✅ got: #t
[⚙️ assert] The palette should be exported to dconf
✅ got: #t
[⚙️ assert] The mono font should be exported to dconf
✅ got: #t
ℹ️ info - ran 1 tasks in: 0 seconds, 14020 microseconds
running unit tests from file: gtk-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)
+----------------------------------------------+
[📑 suite] GTK Configuration Suite
[🧪 test] dconf Theme Names Come From The Palette
[⚙️ assert] The icon theme should be palette derived
✅ got: 'skeu-icons-violet'
[⚙️ assert] An accent colour should always be exported
✅ got: #t
[🧪 test] dconf Colour Scheme Follows The Palette
[⚙️ assert] Dark palettes should request the dark GTK scheme
✅ got: 'prefer-dark'
[⚙️ assert] Light palettes should request the light GTK scheme
✅ got: 'prefer-light'
[🧪 test] GTK 3 Settings
[⚙️ assert] The GTK 3 settings should be an association list
✅ got: #t
[⚙️ assert] GTK 3 windows should show macOS style traffic lights
✅ got: close,minimize,maximize:
[⚙️ assert] The sans font should be configured
✅ got: #t
[🧪 test] GTK 4 Settings
[⚙️ assert] The GTK 4 settings should be an association list
✅ got: #t
[⚙️ assert] GTK 4 windows should show macOS style traffic lights
✅ got: close,minimize,maximize:
[🧪 test] dconf Button Layout
[⚙️ assert] The window manager should place the traffic lights on the left
✅ got: 'close,minimize,maximize:'
ℹ️ info - ran 1 tasks in: 0 seconds, 7111 microseconds
running unit tests from file: waybar-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)
+----------------------------------------------+
[📑 suite] Waybar Configuration Suite
[🧪 test] Keyboard Layout Item
[⚙️ assert] The layout should be the bar's own custom item
✅ got: custom/heks-language
[⚙️ assert] The label should repaint on the bar's layout signal
✅ got: 8
[⚙️ assert] The label is not a poll: the menu pokes it
✅ got: once
[⚙️ assert] The label reads the layouts from the compositor
✅ got: #t
[⚙️ assert] The label bakes in the configured layouts, in the compositor's order
✅ got: #t
[⚙️ assert] The menu switches the layout through the compositor
✅ got: #t
[⚙️ assert] The menu pokes the bar so the label repaints at once
✅ got: #t
[⚙️ assert] The menu is only as tall as the layouts it lists
✅ got: #t
[🧪 test] Spotlight Glyph
[⚙️ assert] The launcher should keep a place on the bar
✅ got: #t
[⚙️ assert] It should be the app grid, a glyph no text font claims
✅ got: #t
[⚙️ assert] It should name the solid face instead of trusting fallback
✅ got: <span font_family="Font Awesome 6 Free Solid"></span>
[⚙️ assert] The family belongs on the rule waybar's labels carry
✅ got: #t
[⚙️ assert] A family on the module never reaches the labels
✅ got: #f
[⚙️ assert] A quoted comma list is one family name, so icons are left to fallback
✅ got: #f
[⚙️ assert] A click should open the launcher
✅ got: #t
[⚙️ assert] An open launcher should be replaced, not left to refuse the click
✅ got: #t
[⚙️ assert] The right button should be the window switcher
✅ got: #t
[⚙️ assert] The launcher should be pointable at another one from the settings file
✅ got: #t
[⚙️ assert] The app grid should wear the actions' style
✅ got: ((color . #ffffff) (padding . 0px 8px) (margin . 0px) (font-size . 12pt) (font-style . normal))
[🧪 test] Do Not Disturb Indicator
[⚙️ assert] Clicking the indicator should toggle the mako DND mode
✅ got: #t
[🧪 test] Rounded Bar Styling
[⚙️ assert] The floating bar should carry the configured corner radius
✅ got: 0px
[⚙️ assert] The bar corner radius should be overridable
✅ got: 0px
[🧪 test] System Menu Rows
[⚙️ assert] The menu should answer what this machine is
✅ got: #t
[⚙️ assert] About should open the generated About window
✅ got: heks-about
[⚙️ assert] Spotlight should be reachable from the menu too
✅ got: #t
[⚙️ assert] Search should open the Rofi launcher
✅ got: #t
[⚙️ assert] The second Rofi should wait for the menu to close
✅ got: #t
[⚙️ assert] The session rows are the power menu's own, not a second copy
✅ got: systemctl poweroff
[⚙️ assert] Locking the session should be one row away
✅ got: #t
[⚙️ assert] So should logging out
✅ got: #t
[⚙️ assert] The groups should be separated by rules nobody can pick
✅ got: #t
[⚙️ assert] A rule should be printed as a row Rofi cannot select
✅ got: #t
[⚙️ assert] The menu should be a Rofi script-mode menu
✅ got: #t
[⚙️ assert] The script should hand itself to Rofi as the mode it opens
✅ got: #t
[⚙️ assert] The menu should drop from the top left, under the logo
✅ got: #t
[⚙️ assert] The window should be exactly as tall as its rows
✅ got: #t
[⚙️ assert] Every action should be detached from the menu's stdout
✅ got: #t
[🧪 test] System Menu At The Far Left
[⚙️ assert] The system menu should be the first thing on the bar
✅ got: custom/heks-system-menu
[⚙️ assert] The power glyph at the end of the row should be gone
✅ got: #f
[⚙️ assert] Its stylesheet rule should be gone with it
✅ got: #f
[⚙️ assert] The first item should say the machine's name, not a glyph
✅ got: Heks
[⚙️ assert] A machine should be able to wear a penguin instead
✅ got: 🐧
[⚙️ assert] A click should open the system menu
✅ got: #t
[⚙️ assert] The right button should still reach the session in one click
✅ got: #t
[⚙️ assert] The logo should be styled as the bar's one bold item
✅ got: #t
[🧪 test] CSS Rules Generation
[⚙️ assert] CSS list should not be empty
✅ got: #t
[⚙️ assert] CSS should contain a rule for the waybar window
✅ got: #t
[⚙️ assert] Module background should be transparent in CSS
✅ got: transparent
[🧪 test] Every Item Explains Itself On Hover
[⚙️ assert] A string in tooltip is a bool waybar ignores
✅ got: #f
[⚙️ assert] The reference says what its two buttons do
✅ got: #t
[⚙️ assert] So does the clipboard
✅ got: #t
[⚙️ assert] So does the system menu's logo
✅ got: #t
[⚙️ assert] So does the launcher
✅ got: #t
[⚙️ assert] So does the wall chooser
✅ got: #t
[⚙️ assert] So does the documentation
✅ got: #t
✅ got: ()
[⚙️ assert] The volume follows the wheel
✅ got: #t
[⚙️ assert] So does the brightness
✅ got: #t
[⚙️ assert] The music glyph can play and pause without a menu
✅ got: #t
[⚙️ assert] The battery reaches the session menu
✅ got: #t
[🧪 test] About This Heks
[⚙️ assert] The window should read what the machine says it runs
✅ got: #t
[⚙️ assert] It should name the palette the desktop is wearing
✅ got: #t
[⚙️ assert] The uptime should not depend on a flag uptime may not have
✅ got: #t
[⚙️ assert] It should open a window rather than a second Rofi menu
✅ got: #t
[⚙️ assert] A machine with no GTK dialog should still say something
✅ got: #t
[🧪 test] Main Configuration (JSON Source)
[⚙️ assert] Waybar config should be a list (convertible to JSON)
✅ got: #t
[⚙️ assert] Waybar position should be top by default
✅ got: top
[⚙️ assert] Modules should be represented as vectors for JSON arrays
✅ got: #t
[⚙️ assert] The do-not-disturb indicator should sit on the bar
✅ got: #t
[🧪 test] The Bar Wears The Mac Menu Bar
[⚙️ assert] The bar should carry a gloss, not a flat fill
✅ got: #t
[⚙️ assert] The top edge should be lit
✅ got: #t
[⚙️ assert] The foot of the bar should be shaded
✅ got: #t
[⚙️ assert] The items should carry the menu bar's text shadow
✅ got: #t
[⚙️ assert] Items should keep the menu bar's tight spacing
✅ got: 0px 8px
[🧪 test] Clipboard Button
[⚙️ assert] The clipboard button should sit on the bar
✅ got: #t
[⚙️ assert] The button should be the bar's own custom item
✅ got: custom/heks-clipboard
[⚙️ assert] The glyph should be the clipboard, named in the solid face
✅ got: <span font_family="Font Awesome 6 Free Solid"></span>
[⚙️ assert] Clicking it should browse the clipboard history
✅ got: #t
[⚙️ assert] An open rofi should be replaced, not left to refuse the click
✅ got: #t
[⚙️ assert] The picker should be pointable at another one from the settings file
✅ got: #t
[⚙️ assert] The clipboard glyph should wear the actions' style
✅ got: ((color . #ffffff) (padding . 0px 8px) (margin . 0px) (font-size . 12pt) (font-style . normal))
[🧪 test] One Ink, No Accent
[⚙️ assert] The palette's accent should appear nowhere in the bar
✅ got: #f;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0
;;; or pass the --no-auto-compile argument to disable.
;;; compiling ./test/veritas/unit/prelude-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/prelude-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/prelude-spec.scm"
;;; compiling ./src/heks-linux/prelude.scm
;;; WARNING: compilation of ./src/heks-linux/prelude.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/prelude.scm"
;;; compiling ./test/veritas/unit/bridges-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/bridges-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/bridges-spec.scm"
;;; compiling ./src/heks-linux/bridges.scm
;;; WARNING: compilation of ./src/heks-linux/bridges.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/bridges.scm"
;;; compiling ./src/heks-linux/user-settings.scm
;;; WARNING: compilation of ./src/heks-linux/user-settings.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/user-settings.scm"
;;; compiling ./test/veritas/unit/flatpak-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/flatpak-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/flatpak-spec.scm"
;;; compiling ./src/heks-linux/packages/flatpak.scm
;;; WARNING: compilation of ./src/heks-linux/packages/flatpak.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/packages/flatpak.scm"
;;; compiling ./test/veritas/unit/toon-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/toon-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/toon-spec.scm"
;;; compiling ./src/heks-linux/toon.scm
;;; WARNING: compilation of ./src/heks-linux/toon.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/toon.scm"
;;; compiling ./src/heks-linux/niri.scm
;;; WARNING: compilation of ./src/heks-linux/niri.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/niri.scm"
;;; compiling ./src/heks-linux/palette.scm
;;; WARNING: compilation of ./src/heks-linux/palette.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/palette.scm"
;;; compiling ./src/heks-linux/wallpaper.scm
;;; WARNING: compilation of ./src/heks-linux/wallpaper.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/wallpaper.scm"
;;; compiling ./src/heks-linux/waybar.scm
;;; WARNING: compilation of ./src/heks-linux/waybar.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/waybar.scm"
;;; compiling ./src/heks-linux/rofi.scm
;;; WARNING: compilation of ./src/heks-linux/rofi.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/rofi.scm"
;;; compiling ./test/veritas/unit/palette-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/palette-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/palette-spec.scm"
;;; compiling ./test/veritas/unit/dconf-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/dconf-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/dconf-spec.scm"
;;; compiling ./src/heks-linux/dconf.scm
;;; WARNING: compilation of ./src/heks-linux/dconf.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/dconf.scm"
;;; compiling ./test/veritas/unit/gtk-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/gtk-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/gtk-spec.scm"
;;; compiling ./src/heks-linux/gtk.scm
;;; WARNING: compilation of ./src/heks-linux/gtk.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/gtk.scm"
;;; compiling ./test/veritas/unit/waybar-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/waybar-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/waybar-spec.scm"
;;; compiling
[⚙️ assert] The bar should not keep a second, dimmer ink
✅ got: #f
[⚙️ assert] Every item should be painted in the palette's one ink
✅ got: ()
[⚙️ assert] The low battery should still be the one exception
✅ got: #t
[⚙️ assert] Every background should be the strip or a veil of the ink
✅ got: ()
[🧪 test] Documentation Button
[⚙️ assert] The documentation button should sit on the bar
✅ got: #t
[⚙️ assert] Clicking it should open the documentation view
✅ got: #t
[⚙️ assert] It should ask the compositor for the activation a bar click cannot prove
✅ got: #t
[⚙️ assert] The glyph should be the book, in the solid face that has it
✅ got: <span font_family="Font Awesome 6 Free Solid"></span>
[⚙️ assert] The tooltip should say what the book opens
✅ got: #t
[🧪 test] Keybinding Reference Button
[⚙️ assert] The question-mark button should sit on the bar
✅ got: #t
[⚙️ assert] The bar should carry only the new question mark
✅ got: #t
[⚙️ assert] The button should be a circled question mark glyph, in the solid face
✅ got: <span font_family="Font Awesome 6 Free Solid"></span>
[⚙️ assert] Clicking it should ask the compositor to activate it
✅ got: #t
[⚙️ assert] Clicking it should open the keyboard reference
✅ got: #t
[⚙️ assert] The button should be styled like the rest of the bar
✅ got: #t
[⚙️ assert] A right click should still reach the project page
✅ got: #t
[🧪 test] Wallpaper Button
[⚙️ assert] The wallpaper button should sit beside the palette
✅ got: #t
[⚙️ assert] Clicking it should open the wall chooser
✅ got: #t
[⚙️ assert] The button is a glyph, not a label
✅ got: #t
[⚙️ assert] The glyph should be the picture icon, named in the solid face
✅ got: <span font_family="Font Awesome 6 Free Solid"></span>
[⚙️ assert] The appearance buttons should share one rule
✅ got: #t
[⚙️ assert] The palette and the wall chooser should wear one style
✅ got: ((color . #ffffff) (padding . 0px 8px) (margin . 0px) (font-size . 12pt) (font-style . normal))
ℹ️ info - ran 1 tasks in: 0 seconds, 85879 microseconds
running unit tests from file: mako-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)
+----------------------------------------------+
[📑 suite] Mako Notification Suite
[🧪 test] Banners Match The macOS Look
[⚙️ assert] Notification banners should be rounded
✅ got: #t
[⚙️ assert] Notification banners should carry a one-pixel hairline edge
✅ got: #t
[⚙️ assert] The edge should be the secondary text colour at 15% opacity
✅ got: #t
[🧪 test] Banner Background Follows Palette Opacity
[⚙️ assert] The default banner should use its palette mako-opacity
✅ got: #t
[⚙️ assert] Golden Gate should render its own, more transparent banner
✅ got: #t
[🧪 test] Do Not Disturb Mode Is Declared
[⚙️ assert] A do-not-disturb mode section should exist so makoctl can toggle it
✅ got: #t
[⚙️ assert] While in do-not-disturb, notifications must not be drawn
✅ got: #t
[🧪 test] Notification behaviour is configured
[⚙️ assert] Notification history should be kept
✅ got: #t
[⚙️ assert] A default timeout should be set
✅ got: #t
[⚙️ assert] Left click should dismiss a notification
✅ got: #t
ℹ️ info - ran 1 tasks in: 0 seconds, 8426 microseconds
running unit tests from file: fontconfig-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)
+----------------------------------------------+
[📑 suite] Fontconfig Configuration Suite
[🧪 test] Emboldening Is Off Unless Asked For
[⚙️ assert] One match by default: the size-gated rule is not written
✅ got: 1
[⚙️ assert] A second, size-gated match appears when faking bold
✅ got: 2
[⚙️ assert] By default there is no size gate to read
✅ got: #t
[⚙️ assert] The faking should be gated on the point size
✅ got: #t
[⚙️ assert] The gate should use the configured size
✅ got: #t
[🧪 test] The Rules Are Overridable
[⚙️ assert] A machine that wants subpixel rendering should be able to ask for it
✅ got: rgb
[⚙️ assert] And a machine that wants no smoothing at all
✅ got: false
[🧪 test] Every Rule Assigns
[⚙️ assert] Every edit should assign, not merely prefer
✅ got: ()
[🧪 test] The File Is Valid Fontconfig XML
[⚙️ assert] The file should open with an XML declaration
✅ got: #t
[⚙️ assert] It should carry the DOCTYPE fontconfig's own files carry
✅ got: #t
[⚙️ assert] It should not carry a namespace fontconfig rejects
✅ got: #f
[⚙️ assert] The rules should be one font-targeted match
✅ got: #t
[⚙️ assert] The renderer should return the fontconfig element
✅ got: fontconfig
[🧪 test] Text Is Smoothed The Way A Mac Smooths It
[⚙️ assert] Text should be smoothed in grey, not in subpixels
✅ got: none
[⚙️ assert] Glyphs should be hinted lightly, so the design survives
✅ got: hintslight
[⚙️ assert] The LCD filter should leave the glyphs alone
✅ got: lcdnone
[⚙️ assert] Antialiasing should be a boolean, not a keyword
✅ got: bool
[⚙️ assert] Antialiasing should be on
✅ got: true
ℹ️ info - ran 1 tasks in: 0 seconds, 10056 microseconds
running unit tests from file: wezterm-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)
+----------------------------------------------+
[📑 suite] Modifier Translation
[🧪 test] Short Modifiers Use WezTerm Spelling
[⚙️ assert] Modifiers are joined with a vertical bar
✅ got: CTRL|SHIFT
[⚙️ assert] Alt and Super are spelled out
✅ got: ALT|SUPER
[⚙️ assert] Unknown modifiers pass through
✅ got: CTRL|Custom
+----------------------------------------------+
[📑 suite] Lua Value Serialization
[🧪 test] Literal Lua Passes Through
[⚙️ assert] A raw fragment is emitted verbatim
✅ got: act.TogglePaneZoomState
[⚙️ assert] Raw fragments are recognisable
✅ got: #t
[🧪 test] Tables Are Laid Out One Entry Per Line
[⚙️ assert] An object becomes an indented table
✅ got: {
foreground = '#ffffff',
background = '#1d2021',
}
[⚙️ assert] An array becomes an indented table
✅ got: {
'bash',
}
[⚙️ assert] A compact table stays on one line
✅ got: { left = 16, top = 4 }
[🧪 test] Scalars Render As Lua Literals
[⚙️ assert] Booleans render unquoted
✅ got: true
[⚙️ assert] False renders unquoted
✅ got: false
[⚙️ assert] Numbers render unquoted
✅ got: 12
[⚙️ assert] Strings are single-quoted so they need no escapes
✅ got: 'bash'
[🧪 test] Table Names Are Bracketed When Lua Needs It
[⚙️ assert] A valid identifier is emitted bare
✅ got: scrollback_lines
[⚙️ assert] A name with a dash is bracketed
✅ got: ['emacs-cx']
+----------------------------------------------+
[📑 suite] Emacs Prefix
[🧪 test] Control+X Opens The Prefix Table
[⚙️ assert] Control+X activates the table
✅ got: #t
[⚙️ assert] An unknown second key leaves the table
✅ got: #t
[⚙️ assert] An abandoned prefix gives up on its own
✅ got: #t
[🧪 test] A Prefix Matches With Control Held Or Released
[⚙️ assert] Each entry is expanded into both spellings
✅ got: #t
[🧪 test] Emacs Commands Keep Their Keys
[⚙️ assert] Control+X 2 splits below
✅ got: #t
[⚙️ assert] Control+X 3 splits right
✅ got: #t
[⚙️ assert] Control+X 0 closes the tab
✅ got: #t
[⚙️ assert] Control+X t opens a new tab
✅ got: #t
[⚙️ assert] Control+X 1 leaves one pane
✅ got: #t
[⚙️ assert] Control+X o moves to the other tab
✅ got: #t
[⚙️ assert] Control+X b picks a tab like a buffer
✅ got: #t
[⚙️ assert] Control+X g quits the prefix
✅ got: #t
[⚙️ assert] Control+X <right> moves to the next tab
✅ got: #t
+----------------------------------------------+
[📑 suite] Guarded Bindings
[🧪 test] The Emacs Page Keys Are Claimed
[⚙️ assert] Control+V pages the scrollback forward
✅ got: #t
[⚙️ assert] Alt+V pages the scrollback back
✅ got: #t
[🧪 test] The Emacs Chords Are Registered
[⚙️ assert] Control+Y pastes
✅ got: #t
[⚙️ assert] Alt+W copies
✅ got: #t
[⚙️ assert] Control+= grows the font, as text-scale-increase does
✅ got: #t
[⚙️ assert] Control+- shrinks the font, as text-scale-decrease does
✅ got: #t
[⚙️ assert] Shift+Left moves to the previous tab
✅ got: #t
[⚙️ assert] Shift+Right moves to the next tab
✅ got: #t
[⚙️ assert] Shift+Up also moves to the previous tab
✅ got: #t
[⚙️ assert] Shift+Down also moves to the next tab
✅ got: #t
[⚙️ assert] Shift+PageUp pages the scrollback
✅ got: #t
[🧪 test] The Bare Defaults Are Re-Registered Through The Guard
[⚙️ assert] Control+Tab still switches tabs
✅ got: #t
[⚙️ assert] Alt+Enter still toggles full screen
✅ got: #t
[⚙️ assert] Control+Insert still copies the selection
✅ got: #t
[⚙️ assert] Every guarded default is registered exactly once
✅ got: 6
[🧪 test] Every Chord Is Guarded
[⚙️ assert] Chords are dispatched through a callback
✅ got: #t
[⚙️ assert] The callback asks the pane which process is in front
✅ got: #t
[⚙️ assert] The chord is re-sent to the application
✅ got: #t
[⚙️ assert] The terminal only acts when the keyboard is free
✅ got: #t
+----------------------------------------------+
[📑 suite] Generated File
[🧪 test] Settings And Colours Follow The System
[⚙️ assert] Scrollback matches the other terminals
✅ got: #t
[⚙️ assert] Opacity is set
✅ got: #t
[⚙️ assert] The font is a fallback list
✅ got: #t
[⚙️ assert] Padding is applied on every side
✅ got: #t
[⚙️ assert] The shell is bash, as in the other terminals
✅ got: #t
[⚙️ assert] The background follows the selected palette
✅ got: #t
[⚙️ assert] The foreground follows the selected palette
✅ got: #t
[🧪 test] Control+C Stays The Interrupt
[⚙️ assert] Control+C is never taken by the terminal
✅ got: #f
[🧪 test] The File Is Self-Describing
[⚙️ assert] The file carries a generated-file header
✅ got: #t
[⚙️ assert] The header says not to edit the file
✅ got: #t
[⚙️ assert] The header names the source of truth
✅ got: #t
[⚙️ assert] The configuration is built from the builder
✅ got: #t
[⚙️ assert] The file returns the configuration
✅ got: #t
[⚙️ assert] Every section banner is the same width
✅ got: #t
[🧪 test] Title Bar And Resize Border Are Requested
[⚙️ assert] A title bar and a resize border are requested
✅ got: #t
[⚙️ assert] No window is undecorated
✅ got: #f
[⚙️ assert] The title bar is not dropped for the border
✅ got: #f
[⚙️ assert] No window buttons are drawn into the tab bar
✅ got: #f
[⚙️ assert] The decorations do not depend on the platform
✅ got: #f
[⚙️ assert] The tab bar is enabled
✅ got: #t
[⚙️ assert] The tab bar is the one WezTerm paints itself
✅ got: #t
[⚙️ assert] The tab bar stays visible for a single pane, as the title bar
✅ got: #t
[⚙️ assert] The tab bar carries a close button
✅ got: #t
[🧪 test] Meta And The Keyboard Protocol Are Configured
[⚙️ assert] Left Option sends Meta
✅ got: #t
[⚙️ assert] Right Option sends Meta
✅ got: #t
[⚙️ assert] The kitty keyboard protocol is left available to applications
✅ got: #t
+----------------------------------------------+
[📑 suite] Passthrough
[🧪 test] The Application List Is Matched On The Base Name
[⚙️ assert] A full path such as /usr/bin/less still matches
✅ got: #t
[⚙️ assert] The directory part of the process name is dropped
✅ got: #t
[⚙️ assert] A version suffix is allowed, so python3.13 matches python
✅ got: #t
[⚙️ assert] The base name is matched against the compiled patterns
✅ got: #t
[🧪 test] Emacs And The Pager Own The Keyboard
[⚙️ assert] Emacs is declared as an owning application
✅ got: #t
[⚙️ assert] less is declared as an owning application
✅ got: #t
[⚙️ assert] Emacs is in the default application list
✅ got: #t
[⚙️ assert] less is in the default application list
✅ got: #t
+----------------------------------------------+
[📑 suite] Binding Serialization
[🧪 test] Prefix Entries Carry No Modifier
[⚙️ assert] The runtime adds the modifiers a prefix needs
✅ got: { key = '2', action = act.TogglePaneZoomState }
[🧪 test] Bindings Render As Inline Lua Tables
[⚙️ assert] A key assignment is one inline table
✅ got: { key = 'y', mods = 'CTRL', action = act.PasteFrom 'Clipboard' }
[⚙️ assert] A named key keeps its WezTerm spelling
✅ got: { key = 'PageUp', mods = 'SHIFT', action = act.ScrollByPage(-1) }
ℹ️ info - ran 7 tasks in: 0 seconds, 314027 microseconds
running unit tests from file: image-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)
+----------------------------------------------+
[📑 suite] Heks-Linux Live Image Suite
[🧪 test] The Build Checks Itself
[⚙️ assert] The build should know what a ready system looks like
✅ got: #t
[⚙️ assert] It should check programs as well as files
✅ got: #t
[⚙️ assert] Guix should be one of the programs a ready image has
✅ got: #t
[⚙️ assert] Nix should be one of them too
✅ got: #t
[⚙️ assert] The build should have a phase that asks
✅ got: #t
[⚙️ assert] And it should refuse to produce an image that fails it
✅ got: #t
[🧪 test] It Is Rendered Before It Ships
[⚙️ assert] heks-render should run maak home-reconfigure
✅ got: #t
[⚙️ assert] heks-render should run maak install-bash
✅ got: #t
[⚙️ assert] heks-render should run maak install-icon-files
✅ got: #t
[⚙️ assert] heks-render should run maak install-heks-toon
✅ got: #t
[⚙️ assert] heks-render should run maak install-lambdock
✅ got: #t
[⚙️ assert] The build should run maak home-reconfigure
✅ got: #t
[⚙️ assert] The build should run maak install-bash
✅ got: #t
[⚙️ assert] The build should run maak install-icon-files
✅ got: #t
[⚙️ assert] The build should run maak install-heks-toon
✅ got: #t
[⚙️ assert] The build should run maak install-lambdock
✅ got: #t
[⚙️ assert] heks-render should refuse to render another user's home as a user
✅ got: #t
[⚙️ assert] The unit should skip itself once the desktop is rendered
✅ got: #t
[⚙️ assert] The build should leave the marker the unit reads
✅ got: #t
[⚙️ assert] It is a one-shot, not a daemon
✅ got: #t
[⚙️ assert] Rendering downloads, so it should wait for the network
✅ got: #t
[🧪 test] The Description Is Well Formed XML
[⚙️ assert] The description should declare itself as UTF-8 XML
✅ got: #t
[⚙️ assert] The schema version should be the one KIWI 10.3 validates against
✅ got: #t
[⚙️ assert] Every element the description opens should be closed
✅ got: 24
[⚙️ assert] The renderer should not double-escape
✅ got: #f
[🧪 test] The Live Account Is The One That Logs In
[⚙️ assert] The image should create the user it is named after
✅ got: heks
[⚙️ assert] The live user's home should be the one the checkouts are cloned into
✅ got: /home/heks
[⚙️ assert] The live user should be able to use sudo
✅ got: #t
[⚙️ assert] GDM should log in the same user the image creates
✅ got: #t
[⚙️ assert] The autologin should be enabled, not merely configured
✅ got: #t
[⚙️ assert] The display manager should be enabled
✅ got: #t
[⚙️ assert] The image should boot to the graphical target
✅ got: #t
[🧪 test] Guix And Nix Are On It
[⚙️ assert] The image should carry Guix
✅ got: #t
[⚙️ assert] The image should carry Nix
✅ got: #t
[⚙️ assert] The Guix daemon should be enabled, or the store cannot be added to
✅ got: #t
[⚙️ assert] Publishing the store on the network is not a desktop's job
✅ got: #t
[⚙️ assert] The store should stay writable, so its read-only mount is masked
✅ got: #t
[⚙️ assert] The nix daemon should start when something asks it to
✅ got: #t
[⚙️ assert] The build should wait for its own nix daemon
✅ got: #t
[⚙️ assert] The build should wait for its own guix daemon
✅ got: #t
[🧪 test] What The Image Leaves Out
[⚙️ assert] The image should not carry a typesetting system
✅ got: #t
[⚙️ assert] The image should not carry a 3D suite
✅ got: #t
[⚙️ assert] The image should not carry a compiler toolchain
✅ got: #t
[⚙️ assert] The image should not carry an image editor
✅ got: #t
[⚙️ assert] The image should carry one network applet
✅ got: #t
[⚙️ assert] The one it carries should be the GNOME applet
✅ got: #t
[⚙️ assert] The workstation list should still carry the typesetting system
✅ got: #t
[🧪 test] The Description Is A Live Image
[⚙️ assert] The image should be an ISO
✅ got: iso
[⚙️ assert] The ISO should boot from an overlay, so the medium stays read-only
✅ got: overlay
[⚙️ assert] The same file should keep a session when it is written to a stick
✅ got: true
[⚙️ assert] The description should have preferences at all
✅ got: #t
[🧪 test] The Three Projects Are Pre-Loaded
[⚙️ assert] The image should clone heks-linux
✅ got: #t
[⚙️ assert] The image should clone heks-emacs
✅ got: #t
[⚙️ assert] The image should clone heks-bash
✅ got: #t
[⚙️ assert] The editor's configuration directory should be created
✅ got: #t
[⚙️ assert] The editor's configuration should be installed, not only checked out
✅ got: #t
[⚙️ assert] The editor's modules and snippets should be copied with it
✅ got: #t
[🧪 test] The Image Follows The Desktop's Settings
[⚙️ assert] The image should be in the timezone the desktop declares
✅ got: Europe/Amsterdam
[⚙️ assert] The image should be in the locale the desktop declares
✅ got: nl_NL
[⚙️ assert] The image should carry the desktop's hostname
✅ got: #t
[🧪 test] The Distribution Is Slowroll
[⚙️ assert] The image should be built from exactly two repositories
✅ got: 2
[⚙️ assert] The first repository should be Slowroll's open source one
✅ got: https://download.opensuse.org/slowroll/repo/oss/
[⚙️ assert] The repository should be included in the image, not only used to build it
✅ got: true
[⚙️ assert] The bootstrap set should carry the release package, or zypper cannot tell what it is
✅ got: #t
[⚙️ assert] The bootstrap set should carry the tools that create the live user
✅ got: #t
[🧪 test] The Session Is On The Image
[⚙️ assert] The image should carry the bar
✅ got: #t
[⚙️ assert] The image should carry the compositor
✅ got: #t
[⚙️ assert] The image should carry the display manager
✅ got: #t
[⚙️ assert] The image should carry the editor
✅ got: #t
[⚙️ assert] The image should carry the language the desktop is written in
✅ got: #t
[⚙️ assert] The image should carry the audio server
✅ got: #t
[⚙️ assert] The image should carry the portals a Wayland session needs
✅ got: #t
[⚙️ assert] A live ISO boots from KIWI's own initrd module
✅ got: #t
[⚙️ assert] The image should carry the git its build clones with
✅ got: #t
[⚙️ assert] The image should carry the curl its first boot downloads with
✅ got: #t
[⚙️ assert] The image should carry the gpg that verifies the download
✅ got: #t
[🧪 test] It Installs As Well As Boots
[⚙️ assert] The description should produce a live ISO and an installable image
✅ got: 2
[⚙️ assert] One of them should be an OEM image
✅ got: #t
[⚙️ assert] The OEM image should ship an install ISO
✅ got: true
[⚙️ assert] An installed image should grow to the disk it lands on
✅ got: true
[⚙️ assert] The initrd module that grows it should be on the image
✅ got: #t
ℹ️ info - ran 1 tasks in: 0 seconds, 97771 microseconds
running unit tests from file: zen-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)
+----------------------------------------------+
[📑 suite] Value Serialization
[🧪 test] Preference Lines Are user_pref Calls
[⚙️ assert] A boolean pref keeps its name and literal
✅ got: user_pref("zen.tabs.vertical", true);
[⚙️ assert] A numeric pref has no quotes
✅ got: user_pref("zen.view.sidebar-expanded.max-width", 300);
[🧪 test] Strings Are Quoted And Escaped
[⚙️ assert] A plain string is double-quoted
✅ got: "dark"
[⚙️ assert] A quote inside the value is escaped
✅ got: "a \"quoted\" path"
[⚙️ assert] A backslash inside the value is escaped
✅ got: "C:\\tmp"
[🧪 test] Scalars Render As JavaScript Literals
[⚙️ assert] Booleans render unquoted
✅ got: true
[⚙️ assert] False renders unquoted
✅ got: false
[⚙️ assert] Zero is a pref value, not an absence
✅ got: 0
[⚙️ assert] Integers render without Scheme punctuation
✅ got: 300
+----------------------------------------------+
[📑 suite] Parameters
[🧪 test] Tracking Protection Is On By Default
[⚙️ assert] The custom ETP category keeps the individual prefs in charge
✅ got: #t
[⚙️ assert] Tracking protection is on
✅ got: #t
[⚙️ assert] Cryptominer blocking is on
✅ got: #t
[⚙️ assert] Link prefetching is off
✅ got: #t
[🧪 test] The Site-Breaking Prefs Are Opt-In
[⚙️ assert] Fingerprinting protection is off, and says so
✅ got: #t
[⚙️ assert] It is rendered when asked for
✅ got: #t
[⚙️ assert] The fingerprinting blocker travels with it
✅ got: #t
[⚙️ assert] HTTPS-Only mode is off, and says so
✅ got: #t
[⚙️ assert] It is rendered when asked for
✅ got: #t
[⚙️ assert] A trimmed profile is put back to Firefox's own policy
✅ got: #t
[🧪 test] Adblock Prefs Can Be Turned Off
[⚙️ assert] The sideload scopes disappear
✅ got: #f
[🧪 test] Compact Mode Is Opt-In
[⚙️ assert] Compact mode is off by default
✅ got: #f
[⚙️ assert] Turning it on adds the master preference
✅ got: #t
[⚙️ assert] The address bar stays visible
✅ got: #t
[🧪 test] Hardening Can Be Turned Off
[⚙️ assert] Turning hardening off drops the block
✅ got: #f
[⚙️ assert] The layout is still declared
✅ got: #t
[🧪 test] Local Overrides Are Rendered Last
[⚙️ assert] The override line is present
✅ got: #t
[⚙️ assert] The generated line stays, so the override wins on load
✅ got: #t
[🧪 test] DevTools Can Be Turned Off
[⚙️ assert] The Toolbox prefs disappear together
✅ got: #f
[⚙️ assert] The external editor is enabled by its parameter
✅ got: #t
[⚙️ assert] The editor path follows its parameter
✅ got: #t
[⚙️ assert] The editor receives the line number
✅ got: #t
[⚙️ assert] The editor prefs disappear once it is unset
✅ got: #f
+----------------------------------------------+
[📑 suite] Generated File
[🧪 test] The File Is Self-Describing
[⚙️ assert] The file carries a generated-file header
✅ got: #t
[⚙️ assert] The header says not to edit the file
✅ got: #t
[⚙️ assert] The header names the source of truth
✅ got: #t
[🧪 test] The Browser Toolbox Is Enabled With A Prompt
[⚙️ assert] Chrome debugging is available
✅ got: #t
[⚙️ assert] Remote debugging is available
✅ got: #t
[⚙️ assert] Connecting still asks for confirmation
✅ got: #t
[⚙️ assert] The external editor is off by default
✅ got: #f
[🧪 test] uBlock Origin Is Allowed To Start Enabled
[⚙️ assert] Side-loaded extensions are not disabled
✅ got: #t
[⚙️ assert] The profile scope is enabled
✅ got: #t
[🧪 test] The DevTools Theme Follows The Palette
[⚙️ assert] A dark palette asks for the dark theme
✅ got: #t
[⚙️ assert] A light palette asks for the light theme
✅ got: #t
[🧪 test] Vertical Tabs Are Declared
[⚙️ assert] The tab bar is vertical
✅ got: #t
[⚙️ assert] The tab bar stays on the left
✅ got: #t
[⚙️ assert] The sidebar starts expanded
✅ got: #t
[⚙️ assert] The sidebar has a laptop-friendly width
✅ got: #t
ℹ️ info - ran 3 tasks in: 1 seconds, -899210 microseconds
running unit tests from file: wallpaper-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)[INFO] [2026-10-26 15:47:01 UTC] Creating directory: /tmp/heks-wallpaper-spec-2
[INFO] [2026-10-26 15:47:01 UTC] Creating directory: /tmp/heks-wallpaper-spec-2/bin
[INFO] [2026-10-26 15:47:01 UTC] Installing wallpaper management configuration
[INFO] [2026-10-26 15:47:01 UTC] load-local-overrides: Attempting override resolution for module (heks-linux wallpaper) with profile 'wallpaper-settings'
[INFO] [2026-10-26 15:47:01 UTC] load-local-overrides: $XDG_CONFIG_HOME empty/unset, falling back to $HOME/.config
[INFO] [2026-10-26 15:47:01 UTC] load-local-overrides: Checking for override file at: /root/.config/heks-linux/wallpaper-settings.scm
[INFO] [2026-10-26 15:47:01 UTC] load-local-overrides: No override file found at /root/.config/heks-linux/wallpaper-settings.scm. Skipping.
[INFO] [2026-10-26 15:47:01 UTC] Writing config to file: /tmp/heks-wallpaper-spec-2/bin/heks-wallpaper
[INFO] [2026-10-26 15:47:01 UTC] Removed the retired Rofi wallpaper picker: /tmp/heks-wallpaper-spec-2/bin/heks-wallpaper-chooser
[INFO] [2026-10-26 15:47:01 UTC] Creating directory: /tmp/heks-wallpaper-spec-2/systemd
[INFO] [2026-10-26 15:47:01 UTC] Writing config to file: /tmp/heks-wallpaper-spec-2/systemd/heks-wallpaper.service
[INFO] [2026-10-26 15:47:01 UTC] Writing config to file: /tmp/heks-wallpaper-spec-2/systemd/heks-wallpaper.timer
[SUCCESS] [2026-10-26 15:47:01 UTC] Installed wallpaper management configuration
+----------------------------------------------+
[📑 suite] Wallpaper Engine Suite
[🧪 test] The Engine Detaches Its Renderer
[⚙️ assert] The renderer should outlive the service that started it
✅ got: #t
[⚙️ assert] The previous swaybg should be replaced, by exact name
✅ got: #t
[⚙️ assert] A renderer that died on connect must be noticed
✅ got: #t
[⚙️ assert] The layer-shell renderer should be selectable
✅ got: #t
[🧪 test] Every Palette Resolves To Absolute Paths
[⚙️ assert] No palette may end up without a wallpaper set
✅ got: #t
[🧪 test] The Timer Rotates Every Ninety Minutes
[⚙️ assert] The timer needs the first change to be scheduled
✅ got: #t
[⚙️ assert] And every change after it to repeat
✅ got: #t
[⚙️ assert] The schedule should be the configured interval
✅ got: #t
[⚙️ assert] The wallpaper should change every ninety minutes by default
✅ got: 1h30m
[⚙️ assert] A calendar entry cannot say ninety minutes, so there should not be one
✅ got: #f
[⚙️ assert] The timer should name the service it starts
✅ got: #t
[⚙️ assert] The timer should be enable-able
✅ got: #t
[🧪 test] The Service Finishes So The Timer Can Fire Again
[⚙️ assert] The service should be a unit file
✅ got: #t
[⚙️ assert] A simple unit around a renderer that never exits cannot be re-triggered
✅ got: #t
[⚙️ assert] The detached renderer must survive the oneshot finishing
✅ got: #t
[⚙️ assert] The service should run the installed engine
✅ got: #t
[🧪 test] The Engine Is A POSIX Shell Script
[⚙️ assert] The engine should run under any sh
✅ got: #t
[⚙️ assert] The engine must not use bash test syntax
✅ got: #t
[⚙️ assert] The engine must not read the bash-only RANDOM
✅ got: #t
[🧪 test] The Engine Finds The Compositor Instead Of Guessing It
[⚙️ assert] The engine should read WAYLAND_DISPLAY
✅ got: #t
[⚙️ assert] The engine should discover the socket in XDG_RUNTIME_DIR
✅ got: #t
[⚙️ assert] The old guess at the display name must be gone
✅ got: #t
[⚙️ assert] Waiting for the compositor should fail loudly
✅ got: #t
[🧪 test] Tinted Operandi Reaches The macOS Set
[⚙️ assert] modus-operandi-tinted must not be swallowed by the generic operandi clause
✅ got: #t
[⚙️ assert] The macOS wallpaper set should not be empty
✅ got: #t
[🧪 test] Unknown Palettes Are Rejected
[⚙️ assert] An unregistered palette should raise instead of picking nothing
✅ success catching error: %exception: (#<&message message: "exception occurred! unknown palette selected (not-a-real-palette), could not determine wallpaper set.">)
[🧪 test] Installing Writes Every Artefact
[⚙️ assert] The engine should be installed
✅ got: #t
[⚙️ assert] The engine should be executable
✅ got: #t
[⚙️ assert] The retired Rofi wallpaper picker should not be installed
✅ got: #t
[⚙️ assert] The service should be installed
✅ got: #t
[⚙️ assert] The timer should be installed
✅ got: #t
[🧪 test] Catalogued Palettes Use Their Own Directories
[⚙️ assert] catppuccin-mocha should use its own artwork
✅ got: #t
[⚙️ assert] ayu-dark should use the space artwork
✅ got: #t
[🧪 test] The Engine Remembers And Restores
[⚙️ assert] The engine should keep the wallpaper it set
✅ got: #t
[⚙️ assert] The compositor should be able to re-apply that wallpaper
✅ got: #t
[⚙️ assert] next and prev need to know where the current image sits
✅ got: #t
[🧪 test] Generic Operandi Uses The Bergen Set
[⚙️ assert] modus-operandi should stay inside the shared wallpaper tree
✅ got: #t
[⚙️ assert] modus-operandi should include the Bergen backgrounds
✅ got: #t
[🧪 test] The Engine Carries The Whole Palette Set
[⚙️ assert] One quoted wallpaper per line, and no more
✅ got: 2
[⚙️ assert] Every palette wallpaper should be reachable from the engine
✅ got: #t
ℹ️ info - ran 1 tasks in: 0 seconds, 42449 microseconds
running unit tests from file: niri-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)
+----------------------------------------------+
[📑 suite] Niri Configuration Suite
[🧪 test] Configuration Serializes To KDL
[⚙️ assert] The generated config should start with the Heks header
✅ got: #t
[⚙️ assert] An input block should be emitted
✅ got: #t
[⚙️ assert] A binds block should be emitted
✅ got: #t
[🧪 test] Natural Scrolling Follows Its Setting
[⚙️ assert] Natural scrolling should stay off while the setting is disabled
✅ got: #t
[⚙️ assert] Enabling the setting should emit natural-scroll into the config
✅ got: #t
[🧪 test] WezTerm Is The Main Terminal
[⚙️ assert] Super+T should launch WezTerm
✅ got: #t
[⚙️ assert] The terminal binding should spawn wezterm
✅ got: #t
[⚙️ assert] Alacritty must no longer be referenced
✅ got: #t
[⚙️ assert] kitty must no longer be referenced
✅ got: #t
[🧪 test] Extra Keyboard Options Are Composed With Caps To Ctrl
[⚙️ assert] Extra XKB options should be comma-joined with ctrl:nocaps
✅ got: #t
[⚙️ assert] A single extra option should still compose with ctrl:nocaps
✅ got: #t
[⚙️ assert] Without ctrl:nocaps the extra options stand alone
✅ got: #t
[⚙️ assert] Repeated configuration does not generate redundancies
✅ got: #t
[🧪 test] Rounded Windows And Soft Shadows
[⚙️ assert] Windows should get a rounded corner radius
✅ got: #t
[⚙️ assert] Windows should cast a drop shadow
✅ got: #t
[🧪 test] Clipboard History Is Recorded
[⚙️ assert] The clipboard watcher should be started with the session
✅ got: #t
[🧪 test] The Reference Window Opens Focused And Blurred
[⚙️ assert] The window should be matched by its application id
✅ got: #t
[⚙️ assert] The window should be focused the moment it opens
✅ got: #t
[⚙️ assert] The compositor should blur what is behind the glass
✅ got: #t
[🧪 test] Startup Scripts Exist Under ~/.local/bin
[⚙️ assert] The startup entry must name the script that the dconf module installs
✅ got: #t
[⚙️ assert] The stale, non-existent startup script name must be gone
✅ got: #t
[🧪 test] macOS And Omarchy Parity Bindings
[⚙️ assert] Super+Space should open the spotlight launcher
✅ got: #t
[⚙️ assert] Toggling floating mode should move to Super+Shift+Space
✅ got: #t
[⚙️ assert] Super+Return should open a terminal, as in Omarchy
✅ got: #t
[⚙️ assert] Super+Q should close the focused window
✅ got: #t
[⚙️ assert] Super+V should browse the clipboard history
✅ got: #t
[⚙️ assert] The palette chooser should be reachable from a binding, on its own view
✅ got: #t
[⚙️ assert] Do-not-disturb should be reachable from a binding
✅ got: #t
[🧪 test] Springy macOS Style Motion
[⚙️ assert] Window opening should be animated
✅ got: #t
[⚙️ assert] Animations should be spring driven
✅ got: #t
[⚙️ assert] Workspace switches should be animated
✅ got: #t
ℹ️ info - ran 1 tasks in: 0 seconds, 456238 microseconds
running unit tests from file: rofi-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 157080811 (replay with VERITAS_SEED=157080811)
+----------------------------------------------+
[📑 suite] Rofi Configuration and Theming
[🧪 test] The Inputbar Carries One Button
[⚙️ assert] The inputbar should carry the red close dot
✅ got: #t
[⚙️ assert] The yellow clear dot should be gone
✅ got: #f
[⚙️ assert] The green mode dot should be gone
✅ got: #f
[⚙️ assert] The clear dot's rule should be gone too
✅ got: #f
[⚙️ assert] The mode dot's rule should be gone too
✅ got: #f
[⚙️ assert] The close dot should still be a real button
✅ got: #t
[🧪 test] Rofi Script Modes Registered
[⚙️ assert] The launcher, window switcher and power menu modes should be registered
✅ got: #t
[⚙️ assert] The theme picker mode should be registered
✅ got: #t
[⚙️ assert] The power mode should point at the generated script
✅ got: #t
[🧪 test] Rofi Theme (AList Structure)
[⚙️ assert] Theme should be a list (AList)
✅ got: #t
[⚙️ assert] Should contain a global wildcard '*' section
✅ got: #t
[⚙️ assert] Global background-color should be transparent
✅ got: transparent
[⚙️ assert] The spotlight panel should be softly rounded
✅ got: 18px
[⚙️ assert] The launcher should carry a one-pixel hairline
✅ got: 1px
[⚙️ assert] The hairline should be the secondary text colour at 15% opacity
✅ got: rgba(152, 152, 152, 0.15)
[🧪 test] Theme Picker Wears The Right Emacs Theme
[⚙️ assert] A palette should carry the Emacs theme it wears, not a rename of its own name
✅ got: #t
[⚙️ assert] The running Emacs should be told about the theme instead of waiting for a restart
✅ got: #t
[🧪 test] Theme Picker Knows Which Palette Is Running
[⚙️ assert] The picker should know which palette is currently active
✅ got: #t
[🧪 test] Rofi Config String Template
[⚙️ assert] Configuration should inject the configured sans font
✅ got: #t
[⚙️ assert] Icons should be enabled by default
✅ got: #t
[⚙️ assert] Config must reference the generated theme file
✅ got: #t
[🧪 test] Power Menu Script
[⚙️ assert] The power menu must be a Bash script
✅ got: #t
[⚙️ assert] The first entry must use the rofi \0icon\x1f separator
✅ got: #t
[⚙️ assert] The power menu should expose a shutdown action
✅ got: #t
[🧪 test] Theme Picker Script
[⚙️ assert] The theme picker must be a Bash script
✅ got: #t
[⚙️ assert] Choosing a palette must re-render the palette-dependent configs
✅ got: #t
[⚙️ assert] Choosing a palette must persist itself as a local override
✅ got: #t
[🧪 test] Theme Picker Reports Its Progress
[⚙️ assert] The picker should write its stages in the order it does them
✅ got: #t
[⚙️ assert] A switch that fails should say so
✅ got: #t
[⚙️ assert] The stage should be written where the gallery page reads it
✅ got: #t
[⚙️ assert] The picker should keep the id of the notification it opened
✅ got: #t
[⚙️ assert] The picker should edit that notification rather than add another
✅ got: #t
[⚙️ assert] The id prefix fyi prints should be stripped before reuse
✅ got: #t
[🧪 test] Theme Picker Caches Its Swatches
[⚙️ assert] The swatches should be cached outside the config
✅ got: #t
[⚙️ assert] A palette change should invalidate the cached swatches exactly once
✅ got: #t
[⚙️ assert] ImageMagick should draw the swatches
✅ got: #t
[🧪 test] Theme Picker Offers Every Palette With A Swatch
[⚙️ assert] Every registered palette should get a swatch table row
✅ got: 41
[⚙️ assert] Every registered palette should be listed
✅ got: #t
[⚙️ assert] A swatch should be painted from the palette's own colours
✅ got: #t
ℹ️ info - ran 1 tasks in: 1 seconds, -486369 microseconds
finished running tests
./test/veritas/unit/mako-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/mako-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/mako-spec.scm"
;;; compiling ./src/heks-linux/mako.scm
;;; WARNING: compilation of ./src/heks-linux/mako.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/mako.scm"
;;; compiling ./test/veritas/unit/fontconfig-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/fontconfig-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/fontconfig-spec.scm"
;;; compiling ./src/heks-linux/fontconfig.scm
;;; WARNING: compilation of ./src/heks-linux/fontconfig.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/fontconfig.scm"
;;; compiling ./test/veritas/unit/wezterm-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/wezterm-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/wezterm-spec.scm"
;;; compiling ./src/heks-linux/wezterm.scm
;;; WARNING: compilation of ./src/heks-linux/wezterm.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/wezterm.scm"
;;; compiling ./test/veritas/unit/image-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/image-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/image-spec.scm"
;;; compiling ./src/heks-linux/image.scm
;;; WARNING: compilation of ./src/heks-linux/image.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/image.scm"
;;; compiling ./src/heks-linux/packages/zypper.scm
;;; WARNING: compilation of ./src/heks-linux/packages/zypper.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/packages/zypper.scm"
;;; compiling ./test/veritas/unit/zen-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/zen-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/zen-spec.scm"
;;; compiling ./src/heks-linux/zen.scm
;;; WARNING: compilation of ./src/heks-linux/zen.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/zen.scm"
;;; compiling ./test/veritas/unit/wallpaper-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/wallpaper-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/wallpaper-spec.scm"
;;; compiling ./test/veritas/unit/niri-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/niri-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/niri-spec.scm"
;;; compiling ./test/veritas/unit/rofi-spec.scm
;;; WARNING: compilation of ./test/veritas/unit/rofi-spec.scm failed:
;;; failed to create path for auto-compiled file "./test/veritas/unit/rofi-spec.scm"
Execute command:
guix time-machine --channels=channels.scm -- shell -m manifest.scm --container -- guile -L ./src -L ./test -c '((@ (veritas runner) run-tests))'
Executing: guix time-machine --channels=channels.scm -- shell -m manifest.scm --container -- guile -L ./src -L ./test -c '((@ (veritas runner) run-tests))'
Executing: genhtml reports/lcov/*.info --output-directory reports/html >/dev/null 2>&1
→ running command: cd /etc/byggsteg/job-clone/heks-linux/trunk && sudo maak deploy
--------------------------------------------------------------
Maak 0.14.0: the infinitely extensible command runner
Loading tasks from Maak file: /etc/byggsteg/job-clone/heks-linux/trunk/maak.scm
Executing Maak tasks: deploy
--------------------------------------------------------------
=> Running Maak task: deploy
Deploy the project's documentation.
channels.scm:54:6: warning: channel 'jointhefreeworld' is not trusted
[INFO] [2026-10-26 16:47:02 CET] load-local-overrides: Attempting override resolution for module (heks-linux user-settings) with profile 'local-settings'
[INFO] [2026-10-26 16:47:02 CET] load-local-overrides: $XDG_CONFIG_HOME empty/unset, falling back to $HOME/.config
[INFO] [2026-10-26 16:47:02 CET] load-local-overrides: Checking for override file at: /root/.config/heks-linux/local-settings.scm
[INFO] [2026-10-26 16:47:02 CET] load-local-overrides: No override file found at /root/.config/heks-linux/local-settings.scm. Skipping.
;;; note: source file /etc/byggsteg/job-clone/heks-linux/trunk/src/heks-linux/lambdock.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/heks-linux/trunk/src/heks-linux/lambdock.scm.go
;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0
;;; or pass the --no-auto-compile argument to disable.
;;; compiling /etc/byggsteg/job-clone/heks-linux/trunk/src/heks-linux/lambdock.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/heks-linux/trunk/src/heks-linux/lambdock.scm.go
API documentation saved to doc/api
channels.scm:54:6: warning: channel 'jointhefreeworld' is not trusted
index.texi:2529: warning: @end should only appear at the beginning of a line
index.texi:2543: warning: @end should only appear at the beginning of a line
index.texi:2558: warning: @end should only appear at the beginning of a line
index.texi: warning: must specify a title with a title command or @top
Execute command:
guix time-machine --channels=channels.scm -- shell -m manifest.scm -- documenta api ./src/heks-linux
Executing: guix time-machine --channels=channels.scm -- shell -m manifest.scm -- documenta api ./src/heks-linux
Execute command:
guix time-machine --channels=channels.scm -- shell -m manifest.scm -- texi2any -v --html --css-ref=https://jointhefreeworld.org/static/css/jointhefreeworld.css -o index_html ./doc/api/index.texi
Executing: guix time-machine --channels=channels.scm -- shell -m manifest.scm -- texi2any -v --html --css-ref=https://jointhefreeworld.org/static/css/jointhefreeworld.css -o index_html ./doc/api/index.texi
renamed './index_html' -> './doc/api-dist'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/API.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fbridges.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fbtop.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fcontainers.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fdconf.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005ffastfetch.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005ffontconfig.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fgif.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fgit.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fgtk.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fimage.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005flambdock.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fmako.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fniri.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fpackages_005fflatpak.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fpackages_005fzypper.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fpalette.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fprelude.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005frmpc.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005frofi.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005ftoon.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fuser_002dsettings.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fwallpaper.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fwaybar.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fwezterm.html'
removed '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fzen.html'
removed directory '/srv/http/jointhefreeworld.org/api-docs/heks-linux'
mkdir: created directory '/srv/http/jointhefreeworld.org/api-docs/heks-linux'
renamed 'doc/api-dist/API.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/API.html'
renamed 'doc/api-dist/heks_002dlinux_005fbridges.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fbridges.html'
renamed 'doc/api-dist/heks_002dlinux_005fbtop.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fbtop.html'
renamed 'doc/api-dist/heks_002dlinux_005fcontainers.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fcontainers.html'
renamed 'doc/api-dist/heks_002dlinux_005fdconf.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fdconf.html'
renamed 'doc/api-dist/heks_002dlinux_005ffastfetch.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005ffastfetch.html'
renamed 'doc/api-dist/heks_002dlinux_005ffontconfig.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005ffontconfig.html'
renamed 'doc/api-dist/heks_002dlinux_005fgif.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fgif.html'
renamed 'doc/api-dist/heks_002dlinux_005fgit.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fgit.html'
renamed 'doc/api-dist/heks_002dlinux_005fgtk.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fgtk.html'
renamed 'doc/api-dist/heks_002dlinux_005fimage.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fimage.html'
renamed 'doc/api-dist/heks_002dlinux_005flambdock.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005flambdock.html'
renamed 'doc/api-dist/heks_002dlinux_005fmako.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fmako.html'
renamed 'doc/api-dist/heks_002dlinux_005fniri.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fniri.html'
renamed 'doc/api-dist/heks_002dlinux_005fpackages_005fflatpak.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fpackages_005fflatpak.html'
renamed 'doc/api-dist/heks_002dlinux_005fpackages_005fzypper.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fpackages_005fzypper.html'
renamed 'doc/api-dist/heks_002dlinux_005fpalette.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fpalette.html'
renamed 'doc/api-dist/heks_002dlinux_005fprelude.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fprelude.html'
renamed 'doc/api-dist/heks_002dlinux_005frmpc.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005frmpc.html'
renamed 'doc/api-dist/heks_002dlinux_005frofi.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005frofi.html'
renamed 'doc/api-dist/heks_002dlinux_005ftoon.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005ftoon.html'
renamed 'doc/api-dist/heks_002dlinux_005fuser_002dsettings.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fuser_002dsettings.html'
renamed 'doc/api-dist/heks_002dlinux_005fwallpaper.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fwallpaper.html'
renamed 'doc/api-dist/heks_002dlinux_005fwaybar.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fwaybar.html'
renamed 'doc/api-dist/heks_002dlinux_005fwezterm.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fwezterm.html'
renamed 'doc/api-dist/heks_002dlinux_005fzen.html' -> '/srv/http/jointhefreeworld.org/api-docs/heks-linux/heks_002dlinux_005fzen.html'
Executing: mv -v doc/api-dist/* /srv/http/jointhefreeworld.org/api-docs/heks-linux
removed 'doc/api/index.texi'
removed directory 'doc/api'
removed directory 'doc/api-dist'
removed directory 'doc'