Files
Void-Homelab/docs/superpowers/plans/2026-05-31-void-v2-plan1-progress.md
root 54ba68a11c docs: move void-v2 specs + plans into the repo
All Void 2.0 superpowers specs and implementation plans now live at
docs/superpowers/{specs,plans}/ inside the repo. Previously they were
at /project/docs/superpowers/ which was not under git.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 04:11:32 +10:00

7.2 KiB

Void 2.0 Plan 1 — Execution Progress

Updated: 2026-05-31 (session paused at 92% context) Plan: /project/docs/superpowers/plans/2026-05-31-void-v2-plan1-foundation.md Spec: /project/docs/superpowers/specs/2026-05-31-void-v2-design.md Repo: /project/src/void-v2/ (git init done, on branch main) Execution mode: subagent-driven-development

Status by Phase

Phase Plan Tasks Status Notes
A — Scaffolding 1, 4 DONE Repo init + Node project init. 2 commits.
B — Infrastructure 2, 3 DONE void2-db (CT 310 @ 192.168.1.12) + void2-app (CT 311 @ 192.168.1.13) running on Z. Postgres 16.14 + pgvector 0.8.2 + pgcrypto 1.3. DB user void + database void created. Verified reachable from this LXC. .env populated.
C — Migrations 5, 6, 8, 10, 12, 14, 16 READY DB is reachable — can dispatch Task 5 implementer.
D — Repos 7, 9, 11, 13, 15, 16-real Blocked by B All entity repos.
E — Auth + Server 17, 18, 19, 20 Blocked by B Capability check, owner middleware, Express, /health smoke.
F — Deploy + docs 21, 22 Blocked by E systemd, push.sh, completion doc.

Completed Tasks

Task 1 — Repo Scaffolding [commit 0ede9fe]

  • 5 files: .gitignore, README.md, CHANGELOG.md, docs/VERSION_HISTORY.md, .env.example
  • Spec reviewed , code quality reviewed

Task 4 — Node Project Init [commit 45186f7]

  • package.json (name=void-server, version=2.0.0-alpha.1, type=module)
  • 7 runtime deps + 2 dev deps installed
  • vitest.config.js, lib/log.js (pino logger)
  • NOT YET REVIEWED — spec + code quality review skipped due to token pressure. Re-do on resume if desired, OR proceed (Task 4 is mechanical setup with no functional code).

Deviations from Plan

  1. Express 5.2.1 installed (plan said "Express 4"). Express 5 is the current npm install express default. Likely fine — Express 5 changed middleware error handling (promises auto-catch) and removed deprecated APIs, but our usage (json body, simple middlewares) works on both. Flag if any test fails with Express 5-specific behaviour.
  2. Debian 13 used for LXCs (plan said 12). Only debian-13-standard_13.1-2 template was on Z. No functional impact.
  3. Storage: localzfs on Z (plan said donatello-zfs). Donatello + Leonardo ZFS pools are OFFLINE — leftover from your 2026-05-22 SATA bus incident. HA migrate is NOT blockedlocalzfs is the standard pattern here (CT 104, 105, 106, 108-112 all run on it) and PVE storage replication to Z3 every 15 min is configured. Replication jobs 310-0 and 311-0 added with */15 schedule, matching the rest of the fleet. pct migrate 310 z3 will work like every other CT. Donatello/Leonardo restoration is a separate issue, not Void-blocking.
  4. su - postgres instead of sudo -u postgres — Debian 13 minimal doesn't ship sudo. Not a deviation in outcome, just adjusted command form.
  5. DB password stored at /root/void2-db-pass.txt on Z (chmod 600). Also baked into /project/src/void-v2/.env on this LXC.

Awaiting User — Phase B (Tasks 2 + 3)

These need PVE host access. Agent inside /project cannot run them.

Task 2 — Provision LXCs on PVE host z

Pick two free CT IDs (suggestion: 310 = void2-db, 311 = void2-app) and two free IPs on 192.168.1.0/24.

# On PVE host as root
pct create 310 local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst \
  --hostname void2-db \
  --cores 2 --memory 4096 --swap 1024 \
  --net0 name=eth0,bridge=vmbr0,ip=192.168.1.X/24,gw=192.168.1.1 \
  --storage donatello-zfs --rootfs donatello-zfs:32 \
  --unprivileged 1 --features nesting=1 --onboot 1 --start 0
cat >> /etc/pve/lxc/310.conf <<'EOF'
lxc.apparmor.profile: unconfined
EOF
pct start 310

pct create 311 local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst \
  --hostname void2-app \
  --cores 4 --memory 4096 --swap 1024 \
  --net0 name=eth0,bridge=vmbr0,ip=192.168.1.Y/24,gw=192.168.1.1 \
  --storage donatello-zfs --rootfs donatello-zfs:16 \
  --unprivileged 1 --features nesting=1 --onboot 1 --start 0
cat >> /etc/pve/lxc/311.conf <<'EOF'
lxc.apparmor.profile: unconfined
EOF
pct start 311

Task 3 — Install Postgres 16 + pgvector on void2-db (CT 310)

pct enter 310

apt update
apt install -y curl ca-certificates gnupg
install -d /usr/share/postgresql-common/pgdg
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc \
  -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc
echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \
  https://apt.postgresql.org/pub/repos/apt $(. /etc/os-release; echo $VERSION_CODENAME)-pgdg main" \
  > /etc/apt/sources.list.d/pgdg.list
apt update
apt install -y postgresql-16 postgresql-16-pgvector

sed -i "s/^#listen_addresses.*/listen_addresses = '*'/" /etc/postgresql/16/main/postgresql.conf

cat >> /etc/postgresql/16/main/pg_hba.conf <<'EOF'
host    void    void    192.168.1.0/24    scram-sha-256
EOF

systemctl restart postgresql

DB_PASS=$(openssl rand -base64 24)
echo "Generated DB password (SAVE THIS): $DB_PASS"

sudo -u postgres psql <<EOF
CREATE USER void WITH PASSWORD '$DB_PASS';
CREATE DATABASE void OWNER void;
\c void
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS pgcrypto;
EOF

SAVE THE DB PASSWORD somewhere safe — needed for .env on resume.

After user completes Tasks 2 + 3

Report back with:

  1. void2-db IP
  2. void2-app IP
  3. The DB password
  4. Confirmation that psql -h <void2-db-ip> -U void -d void -c 'SELECT version();' succeeds from any LAN host

Then update /project/src/void-v2/.env:

DATABASE_URL=postgres://void:<PASSWORD>@<VOID2_DB_IP>:5432/void
OWNER_TOKEN=<generate via openssl rand -base64 24>
PORT=3000
LOG_LEVEL=info
NODE_ENV=development

How to Resume

In the next session, say something like:

"Resume Plan 1 Void 2.0 execution. Read /project/docs/superpowers/plans/2026-05-31-void-v2-plan1-progress.md — Phases A+B done, start dispatching from Task 5."

Resume agent should:

  1. Read this progress file
  2. Verify DB still reachable: PGPASSWORD=$(ssh root@192.168.1.124 'grep DB_PASS /root/void2-db-pass.txt | cut -d= -f2') psql -h 192.168.1.12 -U void -d void -c 'SELECT 1;'
  3. Continue dispatching implementer subagents for Task 5 onward
  4. Token-saving advice: skip code-quality review for trivial scaffolding tasks (the spec compliance review is sufficient there); do full two-stage review for repo + auth + server code

Next subagent dispatch (when ready)

Task 5: Postgres Pool + Migration Runner — full task text in plan file lines covering DB pool, migration runner with idempotency, test helpers.

Quick environment cheatsheet for resume

  • Repo: /project/src/void-v2/ (on main, 2 commits)
  • DB: 192.168.1.12:5432, user void, db void, password in .env and at /root/void2-db-pass.txt on Z (192.168.1.124)
  • App LXC ready (CT 311 @ 192.168.1.13) but Node not installed there yet (Task 21 handles that)
  • cd /project/src/void-v2 && npm test should work once tests exist; .env will be picked up by dotenv
  • SSH to Z: ssh root@192.168.1.124 (key auth works)
  • SSH to void2-db/app: pct exec 310 -- bash / pct exec 311 -- bash from Z (via the SSH chain)