starting new job...
→ running command: cd "/etc/byggsteg/job-clone//heks-linux/trunk" && git reset --hard && git pull
HEAD is now at dda3108 feat: Improve waybar
From https://codeberg.org/jjba23/heks-linux
dda3108..6366a59 trunk -> origin/trunk
Updating dda3108..6366a59
Fast-forward
channels.scm | 8 ++++----
maak.scm | 8 ++++----
2 files changed, 8 insertions(+), 8 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 6366a59dff6444e659e3ab4791b1d23def446598
Author: Josep Bigorra <jjbigorra@gmail.com>
Date: Mon Oct 26 13:26:05 2026 +0100
feat: Pin jointhefreeworld at scriba 0.4.5
Move the Guix channel and the nix-jointhefreeworld revision together, so the two
halves of the collection stay on the same release. scriba 0.4.5 is a
maintenance release: its log-level suite no longer failed to compile, and
nothing in the library's API, behaviour or documentation changed. The pins
also pick up lambdock 0.12.0, which landed on both trunks since the last pin.
🤖 Generated with [ECA](https://eca.dev) (deepseek/deepseek-flash)
Co-Authored-By: eca-agent <git@eca.dev>
M channels.scm
M maak.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*
;;; note: source file /etc/byggsteg/job-clone/heks-linux/trunk/maak.scm
;;; newer than compiled /tmp/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/heks-linux/trunk/maak.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/maak.scm
;;; compiled /tmp/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/heks-linux/trunk/maak.scm.go
channels.scm:54:6: warning: channel 'jointhefreeworld' is not trusted
Updating channel 'guix' from Git repository at 'https://codeberg.org/guix/guix.git'...
Updating channel 'jointhefreeworld' from Git repository at 'https://codeberg.org/jjba23/guix-jointhefreeworld'...
Authenticating channel 'jointhefreeworld', commits b0ac3f0 to ff4e138 (2 new commits)...
warning: 'uv' is deprecated, use '(@ (gnu packages build-tools) uv)' instead
▕███████████████████████████████████████ ▏
warning: 'uv' is deprecated, use '(@ (gnu packages build-tools) uv)' instead
warning: 'oniguruma' is deprecated, use '(@ (gnu packages regex) oniguruma)' instead
warning: 'oniguruma' is deprecated, use '(@ (gnu packages regex) oniguruma)' instead
Computing Guix derivation for 'x86_64-linux'...
substitute: looking for substitutes on 'https://bordeaux.guix.gnu.org'... 100.0%
substitute:
substitute: looking for substitutes on 'https://bordeaux.guix.gnu.org'... 0.0%
substitute: looking for substitutes on 'https://bordeaux.guix.gnu.org'... 50.0%
substitute: looking for substitutes on 'https://ci.guix.gnu.org'... 100.0%
substitute:
substitute: looking for substitutes on 'https://ci.guix.gnu.org'... 0.0%
substitute: looking for substitutes on 'https://ci.guix.gnu.org'... 50.0%
The following derivations will be built:
/gnu/store/6mp3m8i821h8a0w7qlyjza10r22r29qf-inferior-script.scm.drv
/gnu/store/d39kcdi938ib3f3n6l2m6jc0c9yi4gnn-jointhefreeworld.drv
/gnu/store/pski2skhjsa96m323pdyc2n96ysq4wmh-profile.drv
/gnu/store/7fj5qbvf1dp2svqvv3prf83ic00kpfh6-inferior-script.scm.drv
/gnu/store/iwrn6bzpl5ihgr9w1l0wcw2m6shl09fa-profile.drv
building /gnu/store/6mp3m8i821h8a0w7qlyjza10r22r29qf-inferior-script.scm.drv...
building /gnu/store/d39kcdi938ib3f3n6l2m6jc0c9yi4gnn-jointhefreeworld.drv...
building CA certificate bundle...
listing Emacs sub-directories...
building fonts directory...
building directory of Info manuals...
building profile with 2 packages...
building /gnu/store/7fj5qbvf1dp2svqvv3prf83ic00kpfh6-inferior-script.scm.drv...
building package cache...
building profile with 2 packages...
substitute: looking for substitutes on 'https://bordeaux.guix.gnu.org'... 100.0%
substitute:
substitute: looking for substitutes on 'https://bordeaux.guix.gnu.org'... 0.0%
substitute: looking for substitutes on 'https://ci.guix.gnu.org'... 100.0%
substitute:
substitute: looking for substitutes on 'https://ci.guix.gnu.org'... 0.0%
The following derivations will be built:
/gnu/store/72my9wb2nn0jyf8m7wy4a4kmrxh9ar4x-guile-scriba-0.4.5.drv
/gnu/store/v7f0mbdr671l7bmq2g91jf1qdy4a8wqd-profile.drv
building /gnu/store/72my9wb2nn0jyf8m7wy4a4kmrxh9ar4x-guile-scriba-0.4.5.drv...
100% ▕█████████████████████████████████████████████████████████████████████████▏building CA certificate bundle...
12% ▕█████████▏ ▏
25% ▕██████████████████▎ ▏
38% ▕███████████████████████████▍ ▏
50% ▕████████████████████████████████████▌ ▏
62% ▕█████████████████████████████████████████████▋ ▏
75% ▕██████████████████████████████████████████████████████▊ ▏
88% ▕███████████████████████████████████████████████████████████████▉ ▏
100% ▕█████████████████████████████████████████████████████████████████████████▏
listing Emacs sub-directories...
building fonts directory...
building directory of Info manuals...
building profile with 12 packages...
scanning directories for unit tests...
scanning present working directory for unit tests...
shuffled the files with seed 400453836 (replay with VERITAS_SEED=400453836)
found unit tests: (prelude-spec.scm dconf-spec.scm wallpaper-spec.scm waybar-spec.scm rofi-spec.scm toon-spec.scm niri-spec.scm zen-spec.scm gtk-spec.scm flatpak-spec.scm wezterm-spec.scm bridges-spec.scm palette-spec.scm image-spec.scm mako-spec.scm)
running unit tests from file: prelude-spec.scm, entrypoint: spec
[INFO] [2026-10-26 12:29:33 UTC] Creating directory: /tmp/heks-prelude-spec-2
[INFO] [2026-10-26 12:29:33 UTC] Creating directory: /tmp/heks-prelude-spec-2/symlinked
[INFO] [2026-10-26 12:29:33 UTC] Creating directory: /tmp/heks-prelude-spec-2/symlinked/repo
[INFO] [2026-10-26 12:29:33 UTC] Creating directory: /tmp/heks-prelude-spec-2/symlinked/conf
[INFO] [2026-10-26 12:29:33 UTC] Writing config to file: /tmp/heks-prelude-spec-2/symlinked/conf/linked.conf
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)[INFO] [2026-10-26 12:29:33 UTC] Creating directory: /tmp/heks-prelude-spec-2/installed
[INFO] [2026-10-26 12:29:33 UTC] Creating directory: /tmp/heks-prelude-spec-2/installed/nested
[INFO] [2026-10-26 12:29:33 UTC] Writing config to file: /tmp/heks-prelude-spec-2/installed/nested/deep.conf
[INFO] [2026-10-26 12:29:33 UTC] Creating directory: /tmp/heks-prelude-spec-2/a
[INFO] [2026-10-26 12:29:33 UTC] Creating directory: /tmp/heks-prelude-spec-2/a/b
[INFO] [2026-10-26 12:29:33 UTC] Creating directory: /tmp/heks-prelude-spec-2/a/b/c
[INFO] [2026-10-26 12:29:33 UTC] Creating directory: /tmp/heks-prelude-spec-2/bin
[INFO] [2026-10-26 12:29:33 UTC] Writing config to file: /tmp/heks-prelude-spec-2/bin/script.sh
+----------------------------------------------+
[📑 suite] Prelude Helper Suite
[🧪 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] 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] 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
[🧪 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] Key Value Rendering
[⚙️ assert] Pairs should render with the default template✅ got: host=localhostport=80
[⚙️ assert] The template should be overridable✅ got: host = localhost
[⚙️ assert] CSS pairs should render indented✅ got: color: black;ℹ️ info - ran 1 tasks in: 0 seconds, 9236 microseconds
running unit tests from file: dconf-spec.scm, entrypoint: spec
[INFO] [2026-10-26 12:29:33 UTC] load-local-overrides: Attempting override resolution for module (heks-linux user-settings) with profile 'local-settings'
[INFO] [2026-10-26 12:29:33 UTC] load-local-overrides: $XDG_CONFIG_HOME empty/unset, falling back to $HOME/.config
[INFO] [2026-10-26 12:29:33 UTC] load-local-overrides: Checking for override file at: /root/.config/heks-linux/local-settings.scm
[INFO] [2026-10-26 12:29:33 UTC] load-local-overrides: No override file found at /root/.config/heks-linux/local-settings.scm. Skipping.
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)
+----------------------------------------------+
[📑 suite] dconf test suite
[🧪 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] 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] 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, 6078 microseconds
running unit tests from file: wallpaper-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)[INFO] [2026-10-26 12:29:33 UTC] Creating directory: /tmp/heks-wallpaper-spec-2
[INFO] [2026-10-26 12:29:33 UTC] Creating directory: /tmp/heks-wallpaper-spec-2/bin
[INFO] [2026-10-26 12:29:33 UTC] Installing wallpaper management configuration
[INFO] [2026-10-26 12:29:33 UTC] load-local-overrides: Attempting override resolution for module (heks-linux wallpaper) with profile 'wallpaper-settings'
[INFO] [2026-10-26 12:29:33 UTC] load-local-overrides: $XDG_CONFIG_HOME empty/unset, falling back to $HOME/.config
[INFO] [2026-10-26 12:29:33 UTC] load-local-overrides: Checking for override file at: /root/.config/heks-linux/wallpaper-settings.scm
[INFO] [2026-10-26 12:29:33 UTC] load-local-overrides: No override file found at /root/.config/heks-linux/wallpaper-settings.scm. Skipping.
[INFO] [2026-10-26 12:29:33 UTC] Writing config to file: /tmp/heks-wallpaper-spec-2/bin/heks-wallpaper
[INFO] [2026-10-26 12:29:33 UTC] Removed the retired Rofi wallpaper picker: /tmp/heks-wallpaper-spec-2/bin/heks-wallpaper-chooser
[INFO] [2026-10-26 12:29:33 UTC] Creating directory: /tmp/heks-wallpaper-spec-2/systemd
[INFO] [2026-10-26 12:29:33 UTC] Writing config to file: /tmp/heks-wallpaper-spec-2/systemd/heks-wallpaper.service
[INFO] [2026-10-26 12:29:33 UTC] Writing config to file: /tmp/heks-wallpaper-spec-2/systemd/heks-wallpaper.timer
[SUCCESS] [2026-10-26 12:29:33 UTC] Installed wallpaper management configuration
+----------------------------------------------+
[📑 suite] Wallpaper Engine Suite
[🧪 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 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] 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] 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] 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 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] 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] 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 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
[🧪 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 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 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ℹ️ info - ran 1 tasks in: 0 seconds, 36778 microseconds
running unit tests from file: waybar-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)
+----------------------------------------------+
[📑 suite] Waybar Configuration Suite
[🧪 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] Do Not Disturb Indicator
[⚙️ assert] Clicking the indicator should toggle the mako DND mode✅ got: #t
[🧪 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] 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] 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:
[⚙️ 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 10px) (margin . 0px) (font-size . 12pt) (font-weight . 600) (font-style . normal))
[🧪 test] One Ink, No Accent
[⚙️ assert] The palette's accent should appear nowhere in the bar✅ got: #f
[⚙️ 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 the bar's font can draw✅ got:
[⚙️ assert] The tooltip should say what the book opens✅ 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 wider spacing, and changing it should be deliberate✅ got: 0px 10px
[🧪 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✅ got:
[⚙️ 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] 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 the bar's font can draw✅ got:
[⚙️ 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 10px) (margin . 0px) (font-size . 12pt) (font-weight . 600) (font-style . normal))
[🧪 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] 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] 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] 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 logo should be the lambda this desktop is written in✅ got: λ
[⚙️ 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] 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 the bar's first font can draw✅ got: #t
[⚙️ 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 10px) (margin . 0px) (font-size . 12pt) (font-weight . 600) (font-style . normal))ℹ️ info - ran 1 tasks in: 0 seconds, 53888 microseconds
running unit tests from file: rofi-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)
+----------------------------------------------+
[📑 suite] Rofi Configuration and Theming
[🧪 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] 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] 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] 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 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] 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 Knows Which Palette Is Running
[⚙️ assert] The picker should know which palette is currently active✅ 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 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, -716526 microseconds
running unit tests from file: toon-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)[INFO] [2026-10-26 12:29:34 UTC] Creating directory: /tmp/heks-toon-spec-2
[INFO] [2026-10-26 12:29:34 UTC] Creating directory: /tmp/heks-toon-spec-2/bin
[INFO] [2026-10-26 12:29:34 UTC] Creating directory: /tmp/heks-toon-spec-2/config
[INFO] [2026-10-26 12:29:34 UTC] Creating directory: /tmp/heks-toon-spec-2/config/heks-linux
[INFO] [2026-10-26 12:29:34 UTC] Creating directory: /tmp/heks-toon-spec-2/config/heks-linux/keybindings
[INFO] [2026-10-26 12:29:34 UTC] Retiring the HTML pages heks-toon replaces
[INFO] [2026-10-26 12:29:34 UTC] load-local-overrides: Attempting override resolution for module (heks-linux toon) with profile 'toon-settings'
[INFO] [2026-10-26 12:29:34 UTC] load-local-overrides: $XDG_CONFIG_HOME empty/unset, falling back to $HOME/.config
[INFO] [2026-10-26 12:29:34 UTC] load-local-overrides: Checking for override file at: /root/.config/heks-linux/toon-settings.scm
[INFO] [2026-10-26 12:29:34 UTC] load-local-overrides: No override file found at /root/.config/heks-linux/toon-settings.scm. Skipping.
[INFO] [2026-10-26 12:29:34 UTC] Removed the retired page launcher: /tmp/heks-toon-spec-2/bin/heks-keybindings
[INFO] [2026-10-26 12:29:34 UTC] Removed the retired page launcher: /tmp/heks-toon-spec-2/bin/heks-wallpaper-gallery
[INFO] [2026-10-26 12:29:34 UTC] Removed the retired page launcher: /tmp/heks-toon-spec-2/bin/heks-palette-gallery
[INFO] [2026-10-26 12:29:34 UTC] Removed the retired page: /tmp/heks-toon-spec-2/config/heks-linux/keybindings/index.html
[INFO] [2026-10-26 12:29:34 UTC] Removed the retired page directory: /tmp/heks-toon-spec-2/config/heks-linux/keybindings
[SUCCESS] [2026-10-26 12:29:34 UTC] Installed heks-toon configuration
[INFO] [2026-10-26 12:29:34 UTC] Creating directory: /tmp/heks-toon-spec-2
[INFO] [2026-10-26 12:29:34 UTC] Creating directory: /tmp/heks-toon-spec-2/again
[INFO] [2026-10-26 12:29:34 UTC] Retiring the HTML pages heks-toon replaces
[INFO] [2026-10-26 12:29:34 UTC] load-local-overrides: Attempting override resolution for module (heks-linux toon) with profile 'toon-settings'
[INFO] [2026-10-26 12:29:34 UTC] load-local-overrides: $XDG_CONFIG_HOME empty/unset, falling back to $HOME/.config
[INFO] [2026-10-26 12:29:34 UTC] load-local-overrides: Checking for override file at: /root/.config/heks-linux/toon-settings.scm
[INFO] [2026-10-26 12:29:34 UTC] load-local-overrides: No override file found at /root/.config/heks-linux/toon-settings.scm. Skipping.
[INFO] [2026-10-26 12:29:34 UTC] Removed the retired page launcher: /tmp/heks-toon-spec-2/again/heks-keybindings
[SUCCESS] [2026-10-26 12:29:34 UTC] Installed heks-toon configuration
[INFO] [2026-10-26 12:29:34 UTC] Retiring the HTML pages heks-toon replaces
[INFO] [2026-10-26 12:29:34 UTC] load-local-overrides: Attempting override resolution for module (heks-linux toon) with profile 'toon-settings'
[INFO] [2026-10-26 12:29:34 UTC] load-local-overrides: $XDG_CONFIG_HOME empty/unset, falling back to $HOME/.config
[INFO] [2026-10-26 12:29:34 UTC] load-local-overrides: Checking for override file at: /root/.config/heks-linux/toon-settings.scm
[INFO] [2026-10-26 12:29:34 UTC] load-local-overrides: No override file found at /root/.config/heks-linux/toon-settings.scm. Skipping.
[SUCCESS] [2026-10-26 12:29:34 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 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 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 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 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] 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
[🧪 test] Retiring A Second Time Is Harmless
[⚙️ assert] The launcher should be gone after both runs✅ got: #tℹ️ info - ran 1 tasks in: 0 seconds, 82354 microseconds
running unit tests from file: niri-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)
+----------------------------------------------+
[📑 suite] Niri Configuration Suite
[🧪 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] 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
[🧪 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] 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] 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] Clipboard History Is Recorded
[⚙️ assert] The clipboard watcher should be started with the session✅ 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] 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] 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] 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ℹ️ info - ran 1 tasks in: 0 seconds, 257666 microseconds
running unit tests from file: zen-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)
+----------------------------------------------+
[📑 suite] Parameters
[🧪 test] Adblock Prefs Can Be Turned Off
[⚙️ assert] The sideload scopes disappear✅ got: #f
[🧪 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] 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
[🧪 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] Hardening Can Be Turned Off
[⚙️ assert] Turning hardening off drops the block✅ got: #f
[⚙️ assert] The layout is still declared✅ got: #t
[🧪 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
+----------------------------------------------+
[📑 suite] Value Serialization
[🧪 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] 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] 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] Generated File
[🧪 test] Vertical Tabs Are Declared
[⚙️ assert] The tab bar is vertical✅ got: #t
[⚙️ assert] The tab bar stays on the left✅ got: #t;;; 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/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 ./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/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 ./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/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 ./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 ./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/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/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 ./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 ./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"
;;; 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/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 ./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/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/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
[⚙️ assert] The sidebar starts expanded✅ got: #t
[⚙️ assert] The sidebar has a laptop-friendly width✅ got: #t
[🧪 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 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 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] 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ℹ️ info - ran 3 tasks in: 0 seconds, 91998 microseconds
running unit tests from file: gtk-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)
+----------------------------------------------+
[📑 suite] GTK Configuration Suite
[🧪 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] 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] dconf Button Layout
[⚙️ assert] The window manager should place the traffic lights on the left✅ got: 'close,minimize,maximize:'
[🧪 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 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ℹ️ info - ran 1 tasks in: 0 seconds, 19293 microseconds
running unit tests from file: flatpak-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)
+----------------------------------------------+
[📑 suite] Catalog
[🧪 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
[🧪 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
+----------------------------------------------+
[📑 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] Overrides
[🧪 test] An Extra Can Change An Existing Remote
[⚙️ assert] The extra declaration wins over the category✅ got: flathub-beta
[🧪 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] A Duplicate Extra Entry Is Installed Once
[⚙️ assert] The first declaration wins✅ got: 1
[🧪 test] Extra Applications Join The Union
[⚙️ assert] An extra application joins the union✅ got: #t
+----------------------------------------------+
[📑 suite] Application Declarations
[🧪 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
[🧪 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ℹ️ info - ran 4 tasks in: 0 seconds, 47055 microseconds
running unit tests from file: wezterm-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)
+----------------------------------------------+
[📑 suite] Guarded Bindings
[🧪 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] 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] 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] Control+C Stays The Interrupt
[⚙️ assert] Control+C is never taken by the terminal✅ got: #f
[🧪 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] 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] 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
[🧪 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
+----------------------------------------------+
[📑 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] 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] 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] 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] 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) }
+----------------------------------------------+
[📑 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] 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] 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] 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
[🧪 test] A Prefix Matches With Control Held Or Released
[⚙️ assert] Each entry is expanded into both spellings✅ got: #tℹ️ info - ran 7 tasks in: 1 seconds, -689734 microseconds
running unit tests from file: bridges-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)
+----------------------------------------------+
[📑 suite] bridges test suite
[🧪 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
[🧪 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ℹ️ info - ran 1 tasks in: 0 seconds, 4637 microseconds
running unit tests from file: palette-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)
+----------------------------------------------+
[📑 suite] Palette Registry Suite
[🧪 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] Golden Gate Is More Transparent
[⚙️ assert] Both Golden Gate variants must be more transparent than every other palette✅ 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] 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] 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 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] 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ℹ️ info - ran 1 tasks in: 0 seconds, 26889 microseconds
running unit tests from file: image-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)
+----------------------------------------------+
[📑 suite] Heks-Linux Live Image Suite
[🧪 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 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 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] 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 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] 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] 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 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
[🧪 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] 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] 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 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ℹ️ info - ran 1 tasks in: 0 seconds, 87953 microseconds
running unit tests from file: mako-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 400453836 (replay with VERITAS_SEED=400453836)
+----------------------------------------------+
[📑 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, 8532 microseconds
finished running tests
./src/heks-linux/gtk.scm failed:
;;; failed to create path for auto-compiled file "./src/heks-linux/gtk.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/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/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 ./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/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/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"
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.
;;; note: source file /etc/byggsteg/job-clone/heks-linux/trunk/maak.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/heks-linux/trunk/maak.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/maak.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/heks-linux/trunk/maak.scm.go
channels.scm:54:6: warning: channel 'jointhefreeworld' is not trusted
[INFO] [2026-10-26 13:29:36 CET] load-local-overrides: Attempting override resolution for module (heks-linux user-settings) with profile 'local-settings'
[INFO] [2026-10-26 13:29:36 CET] load-local-overrides: $XDG_CONFIG_HOME empty/unset, falling back to $HOME/.config
[INFO] [2026-10-26 13:29:36 CET] load-local-overrides: Checking for override file at: /root/.config/heks-linux/local-settings.scm
[INFO] [2026-10-26 13:29:36 CET] load-local-overrides: No override file found at /root/.config/heks-linux/local-settings.scm. Skipping.
API documentation saved to doc/api
channels.scm:54:6: warning: channel 'jointhefreeworld' is not trusted
index.texi:2263: warning: @end should only appear at the beginning of a line
index.texi:2277: warning: @end should only appear at the beginning of a line
index.texi:2292: 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_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_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'