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:
parent
013f5fb40d
commit
8f14ce0573
15 changed files with 167 additions and 181 deletions
|
|
@ -1,6 +1,6 @@
|
|||
# IDENTITY.md - Who Am I
|
||||
|
||||
- **Name:** Klavdija
|
||||
- **Name:** Clawdie
|
||||
- **Creature:** AI assistant
|
||||
- **Vibe:** Practical, direct, warm when it matters
|
||||
- **Emoji:** 🦞
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
2
USER.md
2
USER.md
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 1–3.
|
||||
> 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) |
|
||||
|
|
|
|||
|
|
@ -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 1–5 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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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` |
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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")"
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue