feat(svos): v0.0.27 live on nh3-svos — interface 0.0.9 (owner-only state dir), UI 0.0.32; no card

This commit is contained in:
vh
2026-10-19 09:54:41 -07:00
parent b1b9a06011
commit 25029feaf4
4 changed files with 80 additions and 1 deletions
@@ -0,0 +1,26 @@
# nh3-svos: STAGE SVOS v0.0.27 (d5e15c3) beside the live release. Installs into /opt/svos/releases/d5e15c3 and runs the
# new kernel's check-config against the live configuration. Does NOT switch current, stop or start anything.
# svos-dev's request (thread 01M5AH9A7QGJ018HNTSGKNGAA7): UI 0.0.32 (interface 0.0.9 + U23 v0.2); kernel 0.0.27 is a
# version bump; everything else carried from a83c223. Built from the LOCAL tag before the push; the publish
# (nh3-svos-d5e15c3-v0.0.27.yaml) first needs origin's v0.0.27 to name the same commit.
steps:
- name: Private staging dir
shell: install -d -m 0700 /tmp/svos-stage-d5e15c3
- {name: stage release, upload: {src: /tmp/claude-1000/-home-lkraven-development-eshpfi-management/e0be18fd-0734-4786-b933-904f0a74d2a2/scratchpad/svos-d5e15c3/svos-release-d5e15c3.tar.gz, dest: /tmp/svos-stage-d5e15c3/release.tar.gz, mode: "0644"}}
- {name: stage uv, upload: {src: /home/lkraven/bin/uv, dest: /tmp/svos-stage-d5e15c3/uv, mode: "0755"}}
- {name: stage installer, upload: {src: /tmp/claude-1000/-home-lkraven-development-eshpfi-management/e0be18fd-0734-4786-b933-904f0a74d2a2/scratchpad/svos-d5e15c3/install-release.py, dest: /tmp/svos-stage-d5e15c3/install-release.py, mode: "0644"}}
- name: Verify staged hashes
shell: cd /tmp/svos-stage-d5e15c3 && printf '%s %s\n' 6d3da96eae8838840559b39569b5433725febaae43c0f4228f314c151d99d8a4 release.tar.gz 83aa128da93e168283ed32cf75cd819fe17b135b3fc1f7ccb3c912eec198d9fb uv | sha256sum -c -
changed_when: "false"
- name: Install release d5e15c3 beside the live one (current NOT switched)
sudo: true
shell: python3 /tmp/svos-stage-d5e15c3/install-release.py
creates: /opt/svos/releases/d5e15c3/apps-env/pyvenv.cfg
verify:
- name: New kernel 0.0.27 accepts the live configuration as it is
sudo: true
shell: runuser -u svc-svos -- /opt/svos/releases/d5e15c3/kernel-env/bin/svos-kernel check-config --data-root /var/lib/svos
changed_when: "false"
- name: current still points at the live release
shell: readlink /opt/svos/current
changed_when: "false"
@@ -0,0 +1,45 @@
# nh3-svos -> SVOS v0.0.27 (d5e15c3): UI 0.0.32 (U23 v0.2 depth redo, compact inbox row, ?look= retired) + app-interface
# 0.0.9 (the three stores share state.py: state/apps/interface tightened to 0700, pins' WAL sidecars 0600; manifest changes
# only its version, so no card is expected). Kernel 0.0.27 = a version bump; NOT restarted. Prime 1005 via svos-dev
# ("deploy what you have first so it's live"), thread 01M5AH9A7QGJ018HNTSGKNGAA7. PRE-REQ: the stage playbook; origin's
# v0.0.27 == d5e15c378877.
steps:
- name: Pre-reqs present
sudo: true
shell: test -f /opt/svos/releases/d5e15c3/apps-env/bin/svos-interface && readlink /opt/svos/current && stat -c '%a %U' /var/lib/svos/state/apps/interface
changed_when: "false"
- name: Online backup of the interface stores to /var/lib/svos/backup/pre-d5e15c3
sudo: true
shell: |
set -e
d=/var/lib/svos/backup/pre-d5e15c3
runuser -u svc-svos -- install -d -m 0700 $d
runuser -u svc-svos -- python3 -c "
import sqlite3, glob, os
for src in sorted(glob.glob('/var/lib/svos/state/apps/interface/*.sqlite3')):
dst = '$d/' + os.path.basename(src)
s = sqlite3.connect('file:' + src + '?mode=ro', uri=True); t = sqlite3.connect(dst); s.backup(t); t.close(); s.close()
c = sqlite3.connect('file:' + dst + '?mode=ro', uri=True); print(os.path.basename(src), 'integrity', c.execute('pragma integrity_check').fetchone()[0])"
- name: Switch current to d5e15c3
sudo: true
shell: ln -sfn /opt/svos/releases/d5e15c3 /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: Front door inventory (UI 0.0.32 live; a83c223 becomes previous)
sudo: true
shell: /usr/local/sbin/svos-front-inventory 2>&1 | grep -E 'GENERATED|updated|root \*|path /assets' | head -4
- name: Restart ONLY svos-interface
sudo: true
shell: systemctl restart svos-interface; sleep 8; systemctl is-active svos-interface
verify:
- name: Interface on d5e15c3; its manifest (pinned without a card expected); the state dir mode
sudo: true
shell: |
pid=$(systemctl show svos-interface -p MainPID --value); grep -q /opt/svos/releases/d5e15c3 /proc/$pid/maps && echo "interface pid $pid on d5e15c3"
stat -c 'state/apps/interface %a %U' /var/lib/svos/state/apps/interface; ls -l /var/lib/svos/state/apps/interface | grep -E 'wal|shm' || true
python3 -c "
import sqlite3
c = sqlite3.connect('file:/var/lib/svos/state/svos.db?mode=ro', uri=True)
for r in c.execute(\"select slug, revision, substr(sha256,1,12), state from app_manifests where slug='app-interface' order by revision desc limit 2\"): print(r)
for r in c.execute(\"select id, kind, state, created_at from cards where slug='app-interface' and created_at > '2026-10-19T16:30' order by created_at desc limit 1\"): print(r)"
curl -s http://127.0.0.1:8400/health; echo
/usr/local/sbin/svos-front-inventory --check
changed_when: "false"