Skip to content

Fresh Install Checklist

Verification checklist for new Clawdie-AI installations (bare metal, bhyve VM, or jail-based). Run after firstboot completes. Each check includes the exact command and expected result.

Designed to work with the tmux-screenshot skill — capture each section for the installation record.

Record wall-clock timestamps at each stage. On bhyve, the serial console shows boot messages with timestamps.

MilestoneCommand / eventRecord
Boot startFirst kernel messageT0
first-boot setup consumed[firstboot] seed loaded in logT1 = T1 - T0
Firstboot complete[firstboot] Complete. in logT2 = T2 - T0
Desktop ready (Lumina)lightdm login screen visibleT3 = T3 - T0
Agent responding/ping on Telegram returns pongT4 = T4 - T0

If the first-boot setup (setup.txt) was absent or invalid, the install falls back to the interactive TUI wizard at the equivalent of T1 — record the same milestone but note “TUI fallback” in the install record.

Check firstboot log for exact timestamps:

Terminal window
head -5 /var/log/${AGENT_NAME}-firstboot.log
tail -5 /var/log/${AGENT_NAME}-firstboot.log
Terminal window
sudo bastille list

Expected jails depend on configuration:

JailWhen present
{agent}-controlplaneWhen agent runs inside a controlplane jail
git (shared, 10.0.0.2)Shared across agents — one per host
cms (shared, 10.0.0.3)Shared across agents — one per host
ollama / llama-cpp (10.0.0.4)When Local AI Models are enabled
db (10.0.0.5)Only when DB_RUNTIME=jail
{agent}_db_workerPhase 7 isolation enabled
{agent}_git_workerPhase 7 isolation enabled
{agent}_ctrl_workerPhase 7 isolation enabled

With DB_RUNTIME=host there is no db jail — PostgreSQL runs on the host and jails connect via warden0 (10.0.N.1:5432).

If expected jails are missing:

Terminal window
grep -i 'fail\|error' /var/log/${AGENT_NAME}-firstboot.log

Before editing .env inside a bhyve guest, confirm you are in the guest filesystem and on the expected user/home path:

Terminal window
hostname
ifconfig | head -n 5
whoami
echo "$HOME"
pwd
ls -la /home

If the agent name is mevy, expect the repo at:

Terminal window
ls -la /home/mevy/clawdie-ai/.env
Terminal window
grep -E '^(AGENT_NAME|AGENT_GENDER|AGENT_DOMAIN|AGENT_INTERNAL_DOMAIN|AGENT_TMP_DIR|PI_TUI_PROVIDER|PI_TUI_MODEL|EMBED_BASE_URL|TELEGRAM_BOT_TOKEN)=' .env

Verify:

KeyExpected
AGENT_NAMELowercase, no spaces (e.g. clawdie, mevy)
AGENT_GENDERf, m, or n
AGENT_DOMAINPublic domain (e.g. clawdie.si) or {agent}.internal for VMs
AGENT_INTERNAL_DOMAIN{agent}.home.arpa (Tailscale / local DNS)
AGENT_TMP_DIRWritable path, not /tmp
PI_TUI_PROVIDERzai, openrouter, anthropic, etc.
PI_TUI_MODELValid model for the provider
EMBED_BASE_URLURL ending in /v1
TELEGRAM_BOT_TOKENNon-empty if FEATURE_TELEGRAM=true
Terminal window
# Check socket exists
ls -la "${AGENT_TMP_DIR:-tmp}/ipc/"
# Query watchdog status
echo '{"cmd":"status"}' | nc -U "${AGENT_TMP_DIR:-tmp}/ipc/${AGENT_NAME}-watchdog.sock"

Expected: JSON response with mode, throttle, memory, activeJails.

If socket is missing, check if the agent process is running:

Terminal window
sudo bastille cmd "${AGENT_NAME}-controlplane" service clawdie status
Terminal window
# DB_RUNTIME=host: PostgreSQL runs on the host
service postgresql status
# DB_RUNTIME=jail: PostgreSQL runs in the db jail
sudo bastille cmd db service postgresql status
# Test connection (uses .env credentials)
just setup -- --step verify

Expected: postgresql is running and verify step exits 0.

If tenant sites are already declared, verify may report publish state such as planned_only, partial, or available. Those are acceptable during the current manual publish phase. inconsistent is the state that needs operator attention before you treat publishing as healthy.

Terminal window
# Quick inference test via pi
pi --provider "${PI_TUI_PROVIDER}" --model "${PI_TUI_MODEL}" -e "reply with OK"

Expected: Model responds. If using ZAI (GLM), verify the API key:

Terminal window
grep '^ZAI_API_KEY=' .env | cut -c1-20
Terminal window
# Check bot token is valid (should return bot info)
curl -s "https://api.telegram.org/bot$(grep '^TELEGRAM_BOT_TOKEN=' .env | cut -d= -f2)/getMe" | python3 -m json.tool

Expected: "ok": true with the bot username.

Terminal window
service lightdm status
service dbus status

If Lumina fails to start, check:

Terminal window
# X11 log
tail -30 /var/log/Xorg.0.log
# LightDM log
tail -30 /var/log/lightdm/lightdm.log
# GPU driver loaded?
pciconf -lv | grep -B3 'VGA'
Terminal window
# PF rules loaded
sudo pfctl -sr | head -10
# NAT working (from inside the db jail)
sudo bastille cmd db ping -c 1 1.1.1.1
# Bridge healthy
ifconfig warden0 | grep 'inet '
Terminal window
zpool status -x
zfs list -o name,used,avail -t filesystem | head -20

Expected: all pools are healthy.

Capture the final state as proof of successful install:

Terminal window
python3 .agent/skills/tmux-screenshot/tmux-screenshot.py \
--session "${AGENT_NAME}" \
--base-url "https://${AGENT_DOMAIN}/screenshots" \
--publish

Verify the capture landed:

Terminal window
ls -la /usr/local/www/${AGENT_NAME}/screenshots/*.png | tail -3
LogPath
Firstboot orchestrator/var/log/${AGENT_NAME}-firstboot.log
Firstboot progress/var/log/${AGENT_NAME}-firstboot.progress
Agent (production)logs/${AGENT_NAME}.log (relative to project)
WatchdogSame as agent log (pino structured)
Preflight runtmp/preflight/{runstamp}/
LightDM/var/log/lightdm/lightdm.log
X11/var/log/Xorg.0.log
PostgreSQL/var/log/postgresql.log (inside db jail)
nginx/var/log/nginx/error.log

The automated version of this checklist:

Terminal window
# As root (for jail and firewall steps)
sudo just preflight
# With onboarding wizard
sudo just preflight -- --with-onboarding
# Stop on first failure
sudo just preflight -- --fail-fast

Results are written to tmp/preflight/{timestamp}/summary.json.