wikimusic-6e28186d-6f09 (retry fd883b3a)

job failed

starting new job...


→ running command: dir='/etc/byggsteg/job-clone//wikimusic/trunk'
branch='trunk'
if ! command -v git >/dev/null 2>&1; then
  echo 'byggsteg: git is not on this deployment PATH, so the clone cannot be updated' >&2
  exit 1
fi
if ! cd "$dir"; then
  echo "byggsteg: cannot enter the clone $dir" >&2
  exit 1
fi
root=$(git rev-parse --show-toplevel 2>/dev/null)
if [ "$root" != "$(pwd -P)" ]; then
  echo "byggsteg: $dir is not a git checkout; remove it and the next run clones it again" >&2
  exit 1
fi
if ! origin=$(git remote get-url origin 2>/dev/null); then
  echo "byggsteg: $dir has no origin remote to fetch $branch from" >&2
  exit 1
fi
before=$(git rev-parse --short HEAD 2>/dev/null) || before=none
attempt=1
while :; do
  if GIT_TERMINAL_PROMPT=0 git fetch --quiet origin "+refs/heads/$branch:refs/remotes/origin/$branch"; then
    break
  fi
  if [ "$attempt" -ge 3 ]; then
    echo "byggsteg: could not fetch $branch from $origin after 3 attempts; is the branch still there, and is the remote reachable?" >&2
    exit 1
  fi
  echo "byggsteg: fetching $branch from $origin failed; retrying in $((attempt * 2))s" >&2
  sleep $((attempt * 2))
  attempt=$((attempt + 1))
done
if ! git checkout --quiet --force -B "$branch" FETCH_HEAD; then
  echo "byggsteg: fetched $branch from $origin but could not check it out" >&2
  exit 1
fi
after=$(git rev-parse --short HEAD)
if [ "$before" = "$after" ]; then
  echo "byggsteg: $branch was already at $after"
else
  echo "byggsteg: $branch moved from $before to $after"
fi


byggsteg: trunk was already at d27fc68

→ running command: cd /etc/byggsteg/job-clone/wikimusic/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/wikimusic/trunk && git log --name-status HEAD^..HEAD

commit d27fc689c96c5c3dd7f6f29d76937a1287f28775
Author: Josep Bigorra <jjbigorra@gmail.com>
Date:   Wed Nov 4 23:22:51 2026 +0100

    feat: Put the project logo in the navigation bar

M       lib/wikimusic/config.scm
M       lib/wikimusic/html.scm
M       pub/favicon.ico
A       pub/img/wikimusic-logo.png
A       pub/img/wikimusic-logo.svg
D       pub/img/wikimusic.jpg
M       resources/assets/fetch.scm

→ running command: cd /etc/byggsteg/job-clone/wikimusic/trunk && maak test


scanning directories for unit tests...
scanning present working directory for unit tests...

shuffled the files with seed 143480906 (replay with VERITAS_SEED=143480906)

found unit tests: (assets-spec.scm guitarpro-view-spec.scm about-spec.scm controller-spec.scm sql-spec.scm config-spec.scm domain-spec.scm views-spec.scm error-pages-spec.scm auth-spec.scm guitarpro-spec.scm)


running unit tests from file: assets-spec.scm, entrypoint: spec


ℹ️ info - shuffled with seed 143480906 (replay with VERITAS_SEED=143480906)
+----------------------------------------------+
[📑 suite] A face is named after what it carries
  [🧪 test] the family, the subset and the slope are all in the name
    [⚙️ assert] a straight face names no slope
    ✅ got: worksans-latin.woff2
    [⚙️ assert] a sloped one says so
    ✅ got: sourceserif4-latin-italic.woff2
    [⚙️ assert] and a subset that is not latin is kept apart
    ✅ got: worksans-latin-ext-italic.woff2
+----------------------------------------------+
[📑 suite] A fetched stylesheet names the files beside it
  [🧪 test] each face is named for the block it stands in
    [⚙️ assert] the addresses and the names line up
    ✅ got: ((https://fonts.gstatic.com/s/worksans/v25/aaa111.woff2 . worksans-latin-ext-italic.woff2) (https://fonts.gstatic.com/s/worksans/v25/bbb222.woff2 . worksans-latin.woff2) (https://fonts.gstatic.com/s/sourceserif4/v9/ccc333.woff2 . sourceserif4-latin-italic.woff2))
  [🧪 test] the address of the host it came from is gone
    [⚙️ assert] no gstatic face is asked for
    ✅ got: #t
    [⚙️ assert] nor any other absolute address
    ✅ got: #t
    [⚙️ assert] the file beside it is named instead
    ✅ got: #t
  [🧪 test] every face the answer named is a face to fetch
    [⚙️ assert] three faces, three files
    ✅ got: ((https://fonts.gstatic.com/s/worksans/v25/aaa111.woff2 . worksans-latin-ext-italic.woff2) (https://fonts.gstatic.com/s/worksans/v25/bbb222.woff2 . worksans-latin.woff2) (https://fonts.gstatic.com/s/sourceserif4/v9/ccc333.woff2 . sourceserif4-latin-italic.woff2))
  [🧪 test] what the face says about itself is kept
    [⚙️ assert] the format stays on the line
    ✅ got: #t
    [⚙️ assert] so does what the face asks of the reader
    ✅ got: #t
    [⚙️ assert] and the range it carries
    ✅ got: #t
    [⚙️ assert] the line saying which subset follows
    ✅ got: #t
    [⚙️ assert] and the stylesheet is as long as it was
    ✅ got: 27
+----------------------------------------------+
[📑 suite] An icon set is copied with what is served of it
  [🧪 test] the face names the file that is beside it, and only it
    [⚙️ assert] the woff2 clause ends the list
    ✅ got: #t
    [⚙️ assert] the older woff is not named
    ✅ got: #t
    [⚙️ assert] nor the ttf
    ✅ got: #t
    [⚙️ assert] nor the svg
    ✅ got: #t
  [🧪 test] a stylesheet with nothing to prune is left alone
    [⚙️ assert] the text comes back as it went in
    ✅ got: @font-face {
  font-family: "Phosphor";
  src:
    url("./Phosphor.woff2") format("woff2");
  font-weight: normal;
  font-style: normal;
  font-display: block;
}

.ph {
  font-family: "Phosphor" !important;
  line-height: 1;
}

  [🧪 test] what is left is still a stylesheet
    [⚙️ assert] the braces still balance
    ✅ got: 2
    [⚙️ assert] and they close as often
    ✅ got: 2
    [⚙️ assert] the face keeps its family
    ✅ got: #t
    [⚙️ assert] and the class the glyphs are worn with
    ✅ got: #t
    [⚙️ assert] no clause is left dangling
    ✅ got: #t
ℹ️ info - ran 3 tasks in: 0 seconds, 144050 microseconds

running unit tests from file: guitarpro-view-spec.scm, entrypoint: spec


ℹ️ info - shuffled with seed 143480906 (replay with VERITAS_SEED=143480906)
+----------------------------------------------+
[📑 suite] What a tab's own header is shown as
  [🧪 test] a key is listed by the name of the key and not the count
    [⚙️ assert] two flats is B flat
    ✅ got: Bb
  [🧪 test] every field a tab's author filled in is listed
    [⚙️ assert] the title
    ✅ got: a title
    [⚙️ assert] the artist
    ✅ got: an artist
    [⚙️ assert] the album
    ✅ got: an album
    [⚙️ assert] who tabbed it
    ✅ got: a tabber
  [🧪 test] a tempo is written as a reader reads it
    [⚙️ assert] a tempo in beats per minute
    ✅ got: 132 bpm
  [🧪 test] a field its author left empty is not listed at all
    [⚙️ assert] an empty artist
    ✅ got: #f
    [⚙️ assert] an album that was never read
    ✅ got: #f
    [⚙️ assert] a key with no name
    ✅ got: #f
  [🧪 test] the numbers a header always carries are always listed
    [⚙️ assert] the measures
    ✅ got: 42
    [⚙️ assert] the tracks
    ✅ got: 3
+----------------------------------------------+
[📑 suite] The name a tab is saved under
  [🧪 test] a name is still made of nothing
    [⚙️ assert] a version with no name of its own
    ✅ got: wikimusic-tab.gp5
    [⚙️ assert] and a song the page has not read yet
    ✅ got: wikimusic-tab.gp5
  [🧪 test] the name says which song and which version it is
    [⚙️ assert] the two together
    ✅ got: A Song - v1.gp5
  [🧪 test] the characters a file name cannot hold are replaced
    [⚙️ assert] a song whose name holds a slash and a colon
    ✅ got: A-B- C-D-.gp5
+----------------------------------------------+
[📑 suite] The section a version's tab is offered in
  [🧪 test] a tab whose header cannot be read says so and is still a download
    [⚙️ assert] the sentence
    ✅ got: #t
  [🧪 test] playing and stopping are offered once there is something to play
    [⚙️ assert] playing
    ✅ got: #t
    [⚙️ assert] and stopping
    ✅ got: #t
  [🧪 test] each version's section is named after the version it is
    [⚙️ assert] the score of the second version
    ✅ got: #t
    [⚙️ assert] and not the first version's
    ✅ got: #t
  [🧪 test] the controls and the score are on the page before they are used
    [⚙️ assert] the controls start hidden
    ✅ got: #t
    [⚙️ assert] the place a score is drawn in
    ✅ got: #t
  [🧪 test] a version carrying no tab is offered none
    [⚙️ assert] a field a reader never touched
    ✅ got: ()
    [⚙️ assert] and a version whose tab is not a tab at all
    ✅ got: ()
  [🧪 test] a version carrying a tab offers it for download
    [⚙️ assert] the link to the file
    ✅ got: #t
    [⚙️ assert] and the name it is saved under
    ✅ got: #t
  [🧪 test] the words the player shows are the page's own
    [⚙️ assert] while it loads
    ✅ got: #t
    [⚙️ assert] once it is drawn
    ✅ got: #t
    [⚙️ assert] and when it cannot be drawn
    ✅ got: #t
    [⚙️ assert] the state while loading is a place the script reaches
    ✅ got: #t
    [⚙️ assert] and the state once drawn
    ✅ got: #t
    [⚙️ assert] and the state that failed
    ✅ got: #t
  [🧪 test] and the offer to draw it here, which is a button and not a script
    [⚙️ assert] the button
    ✅ got: #t
ℹ️ info - ran 3 tasks in: 1 seconds, -812342 microseconds

running unit tests from file: about-spec.scm, entrypoint: spec


ℹ️ info - shuffled with seed 143480906 (replay with VERITAS_SEED=143480906)

❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)

+----------------------------------------------+
[📑 suite] What the page says the project is

❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)

+----------------------------------------------+
[📑 suite] The pages of an instance that asks for nothing

❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (search-box) #f)

+----------------------------------------------+
[📑 suite] The word the link is offered in
  [🧪 test] es_ES has a word for it
    [⚙️ assert] the label is translated
    ✅ got: #t
  [🧪 test] nl_NL has a word for it
    [⚙️ assert] the label is translated
    ✅ got: #t
  [🧪 test] ja_JP has a word for it
    [⚙️ assert] the label is translated
    ✅ got: #t
  [🧪 test] en_US has a word for it
    [⚙️ assert] the label is translated
    ✅ got: #t
+----------------------------------------------+
[📑 suite] The front page as a way in

❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (search-box) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (search-box) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (search-box) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (search-box) #f)

+----------------------------------------------+
[📑 suite] The order the page says things in

❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)

+----------------------------------------------+
[📑 suite] What the page tells a crawler

❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)

+----------------------------------------------+
[📑 suite] The words the two pages share

❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (search-box) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)


❌ error - task raised an error: unbound-variable: (#f Unbound variable: ~S (html-template) #f)

+----------------------------------------------+
[📑 suite] The link to the page
  [🧪 test] every page offers it
    [⚙️ assert] the footer links to it
    ✅ got: #t
    [⚙️ assert] and says where it leads
    ✅ got: #t
ℹ️ info - ran 9 tasks in: 1 seconds, -576416 microseconds

❌ error - 
aborting due to error in test case...

;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0
;;;       or pass the --no-auto-compile argument to disable.
;;; compiling /etc/byggsteg/job-clone/wikimusic/trunk/env.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/env.scm.go
;;; compiling ./test/veritas/unit/assets-spec.scm
;;; compiling ./resources/assets/fetch.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/resources/assets/fetch.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/test/veritas/unit/assets-spec.scm.go
;;; compiling ./test/veritas/unit/guitarpro-view-spec.scm
;;; compiling ./app/views/song-content-view.scm
;;; compiling ./lib/wikimusic/html.scm
WARNING: (hygguile hygguile): imported module (hygguile components select) overrides core binding `select'
;;; compiling ./lib/wikimusic/config.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/lib/wikimusic/config.scm.go
;;; compiling ./lib/wikimusic/seo.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/lib/wikimusic/seo.scm.go
WARNING: (wikimusic html): imported module (hygguile hygguile) overrides core binding `select'
WARNING: (wikimusic html): `get-short-commit-sha' imported from both (kracht prelude) and (hygguile hygguile)
;;; WARNING: compilation of ./lib/wikimusic/html.scm failed:
;;; Syntax error:
;;; unknown location: source expression failed to match any pattern in form (@ (src (unquote (asset-address "/img/wikimusic-logo.svg"))) (alt "") (loading lazy) (class (unquote (mk-class (quote (shrink-0 h-8 w-auto sm:h-9))))))
WARNING: (wikimusic html): imported module (hygguile hygguile) overrides core binding `select'
WARNING: (wikimusic html): `get-short-commit-sha' imported from both (kracht prelude) and (hygguile hygguile)
;;; WARNING: compilation of ./app/views/song-content-view.scm failed:
;;; Syntax error:
;;; unknown location: source expression failed to match any pattern in form (@ (src (unquote (asset-address "/img/wikimusic-logo.svg"))) (alt "") (loading lazy) (class (unquote (mk-class (quote (shrink-0 h-8 w-auto sm:h-9))))))
;;; compiling ./lib/wikimusic/domain.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/lib/wikimusic/domain.scm.go
;;; compiling ./lib/wikimusic/guitarpro.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/lib/wikimusic/guitarpro.scm.go
;;; compiling ./lib/wikimusic/domain/guitar-chord-guide.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/lib/wikimusic/domain/guitar-chord-guide.scm.go
WARNING: (app views song-content-view): imported module (hygguile hygguile) overrides core binding `select'
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/test/veritas/unit/guitarpro-view-spec.scm.go
;;; compiling ./test/veritas/unit/about-spec.scm
;;; compiling ./test/support/deployment.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/test/support/deployment.scm.go
;;; compiling ./app/views/about.scm
;;; compiling ./lib/wikimusic/prose.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/lib/wikimusic/prose.scm.go
;;; compiling ./app/views/index.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/app/views/index.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/app/views/about.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/test/veritas/unit/about-spec.scm.go


--------------------------------------------------------------

Maak 0.14.0: the infinitely extensible command runner

Loading tasks from Maak file: /etc/byggsteg/job-clone/wikimusic/trunk/maak.scm

Executing Maak tasks: test


--------------------------------------------------------------

=> Running Maak task: test

  Run the project's test suite, one spec at a time, from test/veritas.

Executing: guix time-machine --channels=channels.scm -- shell -m manifest.scm -- guile --fresh-auto-compile -L ./lib -L ./test -L . -c '(load "env.scm")(begin (setlocale LC_ALL "C.UTF-8") (use-modules (veritas runner)) (run-tests))'

maak: error: command failed (exit code 1): guix time-machine --channels=channels.scm -- shell -m manifest.scm -- guile --fresh-auto-compile -L ./lib -L ./test -L . -c '(load "env.scm")(begin (setlocale LC_ALL "C.UTF-8") (use-modules (veritas runner)) (run-tests))'
        hint: Fix the command above, or run `maak --dry-run' to inspect it first.
inspect the job's lambda expression
(lambda()
  `((task . ("maak-test" "maak-migrate" "maak-deploy" "pull-and-restart"))
    (daemon-name . "wikimusic-daemon")
    (project . "wikimusic")
    (branch-name . "trunk")
    (clone-url . "https://github.com/jjba23/wikimusic.git")))