chore: replace legacy klavdija refs with agent-agnostic names, fix checklist to use Bastille

Replaces hardcoded "klavdija" with ${AGENT_NAME} or generic phrasing across
docs, scripts, and identity files. Fixes fresh-install checklist: jls → bastille
list, parameterized log paths, Bastille-based service checks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---
Build: pass | Tests: pass — Tests  605 passed (605)
This commit is contained in:
Clawdie AI 2026-04-01 21:59:13 +00:00
parent 013f5fb40d
commit 8f14ce0573
15 changed files with 167 additions and 181 deletions

View file

@ -1,6 +1,6 @@
# IDENTITY.md - Who Am I
- **Name:** Klavdija
- **Name:** Clawdie
- **Creature:** AI assistant
- **Vibe:** Practical, direct, warm when it matters
- **Emoji:** 🦞

View file

@ -4,7 +4,7 @@
## Current System (as of 28.Mar.2026)
- **Host:** FreeBSD 15.0 bare-metal, ZFS, Bastille jails
- **Brain:** PostgreSQL 17 + pgvector in `db` jail (192.168.100.3), DB: `klavdija_brain`
- **Brain:** PostgreSQL 17 + pgvector in `db` jail (192.168.100.3), DB: `{agent}_brain`
- **Embeddings:** bge-m3 Q4_K_M via llama-server at 192.168.100.5:8080
- **Chat model:** Phi-4-mini-instruct Q4_K_M at 192.168.100.5:8081 (stepping stone; target: Qwen3-14B at 32 GB RAM)
- **Heartbeat:** cron every 30 min, writes HEARTBEAT.md, optional Telegram alert
@ -34,9 +34,9 @@ using Docker, OpenClaw v1/v2, and cloud LLMs (GLM, OpenRouter). That infrastruct
is retired. These memories are kept for continuity — treat infra references in them
as historical, not current.
- [24.02.] Major session: 3 skills created, cost optimisation, name Klavdija → Clawdie, Telegram integration
- [24.02.] Major session: 3 skills created, cost optimisation, assistant renamed to Clawdie, Telegram integration
- [14.02.] PRD updates v0.3: SSH, Tailscale VPN, user 'clawdie', GLM-5 model configured
- [11.02.] Collaborative tmux + Claude Code workflow established
- [10.02.] Strapi CMS deployment planning for cms.domedog.pro
- [09.02.] Memory persistence explained — context files are the persistent layer
- [06.02.] Initial setup: Sam configured Klavdija as AI assistant, sudo access, fail2ban, cron
- [06.02.] Initial setup: Sam configured Clawdie as AI assistant, sudo access, fail2ban, cron

View file

@ -14,7 +14,7 @@
- Has a dog that needs live attention (busy with caregiving)
- Exploring AWS free tier for cloud infrastructure
- Wants Klavdija to be resilient and long-term companion
- Wants the agent to be resilient and a long-term companion
- Uses SSH keys for authentication
- Values security but doesn't have time for manual maintenance
- Learning Python and experimenting with AI/LLM development

View file

@ -5,7 +5,7 @@ running domedog host. Written after a live session so all snags are documented.
> **Script:** `docs/scripts/setup-controlplane-jail.sh` automates steps 13.
> The remaining steps (npm prefix, pi, service) must be run manually for now —
> the script's step 5 is stale (hardcoded `klavdija`, wrong rc.d path). Use
> the script's step 5 is stale (hardcoded service name, wrong rc.d path). Use
> the manual commands below.
---
@ -17,7 +17,7 @@ running domedog host. Written after a live session so all snags are documented.
- `.env` populated — especially `AGENT_NAME`, `WORKER_JAIL_IP`, `ZAI_API_KEY`
- ZFS pool `zroot` with prefix `clawdie-runtime` (set in `bastille.conf`)
- `warden0` bridge interface exists (`ifconfig warden0` to verify)
- `db` jail running with `clawdie_brain` database already created
- `db` jail running with `{agent}_brain` database already created
(see `docs/scripts/setup-db-jail.sh` — run that first)
---
@ -278,4 +278,4 @@ points at the old jail path.
| 6 | `node dist/setup/index.js` not found | Setup is not compiled to dist | Use `npx tsx setup/index.ts` |
| 7 | `bastille destroy` fails | Mounts still active | Unmount nullfs + ZFS dataset manually first |
| 8 | ZFS npm-global not visible in new jail | Mountpoint still points at old jail | `zfs set mountpoint=...` to new path |
| 9 | Service script references `klavdija` | `setup-controlplane-jail.sh` step 5 is stale | Use `--step service` via tsx (step 10 above) |
| 9 | Service script references a hardcoded name | `setup-controlplane-jail.sh` step 5 is stale | Use `--step service` via tsx (step 10 above) |

View file

@ -20,11 +20,11 @@ enters through the CMS.
attacker
→ crafted HTTP POST to cms.clawdie.si (Strapi API or contact form)
→ strapi_cms database (cms → db jail, port 5432)
— jail isolation holds: strapi_cms user has no SELECT on klavdija_brain
— jail isolation holds: strapi_cms user has no SELECT on {agent}_brain
— BUT: agent reads published CMS content as part of normal site-check
→ agent reads the page, scores it as interesting, stores summary
→ memory-pg: INSERT INTO memories (summary, key_facts, importance ...)
→ poisoned record is now in klavdija_brain
→ poisoned record is now in {agent}_brain
→ next startup: memory hydration injects poisoned instructions into context
→ agent acts on them on the first matching query
```
@ -37,7 +37,7 @@ access controls entirely — the agent cooperates willingly.
### What "partial success" looks like
- Jail isolation held. No shell. No host escape.
- `klavdija_brain` schema is intact. PostgreSQL is healthy.
- `{agent}_brain` schema is intact. PostgreSQL is healthy.
- `memories` contains 15 crafted rows with plausible metadata:
- `topics = ARRAY['system', 'instructions', 'safety']`
- `importance = 3` (below threshold that triggers operator alert)
@ -68,7 +68,7 @@ Anomalous agent behaviour detected
Stop agent immediately
sudo service klavdija stop
sudo service {agent} stop
Run memory audit queries (see above)
@ -161,7 +161,7 @@ a clean proven state.
### Step 1: Stop everything touching the db jail
```sh
sudo service klavdija stop
sudo service {agent} stop
sudo bastille stop ${AGENT_NAME}-cms # Strapi writes stop
```
@ -214,9 +214,9 @@ The `max(created_at)` should match the snapshot timestamp.
### Step 6: Restart agent and audit hydration output
```sh
sudo service klavdija start
sudo service {agent} start
# Monitor hydration output
tail -f /home/clawdie/clawdie-ai/logs/klavdija.log | grep -i "hydrat\|memory\|brain"
tail -f /home/clawdie/clawdie-ai/logs/{agent}.log | grep -i "hydrat\|memory\|brain"
```
Verify the hydrated MEMORY.md does not contain the poisoned content.
@ -299,7 +299,7 @@ psql "$MEMORY_DB_URL" -c "
"
# 5. Stop agent (simulates operator response)
sudo service klavdija stop
sudo service {agent} stop
# 6. Option A path — surgical delete
psql "$MEMORY_DB_URL" -c "
@ -327,9 +327,9 @@ fi
# psql "$MEMORY_DB_URL" -tAc "SELECT count(*) FROM memories;"
# 9. Restart agent
sudo service klavdija start
sudo service {agent} start
echo "Drill complete. Check logs/klavdija.log for clean memory hydration."
echo "Drill complete. Check logs/{agent}.log for clean memory hydration."
```
### Pass criteria

View file

@ -21,7 +21,7 @@ VPS / cloud host (FreeBSD 15)
**Setup path:**
```
git clone → npm run install-all → configure .env → service klavdija start
git clone → npm run install-all → configure .env → service {agent} start
```
See [`docs/INSTALL.md`](./INSTALL.md) and the `ansible-freebsd` skill for

View file

@ -23,30 +23,30 @@ shows boot messages with timestamps.
Check firstboot log for exact timestamps:
```sh
head -5 /var/log/clawdie-firstboot.log
tail -5 /var/log/clawdie-firstboot.log
head -5 /var/log/${AGENT_NAME}-firstboot.log
tail -5 /var/log/${AGENT_NAME}-firstboot.log
```
## 1. Jails running
```sh
jls -N
sudo bastille list
```
Expected (agent name may vary):
```
JID IP Address Hostname Name
1 10.0.X.2 {agent}-controlplane {agent}-controlplane
2 10.0.X.3 db db
3 10.0.X.4 cms cms
4 10.0.X.5 llamacpp llamacpp
JID IP Address Hostname Path
{agent}-cont.. 10.0.X.2 {agent}-controlplane /usr/local/bastille/jails/...
db 10.0.X.3 db /usr/local/bastille/jails/...
cms 10.0.X.4 cms /usr/local/bastille/jails/...
llamacpp 10.0.X.5 llamacpp /usr/local/bastille/jails/...
```
All four jails must be present and running. If any are missing:
```sh
cat /var/log/clawdie-firstboot.log | grep -i 'fail\|error'
grep -i 'fail\|error' /var/log/${AGENT_NAME}-firstboot.log
```
## 2. .env correctness
@ -61,8 +61,8 @@ Verify:
|-----|----------|
| `AGENT_NAME` | Lowercase, no spaces (e.g. `clawdie`, `mevy`) |
| `AGENT_GENDER` | `f`, `m`, or `n` |
| `AGENT_DOMAIN` | Valid domain or `.internal` |
| `AGENT_INTERNAL_DOMAIN` | `{agent}.home.arpa` |
| `AGENT_DOMAIN` | Public domain (e.g. `clawdie.si`) or `{agent}.internal` for VMs |
| `AGENT_INTERNAL_DOMAIN` | `{agent}.home.arpa` (Tailscale / local DNS) |
| `AGENT_TMP_DIR` | Writable path, not `/tmp` |
| `PI_TUI_PROVIDER` | `zai`, `openrouter`, `anthropic`, etc. |
| `PI_TUI_MODEL` | Valid model for the provider |
@ -84,7 +84,7 @@ Expected: JSON response with `mode`, `throttle`, `memory`, `activeJails`.
If socket is missing, check if the agent process is running:
```sh
pgrep -f 'node.*dist/index.js'
sudo bastille cmd "${AGENT_NAME}-controlplane" service clawdie status
```
## 4. Database connectivity
@ -132,13 +132,12 @@ If Lumina fails to start, check:
```sh
# X11 log
cat /var/log/Xorg.0.log | tail -30
tail -30 /var/log/Xorg.0.log
# LightDM log
cat /var/log/lightdm/lightdm.log | tail -30
tail -30 /var/log/lightdm/lightdm.log
# GPU driver loaded?
sysctl kern.conftxt | grep -i gpu
pciconf -lv | grep -B3 'VGA'
```
@ -148,8 +147,8 @@ pciconf -lv | grep -B3 'VGA'
# PF rules loaded
sudo pfctl -sr | head -10
# NAT working (from inside a jail)
sudo bastille cmd db ping -c1 1.1.1.1
# NAT working (from inside the db jail)
sudo bastille cmd db ping -c 1 1.1.1.1
# Bridge healthy
ifconfig warden0 | grep 'inet '
@ -178,16 +177,16 @@ python3 .agent/skills/tmux-screenshot/tmux-screenshot.py \
Verify the capture landed:
```sh
ls -la /usr/local/www/clawdie/screenshots/*.png | tail -3
ls -la /usr/local/www/${AGENT_NAME}/screenshots/*.png | tail -3
```
## Log paths reference
| Log | Path |
|-----|------|
| Firstboot orchestrator | `/var/log/clawdie-firstboot.log` |
| Firstboot progress | `/var/log/clawdie-firstboot.progress` |
| Agent (production) | `logs/klavdija.log` (relative to project) |
| 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) |
| Watchdog | Same as agent log (pino structured) |
| Preflight run | `logs/preflight-{runstamp}/` |
| LightDM | `/var/log/lightdm/lightdm.log` |

View file

@ -29,8 +29,8 @@ Each run (default: every 30 minutes):
3. **LLM interpretation** — local model at `:8081`
- Feed health + memory snapshot to chat model
- Prompt: "You are Klavdija's system monitor. Summarise current state
in 3 sentences. Flag anything that needs operator attention."
- Prompt: "You are the system monitor for ${AGENT_NAME}. Summarise
current state in 3 sentences. Flag anything that needs operator attention."
- If LLM unavailable: skip interpretation, log raw data only
4. **Write `HEARTBEAT.md`** — live state file in project root
@ -111,11 +111,11 @@ HEARTBEAT runs
├── WARN (jail down, disk >80%, memory pipeline stale >2h)
│ → write HEARTBEAT.md with flag
│ → Telegram: "⚠️ Klavdija heartbeat: <summary>"
│ → Telegram: "⚠️ ${AGENT_NAME} heartbeat: <summary>"
└── CRIT (DB unreachable, all jails down, disk >95%)
→ write HEARTBEAT.md with flag
→ Telegram: "🚨 Klavdija heartbeat CRITICAL: <summary>"
→ Telegram: "🚨 ${AGENT_NAME} heartbeat CRITICAL: <summary>"
→ do NOT attempt auto-repair (operator decides)
```
@ -127,7 +127,7 @@ Repair actions go through `clawdie-hostd` on explicit operator request.
## Memory integration
The heartbeat optionally writes a low-importance memory entry after each
run so Klavdija has context about recent system state:
run so the agent has context about recent system state:
```sql
INSERT INTO memories (session_id, summary, importance, topics)

View file

@ -94,18 +94,18 @@ echo "==> npm-global: auto-mounted via ZFS mountpoint (no fstab entry needed)"
# ── 5. rc.d service ───────────────────────────────────────────────────────────
RC_SRC="/usr/local/etc/rc.d/klavdija"
RC_DST="${JAIL_ROOT}/usr/local/etc/rc.d/klavdija"
RC_SRC="/usr/local/etc/rc.d/${AGENT_NAME}"
RC_DST="${JAIL_ROOT}/usr/local/etc/rc.d/${AGENT_NAME}"
if [ -f "${RC_SRC}" ]; then
echo "==> Installing rc.d/klavdija into jail"
echo "==> Installing rc.d/${AGENT_NAME} into jail"
cp "${RC_SRC}" "${RC_DST}"
chmod +x "${RC_DST}"
bastille sysrc "${JAIL}" klavdija_enable=YES
bastille sysrc "${JAIL}" "${AGENT_NAME}_enable=YES"
else
echo "WARN: ${RC_SRC} not found — install manually after npm run build"
fi
echo ""
echo "==> Done. Start with: bastille cmd ${JAIL} service klavdija start"
echo "==> Done. Start with: bastille cmd ${JAIL} service ${AGENT_NAME} start"
echo " Verify: bastille cmd ${JAIL} pgrep -la node"

View file

@ -1,24 +1,25 @@
{
"generated_at": "2026-03-08T21:48:15.396932",
"count": 6,
"generated_at": "2026-04-01T20:27:52.411135",
"count": 5,
"screenshots": [
{
"uuid": "bd96a82b194c",
"uuid": "f5bc5ba1885b",
"session": "0",
"captured_at": "2026-03-08T21:48:14.941197",
"captured_at_display": "08.mar.2026 21:48:14",
"capture_target": "0:codex",
"captured_at": "2026-04-01T20:27:51.941350",
"captured_at_display": "01.apr.2026 20:27:51",
"host": "osa.smilepowered.org",
"window_index": "0",
"window_name": "node",
"window_name": "codex",
"pane_id": "%0",
"pane_title": "\u2810 Claude Code",
"pane_current_command": "node",
"pane_current_path": "/home/clawdie/clawdie-ai",
"txt_hash": "bd96a82b194c293366e5dd47e0e8be99114b719dd64249889102461245d7de22",
"text_path": "bd96a82b194c.txt",
"png_path": "bd96a82b194c.png",
"json_path": "bd96a82b194c.json",
"line_count": 40,
"pane_title": "osa.smilepowered.org",
"pane_current_command": "codex",
"pane_current_path": "/home/clawdie/clawdie-iso",
"txt_hash": "f5bc5ba1885b67c1f7914d2b641024c7f478ec7156e5b5caa3ca9fa6381e63a6",
"text_path": "f5bc5ba1885b.txt",
"png_path": "f5bc5ba1885b.png",
"json_path": "f5bc5ba1885b.json",
"line_count": 39,
"tags": [
"tmux",
"terminal",
@ -26,27 +27,28 @@
],
"detected_signatures": [],
"dimensions": {
"width": 1579,
"height": 788
"width": 1561,
"height": 848
}
},
{
"uuid": "ee55b51741f1",
"uuid": "cd9afb8e7f0a",
"session": "0",
"captured_at": "2026-03-08T21:47:32.228071",
"captured_at_display": "08.mar.2026 21:47:32",
"capture_target": "%0",
"captured_at": "2026-04-01T20:14:11.120766",
"captured_at_display": "01.apr.2026 20:14:11",
"host": "osa.smilepowered.org",
"window_index": "0",
"window_name": "node",
"window_name": "codex",
"pane_id": "%0",
"pane_title": "\u2802 Claude Code",
"pane_current_command": "node",
"pane_current_path": "/home/clawdie/clawdie-ai",
"txt_hash": "ee55b51741f100899182655eac822190e620dd5bf80d1407f582b327518a6ff0",
"text_path": "ee55b51741f1.txt",
"png_path": "ee55b51741f1.png",
"json_path": "ee55b51741f1.json",
"line_count": 40,
"pane_title": "osa.smilepowered.org",
"pane_current_command": "codex",
"pane_current_path": "/home/clawdie/clawdie-iso",
"txt_hash": "cd9afb8e7f0a6dc1afc40264adcdecd55415eb60a6cec182c346ea7533d46259",
"text_path": "cd9afb8e7f0a.txt",
"png_path": "cd9afb8e7f0a.png",
"json_path": "cd9afb8e7f0a.json",
"line_count": 39,
"tags": [
"tmux",
"terminal",
@ -59,10 +61,68 @@
}
},
{
"uuid": "10a7cd4c4a6e",
"uuid": "803a5a96c890",
"session": "0",
"captured_at": "2026-03-08T21:33:02.396651",
"captured_at_display": "08.mar.2026 21:33:02",
"capture_target": "%0",
"captured_at": "2026-04-01T18:07:33.878786",
"captured_at_display": "01.apr.2026 18:07:33",
"host": "osa.smilepowered.org",
"window_index": "0",
"window_name": "codex",
"pane_id": "%0",
"pane_title": "osa.smilepowered.org",
"pane_current_command": "codex",
"pane_current_path": "/home/clawdie/clawdie-iso",
"txt_hash": "803a5a96c89019b68fc565be51d0ba98d24a43969b4079033179a7547f8df652",
"text_path": "803a5a96c890.txt",
"png_path": "803a5a96c890.png",
"json_path": "803a5a96c890.json",
"line_count": 39,
"tags": [
"tmux",
"terminal",
"diagnostic"
],
"detected_signatures": [],
"dimensions": {
"width": 1579,
"height": 688
}
},
{
"uuid": "8c358e1aa9d8",
"session": "clawdie",
"capture_target": "clawdie:main",
"captured_at": "2026-03-14T23:07:04.863267",
"captured_at_display": "14.mar.2026 23:07:04",
"host": "osa.smilepowered.org",
"window_index": "1",
"window_name": "main",
"pane_id": "%2",
"pane_title": "",
"pane_current_command": "bash",
"pane_current_path": "/home/clawdie/clawdie-ai",
"txt_hash": "8c358e1aa9d87ebf75a724fe3bc05d5cf7a86e7906e222f79f7065dd672ef84e",
"text_path": "8c358e1aa9d8.txt",
"png_path": "8c358e1aa9d8.png",
"json_path": "8c358e1aa9d8.json",
"line_count": 35,
"tags": [
"tmux",
"terminal",
"diagnostic"
],
"detected_signatures": [],
"dimensions": {
"width": 481,
"height": 768
}
},
{
"uuid": "e71e3f2434cc",
"session": "0",
"captured_at": "2026-03-08T21:11:33.339789",
"captured_at_display": "08.03.2026 21:11:33",
"host": "osa.smilepowered.org",
"window_index": "0",
"window_name": "node",
@ -70,104 +130,28 @@
"pane_title": "\u2810 Claude Code",
"pane_current_command": "node",
"pane_current_path": "/home/clawdie/clawdie-ai",
"txt_hash": "10a7cd4c4a6ead934858ec588dc71c7aa24fbb9ee60a447d9779661835d64811",
"text_path": "10a7cd4c4a6e.txt",
"png_path": "10a7cd4c4a6e.png",
"json_path": "10a7cd4c4a6e.json",
"txt_hash": "e71e3f2434cccf734c12424d77ec995203b670dbed79a4726fd0e481ae10c922",
"text_path": "e71e3f2434cc.txt",
"png_path": "e71e3f2434cc.png",
"json_path": "e71e3f2434cc.json",
"line_count": 40,
"tags": [
"tmux",
"terminal",
"diagnostic"
],
"detected_signatures": [],
"dimensions": {
"width": 1579,
"height": 848
}
},
{
"uuid": "881a4ffb1ec7",
"session": "0",
"captured_at": "2026-03-08T21:31:44.445800",
"captured_at_display": "08.mar.2026 21:31:44",
"host": "osa.smilepowered.org",
"window_index": "0",
"window_name": "node",
"pane_id": "%0",
"pane_title": "\u2810 Claude Code",
"pane_current_command": "node",
"pane_current_path": "/home/clawdie/clawdie-ai",
"txt_hash": "881a4ffb1ec703357e8da90cb859c09f1259f4a282f439eb8d9d844f42cf9aa6",
"text_path": "881a4ffb1ec7.txt",
"png_path": "881a4ffb1ec7.png",
"json_path": "881a4ffb1ec7.json",
"line_count": 40,
"tags": [
"tmux",
"terminal",
"diagnostic"
"detected_signatures": [
{
"id": "controlplane_hostname_ok",
"severity": "ok",
"source_skill": "warden-bootstrap",
"matched_text": "controlplane.clawdie.local",
"next_action": "Controlplane hostname is correctly set."
}
],
"detected_signatures": [],
"dimensions": {
"width": 1579,
"height": 848
}
},
{
"uuid": "b45b2398a656",
"session": "0",
"captured_at": "2026-03-08T21:27:11.222631",
"captured_at_display": "08.mar.2026 21:27:11",
"host": "osa.smilepowered.org",
"window_index": "0",
"window_name": "node",
"pane_id": "%0",
"pane_title": "\u2802 Claude Code",
"pane_current_command": "node",
"pane_current_path": "/home/clawdie/clawdie-ai",
"txt_hash": "b45b2398a656dd10c8c439e8ced701a845c68889bf46b5593cdfe46172b49158",
"text_path": "b45b2398a656.txt",
"png_path": "b45b2398a656.png",
"json_path": "b45b2398a656.json",
"line_count": 40,
"tags": [
"tmux",
"terminal",
"diagnostic"
],
"detected_signatures": [],
"dimensions": {
"width": 1579,
"height": 828
}
},
{
"uuid": "33625d1cad23",
"session": "0",
"captured_at": "2026-03-08T21:18:48.415910",
"captured_at_display": "08.mar.2026 21:18:48",
"host": "osa.smilepowered.org",
"window_index": "0",
"window_name": "node",
"pane_id": "%0",
"pane_title": "\u2810 Claude Code",
"pane_current_command": "node",
"pane_current_path": "/home/clawdie/clawdie-ai",
"txt_hash": "33625d1cad23782a50071ec4ce0f7f9d483b3032d028cb2e7c34a0b364705e19",
"text_path": "33625d1cad23.txt",
"png_path": "33625d1cad23.png",
"json_path": "33625d1cad23.json",
"line_count": 40,
"tags": [
"tmux",
"terminal",
"diagnostic"
],
"detected_signatures": [],
"dimensions": {
"width": 1579,
"height": 848
"height": 648
}
}
]

View file

@ -43,7 +43,7 @@ _flag() {
}
# Jails — try prefixed name first, fall back to short name
# Handles both klavdija-db and db conventions; llama-cpp → llamacpp variant
# Handles legacy prefixed naming; llama-cpp → llamacpp variant
JAIL_STATUS=""
BASTILLE_LIST="$(sudo timeout 10 bastille list 2>/dev/null || true)"
_jail_up() {
@ -113,7 +113,7 @@ fi
SUMMARY="LLM unavailable — raw data only."
if [ "$CHAT_STATUS" = "✓" ]; then
HEALTH_SNAPSHOT="Jails: $(printf '%b' "$JAIL_STATUS" | tr '\n' '|') | Memories: ${MEM_COUNT} (latest: ${MEM_LATEST}) | Embed: ${EMBED_STATUS} | Disk: ${ZFS_USED}"
PROMPT="You are Klavdija's system monitor. Current state: ${HEALTH_SNAPSHOT}. Flags: ${FLAGS:-none}. Summarise in 2 sentences, mention any concerns."
PROMPT="You are ${AGENT_NAME}'s system monitor. Current state: ${HEALTH_SNAPSHOT}. Flags: ${FLAGS:-none}. Summarise in 2 sentences, mention any concerns."
SUMMARY=$(curl -sf --max-time 15 "${CHAT_BASE_URL}/chat/completions" \
-H "Content-Type: application/json" \
@ -159,7 +159,7 @@ NOTIFY="${HEARTBEAT_NOTIFY_TELEGRAM:-false}"
if [ "$NOTIFY" = "true" ] && [ "$STATUS" != "OK" ]; then
ICON="⚠️"
[ "$STATUS" = "CRIT" ] && ICON="🚨"
MSG="${ICON} Klavdija heartbeat ${STATUS}${NOW}
MSG="${ICON} ${AGENT_NAME} heartbeat ${STATUS}${NOW}
${SUMMARY}
Flags:
$(printf '%b' "$FLAGS")"

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python3
"""
scripts/memory/embed-docs.py Embed project docs into klavdija_brain.
scripts/memory/embed-docs.py Embed project docs into {agent}_brain.
Reads markdown files, splits by heading sections, embeds via bge-m3,
and inserts into the memories/memory_chunks/memory_embeddings tables.
@ -38,7 +38,7 @@ def load_env(path: Path) -> dict[str, str]:
return env
ENV = load_env(PROJECT_ROOT / '.env')
AGENT_NAME = ENV.get('AGENT_NAME', 'klavdija')
AGENT_NAME = ENV.get('AGENT_NAME', 'clawdie')
DB_HOST = ENV.get('WARDEN_DB_IP', '10.0.1.3')
DB_PORT = ENV.get('DB_PORT', '5432')
DB_NAME = f'{AGENT_NAME}_brain'

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""
scripts/memory/import-memories.py
Import session memories from a transfer JSON into klavdija_brain.
Import session memories from a transfer JSON into {agent}_brain.
Usage:
python3 scripts/memory/import-memories.py <transfer.json>
@ -39,7 +39,7 @@ def load_env(path: Path) -> dict[str, str]:
ENV = load_env(PROJECT_ROOT / '.env')
AGENT_NAME = ENV.get('AGENT_NAME', 'klavdija')
AGENT_NAME = ENV.get('AGENT_NAME', 'clawdie')
DB_HOST = ENV.get('WARDEN_DB_IP', '10.0.1.3')
DB_PORT = int(ENV.get('DB_PORT', '5432'))
DB_NAME = f'{AGENT_NAME}_brain'

View file

@ -6,11 +6,14 @@
import { initMemoryPool, shutdownMemoryPool } from '../src/memory-lifecycle.js';
import { storeMemory, searchMemories, getMemoryStats } from '../src/memory-pg.js';
import { AGENT_NAME } from '../src/config.js';
const AGENT_DISPLAY_NAME = AGENT_NAME.charAt(0).toUpperCase() + AGENT_NAME.slice(1);
const TEST_SUMMARY = `
Klavdija je pomagala uporabniku nastaviti lokalni embedding strežnik bge-m3 na FreeBSD gostitelju.
${AGENT_DISPLAY_NAME} je pomagala uporabniku nastaviti lokalni embedding strežnik bge-m3 na FreeBSD gostitelju.
Namestili smo llama-cpp z bastille jail za PostgreSQL s pgvector razširitvijo.
Vektorska baza podatkov klavdija_brain je zdaj aktivna na 192.168.100.3.
Vektorska baza podatkov ${AGENT_NAME}_brain je zdaj aktivna na 192.168.100.3.
Embedding model bge-m3 deluje na 127.0.0.1:8080 z 1024 dimenzijami.
`.trim();

View file

@ -3,7 +3,7 @@
*
* These tests protect SKILL.md files from common regressions:
* - missing or broken frontmatter
* - stale agent name "klavdija" (renamed to clawdie)
* - stale legacy agent name from previous experiments
* - Docker/macOS commands leaking into FreeBSD-native skills
* - broken references to files in this repo
*/
@ -166,7 +166,7 @@ describe('SKILL.md frontmatter', () => {
});
// ---------------------------------------------------------------------------
// 2. No stale agent name "klavdija" — every skill
// 2. No stale legacy agent name — every skill
// ---------------------------------------------------------------------------
describe('No stale "klavdija" agent name', () => {
for (const { skill, filePath } of all) {