13 KiB
OTIVM — Offline Archive Inventory
Offline archives are vzdump snapshots of LXC container 1105 (otivm-dev) on srv-a.
Each archive is stored in /var/lib/vz/dump/ on srv-a and copied to USB after creation.
Before restoring any archive, read the state description carefully.
Restoring will overwrite everything on the container — all code, all data, all PM2 state.
The Gitea repo is always the SSOT for code. Archives cover the OS, stack, and configuration.
Archive log
vzdump-lxc-1105-2026_05_03-14_08_13.tar.zst
| Property | Value |
|---|---|
| File | vzdump-lxc-1105-2026_05_03-14_08_13.tar.zst |
| Date | 2026-05-03 14:08:13 UTC |
| Size | 1.21 GB |
| Container | LXC 1105 — otivm-dev |
| Host | srv-a (10.0.0.11) |
| Storage | /var/lib/vz/dump/ + offsite cold storage |
| Gitea HEAD | main — 3700f5a iv: retire Prologue.jsx and Ledger.jsx |
Container state at time of archive:
- OTIVM-I, OTIVM-II, OTIVM-III, OTIVM-IV complete and live
- Server startup message:
OTIVM server running on port 3000 — OTIVM-IV - Bootstrap 5.3.3 and Bootstrap Icons 1.11.3 vendored and pinned in
package.json src/App.css— reduced to project overrides. Roman palette as CSS custom properties. All classes prefixedotivm-. Bootstrap handles all layout.- Shell architecture live —
src/components/Shell.jsxandsrc/components/Section.jsxbuilt once. Sidebar with context dropdown replaces tab navigation. Four layout types. Nine panel types in Section.jsx. - Context JSON files —
src/config/contexts.json,context-actor.json,context-forum.json,context-map.json. Dropdown-driven, extensible. - Sub-components —
src/components/ParameterRow.jsx,CostRow.jsx,DriftEntry.jsx src/screens/Actor.jsx— background selection (whenbackground_id = null) or full parameter instrument view (three-col layout).src/screens/Forum.jsx— dispatch/otium decisions. Full cost breakdown visible on route cards. Periodic expenditures panel. Journal collapsible.src/App.jsx— Shell wired. Three contexts: ACTOR, FORUM, MAP.server/index.js— three named otium expenditure trigger types per otium cycle:otium_access_fee(2 dn),personal_maintenance(4 dn),officia_obligation(2 dn). Each writes a separateparameter_drift_logentry with academic source note.src/screens/Prologue.jsxandsrc/screens/Ledger.jsx— deleted. Replaced by Actor.jsx and Forum.jsx.docs/economy/cost-calibration-model.md— ceramic cup baseline, reference wages, periodic cost calibration. Committed.docs/economy/cost-calibration-additional-goods.md— garum, grain, amber, marble capital. Five good patterns established. Committed.docs/Roadmap-OTIVM-IV.md— approved roadmap document. Committed.- PM2 log clean — no errors.
- Live player databases verified:
- Token
1fa3f5fc(Freedman Trader) — 2 ventures, drift log correct - Token
3b1546e8(Noble Younger Son) — extensive play, auctoritas progressed through four band transitions (low→medium→high→distinguished), drift log recording all three otium expenditure types correctly per cycle
- Token
Known deferred items:
- Real cost model — 60/25/15 split (vectura/portoria/other) is a placeholder
- Transformation routes (grain→bread) and barter — architecture defined, not built
- Market reader — deferred, architectural constraints documented and must not be violated
- H7 cells rendered as circles — hex geometry deferred pending client-side h3-js
- Map coastline — five isolated H5 clusters, route corridor deferred
- Terrain — modern WorldCover, restoration layer (HYDE 3.3 + KK10) not yet built
- OTIVM-V scope — not yet defined, project owner decides
What this archive is good for:
First complete OTIVM-IV baseline. Situation instrument live. Shell architecture established. Economic sub-trace recording correctly with named, citable trigger types. Safe restore point before any OTIVM-V development begins.
Restore command (run on srv-a as root):
pct restore 1105 /var/lib/vz/dump/vzdump-lxc-1105-2026_05_03-14_08_13.tar.zst --force
After restore: cd ~/OTIVM && git pull && npm install && npm run build && pm2 restart otivm
Note: otivm.sqlite3 and data/saves/*.sqlite3 are gitignored — present in archive
but not in repo. If restoring to a fresh container without this archive, regenerate
world database from data/create_otivm_db.sql and pipeline scripts. Player databases
will be absent — players start fresh.
vzdump-lxc-1105-2026_05_03-04_36_55.tar.zst
| Property | Value |
|---|---|
| File | vzdump-lxc-1105-2026_05_03-04_36_55.tar.zst |
| Date | 2026-05-03 04:36:55 UTC |
| Size | 1.21 GB |
| Container | LXC 1105 — otivm-dev |
| Host | srv-a (10.0.0.11) |
| Storage | /var/lib/vz/dump/ + offsite cold storage |
| Gitea HEAD | main — d1e1b98 iv: fix drift log trigger type — dispatch_cost vs venture_complete |
Container state at time of archive:
- OTIVM-I, OTIVM-II, OTIVM-III complete and live
server/index.js— OTIVM-III complete. Per-player SQLite live. Ventures, venture_legs, and parameter_drift_log all wired and recording. Drift log trigger types correct:dispatch_cost(den decreases),venture_complete(den increases),interval_complete(auctoritas band change after otium)data/create_player_db.sql— schema version 5.UNIQUE(actor_id)onactor_profile. FK references from all child tables valid. 72 seed rows confirmed clean.data/repair_player_db_fk.sql— repair script for pre-v5 player databases. Applied successfully to78cec864.sqlite3during this session.- Background selection wired end-to-end. PM2 log flushed.
docs/handover-game-dev.md— updated to reflect OTIVM-III complete state.
Known deferred items:
- Cost model: 60/25/15 split is a placeholder
- Journal local state does not reset on new game (React state issue, low priority)
- H7 cells rendered as circles — hex geometry deferred pending client-side h3-js
- Map coastline — five isolated H5 clusters
- Terrain — modern WorldCover, restoration layer not yet built
- OTIVM-IV scope: defined in
docs/Roadmap-OTIVM-IV.md
What this archive is good for:
First complete OTIVM-III baseline with sub-trace live. Ventures, legs, and drift log all recording correctly. Background selection wired end-to-end. Safe restore point before OTIVM-IV development.
Restore command (run on srv-a as root):
pct restore 1105 /var/lib/vz/dump/vzdump-lxc-1105-2026_05_03-04_36_55.tar.zst --force
After restore: cd ~/OTIVM && git pull && npm install && npm run build && pm2 restart otivm
vzdump-lxc-1105-2026_05_02-05_37_24.tar.zst
| Property | Value |
|---|---|
| File | vzdump-lxc-1105-2026_05_02-05_37_24.tar.zst |
| Date | 2026-05-02 05:37 UTC |
| Size | 1.3 GB |
| Container | LXC 1105 — otivm-dev |
| Host | srv-a (10.0.0.11) |
| Storage | /var/lib/vz/dump/ + offsite cold storage |
| Gitea HEAD | main — 1853c1c feat: wire per-player SQLite for OTIVM-III |
Container state at time of archive:
- All of archive 2026-05-02 03:15 plus:
- OTIVM-III complete — per-player SQLite live in production
server/index.jsreplaced — per-player SQLite wiring activedata/create_player_db.sqlcommitted — schema with 8 tables, 72 seed rowsdata/saves/— may contain first.sqlite3player databases from live trafficdata/saves/*.json— legacy JSON saves preserved, never deleted- Roadmap and handover-game-dev.md updated to reflect OTIVM-III state
- Parameter registry additions committed — 44 new tokens
- Law and commerce corpus complete — 37 dialogues reviewed and cleared
Restore command (run on srv-a as root):
pct restore 1105 /var/lib/vz/dump/vzdump-lxc-1105-2026_05_02-05_37_24.tar.zst --force
After restore: cd ~/OTIVM && git pull && npm install && npm run build && pm2 restart otivm
vzdump-lxc-1105-2026_05_02-03_15_12.tar.zst
| Property | Value |
|---|---|
| File | vzdump-lxc-1105-2026_05_02-03_15_12.tar.zst |
| Date | 2026-05-02 03:15 UTC |
| Size | 1.3 GB |
| Container | LXC 1105 — otivm-dev |
| Host | srv-a (10.0.0.11) |
| Storage | /var/lib/vz/dump/ + offsite cold storage |
| Gitea HEAD | main — see commit log for exact SHA |
Container state at time of archive:
- All of archive 2026-04-28 plus:
- OTIVM-II confirmed live — fog-of-war working, routes expanding during gameplay
- Parameter registry additions committed — 44 new tokens
- Law and commerce corpus complete — 37 files reviewed and clean
- Training corpus at 20 Layer 0 primitives, 5 Layer 1 worked examples, 1 sketch
commerce_chunks.jsonl— 230 chunks, 5 layers, evaluated and approved
Restore command (run on srv-a as root):
pct restore 1105 /var/lib/vz/dump/vzdump-lxc-1105-2026_05_02-03_15_12.tar.zst --force
After restore: cd ~/OTIVM && git pull && npm install && npm run build && pm2 restart otivm
vzdump-lxc-1105-2026_04_28-00_39_03.tar.zst
| Property | Value |
|---|---|
| File | vzdump-lxc-1105-2026_04_28-00_39_03.tar.zst |
| Date | 2026-04-28 00:39 UTC |
| Size | 1014 MB |
| Container | LXC 1105 — otivm-dev |
| Host | srv-a (10.0.0.11) |
| Storage | /var/lib/vz/dump/ + workstation cold storage |
| Gitea HEAD | main — see commit log for exact SHA |
Container state at time of archive:
- OTIVM-II complete — fog-of-war map rendering from real TESSERA H7 data
- Fastify backend on port 3000 — static serving, save API, TESSERA map endpoint
data/otivm.sqlite3present — 12,005 H9 rows across five H5 waypoints, status=2data/otivm.sqlite3haspaleo_epochstable — 9 epochs, FK integrity cleanbetter-sqlite3installed in node_modules/api/map/:h5/:epochendpoint live- Map renders H7 land cells at real geographic positions, fog-of-war reveal by chapter
staging_otivm.sqlite3present and in sync with production database
Restore command (run on srv-a as root):
pct restore 1105 /var/lib/vz/dump/vzdump-lxc-1105-2026_04_28-00_39_03.tar.zst --force
After restore: cd ~/OTIVM && git pull && npm install && npm run build && pm2 restart otivm
vzdump-lxc-1105-2026_04_25-12_08_28.tar.zst
| Property | Value |
|---|---|
| File | vzdump-lxc-1105-2026_04_25-12_08_28.tar.zst |
| Date | 2026-04-25 12:08 UTC |
| Size | 791 MB |
| Container | LXC 1105 — otivm-dev |
| Host | srv-a (10.0.0.11) |
| Storage | /var/lib/vz/dump/ + USB copy |
Container state at time of archive:
- OTIVM-I complete and playable at otium.civicus.us
- Fastify backend running — static serving + save API on port 3000
- All five trade routes working — Ostia → Capua → Brundisium → Carthago → Alexandria
- Journal entries, otium/negotium mechanic working
- 128 concurrent players supported
- H3 IDs assigned to all five waypoints — permanent, TESSERA-compatible
Restore command (run on srv-a as root):
pct restore 1105 /var/lib/vz/dump/vzdump-lxc-1105-2026_04_25-12_08_28.tar.zst --force
vzdump-lxc-1105-2026_04_25-07_16_04.tar.zst
| Property | Value |
|---|---|
| File | vzdump-lxc-1105-2026_04_25-07_16_04.tar.zst |
| Date | 2026-04-25 07:16 UTC |
| Size | 759 MB |
| Container | LXC 1105 — otivm-dev |
| Host | srv-a (10.0.0.11) |
| Storage | /var/lib/vz/dump/ + USB copy |
Container state at time of archive:
- Vite + React scaffold present at /home/otivm/OTIVM
npm run buildcompleted — dist/ present- PM2 configured via ecosystem.config.cjs, running, saved
- App serving on port 3000, responding HTTP 200
- otium.civicus.us live and serving Vite welcome page over HTTPS
Restore command (run on srv-a as root):
pct restore 1105 /var/lib/vz/dump/vzdump-lxc-1105-2026_04_25-07_16_04.tar.zst --force
vzdump-lxc-1105-2026_04_25-04_10_53.tar.zst
| Property | Value |
|---|---|
| File | vzdump-lxc-1105-2026_04_25-04_10_53.tar.zst |
| Date | 2026-04-25 04:10 UTC |
| Size | 552 MB |
| Container | LXC 1105 — otivm-dev |
| Host | srv-a (10.0.0.11) |
| Storage | /var/lib/vz/dump/ + USB copy |
Container state at time of archive:
- Debian 12, unprivileged LXC
- 2 cores, 512 MB RAM, 8 GB disk
- Node.js v22 installed (system)
- Python venv at /home/otivm/venv
- Nginx on wg-pk configured and proxying otium.civicus.us → 10.110.0.18:3000
- SSL active on otium.civicus.us
- otivm user created, bashrc configured,
workalias present - Gitea repo cloned to /home/otivm/OTIVM
- PM2 NOT yet configured at time of this archive
- Vite + React scaffold NOT yet present at time of this archive
Restore command (run on srv-a as root):
pct restore 1105 /var/lib/vz/dump/vzdump-lxc-1105-2026_04_25-04_10_53.tar.zst --force
Convention
Archive filenames follow Proxmox default: vzdump-lxc-{CTID}-{YYYY_MM_DD-HH_MM_SS}.tar.zst
Add a new entry to this file every time an archive is created and copied to cold storage.
Always note exactly what is and is not present in the container at time of archive.
Most recent archive listed first.