# 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.**
