# nh3-svos -> SVOS v0.0.14 (3726d73): kernel 0.0.14 (migration 0014, schema 14), app-interface 0.0.6 (briefs index v1->v2 at # its first start), connector base 0.0.10, UI 0.0.19. svos-dev's ask (thread 01M5558E19Q3ZK4RRZXQG6A2Y9), pushed on Prime's # 0245 go. PRE-REQ: nh3-svos-3726d73-v0.0.14-stage.yaml (installs the release beside the live one). # PHASE A of three, in svos-dev's order: A = this (kernel, knowledge, voice; the interface is LEFT STOPPED), # B = nh3-dev-svos-3726d73-v0.0.14.yaml (connector base + app-terminal; raises ONE card), # C = nh3-svos-3726d73-v0.0.14-interface.yaml (app-interface + the web build; raises ONE card). # Run A..C only while Prime can approve both cards within 15 minutes: a held app refuses wrong-revision (reads DOWN). steps: - name: The release is staged and accepts the live config sudo: true shell: test -f /opt/svos/releases/3726d73/apps-env/pyvenv.cfg && runuser -u svc-svos -- /opt/svos/releases/3726d73/kernel-env/bin/svos-kernel check-config --data-root /var/lib/svos changed_when: "false" - name: Stop the local apps then the kernel sudo: true shell: systemctl stop svos-voice svos-knowledge svos-interface svos-kernel; systemctl is-active svos-kernel svos-interface svos-knowledge svos-voice | tr '\n' ' '; echo - name: Offline backup to /var/lib/svos/backup/pre-3726d73 (schema 13 database, the v1 briefs index, config) sudo: true shell: | set -e d=/var/lib/svos/backup/pre-3726d73 runuser -u svc-svos -- install -d -m 0700 $d runuser -u svc-svos -- python3 -c " import sqlite3 for src, dst in (('/var/lib/svos/state/svos.db', '$d/svos.db'), ('/var/lib/svos/state/apps/interface/briefs.sqlite3', '$d/briefs.sqlite3')): s = sqlite3.connect(src); t = sqlite3.connect(dst); s.backup(t); t.close(); s.close() c = sqlite3.connect('file:' + dst + '?mode=ro', uri=True) print(dst, 'integrity', c.execute('pragma integrity_check').fetchone()[0], 'user_version', c.execute('pragma user_version').fetchone()[0])" runuser -u svc-svos -- tar -C /var/lib/svos -cf $d/config-keys-apps.tar config state/keys state/apps state/config-generations apps runuser -u svc-svos -- cp -p /var/lib/svos/config/instance.toml /var/lib/svos/config/instance.toml.pre-3726d73 ls -la $d | tail -4 - name: Switch current to 3726d73 sudo: true shell: ln -sfn /opt/svos/releases/3726d73 /opt/svos/current.new && chgrp -h svc-svos /opt/svos/current.new && mv -T /opt/svos/current.new /opt/svos/current && readlink /opt/svos/current - name: Start the kernel (READY-gated; migration 0014) then knowledge and voice (the interface waits for phase C) sudo: true shell: | t0=$(date +%s.%N); systemctl start svos-kernel.service; rc=$?; t1=$(date +%s.%N) echo "kernel start rc=$rc after $(python3 -c "print(round($t1-$t0,2))") s" systemctl start svos-knowledge svos-voice sleep 5; curl -s http://127.0.0.1:8400/health; echo systemctl is-active svos-kernel svos-interface svos-knowledge svos-voice | tr '\n' ' '; echo journalctl -u svos-kernel --since "-90s" --no-pager -o cat | grep -i -E "migrat|0014|schema|error|refus" | tail -6 | cut -c1-200 test $rc -eq 0 verify: - name: Health is schema 14, status ok shell: h=$(curl -s http://127.0.0.1:8400/health); echo "$h"; echo "$h" | grep -q '"schema_version":14' && echo "$h" | grep -q '"status":"ok"' changed_when: "false" - name: GET /seats profiles.tasks publishes brief_max_chars and ceilings.check_seconds (read with the local admin path if open, else skip) shell: curl -s http://127.0.0.1:8400/seats | python3 -c "import sys,json; d=json.load(sys.stdin); t=d.get('profiles',{}).get('tasks',{}); print('brief_max_chars', t.get('brief_max_chars'), 'check_seconds', (t.get('ceilings') or {}).get('check_seconds'))" 2>&1 || true changed_when: "false" - name: App listener still refuses an uncredentialed kernel-key (401 from the kernel) shell: test "$(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8410/auth/kernel-key)" = 401 changed_when: "false"