Homebot: Sicht, Rechte und Configs
Was der Hauptagent im Chat und der Sub-Agent ramon-1 (Auftrag #925) sehen, dürfen und mitbekommen. Grundlage: Bestandsaufnahme vom 15.10.2026, 19:53–20:03 CEST, nur gelesen, nichts geändert. Secrets stehen hier nur als „vorhanden“, nie mit Inhalt.
Kritisch
admind prüft keine Owner-Rolle
- admind prüft keine Owner-Rolle: nur Quelladresse (localhost / Docker-Netz) und Bearer-Token. Ein
actor-Feld ist frei wählbar, Vorgabe"ramon". - Der Token liegt in
~/docker/homebot-admin/.env(Modus 600, eigener User) und ist damit für jeden Agenten-Prozess lesbar. - Folge: Deploy, Grants, Unit-Restarts, Evolve,
removeundpurgevon Tenants sind peragent.runüber Bash erreichbar. V3 („agent.run ändert den Bot nie“) setzt nur der Prompt durch, nicht admind.
Vorgeschlagene Fixes
(a) Gesetzesnummer G54 → G51
„Ehrlich berichten“ ist laut LAWS.md G51, nicht G54 (G54 = Diktat-Brücke). Korrigieren in worker/agents.py:85 und app/openai_compat.py:1732.
(b) admind-Token absichern
Den admind-Token für Agenten unlesbar machen bzw. in admind eine Herkunftsprüfung einbauen (welcher Prozess/Agent ruft an), statt nur Quelladresse und Token zu prüfen.
Hauptagent (Chat)
Sicht: nur der FAKTEN-Block (Health-Snapshot) plus Ergebnisse von Aktionen
Zugriff
- Kein direkter Serverzugriff.
shell.readonly: nur Statuskommandos sowiels/find/catunter~/.openclaw/workspace.
Rechte
- Alle Aktionen mit Owner-Rechten.
Regeln
| Regel | Inhalt |
|---|---|
| confirm | bei schreibenden Befehlen |
| Kauf/Zahlung | kein Kauf, keine Zahlung ohne Auftrag |
| Löschen | Rückfrage vor dem Löschen |
| Selbständerung | Änderungen an sich selbst nur via evolve.request |
people.provision | nur wenn Ramon es in derselben Nachricht sagt |
server.root | nur als Vorschlag; erlaubt: docker, systemctl, journalctl, apt, apt-get, reboot, shutdown, df, du |
voice.say | nur auf ausdrücklichen Wunsch |
iphone.ui | mit Grenzen (nur Ramon, höchstens 8 Schritte pro Turn, keine Käufe ohne Rückfrage) |
| Aktionen | eine Aktion pro Antwort, aber verkettbar |
Ausfall heute: doc.pdf
doc.pdf meldet „Connection refused“.
1 · Identität (Sub-Agent ramon-1)
| Punkt | Wert | Beleg |
|---|---|---|
| Modell | claude-opus-5-5 (Fallback claude-fable-5-1,claude-opus-5,claude-sonnet-5), --effort high | Kommandozeile der Unit homebot-agent-925-1-1792086829.service; ops/models.txt hat dieselbe Reihenfolge |
| Claude-CLI | 2.1.287 (~/.local/share/claude/versions/2.1.287) | CLAUDE_CODE_EXECPATH |
| Startmodus | claude -p … --output-format json --permission-mode bypassPermissions --add-dir /home/serverlisibachnet --add-dir ~/.openclaw/workspace --session-id … | systemctl --user list-units, worker/modeld.py:1796/1803 |
| Arbeitsverzeichnis | /home/serverlisibachnet/homebot-agents/ramon-1 (Agent 1 von 4; ramon-2 bis ramon-4 existieren) | pwd, ls ~/homebot-agents |
| Laufordner | ~/.homebot/agent-runs/925 (HOMEBOT_TASK=925) | env |
| Unix-User | uid=1000(serverlisibachnet) gid=1000 | id |
| Gruppen | serverlisibachnet, adm(4), cdrom(24), sudo(27), dip(30), plugdev(46), lxd(101), docker(988) | id |
| Hostname | serverlisibachnet | hostname |
| Hooks | PostToolUse/Stop → python3 ~/docker/homebot/worker/agent_inbox.py post/stop | ramon-1/.claude/settings.json |
| Secrets in der Umgebung | HOMEBOT_DB_PASS*, HOMEBOT_API_TOKEN, HOMEBOT_ENVELOPE_KEY, CLAUDE_CODE_MESSAGING_TOKEN sind gesetzt | env (nur Namen geprüft) |
2 · Werkzeuge
Direkt aufrufbar
Agent Bash Edit ListAgents Read ReportFindings ScheduleWakeup Skill ToolSearch Workflow Write mcp__claude_ai_Claude_Docs__batch mcp__claude_ai_Claude_Docs__guide mcp__claude_ai_Claude_Docs__update
Nachladbar über ToolSearch
CronCreate CronDelete CronList DesignSync EnterWorktree ExitWorktree Monitor NotebookEdit PushNotification RemoteTrigger SendMessage TaskStop WebFetch WebSearch mcp__claude_ai_Claude_Docs__create/delete/export/query/read
homebot-admin-MCP: bots_create bots_list bots_logs bots_pairing bots_restart bots_start bots_status bots_stop homebot_overview
Nicht verfügbar
- Kein eigenes Grep- oder Glob-Werkzeug; Suche mit
grepundfindüber Bash. - MCP-Server ohne Anmeldung:
plugin:data:amplitude,amplitude-eu,atlassian,bigquery,hex. plugin:data:definitekonnte keine Verbindung aufbauen (ENDPOINT_NOT_FOUND).
Skills
bots-verwalten anthropic-skills:homebot-ops homeserver-ops homeserver-ssh home-knowledge personal-memory-update pdf docx pptx xlsx und weitere (data:*, dataviz, code-review …)
Lesende Tests
| Befehl | Ergebnis | |
|---|---|---|
docker ps | ok: 62 Container laufen, 71 insgesamt | |
sudo -n true | verweigert: sudo: a password is required (rc=1) | |
journalctl -n 1 | ok (System-Journal, über Gruppe adm) | |
journalctl -u homebot-modeld -n 1 | -- No entries --, weil das eine User-Unit ist; es braucht --user | |
ls ~/docker | ok (42 Einträge) | |
ls ~/docker/homebot | ok (10 Einträge) | |
ls ~/.openclaw/workspace | ok (94 Einträge) | |
ls /mnt/Plex | ok (6 Einträge) | |
ls /var/spool/cron/crontabs | verweigert: Permission denied | |
test -r /etc/shadow / /etc/sudoers | nicht lesbar | |
lagebuch_cli.py lesen bot | ok (rc=0) |
3 · Sicht auf den Server
Platte
| Mount | Größe | Belegt | Frei | Use% |
|---|---|---|---|---|
/ (nvme0n1p2) | 468G | 349G | 96G | 79 % |
/mnt/Plex (NAS volume2) | 22T | 21T | 926G | 96 % |
/mnt/cloud (NAS volume2, gleiches Volume) | 22T | 21T | 926G | 96 % |
/mnt/Plex2 (NAS volume1) | 11T | 7,0T | 3,9T | 65 % |
Container (62 laufend)
Homebot: homebot-api (up 3 h), homebot-db (healthy), homebot-whisper und homebot-admin-web (up 11 h).
Dazu plex, sonarr, radarr, nzbget, prowlarr, overseerr, homeassistant, mosquitto, immich (4), paperless (5), nextcloud (5), jarvis (4), agent-team (2), kitchen (4), shorts (3), 3d/3d-games (4), reverse plus cert_proxy, n8n, vault, ramon-emma (2) und die Websites (lisibach-web, whng, chliart, v2lisibach, jannik, fabian-*, jolanda-test, hokovit3d, scamcheck, restaurant-panoramach).
Vollständige Liste: docker ps --format '{{.Names}}\t{{.Status}}\t{{.Image}}'
systemd
Systemweite homebot*-Units: keine (0 loaded units). Alles läuft als User-Unit:
- aktiv:
homebot-modeld,homebot-wa,homebot-status,homebot-admind,wda,wifi-linklog,wifi-umfrage-ausloeser - Timer:
wifi-snapshot.timer(alle 5 min),wifi-umfrage-training.timer(07:47) - inaktiv:
csi-router.service
Prozesse
| PID | Prozess |
|---|---|
| 3514140 | worker/modeld.py, läuft seit 03:10 h |
| 3299412 | transport/wa.js (node) |
| 2167632 | homebot-admin/admind/admind.py |
| 369837 | ios ui run wda (iPhone-WDA) |
| 3908761 | wifi-tracker/linklog/linklogger.py |
| 415412 | wifi-tracker/umfrage/ausloeser.py |
| 4026927 / 4026928 | Lauf des Sub-Agenten: agent-segment.sh und claude -p |
| 4026967 | homebot-admin/mcp/mcp_server.py |
| 230061 | eine weitere Claude-Remote-Sitzung (ccd-cli 2.1.293), läuft seit fast 4 Tagen |
Cron
crontab -list lesbar und hat 36 aktive Zeilen. Davon gehören 13 zuops/*von homebot (outage-tickundreminders-duejede Minute,evolve-nightly03:40,model-probestündlich :07,selftest07:40, Backups,homebot-guardundanomaly-watch). Dazu kommen die Media-, Tinder-, Presence- und Vault-Jobs.- In
/etc/cron.dsinde2scrub_allundsysstatlesbar.
Nicht sichtbar
root-Crontab und die Crontabs anderer User (/var/spool/cron/crontabs), /etc/shadow, /etc/sudoers, alles, was sudo braucht. Router, Home Assistant und NAS wurden in diesem Lauf bewusst nicht abgefragt.
4 · Dateizugriff (test -r/-w, nichts geschrieben)
| Pfad | r | w | Eigentümer/Modus | |
|---|---|---|---|---|
~/docker/homebot (Repo, inkl. .git) | ja | ja | eigener User, 755/775 | |
app/vorgaben.py | ja | ja | 664 | |
app/policy.py | ja | ja | 644 | |
app/provision.py | ja | ja | 664 | |
ops/ | ja | ja | 755 | |
ops/models.txt, ops/models-manual.txt | ja | ja | 664 | |
ops/.env (10 Zeilen: DB-Passwort, API-Token, Envelope-Key, WA-Nummer …; Inhalt nicht wiedergegeben) | ja | ja | 600, eigener User | |
ops/deploy.sh, ops/evolve.py | ja | ja (x) | 775 | |
memory/ | ja | ja | 775 | |
worker/lagebuch_cli.py | ja | ja | 664 | |
shared/requests | – | – | gibt es weder unter ~/docker/homebot noch unter ~/shared | |
~/.openclaw/shared/requests (66 Einträge) | ja | ja | 775 | |
~/.openclaw/credentials/ (github-user-tokens.json, services.json, user-media-keys.json + .bak, whatsapp) | ja | ja | 775; Dateien 600 | |
~/.openclaw/workspace | ja | ja | 700 | |
~/.ssh/id_ed25519, ~/.ssh/router_key, 3dgames_deploy | vorhanden, lesbar | – | 600 | |
~/homebot-agents/ramon-2 (und alle anderen Agentenordner) | ja | ja | 775 | |
~/.claude/settings.json (global) | ja | ja | 664 | |
/mnt/Plex | ja | ja | UNKNOWN:users 775 | |
/mnt/cloud | ja | nein | trotz Modus 777 (NFS-Squash) | |
/var/log/syslog, /var/log/auth.log | ja | nein | syslog:adm 640 | |
/etc/shadow, /etc/sudoers | nein | nein | root |
5 · Regeln, die der Sub-Agent mitbekommt
| Regel | Inhalt kurz | Quelle |
|---|---|---|
| Identität und Arbeitsordner | ramon-1, Agent 1 von 4; arbeitet nur für Ramon | Prompt (gebaut in worker/modeld.py ca. Z. 1733) und ramon-1/CLAUDE.md (erzeugt von worker/agents.py) |
| Bot nie ändern | nichts unter ~/docker/homebot, kein git commit/push, kein ops/deploy.sh, kein Neustart von homebot-Diensten, kein Schreiben in die Bot-DB außer über das Lagebuch; sonst ENTWICKLUNGSAUFTRAG: | Prompt (AGENT_PREAMBLE), CLAUDE.md, V3 (app/vorgaben.py:342) |
| Selbständerung nur über evolve | Änderungen am Bot macht nur der Verbesserungslauf (evolve.request, ops/evolve.py), nie der Agent über die Shell | Prompt, V3, CLAUDE.md |
| Person anlegen | nie selbst: kein ops/add_<person>.py --apply, kein Eintrag in ~/.openclaw/credentials. Nur people.provision, und nur wenn Ramon in derselben Nachricht „leg <Name> an“ sagt | Prompt, V3/Direktive #77; Prüfung in app/provision.py:132 (ordered(message, …)), app/effectors.py:330 (Capability grant.write) |
| Kauf/Zahlung | nichts bestellen, kaufen, bezahlen, buchen oder abonnieren ohne Ramons ausdrücklichen Auftrag im selben Auftrag; diesmal ausdrücklich „KEIN Kauf“ (kein_kauf) | Prompt (modeld.py), V4 |
| Löschen/Unumkehrbares | Rückfrage nur bei Löschen, Unumkehrbarem oder Geld; [D]: ein Bestätigungssatz | Prompt; Standardklausel [D] in ~/.openclaw/workspace/LAWS.md |
| confirm-Pflicht | server.exec (schreibend auf einem fremden eigenen Server) verlangt confirm: true; root.* verlangt die Bestätigung der Person, erlaubt sind nur docker, systemctl, journalctl, apt, reboot, shutdown, df und du | worker/modeld.py:2685, app/effectors.py:190–199 |
| bots.manage | Freundes-Bots nur für den Owner (Capability config.write), nie Token oder Key als Argument | app/effectors.py:321 |
| iphone.ui | nur Ramon (server.admin, OWNER_ONLY, Daemon verlangt owner_ok), höchstens 8 Schritte pro Turn; V5: bei einem iPhone-Ziel alles ohne Rückfrage außer Käufen; Laws, Grants und Sende-Regel gelten weiter | app/effectors.py:266, V5 |
| Lagebuch | vor jeder Änderung anspruch, bei Exit 3 abbrechen, danach eintrag eintragen; Stand anderer Agenten nur über lesen | Prompt (LAGEBUCH_RULES) |
| Senden | nichts selbst per WhatsApp schicken (kein wa-send.sh, kein curl), Dateien nur über DATEI:-Zeilen | Prompt |
| Zeitgrenze | 30 min harter Abbruch, Hintergrundjobs melden sich nicht | Prompt |
| Ehrlich berichten | „nur, was ein Werkzeug bestätigt hat (G54)“ | CLAUDE.md, worker/agents.py:85 |
| Weitere Vorgaben | V1 (Umfragen nur als Ablauf), V2 (kein iPhone, keine Watch, kein MacBook, kein person.ramon im Tracker), V6 (Umfrage nur bei Widerspruch, höchstens 1 pro Stunde, nachts nie) | app/vorgaben.py:314–383 |
| Gesetze G1–G77 | stehen nicht im Prompt; nur durch Lesen von ~/.openclaw/workspace/LAWS.md (134 Zeilen) bekannt. Relevant: Präambel 1 (Owner-Supremacy), [N], G36 (MacBook/nu.-Datenschutz), G37 (fehlt sudo → Skript nach ~/opclw/to_be_executed/ stagen), G51 (ehrliches Reporting), G67 (OWNER_ONLY) | Datei |
| Code-Ebene | policy.check: Owner ist „unconditionally omnipotent“ (A1). OWNER_ONLY = server.admin, config.write, law.write, grant.write, agent.run, server.remote, server.root | app/policy.py:11–19, 62–68 |
6 · Auffälligkeiten
1 · Die Sperren stehen nur im Prompt, technisch hat der Agent fast Root
Der Sub-Agent läuft mit --permission-mode bypassPermissions und gehört zur Gruppe docker, was praktisch Root bedeutet. Schreibrechte hat er auf das ganze Bot-Repo samt .git, ops/.env, ~/.openclaw/credentials, die Ordner der anderen Agenten und die globale ~/.claude/settings.json. V3 („agent.run ändert den Bot nie“) setzt also nur seine Folgsamkeit durch, keine Dateirechte. app/policy.py:21–25 sagt selbst: „the sandbox was never a control - it was a hope“.
2 · Kein sudo, aber docker
sudo -n true meldet a password is required, obwohl der User in der Gruppe sudo ist. Root-Arbeit über die Shell geht also nur nach G37 (Skript stagen). Die Gruppe docker umgeht das trotzdem. Die Grenze ist damit weder sauber offen noch sauber zu.
3 · Secrets in der Umgebung jedes Agenten
HOMEBOT_DB_PASS*, HOMEBOT_API_TOKEN, HOMEBOT_ENVELOPE_KEY und CLAUDE_CODE_MESSAGING_TOKEN werden jedem agent.run vererbt. Dazu ist ops/.env lesbar. Für einen Owner-Agenten ist das zwar konsistent, es widerspricht aber dem Verbot „keine Schreibzugriffe auf die homebot-Datenbank“: Die Zugangsdaten dafür liegen bereit.
4 · Admin-Dienst: Der Admin-MCP prüft keine Owner-Rolle
Die einzige Hürde ist ein Token in einer Datei, die jeder Prozess des Users lesen kann. Belegt durch Lesen des Codes in ~/docker/homebot-admin, aufgerufen wurde nichts.
- Kette: Der MCP-Server (
mcp/mcp_server.py, 112 Zeilen) bietet 9 Tools an:bots_list,bots_status,bots_create,bots_pairing,bots_start,bots_stop,bots_restart,bots_logs,homebot_overview. Er reicht sie inrun_tool()ohne jede Prüfung von Person, Rolle oderowner_okanadmindclient.call()weiter. Der Client (mcp/admindclient.py) liest den Bearer-Token selbst aus~/docker/homebot-admin/.env(ZeileHOMEBOT_ADMIND_TOKEN=; vorhanden, Modus 600, Eigentümer serverlisibachnet, für den Agenten lesbar) und rufthttp://127.0.0.1:18797auf. - admind prüft nur zwei Dinge (
admind/admind.py,_handle, ca. Z. 145–151): die Quelladresse (ALLOWED_SOURCES= 127.0.0.0/8, 172.16.0.0/12, ::1, sonst403 source not allowed) und den Bearer-Token (sonst401 unauthorized). Eine Rolle, einowner_okoder einactor-Abgleich kommt nicht vor. Das Feldactorist frei wählbar und hat den Vorgabewert"ramon"(_b(b, "actor", "ramon")). - Die Owner-Grenze liegt nur davor:
worker/agents.py:95–108(_provision_skills) schreibt.mcp.jsonnur, wennperson == self.owner, und löscht die Datei sonst. Vorhanden ist sie in genauramon-1bisramon-4, in keinem anderen Agentenordner. Nur Ramons Agenten bekommen den MCP, und agent.run ist ohnehin OWNER_ONLY. Innerhalb dieser Agenten gibt es keine weitere Sperre. Auch für einen Nur-Lese-Lauf sindbots_stop,bots_restartundbots_createfrei. - Mehr erreichbar als der MCP zeigt: Mit demselben Token erreicht jeder Bash-Aufruf auch die Routen, die der MCP bewusst weglässt (
ROUTES,admind.py:46–89):POST /homebot/deploy,/homebot/grants(Rechte vergeben oder entziehen),/homebot/units/(modeld|wa|status)/restart,/homebot/evolution/run,/homebot/evolve/pause|resume,/homebot/switches/<name>,/homebot/tasks/<id>/cancel,/tenants/<slug>/removeund/tenants/<slug>/purge(mitconfirm) sowieDELETE /tenants/<slug>/docs/<id>. - Widerspruch: Der Docstring von
mcp_server.pyverspricht „minus anything destructive and minus any credential - purge and secrets stay on the admin page, behind a passkey“. Das stimmt nur für die MCP-Oberfläche. Der Token liegt für den Agenten lesbar auf der Platte, und damit steht die Passkey-Grenze der Admin-Seite für Ramons Agenten nicht. Auch V3 (kein Deploy, keine Unit-Neustarts, keine Rechte durch agent.run) setzt hier nur der Prompt durch, nicht admind.
5 · Falsche Gesetzesnummer
CLAUDE.md (worker/agents.py:85) und app/openai_compat.py:1732 nennen „G54“ für ehrliches Berichten. Laut LAWS.md ist G54 aber die „Diktat-Brücke Sprachmemo → MacBook-Zwischenablage“; ehrliches Reporting ist G51. → Fix (a)
6 · Die Gesetze erreichen den v2-Bot nicht mehr zuverlässig
LAWS.md liegt im stillgelegten ~/.openclaw/workspace. Im Bot-Code wird es nur in einem Kommentar von app/policy.py sowie in ops/personas.json, ops/sweep_knowledge.py und ops/grants.proposed.json erwähnt. Eine Law-Tabelle gibt es in den Schemas nicht. Der Agenten-Prompt enthält keine G-Gesetze, nur V1–V6. Mehrere Gesetze verweisen auf OpenClaw-Altlasten: G52 openclaw-health.py, G72 shared/requests (existiert nur unter ~/.openclaw/shared/requests), die Rangordnung „AGENTS.md/TOOLS.md“.
7 · Der Modell-Ledger in LAWS.md ist veraltet
G47 sagt „main auf claude-sonnet-5/medium, opus-5 nur noch als Subagent“ (04.09.). ops/models.txt sagt „Ramon, 2026-09-25: Opus 5.5 for everything“. Der Bot folgt models.txt, das Gesetz wurde nicht nachgezogen.
8 · „100 % Zugriff“ (Direktive #76) gilt nur im Chat, nicht im agent.run
Commit 228b686 (15.10. 15:58) gibt dem Owner im Chat „Rechte: alle (Owner)“. Für agent.run bleiben V3, kein_kauf und die people.provision-Sperre absichtlich bestehen. Wer „100 %“ als „auch der Agent darf den Bot ändern“ versteht, stößt auf V3. Das ist gewollt, aber nirgends gemeinsam erklärt.
9 · homebot-Dienste sind User-Units
systemctl list-units 'homebot*' (system) zeigt 0 Units und journalctl -u homebot-modeld zeigt No entries. Prüfungen ohne --user führen also in die Irre.
10 · /mnt/cloud hat Modus 777, ist aber nicht schreibbar
test -w schlägt fehl (NFS-Squash). /mnt/Plex und /mnt/cloud liegen auf demselben Volume und sind zu 96 % voll (926 GB frei).
11 · Swap 3,8 von 8 GiB belegt
Obwohl 9,9 GiB RAM verfügbar sind. Das ist kein Fehler, aber ein Hinweis auf alten Druck.
12 · ops/models-manual.txt
Führt claude-opus-4-8 als manuelle Option. Das ist harmlos, nur der Vollständigkeit halber genannt.