# AA-034 – Hermes Workspace Weboberfläche: Read-only Root-Cause-Analyse
**Modus:** Read-only
**Datum:** 2026-08-12
**Ziel:** Ursache ermitteln, warum Hermes Workspace als Weboberfläche derzeit nicht mehr vollständig funktioniert.
## Executive Summary
Die Workspace-Weboberfläche selbst lädt technisch grundsätzlich: HTML, CSS, JavaScript, Bilder und Manifest werden erfolgreich ausgeliefert, die Browser-Konsole zeigt in der untersuchten Sitzung keine JavaScript-Fehler, und der Container `hermes-carlo-komfort` läuft aktuell `healthy` ohne Restart-Loop.
Der beobachtete Funktionsverlust ist jedoch **nicht** ein kompletter Webserver-Ausfall, sondern eine **Auth-/Zugriffsblockade** auf der Oberfläche:
- Die Seite landet im Browser auf **`/chat/new`** und zeigt **„Enter Password“**.
- Die Workspace-API antwortet ohne gültige Authentifizierung mit **401 Unauthorized** auf zentrale Endpunkte wie `/api/connection-status`, `/api/claude-jobs` und `/api/gateway-status`.
- Der Frontend-Bundle-Code enthält eine explizite Login-Gate-Logik: `fetch('/api/auth-check')`; bei `authRequired && !authenticated` wird die Workspace-Shell unterdrückt und stattdessen der Login angezeigt.
**Wahrscheinlichste Ursache:** Die Workspace ist derzeit nicht „kaputt“ im Sinne eines defekten Builds oder eines toten Containers, sondern im aktuellen Zustand **absichtlich gesperrt** bzw. **nicht authentifiziert**, sodass der eigentliche Workspace-Inhalt nicht freigeschaltet wird.
**Nicht nachgewiesen als Ursache:** Der bekannte `hermes-kanban-adapter`-Healthcheck-Fehler. Die Workspace lädt und rendert bereits vor jeglichem Nachweis eines durch diesen Fehler verursachten Ausfalls. Es gibt derzeit keinen Beleg, dass genau dieser Healthcheck den aktuellen Workspace-Zustand verursacht.
---
## Vollständige Nachweise
### 1) Workspace-Endpunkt
#### Basis-URL und Browser-Zustand
- Browser-Navigation auf `https://hermes-workspace.agentsolutions-mallorca.com/`
- Browser landete auf: `https://hermes-workspace.agentsolutions-mallorca.com/chat/new`
- Titel: `Hermes Workspace`
- Sichtbare Oberfläche: Passwort-Gate mit
- Heading: `Enter Password`
- Text: `This workspace is password-protected`
- Input: `Password`
- Button: `Continue`
#### HTTP-Status / Redirects / HTML / Header
**`https://hermes-workspace.agentsolutions-mallorca.com/`**
- HTTP: `200 OK`
- HTML: vorhanden
- Content-Type: `text/html; charset=utf-8`
- CSP: vorhanden
- Beobachtung: kein serverseitiger Redirect, aber clientseitig führte die App in der Browser-Sitzung nach `/chat/new`
**`http://hermes-workspace.agentsolutions-mallorca.com/`**
- HTTP: `301 Moved Permanently`
- Redirect nach: `https://hermes-workspace.agentsolutions-mallorca.com/`
**`https://hermes-workspace.agentsolutions-mallorca.com/chat/new`**
- HTTP: `200 OK`
- HTML: vorhanden
- Sichtbarer Inhalt: Passwort-Gate
**`http://127.0.0.1:5099/`**
- HTTP: `200 OK`
- Content-Type: `text/html; charset=utf-8`
- CSP: vorhanden
- HTML: vorhanden
#### Response Header / CSP
Auf Basis der geprüften Antworten ist die Content-Security-Policy konsistent und restriktiv:
- `default-src 'self'`
- `base-uri 'self'`
- `object-src 'none'`
- `form-action 'self'`
- `script-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net`
- `style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net`
- `img-src 'self' data: blob: https:`
- `font-src 'self' data: https://fonts.gstatic.com`
- `connect-src 'self' ws: wss: http: https:`
- `worker-src 'self' blob:`
- `media-src 'self' blob: data:`
- `frame-src 'self' http: https:`
**Fakt:** Kein CSP-Blocker wurde in der Browser-Konsole beobachtet.
---
### 2) Geladene Assets
Die Seite lädt erfolgreich die folgenden Assets:
| Typ | URL | HTTP | Content-Type | Größe |
|---|---|---:|---|---:|
| JS | `https://hermes-workspace.agentsolutions-mallorca.com/assets/main-BqvSWry_.js` | 200 | `application/javascript` | 1,342,065 B |
| JS | `https://hermes-workspace.agentsolutions-mallorca.com/assets/index-D_Wxvt_x.js` | 200 | `application/javascript` | 56 B |
| JS | `https://hermes-workspace.agentsolutions-mallorca.com/assets/_sessionKey-BHbFL0-M.js` | 200 | `application/javascript` | 1,646 B |
| JS | `https://hermes-workspace.agentsolutions-mallorca.com/assets/_sessionKey-z4z2QdqU.js` | 200 | `application/javascript` | 980 B |
| CSS | `https://hermes-workspace.agentsolutions-mallorca.com/assets/styles-fpx30DGp.css` | 200 | `text/css` | 454,522 B |
| Image | `https://hermes-workspace.agentsolutions-mallorca.com/claude-avatar.webp` | 200 | `image/webp` | 15,680 B |
| Image | `https://hermes-workspace.agentsolutions-mallorca.com/claude-banner.png` | 200 | `image/png` | 12,333 B |
| Image | `https://hermes-workspace.agentsolutions-mallorca.com/claude-avatar.png` | 200 | `image/png` | 83,740 B |
| Image | `https://hermes-workspace.agentsolutions-mallorca.com/claude-icon-192.png` | 200 | `image/png` | 24,996 B |
| Image | `https://hermes-workspace.agentsolutions-mallorca.com/apple-touch-icon.png` | 200 | `image/png` | 22,691 B |
| Manifest | `https://hermes-workspace.agentsolutions-mallorca.com/manifest.json` | 200 | `application/json` | 795 B |
| Fonts | `https://fonts.googleapis.com/css2?family=Inter...` | 200 | `text/css; charset=utf-8` | 1,398 B |
**Nicht gefunden / keine Fehler beim Asset-Load:**
- Keine 404/500 für die oben identifizierten Assets
- Keine MIME-Type-Fehler
- Keine fehlenden CSS/JS-Dateien im untersuchten Startpfad
**Hinweis:** In der JS-Bundle-Analyse taucht zusätzlich ein Pfad zu `hermesworld-world.png` bzw. ein intern referenzierter Asset-Pfad auf; der konkrete Download wurde im Moment der Analyse nicht als Fehlerquelle sichtbar, da die sichtbaren Kern-Assets erfolgreich geladen wurden.
---
### 3) Browser-Konsole
Browser-Konsole in der untersuchten Sitzung:
- **JavaScript-Fehler:** keine
- **Promise Rejections:** keine
- **Failed Requests:** keine in der Konsole gemeldeten
- **CORS:** kein sichtbarer Fehler
- **CSP:** kein sichtbarer Fehler
- **MIME-Type-Fehler:** kein sichtbarer Fehler
**Fakt:** Die Browser-Konsole ist für die geprüfte Sitzung leer.
---
### 4) Netzwerkanalyse
#### Erfolgreiche Requests
- HTML-Dokument
- JS-Bundles
- CSS
- Bilder
- Manifest
- `/api/auth-check` → `200 OK`
- `/api/dashboard-status` → `200 OK`
- `/api/health` → `200 OK`
#### Fehlgeschlagene / unerlaubte Requests
| URL | HTTP | Zielhost | Zielport | Antwort |
|---|---:|---|---:|---|
| `https://hermes-workspace.agentsolutions-mallorca.com/api/connection-status` | 401 | `hermes-workspace.agentsolutions-mallorca.com` | 443 | `{"error":"Unauthorized"}` |
| `https://hermes-workspace.agentsolutions-mallorca.com/api/claude-jobs` | 401 | `hermes-workspace.agentsolutions-mallorca.com` | 443 | `{"error":"Unauthorized"}` |
| `https://hermes-workspace.agentsolutions-mallorca.com/api/gateway-status` | 401 | `hermes-workspace.agentsolutions-mallorca.com` | 443 | `{"error":"Unauthorized"}` |
| `http://127.0.0.1:5099/api/connection-status` | 401 | `127.0.0.1` | 5099 | `{"error":"Unauthorized"}` |
| `http://127.0.0.1:5099/api/claude-jobs` | 401 | `127.0.0.1` | 5099 | `{"error":"Unauthorized"}` |
| `http://127.0.0.1:5099/api/gateway-status` | 401 | `127.0.0.1` | 5099 | `{"error":"Unauthorized"}` |
| `http://127.0.0.1:9130/api/claude-jobs` | 401 | `127.0.0.1` | 9130 | `{"detail":"Unauthorized"}` |
| `http://127.0.0.1:9130/api/connection-status` | 401 | `127.0.0.1` | 9130 | `{"detail":"Unauthorized"}` |
| `http://127.0.0.1:8653/api/connection-status` | 404 | `127.0.0.1` | 8653 | `404: Not Found` |
| `http://127.0.0.1:3010/api/connection-status` | 200 | `127.0.0.1` | 3010 | `{"status":"disconnected",...}` |
| `http://127.0.0.1:3014/api/connection-status` | 401 | `127.0.0.1` | 3014 | `{"detail":"Unauthorized"}` |
**Wichtige Interpretation:**
- Die Workspace-UI selbst ist erreichbar.
- Die zentralen Funktions-APIs sind ohne Authentifizierung gesperrt.
- Das ist der unmittelbar sichtbare Grund, warum die Weboberfläche „nicht vollständig funktioniert“.
---
### 5) Reverse Proxy read-only geprüft
#### Gefundene nginx-Dateien
- `/etc/nginx/nginx.conf`
- `/etc/nginx/conf.d/hermes-carlo-docker-bridge.conf`
- `/etc/nginx/sites-available/explorer.conf`
- `/etc/nginx/sites-available/filebrowser.conf`
#### Relevante Befunde
`/etc/nginx/conf.d/hermes-carlo-docker-bridge.conf`:
- `listen 172.17.0.1:8653;` → `proxy_pass http://127.0.0.1:8653;`
- `listen 172.17.0.1:9130;` → `proxy_pass http://127.0.0.1:9130;`
- `proxy_set_header Host 127.0.0.1:8653` bzw. `127.0.0.1:9130`
- `proxy_set_header Authorization $http_authorization`
- `proxy_set_header Upgrade $http_upgrade`
- `proxy_set_header Connection "upgrade"`
`/etc/nginx/nginx.conf`:
- lädt die Konfigurationsdateien aus `conf.d` und `sites-enabled`
**Für die Workspace-Domain selbst wurde in `/etc/nginx` in diesem Auftrag kein passender VHost-Treffer gefunden.**
#### Bewertung
- Kein nachgewiesener Reverse-Proxy-Fehler im Workspace-Pfad selbst.
- Die geprüften Header-/Proxy-Regeln sehen funktional aus und erklären den Auth-Gate-Zustand nicht direkt.
- Ein Proxy-Problem ist daher **nicht** die führende Ursache auf Basis des vorliegenden Nachweises.
**Vermutung:** Falls die Workspace-Domain über einen weiteren, hier nicht gefundenen VHost geroutet wird, könnte dort die Auth-Weitergabe oder ein Base-Path-Problem liegen. Das ist aber in dieser Analyse **nicht belegt**.
---
### 6) Workspace-Container
#### Docker-Inspect
Container: `hermes-carlo-komfort`
- Status: `running`
- Running: `true`
- RestartCount: `0`
- ExitCode: `0`
- Health: `healthy`
- Image: `ghcr.io/outsourc-e/hermes-workspace:latest`
- Cmd: `node --max-old-space-size=2048 server-entry.js`
- Ports: keine Host-Port-Mappings im Container-Inspect
- Mounts:
- `/var/lib/hermes/carlo/cron -> /home/workspace/.hermes/cron` (RW)
- `/opt/struktur/hermes-ui-auswahl/data -> /home/workspace/.hermes` (RW)
- `/srv/hermes-workspaces/carlo -> /home/workspace/carlo` (RW)
#### Logs
Docker-/System-Logs zeigen keine Container-Crash-Schleife, sondern vielmehr einen langlebig laufenden Service.
#### Bewertung
- Container lebt und ist gesund.
- Kein Hinweis auf Restart-Sturm, Exit-Loop oder Build-Startfehler.
- Damit ist ein reiner Container-Ausfall **nicht** die Ursache.
---
### 7) API-Erreichbarkeit
| Pfad | Ziel | Erreichbar | HTTP-Code | Antwortzeit |
|---|---|---|---:|---:|
| Workspace → Auth-Check | `/api/auth-check` | Ja | 200 | ~0.02 s |
| Workspace → Connection | `/api/connection-status` | Nein ohne Auth | 401 | ~0.02 s |
| Workspace → Jobs | `/api/claude-jobs` | Nein ohne Auth | 401 | ~0.02 s |
| Workspace → Dashboard-Status | `/api/dashboard-status` | Ja | 200 | ~0.03 s |
| Workspace → Gateway | `/api/gateway-status` | Nein ohne Auth | 401 | ~0.03 s |
| Workspace → Backend 9130 | `/api/claude-jobs` | Nein ohne Auth | 401 | ~0.001 s |
| Workspace → Backend 3010 | `/api/connection-status` | Ja, aber disconnected | 200 | ~0.18 s |
| Workspace → Backend 8653 | `/api/connection-status` | Nein / nicht vorhanden | 404 | ~0.001 s |
#### Interpretation
- Die Auth- und Status-APIs sind der Engpass.
- Die Workspace-UI kann zwar geladen werden, aber die eigentliche Funktionalität bleibt ohne Auth-/Backend-Freigabe gesperrt.
---
### 8) Frontend-Code-Nachweis
Im Bundle `main-BqvSWry_.js` findet sich die zentrale Login-Gate-Logik:
- `fetch('/api/auth-check')`
- Wenn `authRequired && !authenticated`, wird `showLogin` aktiviert
- Andernfalls wird die Workspace-Shell angezeigt
Außerdem finden sich dort die Routen-/API-Bezüge:
- `/api/connection-status`
- `/api/claude-jobs`
- `/api/gateway-status`
**Fakt:** Das Frontend ist so gebaut, dass es bei fehlender Authentifizierung bewusst in einen Login-Zustand wechselt.
---
## Sämtliche verwendeten Befehle
1. `read_file /opt/obsidian-vault/Systemstruktur/SYSTEM-REFERENZ.md`
2. `skill_view hermes-agent`
3. `skill_view software-development:safe-system-changes`
4. `curl`-Abfragen gegen:
- `http://127.0.0.1:5099/`
- `https://hermes-workspace.agentsolutions-mallorca.com/`
- `http://hermes-workspace.agentsolutions-mallorca.com/`
5. `docker inspect hermes-carlo-komfort`
6. `journalctl -u hermes-carlo-host.service -u hermes-carlo-host-dashboard.service --since '24 hours ago'`
7. `search_files` in `/etc/nginx`
8. `read_file` für nginx-Konfigurationen
9. `browser_navigate https://hermes-workspace.agentsolutions-mallorca.com/`
10. `browser_snapshot`
11. `browser_console`
12. `curl` gegen Browser-Assets und API-Endpunkte
13. `grep`/`stat`-basierte Analyse im JS-Bundle
14. `docker logs --since 6h hermes-carlo-komfort`
---
## Root-Cause-Bewertung
### Bewerten nach Ursache
| Ursache | Bewertung | Begründung |
|---|---|---|
| Reverse Proxy | eher unwahrscheinlich | Kein direkter Proxy-Fehler im Workspace-Pfad nachgewiesen; Nginx und Header wirken konsistent |
| Frontend | teilweise beteiligt | Frontend implementiert bewusst das Passwort-/Auth-Gate |
| JavaScript | ja, aber nicht als Fehler | JS funktioniert; die Login-Gate-Logik ist aktiv und korrekt geladen |
| API | **ja** | Zentrale API-Endpunkte liefern ohne Auth `401 Unauthorized` |
| Backend | teilweise | Backend läuft, aber antwortet auf wichtige Pfade mit Auth-Sperre |
| Build | nein | Assets werden korrekt geladen, keine MIME-/Bundle-Fehler |
| Environment | möglicherweise | Auth-/Runtime-Konfiguration steuert den Login-Zustand; konkrete Umgebungsursache hier nicht vollständig belegt |
| Mounts | nein | Mounts sind vorhanden und RW; kein Mount-Fehler im Container nachgewiesen |
| Berechtigungen | nein für Container-Mounts, ja für Gesamtfunktion nicht belegt | Cron-Mount ist vorhanden; der hier untersuchte UI-Ausfall wird nicht durch Mount-Permissions erklärt |
| Container | nein | Container läuft `healthy`, `RestartCount=0` |
### Priorisierung der Ursachen
1. **API-/Auth-Blockade** – primäre, nachgewiesene Ursache
2. **Frontend-Login-Gate** – sekundär, setzt die API-Antworten in eine gesperrte Oberfläche um
3. **Environment-/Konfigurationszustand** – möglich, aber derzeit nicht hinreichend belegt
4. **Reverse Proxy** – derzeit nicht belegt
5. **Container / Build / Mounts / Berechtigungen** – derzeit nicht als Ursache belegt
---
## Empfehlung für den ersten Reparaturschritt
**Erster sinnvoller Reparaturschritt:**
Die Authentifizierungs-/Session-Kette des Workspace gezielt prüfen, insbesondere:
- warum `/api/auth-check` nur `authenticated:false` liefert,
- warum `/api/connection-status`, `/api/claude-jobs` und `/api/gateway-status` ohne Auth `401` liefern,
- und ob der Browser die erwartete Authentifizierung überhaupt erhält.
**Begründung:**
Der Workspace ist erreichbar, die Assets laden, der Container ist gesund. Der funktionale Engpass liegt klar in der Auth-/API-Freigabe, nicht im Webserver-Start.
---
## Vermutungen ausdrücklich als Vermutung
- **Vermutung:** Der Workspace ist aktuell absichtlich oder versehentlich auf Passwortschutz gestellt, sodass normale Bedienung ohne Auth nicht möglich ist.
- **Vermutung:** Ein fehlendes/ungültiges Session- oder Auth-Cookie verhindert die Freischaltung der eigentlichen Workspace-Funktionen.
- **Vermutung:** Ein noch nicht geprüfter, anderer nginx-VHost oder eine Runtime-Override-Datei könnte den Auth-Flow beeinflussen.
Diese Vermutungen sind **nicht** als Fakten zu verstehen.
---
## Fazit
Der Workspace-Ausfall ist in der untersuchten Form **kein Frontend-Crash** und **kein Container-Ausfall**. Der Workspace ist vielmehr **erreichbar, geladen und gesund**, aber die Weboberfläche bleibt aufgrund eines **Auth-/Passwort-Gates** und **401-Antworten auf zentrale API-Endpunkte** nicht vollständig nutzbar.
Der bekannte `hermes-kanban-adapter`-Healthcheck-Fehler ist hierfür **nicht als Ursache belegt**.
**Arbeitsauftrag 034 erledigt.**