symbanta-dashboard-43eb4613-dba4

job succeeded

starting new job...


→ running command: dir='/etc/byggsteg/job-clone//symbanta-dashboard/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 moved from fd325b6 to 51aabce

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

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

    docs: Update visual identity

M       README.org
A       logo.svg

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

⚡ Node.js frontend environment loaded
Node version: v24.19.0
NPM version:  11.17.0

up to date, audited 344 packages in 1m

86 packages are looking for funding
  run `npm fund` for details

6 moderate severity vulnerabilities

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
npm warn allow-scripts 1 package has install scripts not yet covered by allowScripts:
npm warn allow-scripts   esbuild@0.28.2 (postinstall: node install.js)
npm warn allow-scripts
npm warn allow-scripts Run `npm approve-scripts --allow-scripts-pending` to review, or `npm approve-scripts <pkg>` to allow.

> symbanta-dashboard@0.5.1 test
> vitest run


 RUN  v5.0.5 /etc/byggsteg/job-clone/symbanta-dashboard/trunk

stderr | src/a11y/dashboard.a11y.test.tsx > dashboard accessibility > exposes exactly one h1, one main landmark and labelled panels
The width(0) and height(0) of chart should be greater than 0,
       please check the style of container, or the props width(100%) and height(100%),
       or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the
       height and width.

stderr | src/a11y/dashboard.a11y.test.tsx > dashboard accessibility > provides a keyboard skip link that targets the main landmark
The width(0) and height(0) of chart should be greater than 0,
       please check the style of container, or the props width(100%) and height(100%),
       or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the
       height and width.

stderr | src/a11y/dashboard.a11y.test.tsx > dashboard accessibility > offers a screen-reader table alternative for the traffic chart
The width(0) and height(0) of chart should be greater than 0,
       please check the style of container, or the props width(100%) and height(100%),
       or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the
       height and width.

stderr | src/a11y/dashboard.a11y.test.tsx > dashboard accessibility > makes the scrollable tables reachable and named
The width(0) and height(0) of chart should be greater than 0,
       please check the style of container, or the props width(100%) and height(100%),
       or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the
       height and width.

stderr | src/a11y/dashboard.a11y.test.tsx > dashboard accessibility > announces refresh progress through a polite live region
The width(0) and height(0) of chart should be greater than 0,
       please check the style of container, or the props width(100%) and height(100%),
       or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the
       height and width.

stderr | src/a11y/dashboard.a11y.test.tsx > dashboard accessibility > passes the structural audit
The width(0) and height(0) of chart should be greater than 0,
       please check the style of container, or the props width(100%) and height(100%),
       or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the
       height and width.

stderr | src/a11y/dashboard.a11y.test.tsx > dashboard accessibility > passes axe-core WCAG 2.1 A/AA
The width(0) and height(0) of chart should be greater than 0,
       please check the style of container, or the props width(100%) and height(100%),
       or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the
       height and width.

 ✓ src/a11y/dashboard.a11y.test.tsx (7 tests) 6351ms
   ✓ dashboard accessibility (7)
     ✓ exposes exactly one h1, one main landmark and labelled panels 1582ms
     ✓ provides a keyboard skip link that targets the main landmark 789ms
     ✓ offers a screen-reader table alternative for the traffic chart 655ms
     ✓ makes the scrollable tables reachable and named 420ms
     ✓ announces refresh progress through a polite live region 401ms
     ✓ passes the structural audit 491ms
     ✓ passes axe-core WCAG 2.1 A/AA 2013ms
 ✓ src/i18n/catalog.test.ts (66 tests) 3368ms
   ✓ the gettext template (3)
     ✓ is in sync with the source code 906ms
   ✓ de.po (9)
     ✓ is in sync with the template 407ms
   ✓ es.po (9)
     ✓ is in sync with the template 393ms
   ✓ it.po (9)
     ✓ is in sync with the template 392ms
   ✓ ja.po (9)
     ✓ is in sync with the template 305ms
 ✓ src/ConsoleLogs.test.tsx (10 tests) 2113ms
   ✓ ConsoleLogs (10)
     ✓ shows a skeleton while loading 704ms
 ✓ src/StatsTables.test.tsx (15 tests) 1994ms
   ✓ Top routes panel (3)
     ✓ renders the breakdown rows 964ms
 ✓ src/ui.test.tsx (17 tests) 1974ms
   ✓ StatsTable (8)
     ✓ renders one row per entry with views, visitors and share 978ms
   ✓ PeriodSelect (2)
     ✓ reports the selected period 300ms
 ✓ src/StatsDashboard.test.tsx (8 tests) 1314ms
   ✓ StatsDashboard (8)
     ✓ shows a skeleton while the summary loads 731ms
 ✓ src/i18n/I18nContext.test.tsx (11 tests) 1566ms
   ✓ I18nProvider (11)
     ✓ offers every supported language in the switcher 727ms
 ✓ src/DomainSwitcher.test.tsx (7 tests) 1084ms
   ✓ DomainSwitcher (7)
     ✓ renders a select with every property once loaded 629ms
 ✓ src/ThemeContext.test.tsx (10 tests) 1266ms
   ✓ ThemeProvider (10)
     ✓ applies and persists an explicit theme 753ms
 ✓ src/a11y/ContrastContext.test.tsx (7 tests) 1368ms
   ✓ ContrastToggle (4)
     ✓ is a labelled toggle button with a stable accessible name 634ms
 ✓ src/PeriodContext.test.tsx (5 tests) 1280ms
   ✓ PeriodProvider (5)
     ✓ updates the period and remembers the choice 979ms
 ✓ mock-api/routes.test.ts (34 tests) 216ms
 ✓ src/Prelude.test.ts (21 tests) 164ms
 ✓ src/i18n/translate.test.ts (15 tests) 194ms
 ✓ src/i18n/locale.test.ts (16 tests) 188ms
 ✓ src/api/custom-fetch.test.ts (13 tests) 134ms
 ✓ src/a11y/contrast.test.ts (17 tests) 157ms
 ✓ src/a11y/tokens.test.ts (10 tests) 129ms
 ✓ src/i18n/plural.test.ts (11 tests) 119ms
 ✓ src/a11y/colorUsage.test.ts (3 tests) 78ms

 Test Files  20 passed (20)
      Tests  303 passed (303)
   Start at  23:15:53
   Duration  130.66s (environment 59%, tests 21%, setup 10%, import 6%, transform 4%)

Environment  jsdom was created 20 times · 68.54s total, 59% of tracked time
             create it once per worker with pool: 'vmThreads' (keeps per-file isolation) or isolate: false (shares it across files)
             learn more: https://vitest.dev/guide/improving-performance#test-environments



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

Maak 0.14.0: the infinitely extensible command runner

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

Executing Maak tasks: test


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

=> Running Maak task: test

  Run the automated test suite.

  Execute command:
nix develop . --command bash -c 'npm install && npm test'

Executing: nix develop . --command bash -c 'npm install && npm test'

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

warning: Git tree '/etc/byggsteg/job-clone/symbanta-dashboard/trunk' is dirty
⚡ Node.js frontend environment loaded
Node version: v24.19.0
NPM version:  11.17.0

up to date, audited 344 packages in 1s

86 packages are looking for funding
  run `npm fund` for details

6 moderate severity vulnerabilities

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
npm warn allow-scripts 1 package has install scripts not yet covered by allowScripts:
npm warn allow-scripts   esbuild@0.28.2 (postinstall: node install.js)
npm warn allow-scripts
npm warn allow-scripts Run `npm approve-scripts --allow-scripts-pending` to review, or `npm approve-scripts <pkg>` to allow.

> symbanta-dashboard@0.5.1 test
> vitest run


 RUN  v5.0.5 /etc/byggsteg/job-clone/symbanta-dashboard/trunk

stderr | src/a11y/dashboard.a11y.test.tsx > dashboard accessibility > exposes exactly one h1, one main landmark and labelled panels
The width(0) and height(0) of chart should be greater than 0,
       please check the style of container, or the props width(100%) and height(100%),
       or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the
       height and width.

stderr | src/a11y/dashboard.a11y.test.tsx > dashboard accessibility > provides a keyboard skip link that targets the main landmark
The width(0) and height(0) of chart should be greater than 0,
       please check the style of container, or the props width(100%) and height(100%),
       or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the
       height and width.

stderr | src/a11y/dashboard.a11y.test.tsx > dashboard accessibility > offers a screen-reader table alternative for the traffic chart
The width(0) and height(0) of chart should be greater than 0,
       please check the style of container, or the props width(100%) and height(100%),
       or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the
       height and width.

stderr | src/a11y/dashboard.a11y.test.tsx > dashboard accessibility > makes the scrollable tables reachable and named
The width(0) and height(0) of chart should be greater than 0,
       please check the style of container, or the props width(100%) and height(100%),
       or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the
       height and width.

stderr | src/a11y/dashboard.a11y.test.tsx > dashboard accessibility > announces refresh progress through a polite live region
The width(0) and height(0) of chart should be greater than 0,
       please check the style of container, or the props width(100%) and height(100%),
       or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the
       height and width.

stderr | src/a11y/dashboard.a11y.test.tsx > dashboard accessibility > passes the structural audit
The width(0) and height(0) of chart should be greater than 0,
       please check the style of container, or the props width(100%) and height(100%),
       or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the
       height and width.

stderr | src/a11y/dashboard.a11y.test.tsx > dashboard accessibility > passes axe-core WCAG 2.1 A/AA
The width(0) and height(0) of chart should be greater than 0,
       please check the style of container, or the props width(100%) and height(100%),
       or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the
       height and width.

 ✓ src/a11y/dashboard.a11y.test.tsx (7 tests) 2053ms
   ✓ dashboard accessibility (7)
     ✓ exposes exactly one h1, one main landmark and labelled panels 485ms
     ✓ passes axe-core WCAG 2.1 A/AA 617ms
 ✓ src/i18n/catalog.test.ts (66 tests) 829ms
 ✓ src/ConsoleLogs.test.tsx (10 tests) 421ms
 ✓ src/StatsTables.test.tsx (15 tests) 416ms
 ✓ src/ui.test.tsx (17 tests) 499ms
 ✓ src/i18n/I18nContext.test.tsx (11 tests) 290ms
 ✓ src/a11y/ContrastContext.test.tsx (7 tests) 277ms
 ✓ src/StatsDashboard.test.tsx (8 tests) 294ms
 ✓ src/PeriodContext.test.tsx (5 tests) 256ms
 ✓ src/ThemeContext.test.tsx (10 tests) 319ms
 ✓ src/DomainSwitcher.test.tsx (7 tests) 269ms
 ✓ mock-api/routes.test.ts (34 tests) 39ms
 ✓ src/i18n/translate.test.ts (15 tests) 30ms
 ✓ src/i18n/locale.test.ts (16 tests) 25ms
 ✓ src/Prelude.test.ts (21 tests) 45ms
 ✓ src/a11y/contrast.test.ts (17 tests) 22ms
 ✓ src/api/custom-fetch.test.ts (13 tests) 21ms
 ✓ src/a11y/tokens.test.ts (10 tests) 20ms
 ✓ src/i18n/plural.test.ts (11 tests) 18ms
 ✓ src/a11y/colorUsage.test.ts (3 tests) 12ms

 Test Files  20 passed (20)
      Tests  303 passed (303)
   Start at  23:18:08
   Duration  26.49s (environment 53%, tests 26%, setup 9%, import 8%, transform 3%)

Environment  jsdom was created 20 times · 12.46s total, 53% of tracked time
             create it once per worker with pool: 'vmThreads' (keeps per-file isolation) or isolate: false (shares it across files)
             learn more: https://vitest.dev/guide/improving-performance#test-environments

warning: Git tree '/etc/byggsteg/job-clone/symbanta-dashboard/trunk' is dirty
⚡ Node.js frontend environment loaded
Node version: v24.19.0
NPM version:  11.17.0

up to date, audited 344 packages in 1s

86 packages are looking for funding
  run `npm fund` for details

6 moderate severity vulnerabilities

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
npm warn allow-scripts 1 package has install scripts not yet covered by allowScripts:
npm warn allow-scripts   esbuild@0.28.2 (postinstall: node install.js)
npm warn allow-scripts
npm warn allow-scripts Run `npm approve-scripts --allow-scripts-pending` to review, or `npm approve-scripts <pkg>` to allow.

> symbanta-dashboard@0.5.1 build
> tsc -b && vite build

vite v8.3.5 building client environment for production...
transforming...
✓ 722 modules transformed.
rendering chunks...
computing gzip size...
dist/index.html                   0.80 kB │ gzip:   0.42 kB
dist/assets/index-BsN6-mDP.css   63.37 kB │ gzip:  11.74 kB
dist/assets/index-D_rjWkso.js   757.62 kB │ gzip: 220.92 kB

[plugin builtin:vite-reporter] 
(!) Some chunks are larger than 500 kB after minification. Consider:
- Using dynamic import() to code-split the application
- Use build.rolldownOptions.output.codeSplitting to improve chunking: https://rolldown.rs/reference/OutputOptions.codeSplitting
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
✓ built in 1.13s
removed '/srv/symbanta.jointhefreeworld.org/assets/index-D_rjWkso.js'
removed '/srv/symbanta.jointhefreeworld.org/assets/index-BsN6-mDP.css'
removed directory '/srv/symbanta.jointhefreeworld.org/assets'
removed '/srv/symbanta.jointhefreeworld.org/favicon.svg'
removed '/srv/symbanta.jointhefreeworld.org/fonts/juliamono-bold-latin.woff2'
removed '/srv/symbanta.jointhefreeworld.org/fonts/juliamono-normal-latin.woff2'
removed '/srv/symbanta.jointhefreeworld.org/fonts/source-serif-4-italic-latin-ext.woff2'
removed '/srv/symbanta.jointhefreeworld.org/fonts/source-serif-4-italic-latin.woff2'
removed '/srv/symbanta.jointhefreeworld.org/fonts/source-serif-4-normal-latin-ext.woff2'
removed '/srv/symbanta.jointhefreeworld.org/fonts/source-serif-4-normal-latin.woff2'
removed '/srv/symbanta.jointhefreeworld.org/fonts/work-sans-italic-latin-ext.woff2'
removed '/srv/symbanta.jointhefreeworld.org/fonts/work-sans-italic-latin.woff2'
removed '/srv/symbanta.jointhefreeworld.org/fonts/work-sans-normal-latin-ext.woff2'
removed '/srv/symbanta.jointhefreeworld.org/fonts/work-sans-normal-latin.woff2'
removed directory '/srv/symbanta.jointhefreeworld.org/fonts'
removed '/srv/symbanta.jointhefreeworld.org/icons.svg'
removed '/srv/symbanta.jointhefreeworld.org/index.html'
'dist/assets' -> '/srv/symbanta.jointhefreeworld.org/assets'
'dist/assets/index-D_rjWkso.js' -> '/srv/symbanta.jointhefreeworld.org/assets/index-D_rjWkso.js'
'dist/assets/index-BsN6-mDP.css' -> '/srv/symbanta.jointhefreeworld.org/assets/index-BsN6-mDP.css'
'dist/favicon.svg' -> '/srv/symbanta.jointhefreeworld.org/favicon.svg'
'dist/fonts' -> '/srv/symbanta.jointhefreeworld.org/fonts'
'dist/fonts/juliamono-bold-latin.woff2' -> '/srv/symbanta.jointhefreeworld.org/fonts/juliamono-bold-latin.woff2'
'dist/fonts/juliamono-normal-latin.woff2' -> '/srv/symbanta.jointhefreeworld.org/fonts/juliamono-normal-latin.woff2'
'dist/fonts/source-serif-4-italic-latin-ext.woff2' -> '/srv/symbanta.jointhefreeworld.org/fonts/source-serif-4-italic-latin-ext.woff2'
'dist/fonts/source-serif-4-italic-latin.woff2' -> '/srv/symbanta.jointhefreeworld.org/fonts/source-serif-4-italic-latin.woff2'
'dist/fonts/source-serif-4-normal-latin-ext.woff2' -> '/srv/symbanta.jointhefreeworld.org/fonts/source-serif-4-normal-latin-ext.woff2'
'dist/fonts/source-serif-4-normal-latin.woff2' -> '/srv/symbanta.jointhefreeworld.org/fonts/source-serif-4-normal-latin.woff2'
'dist/fonts/work-sans-italic-latin-ext.woff2' -> '/srv/symbanta.jointhefreeworld.org/fonts/work-sans-italic-latin-ext.woff2'
'dist/fonts/work-sans-italic-latin.woff2' -> '/srv/symbanta.jointhefreeworld.org/fonts/work-sans-italic-latin.woff2'
'dist/fonts/work-sans-normal-latin-ext.woff2' -> '/srv/symbanta.jointhefreeworld.org/fonts/work-sans-normal-latin-ext.woff2'
'dist/fonts/work-sans-normal-latin.woff2' -> '/srv/symbanta.jointhefreeworld.org/fonts/work-sans-normal-latin.woff2'
'dist/icons.svg' -> '/srv/symbanta.jointhefreeworld.org/icons.svg'
'dist/index.html' -> '/srv/symbanta.jointhefreeworld.org/index.html'


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

Maak 0.14.0: the infinitely extensible command runner

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

Executing Maak tasks: deploy


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

=> Running Maak task: deploy

  Deploy the project, refusing to continue when the test suite fails.

  Execute command:
nix develop . --command bash -c 'npm install && npm test'

Executing: nix develop . --command bash -c 'npm install && npm test'

  Execute command:
nix develop . --command bash -c 'npm install && npm run build'

Executing: nix develop . --command bash -c 'npm install && npm run build'

Executing: rm -rfv /srv/symbanta.jointhefreeworld.org/*

Executing: cp -r -v dist/* /srv/symbanta.jointhefreeworld.org/
inspect the job's lambda expression
(lambda()
  `((task . ("maak-test" "maak-deploy"))
    (project . "symbanta-dashboard")
    (branch-name . "trunk")
    (clone-url . "https://github.com/jjba23/symbanta-dashboard.git")))