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

151 lines
7.2 KiB
Markdown

# 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 blocked**`localzfs` 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.
```bash
# 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)
```bash
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)