3.4 KiB
3.4 KiB
Plan 1 Complete — Foundation
Done: 2026-05-31
What landed
- Two LXCs provisioned:
void2-db(CT 310 @ 192.168.1.15 — Postgres 16.14 + pgvector 0.8.2 + pgcrypto) andvoid2-app(CT 311 — Node 22 + Express) - PVE replication jobs
310-0and311-0to Z3 every 15 min forpct migrate-based HA - Schema migrations 001-006:
- 001 core (spaces, projects, tasks) with composite-FK tenancy
- 002 knowledge (pages, page_revisions, refs) with FTS + vector indexes
- 003 resources, resource_dependencies, resource_credentials, source_docs (composite FKs on both endpoints, source_docs anchored by NOT NULL FK)
- 004 agents, agent_tokens (bcrypt), conversations, messages (FTS GIN)
- 005 tags, entity_tags, entity_links, attachments (polymorphic — see
docs/security-followups.mdfor tenant-boundary tradeoffs) - 006 audit_log (append-only) + pending_changes
- Repos: spaces, projects, tasks, pages, refs, resources, source_docs, agents,
conversations, messages, tags, links, attachments, audit, pending_changes —
all accept an
actorparameter on mutating ops and emit audit rows - Real audit log with redaction of
token,token_hash,password,api_key,secret,authorizationkeys (case-insensitive, nested) - Capability check (
canAct) with user / cron / worker / system → allow; agents tiered allow / suggest / deny based oncapabilities+scopes - Owner bearer-token auth middleware on all
/api/*;/healthis open - Express server with
/health(DB ping + version) and smoke/api/spaces - systemd unit +
deploy/push.shrsync deploy + setup README - 72 tests across 24 test files — all green
What's NOT here
- Routes for every entity (Plan 2)
- The Void 2.0 UI shell (Plan 2)
- Capture workers — Karakeep poll, YouTube, PDF/OCR, screenshots (Plan 3 + 4)
- MCP server for Claude / Ollama integration (Plan 5)
- Vaultwarden integration for credential storage (deferred, tracked in user memory)
- Migrations from Void 1.x / BookStack / Karakeep (Plan 7)
Known follow-ups
docs/security-followups.md— three security-plugin findings on the polymorphic tables in migration 005 (HIGH: nospace_id; MEDIUM: global tag namespace; MEDIUM: no cascade on parent delete). The polymorphic shape was an approved spec decision; decide tighten-vs-defer before Plan 1 is declared production-ready.lib/db/repos/audit_stub.jsre-exports fromaudit.jsfor backwards compatibility with the 14 existing imports. Future repos should import fromaudit.jsdirectly.voidDB role currently has SUPERUSER for test extension creation. Acceptable for dev; revoke before exposing the DB beyond the LXC perimeter.- vitest
fileParallelism: falseis a workaround forresetDbracing onDROP SCHEMA + CREATE EXTENSION. Tests run sequentially — ~20s for the full suite. Acceptable at current size.
How to verify
cd /project/src/void-v2
npm test
# Expect: 24 files, 72 tests, all passing.
npm run migrate
# Expect: silent success (migrations are idempotent — re-running is a no-op).
OWNER_TOKEN=test npm start &
sleep 1
curl -s localhost:3000/health
# {"ok":true,"db_ok":true,"version":"2.0.0-alpha.1"}
curl -s -H "Authorization: Bearer test" localhost:3000/api/spaces
# []
kill %1
Commit history
22 commits on main, each scoped to a single Plan 1 task. See git log --oneline.