wikimusic-11a32789-6cee

job succeeded

time taken
17 seconds
started at
Wed Oct 14 14:14:47 2026
updated at
Wed Oct 14 14:15:04 2026
log uuid
11a32789-6cee-4f51-9dbc-1de15aae3269
inspect the job's lambda expression
(lambda()
  `((task . ("maak-test" "pull-and-restart" "maak-deploy"))
    (daemon-name . "wikimusic-daemon")
    (project . "wikimusic")
    (branch-name . "trunk")
    (clone-url . "https://codeberg.org/jjba23/wikimusic.git")))
starting new job...


→ running command: cd "/etc/byggsteg/job-clone//wikimusic/trunk" && git reset --hard && git pull

HEAD is now at 6b046e9 feat: Improve music encyclopaedia
From https://codeberg.org/jjba23/wikimusic
   6b046e9..7a3ea54  trunk      -> origin/trunk
Updating 6b046e9..7a3ea54
Fast-forward
 .woodpecker/byggsteg.yaml | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

→ running command: cd /etc/byggsteg/job-clone/wikimusic/trunk && uname -a

Linux wolk-jjba 7.1.5-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 7a3ea54e12e0b1c5a502956029807a75f12039e4
Author: Josep Bigorra <jjbigorra@gmail.com>
Date:   Wed Oct 14 14:14:26 2026 +0200

    feat: Add test stage in CI/CD

M       .woodpecker/byggsteg.yaml

→ 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 654235431 (replay with VERITAS_SEED=654235431)

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


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


?? info - shuffled with seed 654235431 (replay with VERITAS_SEED=654235431)
+----------------------------------------------+
[? suite] What the page says the project is
  [? test] it names what the project is
    [?? assert] and what it works towards
    ? got: #t
    [?? assert] the community is named
    ? got: #t
  [? test] it ends on an invitation
    [?? assert] the last line is the invitation
    ? got: #t
  [? test] it says what the project is built on
    [?? assert] and so is the architecture
    ? got: #t
    [?? assert] the language is named
    ? got: #t
  [? test] it introduces the list of what a reader can do
    [?? assert] the list is introduced
    ? got: #t
+----------------------------------------------+
[? suite] The pages of an instance that asks for nothing
  [? test] and the front page asks for nothing either
    [?? assert] and none of the words that are on one
    ? got: #f
    [?? assert] there is no control
    ? got: #f
  [? test] the about page asks for nothing
    [?? assert] and none of the words that are on one
    ? got: #f
    [?? assert] and nothing about what the money pays for
    ? got: #f
    [?? assert] there is no control
    ? got: #f
  [? test] what the pages are for is still said
    [?? assert] the promises are still made
    ? got: #t
    [?? assert] and the front page still invites
    ? got: #t
+----------------------------------------------+
[? suite] What the page promises a reader can do
  [? test] ?Contribute by adding new compositions, a?? is promised
    [?? assert] and it is said once
    ? got: 1
    [?? assert] it is an item of the list
    ? got: #t
  [? test] ?Organize information with structured met?? is promised
    [?? assert] and it is said once
    ? got: 1
    [?? assert] it is an item of the list
    ? got: #t
  [? test] ?Learn through curated resources that con?? is promised
    [?? assert] and it is said once
    ? got: 1
    [?? assert] it is an item of the list
    ? got: #t
  [? test] ?Discover music from diverse genres and t?? is promised
    [?? assert] it is an item of the list
    ? got: #t
    [?? assert] and it is said once
    ? got: 1
+----------------------------------------------+
[? suite] The order the page says things in
  [? test] the list stands under the sentence that introduces it
    [?? assert] the introduction comes first
    ? got: #t
  [? test] the account of the place comes before the ask
    [?? assert] nothing is asked for before anything is said
    ? got: #t
  [? test] the promises keep the order they were written in
    [?? assert] each one follows the one before it
    ? got: #t
+----------------------------------------------+
[? suite] What the page tells a crawler
  [? test] the page says what kind of page it is
    [?? assert] the page states its own type
    ? got: #t
    [?? assert] and names the community as its subject
    ? got: #t
  [? test] the title names the community
    [?? assert] the page is titled
    ? got: #t
  [? test] the description is the page's own one
    [?? assert] a search result shows the community
    ? got: #t
+----------------------------------------------+
[? suite] The link to the page
  [? test] every page offers it
    [?? assert] and says where it leads
    ? got: #t
    [?? assert] the footer links to it
    ? got: #t
+----------------------------------------------+
[? suite] The word the link is offered in
  [? test] en_US 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] nl_NL has a word for it
    [?? assert] the label is translated
    ? got: #t
  [? test] es_ES has a word for it
    [?? assert] the label is translated
    ? got: #t
+----------------------------------------------+
[? suite] The front page as a way in
  [? test] the search control carries the words to the collection
    [?? assert] the form names the collection
    ? got: #t
    [?? assert] and the field its words are read from
    ? got: #t
  [? test] the first screen says what is in the place
    [?? assert] the summary is read under the tagline
    ? got: #t
    [?? assert] and it is read after it
    ? got: #t
  [? test] a page with no artists to show is still the whole page
    [?? assert] no heading over nothing
    ? got: #f
  [? test] both shelves of the collection are shown, songs first
    [?? assert] the songs are there
    ? got: #t
    [?? assert] and so are the artists
    ? got: #t
    [?? assert] with a way to the rest of them
    ? got: #t
    [?? assert] in the order they are read
    ? got: #t
+----------------------------------------------+
[? suite] The words the two pages share
  [? test] the one ask is the same control on both pages
    [?? assert] the about page asks
    ? got: #t
    [?? assert] and so does the front page
    ? got: #t
    [?? assert] offered in the project's own words
    ? got: #t
  [? test] both pages name the place the same way
    [?? assert] the about page says it
    ? got: #t
    [?? assert] and so does the front page
    ? got: #t
  [? test] both pages close on the same invitation
    [?? assert] and so does the front page
    ? got: #t
    [?? assert] the about page invites
    ? got: #t
  [? test] the account of the project belongs to the about page
    [?? assert] the front page is still the collection
    ? got: #f
?? info - ran 9 tasks in: 0 seconds, 6666 microseconds

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


?? info - shuffled with seed 654235431 (replay with VERITAS_SEED=654235431)
+----------------------------------------------+
[? suite] Which related rows belong to an entry
  [? test] the identifier compared against is the entry's own
    [?? assert] nor is another entry's row this one's
    ? got: ()
    [?? assert] a row naming a song is not the artist's row
    ? got: ()
  [? test] a genre is matched on the genre's identifier
    [?? assert] the row naming this genre
    ? got: (((artist-identifier . artist-1) (genre-identifier . genre-1) (song-identifier . song-1) (display-name . the one that matches)))
  [? test] an artist is matched on the artist's identifier
    [?? assert] the row naming this artist
    ? got: (((artist-identifier . artist-1) (genre-identifier . genre-1) (song-identifier . song-1) (display-name . the one that matches)))
  [? test] a song is matched on the song's identifier
    [?? assert] the row naming this song
    ? got: (((artist-identifier . artist-1) (genre-identifier . genre-1) (song-identifier . song-1) (display-name . the one that matches)))
+----------------------------------------------+
[? suite] What a sort control means
  [? test] the clause names a column and a direction, and nothing else
    [?? assert] and a clause is all there is to it
    ? got: 2
  [? test] every sort the pages offer maps onto its own clause
    [?? assert] edited most recently
    ? got: ((last-edited-at desc))
    [?? assert] most viewed first
    ? got: ((views desc))
    [?? assert] least viewed first
    ? got: ((views asc))
    [?? assert] oldest first
    ? got: ((created-at asc))
    [?? assert] edited longest ago
    ? got: ((last-edited-at asc))
    [?? assert] by name, ascending
    ? got: ((display-name asc))
    [?? assert] newest first
    ? got: ((created-at desc))
    [?? assert] by name, descending
    ? got: ((display-name desc))
  [? test] something the page does not offer sorts the default way
    [?? assert] an unknown sort falls back
    ? got: ((last-edited-at desc))
    [?? assert] so does an empty one
    ? got: ((last-edited-at desc))
  [? test] a sort that is spelled like SQL is not passed through
?? info - ran 2 tasks in: 0 seconds, 2434 microseconds

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


?? info - shuffled with seed 654235431 (replay with VERITAS_SEED=654235431)
+----------------------------------------------+
[? 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: intelonemono-latin.woff2
    [?? assert] a sloped one says so
    ? got: plusjakartasans-latin-italic.woff2
    [?? assert] and a subset that is not latin is kept apart
    ? got: intelonemono-symbols2-italic.woff2
+----------------------------------------------+
[? suite] A fetched stylesheet names the files beside it
  [? test] every face the answer named is a face to fetch
    [?? assert] three faces, three files
    ? got: ((https://fonts.gstatic.com/s/intelonemono/v25/aaa111.woff2 . intelonemono-symbols2-italic.woff2) (https://fonts.gstatic.com/s/intelonemono/v25/bbb222.woff2 . intelonemono-latin.woff2) (https://fonts.gstatic.com/s/plusjakartasans/v9/ccc333.woff2 . plusjakartasans-latin-italic.woff2))
  [? test] each face is named for the block it stands in;;; 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/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/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/html.scm
WARNING: (hygguile hygguile): imported module (hygguile components select) overrides core binding `select'
;;; 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)
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/lib/wikimusic/html.scm.go
;;; 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
WARNING: (wikimusic html): `get-short-commit-sha' imported from both (kracht prelude) and (hygguile hygguile)
WARNING: (wikimusic html): imported module (hygguile hygguile) overrides core binding `select'
;;; compiling ./test/veritas/unit/domain-spec.scm
;;; 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
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/test/veritas/unit/domain-spec.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/controller-spec.scm
;;; compiling ./lib/wikimusic/controller.scm
;;; compiling ./lib/wikimusic/sqlite/util.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/lib/wikimusic/sqlite/util.scm.go
;;; compiling ./lib/wikimusic/sqlite/comment.scm
;;; compiling ./lib/wikimusic/domain/comment.scm
;;; compiling ./lib/wikimusic/domain/repo.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/lib/wikimusic/domain/repo.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/lib/wikimusic/domain/comment.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/lib/wikimusic/sqlite/comment.scm.go
;;; compiling ./lib/wikimusic/auth.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/lib/wikimusic/auth.scm.go
;;; compiling ./app/views/error.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/app/views/error.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/lib/wikimusic/controller.scm.go
;;; compiled 
    [?? assert] the addresses and the names line up
    ? got: ((https://fonts.gstatic.com/s/intelonemono/v25/aaa111.woff2 . intelonemono-symbols2-italic.woff2) (https://fonts.gstatic.com/s/intelonemono/v25/bbb222.woff2 . intelonemono-latin.woff2) (https://fonts.gstatic.com/s/plusjakartasans/v9/ccc333.woff2 . plusjakartasans-latin-italic.woff2))
  [? test] the address of the host it came from is gone
    [?? assert] the file beside it is named instead
    ? got: #t
  [? test] what the face says about itself is kept
    [?? 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] 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] no clause is left dangling
    ? got: #t
?? info - ran 3 tasks in: 0 seconds, 19361 microseconds

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


?? info - shuffled with seed 654235431 (replay with VERITAS_SEED=654235431)
+----------------------------------------------+
[? suite] The guard a mistyped address reaches
  [? test] a row that was found is handed on as it is
    [?? assert] what it is called does not decide what it returns
    ? got: #t
    [?? assert] and nothing about it is rewritten
    ? got: ((identifier . 1c9a5b7e-2f3a-4c5d-9e0f-1a2b3c4d5e6f) (display-name . blue))
    [?? assert] the very row comes back, not a copy
    ? got: #t
  [? test] a lookup that found an empty list is a lookup that found nothing
    [?? assert] an empty list is answered like #f
    ? got: 404
  [? test] the answer says what was looked for, and where
    [?? assert] the message names the kind of thing and the identifier
    ? got: no genre with the identifier a-genre-that-is-not-there
  [? test] a lookup that found nothing is answered with a 404
    [?? assert] and its arguments come as a list
    ? got: #t
+----------------------------------------------+
[? suite] The ownership half of who may change a row
  [? test] a contributor does not change a row somebody else made
    [?? assert] someone else's row is refused
    ? got: #f
  [? test] a row that names no creator is only the super grant's to change
    [?? assert] a row with no creator is refused
    ? got: #f
    [?? assert] while the super grant may still change it
    ? got: #t
  [? test] the super grant changes any row, whoever made it
    [?? assert] and a row of its own
    ? got: #t
    [?? assert] a row another user created
    ? got: #t
  [? test] a contributor changes the row they made
    [?? assert] their own row is theirs to change
    ? got: #t
?? info - ran 2 tasks in: 0 seconds, 2435 microseconds

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


?? info - shuffled with seed 654235431 (replay with VERITAS_SEED=654235431)
+----------------------------------------------+
[? suite] What a base64 text spells
  [? test] a text that is not base64 is refused rather than guessed at
    [?? assert] a text that ends in a lone character
    ? success catching error: misc-error: (#f base64-decode-string: the text ends in a lone base64 character () #f)
    [?? assert] a character outside the alphabet
    ? success catching error: misc-error: (#f base64-decode-string: not a base64 character ~S (*) #f)
  [? test] a text whose bytes are known decodes to them
    [?? assert] six characters is two whole groups
    ? got: hello!
    [?? assert] three characters
    ? got: hi
    [?? assert] two characters
    ? got: h
    [?? assert] five characters
    ? got: hello
  [? test] a text broken across lines is read as one
    [?? assert] whitespace between the characters is ignored
    ? got: hello
  [? test] the encoding a browser does round-trips through the decoder
    [?? assert] a word
    ? got: wikimusic
    [?? assert] one whole group of three
    ? got: abc
    [?? assert] one character, the shortest text that needs padding
    ? got: a
    [?? assert] a text whose bytes are not its characters
    ? got: a title with an accent: caf?
+----------------------------------------------+
[? suite] What a data URL holds
  [? test] an empty value is not a data URL
    [?? assert] the empty string
    ? got: #f
    [?? assert] nor is a path
    ? got: #f
  [? test] a base64 data URL is one, and its bytes come back
    [?? assert] a file posted by a browser
    ? got: #t
    [?? assert] the bytes after the comma
    ? got: hi
  [? test] a data URL that holds something other than base64 holds no bytes
    [?? assert] a text data URL
    ? got: #f
    [?? assert] a base64 text that does not decode
    ? got: #f
  [? test] a version's own file is read through its data URL
    [?? assert] the title
    ? got: through a data url
    [?? assert] the tempo
    ? got: 90
+----------------------------------------------+
[? suite] The key a header names
  [? test] each signature of the fifteen is named
    [?? assert] two flats is B flat
    ? got: Bb
    [?? assert] seven flats is C flat
    ? got: Cb
    [?? assert] no accidentals is C
    ? got: C
    [?? assert] seven sharps is C sharp
    ? got: C#
    [?? assert] one sharp is G
    ? got: G
  [? test] a number no signature has is not named at all
    [?? assert] and one sharp too many
    ? got: #f
    [?? assert] one flat too many
    ? got: #f
+----------------------------------------------+
[? suite] What the header of a Guitar Pro 5 file declares
  [? test] a header written by a release after 5.0 is read the same way
    [?? assert] the tempo of a 5.0 file
    ? got: 155
    [?? assert] the track count of a 5.0 file
    ? got: 5
    [?? assert] the tempo of a 5.1 file
    ? got: 155
    [?? assert] the track count of a 5.1 file
    ? got: 5
  [? test] a field whose two lengths disagree is refused
    [?? assert] a string that claims a length it does not have
    ? got: #f
  [? test] the reader consumes exactly the header and nothing more
    [?? assert] a file with no title
    ? got: 1056
    [?? assert] a file with two notice lines
    ? got: 1092
    [?? assert] a file of the earlier release
    ? got: 1058
    [?? assert] a file with a long title
    ? got: 1093
    [?? assert] the plain file
    ? got: 1063
    [?? assert] a file with numbers at their widest
    ? got: 1063
  [? test] a file of the right generation that is cut short is refused
    [?? assert] a header missing its last fields
    ? got: #f
    [?? assert] a file missing its whole header
    ? got: #f
  [? test] a file that is not a readable Guitar Pro 5 file is answered with #f
    [?? assert] a pdf
    ? got: #f
    [?? assert] nothing at all
    ? got: #f
    [?? assert] a text file
    ? got: #f
    [?? assert] a Guitar Pro 4 file
    ? got: #f
  [? test] a file whose counts cannot be true is refused
    [?? assert] a negative measure count
    ? got: #f
  [? test] every field of a written file is read back
    [?? assert] the release
    ? got: (5 10)
    [?? assert] the tempo
    ? got: 132
    [?? assert] the key it names
    ? got: Bb
    [?? assert] the tracks
    ? got: 3
    [?? assert] the artist, two fields along
    ? got: an artist
    [?? assert] the key signature
    ? got: -2
    [?? assert] the lyrics
    ? got: (the words of the song)
    [?? assert] the title
    ? got: a title
    [?? assert] the measures
    ? got: 42
    [?? assert] the notice lines, in order
    ? got: (first notice second notice)
?? info - ran 4 tasks in: 0 seconds, 4145 microseconds

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


?? info - shuffled with seed 654235431 (replay with VERITAS_SEED=654235431)
+----------------------------------------------+
[? suite] What a tab's own header is shown as
  [? test] a field its author left empty is not listed at all
    [?? assert] a key with no name
    ? got: #f
  [? test] every field a tab's author filled in is listed
    [?? 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 key is listed by the name of the key and not the count
    [?? assert] two flats is B flat
    ? got: Bb
  [? test] the numbers a header always carries are always listed
    [?? assert] the tracks
    ? got: 3
+----------------------------------------------+
[? suite] The name a tab is saved under
  [? 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
  [? test] a name is still made of nothing
    [?? assert] and a song the page has not read yet
    ? got: wikimusic-tab.gp5
    [?? assert] a version with no name of its own
    ? got: wikimusic-tab.gp5
  [? test] the name says which song and which version it is
    [?? assert] the two together
    ? got: A Song - v1.gp5
+----------------------------------------------+
[? suite] The section a version's tab is offered in
  [? test] each version's section is named after the version it is
    [?? assert] and not the first version's
    ? got: #t
  [? test] playing and stopping are offered once there is something to play
    [?? assert] and stopping
    ? got: #t
    [?? assert] playing
    ? got: #t
  [? test] a tab whose header cannot be read says so and is still a download
    [?? assert] the sentence
    ? got: #t
  [? test] and the offer to draw it here, which is a button and not a script
    [?? assert] the button
    ? 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] 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] the state while loading is a place the script reaches
    ? got: #t
    [?? assert] once it is drawn
    ? got: #t
    [?? assert] and when it cannot be drawn
    ? got: #t
    [?? assert] and the state once drawn
    ? got: #t
    [?? assert] and the state that failed
    ? got: #t
  [? test] the controls and the score are on the page before they are used
    [?? assert] the place a score is drawn in
    ? got: #t
    [?? assert] the controls start hidden
    ? got: #t
?? info - ran 3 tasks in: 0 seconds, 2825 microseconds

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


?? info - shuffled with seed 654235431 (replay with VERITAS_SEED=654235431)
+----------------------------------------------+
[? suite] Rendering a statement for the driver
  [? test] a value is rendered as a literal, and its quotes are doubled
    [?? assert] an apostrophe inside a value is doubled
    ? got: SELECT * FROM "songs" WHERE "display_name" = 'O''Brien'
    [?? assert] so every quote it carries is paired
    ? got: 4
    [?? assert] a string is quoted
    ? got: SELECT * FROM "songs" WHERE "display_name" = 'x'
    [?? assert] a value that means to end the string cannot
    ? got: SELECT * FROM "songs" WHERE "display_name" = '''; DROP TABLE users; --'
  [? test] a statement string is passed through untouched
    [?? assert] a plain string
    ? got: SELECT 1
    [?? assert] a statement with a quoted value of its own
    ? got: SELECT 'x'
  [? test] a number and a boolean are not quoted
    [?? assert] a true value is written as 1
    ? got: SELECT * FROM "songs" WHERE "views" = 1
    [?? assert] a number is written as itself
    ? got: SELECT * FROM "songs" WHERE "views" = 3
  [? test] column names are quoted as identifiers
    [?? assert] a hyphenated symbol is spelled underscore
    ? got: UPDATE "users" SET "password" = 'argon2id$x' WHERE "identifier" = 'id-1'
+----------------------------------------------+
[? suite] Accounting for placeholders
  [? test] the number of values has to match the number of placeholders
    [?? assert] a value too few is an error rather than a guess
    ? got: #t
    [?? assert] a placeholder with no value is refused, not left behind
    ? got: #t
    [?? assert] a value too many is an error too
    ? got: #t
  [? test] something that is neither a query nor a string is refused
    [?? assert] nor is a symbol
    ? got: #t
    [?? assert] a number is not a statement
    ? got: #t
  [? test] a rendered statement holds no placeholder any more
    [?? assert] and the rest of the statement is intact
    ? got: #t
+----------------------------------------------+
[? suite] Matching a set of identifiers
  [? test] and a NOT IN over an empty set matches everything
    [?? assert] NOT IN () becomes a true predicate
    ? got: SELECT * FROM "songs" WHERE 1 = 1
  [? test] an IN clause binds one value per identifier, in order
    [?? assert] two identifiers
    ? got: SELECT * FROM "songs" WHERE "identifier" IN ('a', 'b')
  [? test] an empty set matches nothing rather than everything
    [?? assert] IN () becomes a false predicate
    ? got: SELECT * FROM "songs" WHERE 1 = 0
+----------------------------------------------+
[? suite] Matching a term
  [? test] the search statement a builder cannot write is still kracht's
    [?? assert] and the paging is written as numbers
    ? got: #t
  [? test] a LIKE condition renders as LIKE, with its term bound
    [?? assert] a wildcard term
    ? got: SELECT * FROM "songs" WHERE "display_name" LIKE '%x%'
+----------------------------------------------+
[? suite] Shaping a row
  [? test] a column the attributes do not carry is simply left out
    [?? assert] so the table's own default can stand
    ? got: ((display-name . x))
  [? test] only the named columns survive, in the named order
    [?? assert] the columns decide, not the attributes
    ? got: ((views . 2) (display-name . x))
  [? test] an attribute for an unlisted column cannot reach the statement
    [?? assert] a key wikimusic never names is dropped
    ? got: ((display-name . x))
  [? test] a row holding none of the columns is an error
    [?? assert] an insert with no columns is refused
    ? got: #t
+----------------------------------------------+
[? suite] Sorting
  [? test] a clause renders its column and its direction
    [?? assert] and a hyphen becomes an underscore there too
    ? got: "last_edited_at" DESC
    [?? assert] a column with no direction renders bare
    ? got: "display_name"
    [?? assert] two clauses, in order
    ? got: "views" DESC, "display_name" ASC
  [? test] both spellings of a sort are accepted
    [?? assert] a clause list is left as it is
    ? got: ((views desc) (display-name asc))
    [?? assert] one clause, not yet wrapped
    ? got: ((display-name asc))
    [?? assert] and nothing sorts by nothing
    ? got: ()
  [? test] a direction that is not a direction is an error
    [?? assert] so an unknown word cannot reach the statement
    ? got: #t
?? info - ran 6 tasks in: 0 seconds, 4026 microseconds

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


?? info - shuffled with seed 654235431 (replay with VERITAS_SEED=654235431)
+----------------------------------------------+
[? suite] What an error page says
  [? test] a status with no wording of its own still describes itself
    [?? assert] an unnamed status is named in its headline
    ? got: #t
    [?? assert] which is not the wording of a status that has one
    ? got: #t
    [?? assert] and it still has an explanation
    ? got: #t
  [? test] a page leads with a headline of its own
    [?? assert] and something to explain itself
    ? got: #t
    [?? assert] a 404 has a headline
    ? got: #t
    [?? assert] the two codes do not share wording
    ? got: #t
    [?? assert] nor do their explanations
    ? got: #t
  [? test] a page is drawn in the tone its class of refusal is read in
    [?? assert] a request that timed out has a page
    ? got: #t
  [? test] an error page describes what the reader can do
    [?? assert] a 404 points at what is still there
    ? got: #t
    [?? assert] a 500 offers to be tried again
    ? got: #t
+----------------------------------------------+
[? suite] Rendering an error page
  [? test] the page is a whole document of the site's own shell
    [?? assert] and the footer
    ? got: #t
  [? test] a reader who is signed in is not invited to sign in again
    [?? assert] the navigation differs with the session
    ? got: #t
  [? test] the reader is offered a way out
  [? test] the wording is translated through the procedure it is given
    [?? assert] and so does the detail
    ? got: #t
  [? test] the page says which status it is
  [? test] the page is serialized the way the rest of the site is
    [?? assert] and is not escaped into nonsense
    ? got: #t
+----------------------------------------------+
[? suite] The classes an error page asks for
  [? test] every class the page names is one the sheets define
    [?? assert] and the page does name a fair few
    ? got: #t
?? info - ran 3 tasks in: 0 seconds, 18408 microseconds

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


?? info - shuffled with seed 654235431 (replay with VERITAS_SEED=654235431)
+----------------------------------------------+
[? suite] The languages a page offers
  [? test] every offered language is one this instance ships
    [?? assert] the four catalogs are offered
    ? got: (en_US nl_NL es_ES ja_JP)
  [? test] each language is named in that language
  [? test] a compiled catalog stands behind each offered language
+----------------------------------------------+
[? suite] Choosing a language
  [? test] every offered language is a row of the menu
  [? test] the control posts the choice to the preference route
    [?? assert] the menu is the posted field
    ? got: #t
  [? test] the page states the language it is being read in
    [?? assert] and a language not being read is not
    ? got: #f
  [? test] the control names itself for a reader and for assistive tech
    [?? assert] and says what it is
    ? got: #t
+----------------------------------------------+
[? suite] A page a browser can read
  [? test] no non-void element is closed as a self-closed tag
    [?? assert] each one is closed, not reopened
    ? got: #f
  [? test] the body the caller passed is the body that is served
    [?? assert] and it stands inside the document
    ? got: #t
+----------------------------------------------+
[? suite] Where the shell reads its own files
  [? test] no file of the interface is somebody else's to serve
    [?? assert] and no typeface read from somebody's static assets
    ? got: #f
    [?? assert] and none of the hosts a face was fetched from
    ? got: #f
    [?? assert] no font host
    ? got: #f
    [?? assert] no icon CDN
    ? got: #f
  [? test] an instance that serves its own reads them off itself
    [?? assert] the stylesheet the page is laid out with
    ? got: #t
    [?? assert] and the icon the tab is marked with
    ? got: #t
  [? test] a deployment that serves them elsewhere moves every one of them
    [?? assert] the stylesheet
    ? got: #t
    [?? assert] and the icon, with no address left behind
    ? got: #t
    [?? assert] the glyphs its controls wear
    ? got: #t
    [?? assert] the type the page is set in
    ? got: #t
+----------------------------------------------+
[? suite] The footer
  [? test] it states the version this instance runs
    [?? assert] the version is named
    ? got: #t
  [? test] no class is asked for twice
    [?? assert] a clean class attribute
    ? got: #f
  [? test] it offers the way back to the top
    [?? assert] and it is the one that scrolls
    ? got: #t
    [?? assert] the control says what it does
    ? got: #t
  [? test] it points at the code, the manual and the licence
    [?? assert] and where the licence is written out
    ? got: #t
    [?? assert] where the manual is
    ? got: #t
    [?? assert] where the source is
    ? got: #t
+----------------------------------------------+
[? suite] A page a reader is reading
  [? test] the navigation is pinned while browsing
    [?? assert] just below the top edge
    ? got: #t
  [? test] the whole template carries the reading mode down to the bar
    [?? assert] and every other page keeps it
    ? got: #t
  [? test] the navigation is left to scroll away while reading
    [?? assert] and it does not float above the text
    ? got: #f
?? info - ran 6 tasks in: 0 seconds, 25236 microseconds

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


?? info - shuffled with seed 654235431 (replay with VERITAS_SEED=654235431)
+----------------------------------------------+
[? suite] Where the instance reads what it says about itself
  [? test] a variable the deployment did not set falls back
    [?? assert] the project's own value is used
    ? got: the project's own value
  [? test] a variable the deployment set is the one read
    [?? assert] the deployment's own value wins
    ? got: https://pingwing.jointhefreeworld.org
+----------------------------------------------+
[? suite] The addresses the instance offers
  [? test] the mail an instance sends comes from an address
    [?? assert] an address, not a blank
    ? got: #t
    [?? assert] and a name beside it
    ? got: #t
  [? test] the copyright line names somebody
    [?? assert] the holder is named
    ? got: #t
  [? test] each one is an absolute address
    [?? assert] where the source is read
    ? got: #t
    [?? assert] where a reader supports the project
    ? got: #t
    [?? assert] where the manual is read
    ? got: #t
    [?? assert] where the licence is written out
    ? got: #t
+----------------------------------------------+
[? suite] Where the interface's own files are read from
  [? test] a deployment that serves them elsewhere says where
    [?? assert] every file hangs off the host it named
    ? got: https://assets.example.org/wikimusic/vendor/fonts/lucida.css
  [? test] a file named with a leading slash is one file
    [?? assert] the leading slash is not doubled
    ? got: /css/wikimusic.olive.min.css
  [? test] a host written with a trailing slash does not double it
    [?? assert] one slash between the two
    ? got: https://assets.example.org/wikimusic/favicon.ico
  [? test] an instance serving its own reads them off itself
    [?? assert] and the page's own stylesheet with it
    ? got: /css/wikimusic.olive.min.css
    [?? assert] a path on this instance
    ? got: /vendor/fonts/lucida.css
+----------------------------------------------+
[? suite] The manual is read where the code is
  [? test] the manual's address is the deployment's, or the README beside its code
    [?? assert] the manual follows the code
    ? got: https://codeberg.org/jjba23/wikimusic/src/branch/trunk/README.org
+----------------------------------------------+
[? suite] The control an instance turns off
  [? test] an instance that says nothing about it asks
    [?? assert] the ask is shown unless it says otherwise
    ? got: #t
  [? test] and may say so in words
    [?? assert] 0
    ? got: #f
    [?? assert] false
    ? got: #f
    [?? assert] No, however it is capitalised
    ? got: #f
    [?? assert] off, with room around it
    ? got: #f
  [? test] and words that are not a no leave it on
    [?? assert] yes
    ? got: #t
    [?? assert] or the switch itself
    ? got: #t
  [? test] an instance that raises nothing says so with #f
    [?? assert] the switch itself
    ? got: #f
+----------------------------------------------+
[? suite] The picture a page is announced with
  [? test] and with no host to build one on, no address is invented
    [?? assert] no origin, no address
    ? got: #f
  [? test] a path is turned into an address of the instance serving it
    [?? assert] the path is joined onto the origin
    ? got: https://example.org/img/cover.jpg
  [? test] an address the deployment gave is left alone
    [?? assert] an address is already one
    ? got: https://pictures.example.org/cover.jpg
?? info - ran 6 tasks in: 0 seconds, 21459 microseconds

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

error decrypting token: misc-error: (#f ~A (open-envelope: not a bewaking envelope (expected BWK3).) #f)error decrypting token: misc-error: (#f ~A (open-envelope: not a bewaking envelope (expected BWK3).) #f)error decrypting token: misc-error: (#f ~A (bewaking: the sealed data could not be opened: unknown, retired or wrong key, or the data was altered.) #f)error decrypting token: misc-error: (#f ~A (bewaking: the sealed data could not be opened: unknown, retired or wrong key, or the data was altered.) #f)error decrypting token: misc-error: (#f ~A (bewaking: the sealed data could not be opened: unknown, retired or wrong key, or the data was altered.) #f)error decrypting token: misc-error: (#f ~A (bewaking: the sealed data could not be opened: unknown, retired or wrong key, or the data was altered.) #f)
?? info - shuffled with seed 654235431 (replay with VERITAS_SEED=654235431)
+----------------------------------------------+
[? suite] Passwords on file
  [? test] a hash names the scheme it was derived with
    [?? assert] and carries iterations, salt and key
    ? got: 4
  [? test] the same password hashed twice is never the same hash
    [?? assert] the salt is drawn fresh every time
    ? got: #t
  [? test] the recorded cost is at least the cost that was chosen
    [?? assert] pbkdf2 does at least 210000 iterations
    ? got: #t
+----------------------------------------------+
[? suite] Checking a password
  [? test] a row with no usable hash is refused rather than crashed on
    [?? assert] no hash is not a legacy hash
    ? got: #f
    [?? assert] nor is something that is not a string
    ? got: #f
  [? test] a hash was only derived from the one password
    [?? assert] the empty password
    ? got: #f
  [? test] the password a hash was derived from verifies
    [?? assert] the salt column no longer decides
    ? got: #t
    [?? assert] the preferred scheme round trips
    ? got: #t
    [?? assert] and so does the fallback scheme
    ? got: #t
  [? test] a password hashed before the change still verifies
    [?? assert] while a derived hash is not
    ? got: #f
  [? test] a hash that cannot be read is not a match
    [?? assert] no hash at all
    ? got: #f
    [?? assert] a pbkdf2 hash with a field missing
    ? got: #f
    [?? assert] an argon2id salt that is not hexadecimal
    ? got: #f
    [?? assert] an argon2id cost that is not a number
    ? got: #f
    [?? assert] an argon2id hash with a field missing
    ? got: #f
+----------------------------------------------+
[? suite] Reading a session
  [? test] a token sealed with the project's keys names its owner
    [?? assert] the payload carries its own expiry
    ? got: #t
  [? test] a token that has been altered does not open
    [?? assert] a token with something appended
    ? got: #f
  [? test] a route's permission has to be one the session holds
    [?? assert] with no permission asked for, a session is enough
    ? got: #t
  [? test] a token sealed under another key is not ours
    [?? assert] nor one signed with another
    ? got: #f
    [?? assert] a token sealed with a key we do not hold
    ? got: #f
  [? test] every way of failing is the same no
    [?? assert] a cookie that is not even an envelope
    ? got: #f
    [?? assert] a cookie of some other shape
    ? got: #f/root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/test/veritas/unit/controller-spec.scm.go
;;; compiling ./test/veritas/unit/guitarpro-spec.scm
;;; 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
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/test/veritas/unit/guitarpro-spec.scm.go
;;; compiling ./test/veritas/unit/guitarpro-view-spec.scm
;;; compiling ./app/views/song-content-view.scm
;;; 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/app/views/song-content-view.scm.go
;;; 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/sql-spec.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/test/veritas/unit/sql-spec.scm.go
;;; compiling ./test/veritas/unit/error-pages-spec.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/test/veritas/unit/error-pages-spec.scm.go
;;; compiling ./test/veritas/unit/views-spec.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/test/veritas/unit/views-spec.scm.go
;;; compiling ./test/veritas/unit/config-spec.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/test/veritas/unit/config-spec.scm.go
;;; compiling ./test/veritas/unit/auth-spec.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/wikimusic/trunk/test/veritas/unit/auth-spec.scm.go

    [?? assert] an empty cookie
    ? got: #f
    [?? assert] a false token
    ? got: #f
    [?? assert] no token at all
    ? got: #f
  [? test] an expired session is no session
    [?? assert] a validity that is already behind it
    ? got: #f
+----------------------------------------------+
[? suite] The permissions column
  [? test] anything that is not a list of permissions is an empty list
    [?? assert] no column at all
    ? got: ()
    [?? assert] a bare symbol
    ? got: ()
    [?? assert] a string
    ? got: ()
    [?? assert] an empty column
    ? got: ()
    [?? assert] an unreadable column
    ? got: ()
  [? test] a row written before the change still yields its permissions
    [?? assert] a quasiquoted list is unwrapped
    ? got: (wikimusic:song-create)
    [?? assert] the long spelling of it too
    ? got: (wikimusic:song-create)
  [? test] a list of permissions is read as written
    [?? assert] several, in order
    ? got: (wikimusic:song-create wikimusic:artist-delete)
    [?? assert] one permission
    ? got: (wikimusic:song-create)
  [? test] the column is read, never run
    [?? assert] a form naming a procedure comes back as data
    ? got: (system rm -rf /)
    [?? assert] and so does a lambda
    ? got: (lambda (x) x)
?? info - ran 4 tasks in: 0 seconds, 8298 microseconds

finished running tests


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

Maak: 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.

→ running command: cd /etc/byggsteg/job-clone/wikimusic/trunk && sudo herd enable wikimusic-daemon || true && sudo herd restart wikimusic-daemon || true

Enabled service wikimusic-daemon.
Service wikimusic-daemon has been started.

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

Warning (emacs): Cannot fontify source block (htmlize.el >= 1.34 required).  Falling back to plain text.  (see ���org-html-htmlize-output-type���)
Warning (emacs): Cannot fontify source block (htmlize.el >= 1.34 required).  Falling back to plain text.  (see ���org-html-htmlize-output-type���)
Warning (emacs): Cannot fontify source block (htmlize.el >= 1.34 required).  Falling back to plain text.  (see ���org-html-htmlize-output-type���)
Warning (emacs): Cannot fontify source block (htmlize.el >= 1.34 required).  Falling back to plain text.  (see ���org-html-htmlize-output-type���)
Warning (emacs): Cannot fontify source block (htmlize.el >= 1.34 required).  Falling back to plain text.  (see ���org-html-htmlize-output-type���)
Warning (emacs): Cannot fontify source block (htmlize.el >= 1.34 required).  Falling back to plain text.  (see ���org-html-htmlize-output-type���)
Warning (emacs): Cannot fontify source block (htmlize.el >= 1.34 required).  Falling back to plain text.  (see ���org-html-htmlize-output-type���)
Warning (emacs): Cannot fontify source block (htmlize.el >= 1.34 required).  Falling back to plain text.  (see ���org-html-htmlize-output-type���)
Warning (emacs): Cannot fontify source block (htmlize.el >= 1.34 required).  Falling back to plain text.  (see ���org-html-htmlize-output-type���)
Warning (emacs): Cannot fontify source block (htmlize.el >= 1.34 required).  Falling back to plain text.  (see ���org-html-htmlize-output-type���)
Warning (emacs): Cannot fontify source block (htmlize.el >= 1.34 required).  Falling back to plain text.  (see ���org-html-htmlize-output-type���)
Warning (emacs): Cannot fontify source block (htmlize.el >= 1.34 required).  Falling back to plain text.  (see ���org-html-htmlize-output-type���)
Warning (emacs): Cannot fontify source block (htmlize.el >= 1.34 required).  Falling back to plain text.  (see ���org-html-htmlize-output-type���)
Warning (emacs): Cannot fontify source block (htmlize.el >= 1.34 required).  Falling back to plain text.  (see ���org-html-htmlize-output-type���)
finished publishing Wikimusic manual
removed '/srv/http/jointhefreeworld.org/manuals/wikimusic/index.html'
renamed 'README.html' -> '/srv/http/jointhefreeworld.org/manuals/wikimusic/index.html'


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

Maak: the infinitely extensible command runner

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

Executing Maak tasks: deploy

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

=> Running Maak task: deploy

  Deploy the project's documentation.

The manual is rendered from the README and served under `manuals/wikimusic',
which is where a reader of the site is sent.

  Execute command:
guix time-machine --channels=channels.scm -- shell -m manifest.scm -- emacs -Q --batch --eval '(progn (find-file "./README.org") (org-html-export-to-html) (message "finished publishing Wikimusic manual"))'