223 lines
10 KiB
Markdown
223 lines
10 KiB
Markdown
# OpenClaw Agent-first Hardening — Acceptance Evidence
|
|
|
|
**Datum:** 2026-07-30
|
|
**Scope:** Security-Grenze, Gateway-Verbindung, Mutationssicherheit,
|
|
Eventprojektion, durable Runs, globaler Agent-first-Einstieg und wahrheitsgetreue
|
|
Telemetrie
|
|
**Ergebnis:** Lokale Implementierungs- und Testabnahme bestanden;
|
|
Live-Gateway-/Produktionsabnahme offen
|
|
|
|
## Abnahmeurteil
|
|
|
|
Die sieben priorisierten Hardening-Punkte sind im aktuellen Working Tree
|
|
implementiert und durch den unten dokumentierten automatisierten Baseline-Lauf
|
|
abgesichert. Das ist kein Produktionsfreigabe-Nachweis: Es wurde in diesem
|
|
Checkpoint weder ein reales Remote-Gerät gepaart noch ein vollständiger
|
|
OpenClaw-/OpenAI-Lauf in der Zielumgebung ausgeführt.
|
|
|
|
## 1. Security boundary
|
|
|
|
**Status:** lokal abgenommen
|
|
|
|
- `backend/Extensions/ServiceCollectionExtensions.cs` setzt eine
|
|
authentifizierte Fallback-Policy.
|
|
- Nur Authentifizierungs-/Session-Bootstrap und explizite Health-Probes sind
|
|
anonym. Die OpenClaw-, Run-, Event-, Dashboard-, Task-, Agent- und
|
|
Security-Flächen bleiben geschützt.
|
|
- `backend/Services/RequestAuthorizationHelper.cs` behandelt `X-Agent-Id` nur
|
|
nach bereits verifizierter Service- oder privilegierter User-Identität als
|
|
allow-gelisteten Actor-Hinweis.
|
|
- OpenClaw-Control- und Run-Mutationen sind owner-only. Das MCP- und
|
|
Bridge-Datenplane akzeptiert verifiziertes JWT oder `X-Nexus-Api-Key`, aber
|
|
keinen frei gesetzten Agent-Header als Credential.
|
|
- Negative Auth-, Rollen- und Header-Eskalationsfälle liegen in
|
|
`backend-tests/SecurityBoundaryTests.cs` sowie den fokussierten
|
|
Controller-/MCP-Tests.
|
|
|
|
## 2. Reale Gateway-Verbindungsgrundlage
|
|
|
|
**Status:** Protokoll und Pairing-Zustand implementiert; Live-Pairing offen
|
|
|
|
- `backend/Services/OpenClawGatewayProtocol.cs` und
|
|
`backend/Services/GatewayConnector.cs` verwenden Protocol v4 und den
|
|
bestätigten Stable-Release-Pin `2026.7.1`. `2026.7.2-beta.1` ist als
|
|
Vorabversion bewusst nicht der Default.
|
|
- Nur `127.0.0.1`, `::1` und `localhost` gelten als direkte Loopback-Topologie.
|
|
- `backend/Services/OpenClawDeviceIdentityStore.cs` persistiert die
|
|
Ed25519-Geräteidentität und nach erfolgreichem Pairing den Device-Token.
|
|
- Die Challenge-Signatur bindet die kanonische v3-Payload an den vom Gateway
|
|
gelieferten Nonce. `PAIRING_REQUIRED` samt konkreter Request-ID wird bis UI
|
|
und Settings weitergegeben.
|
|
- Die Compose-Konfiguration hält Device- und Audit-Dateien in
|
|
`nexus-openclaw-device` über Container-Neustarts stabil.
|
|
- Protokoll-, Versions-, Loopback-, Challenge-, Pairing- und
|
|
Persistenzverhalten wird durch `backend-tests/GatewayConnectorTests.cs`,
|
|
`backend-tests/OpenClawGatewayProtocolTests.cs` und
|
|
`backend-tests/OpenClawDeviceIdentityAndAuditTests.cs` geprüft.
|
|
|
|
## 3. Zuverlässige Mutationen
|
|
|
|
**Status:** lokal abgenommen; Single-Writer-Grenze bleibt
|
|
|
|
- Frontend-Mutationen erzeugen über
|
|
`frontend/src/services/mutationContext.ts` einen Idempotency Key, eine
|
|
Correlation ID und einen gültigen W3C-`traceparent`.
|
|
- Der Backend-Rand leitet den Actor ausschließlich aus dem authentifizierten
|
|
Principal ab. Die Invocation-Metadaten werden bis zum Gateway transportiert.
|
|
- `backend/Services/OpenClawOperationAuditStore.cs` speichert einen
|
|
append-only Metadaten-Ledger mit gehashten Idempotency Keys, nicht Prompts,
|
|
Tool-Argumenten, Rohresultaten oder Credentials.
|
|
- Ein gleicher Schlüssel und Intent liefert das vorhandene Ergebnis; ein
|
|
abweichender Intent wird abgelehnt. Ein nach Neustart nicht sicher
|
|
abgeschlossenes Ergebnis wird `in_doubt` und nicht automatisch wiederholt.
|
|
- Geschlossene OpenClaw-Control-Schemas erhalten kein erfundenes
|
|
`params.idempotencyKey`. Nexus dedupliziert sie lokal. Durable Run-Aktionen
|
|
persistieren ihre Idempotency- und Transition-Daten zusätzlich in
|
|
PostgreSQL.
|
|
|
|
## 4. Eventprojektion
|
|
|
|
**Status:** lokal abgenommen
|
|
|
|
- `GET /api/v1/openclaw/events` liefert authentifiziertes SSE.
|
|
- `Last-Event-ID` und `lastEventId` unterstützen Replay aus dem begrenzten
|
|
Connector-Buffer.
|
|
- Connection-, Heartbeat- und Gap-Events machen Verbindungs- und
|
|
Replay-Zustand explizit. Run-, Session-, Tool-, Approval-, Artifact- und
|
|
sonstige Gateway-Ereignisse werden klassifiziert, sequenziert und redigiert.
|
|
- Sequenzlücken und Resets bleiben sichtbar; ein veralteter Cursor löst einen
|
|
autoritativen Refresh statt einer stillen Datenlücke aus.
|
|
- `frontend/src/services/openclawLive.ts` und
|
|
`frontend/src/stores/openclaw.ts` verwenden SSE zuerst, reconnecten mit
|
|
begrenztem Backoff und fallen nur bei fehlender Live-Verbindung auf
|
|
60-Sekunden-Polling zurück.
|
|
- Backend-Abdeckung:
|
|
`backend-tests/OpenClawEventProjectionTests.cs` und
|
|
`backend-tests/OpenClawEventSubscriptionCoordinatorTests.cs`.
|
|
Frontend-Abdeckung: `frontend/tests/openclaw-live.test.ts`.
|
|
|
|
## 5. Durable Run
|
|
|
|
**Status:** Start, Stop, Retry, Historie und Reconnect-Projektion lokal
|
|
abgenommen; Same-run-Resume bewusst nicht verfügbar
|
|
|
|
- Die Migration
|
|
`backend/Data/Migrations/20260730130442_AddOpenClawRunProjection.cs`
|
|
ergänzt dauerhafte Runs und Transition-Historie.
|
|
- `backend/Controllers/OpenClawRunsController.cs`,
|
|
`backend/Services/OpenClawRunService.cs`,
|
|
`backend/Services/OpenClawRunGateway.cs` und
|
|
`backend/Repositories/OpenClawRunRepository.cs` implementieren:
|
|
- Liste und Detail;
|
|
- persist-before-dispatch Start;
|
|
- exakten Run-Stop ohne Session-weites Abbrechen;
|
|
- Retry als korrelierten neuen Run;
|
|
- Nexus-Transitionen plus redigierte Gateway-Historie;
|
|
- Task-, Projekt-, Session-, Actor-, Correlation- und Trace-Bezug;
|
|
- Event-Reconciliation einschließlich per-Run-Sequenzlücke.
|
|
- `/runs/:id` zeigt Zustand, Korrelationen, Transitionen, Recovery-Aktionen
|
|
und Sync-/Gap-Zustand. Resume ist deaktiviert und der Backend-Endpunkt
|
|
antwortet `unsupported`, da der gepinnte Gateway-Vertrag keinen belegten
|
|
Same-run-Resume-RPC bietet.
|
|
- Abdeckung:
|
|
`backend-tests/OpenClawRunServiceTests.cs`,
|
|
`backend-tests/OpenClawRunGatewayTests.cs` und
|
|
`frontend/tests/openclaw-runs.test.ts`.
|
|
|
|
## 6. Globaler Agent-first-Einstieg
|
|
|
|
**Status:** lokal abgenommen
|
|
|
|
- `Ctrl/Cmd+K` öffnet
|
|
`frontend/src/components/mission-control/CommandPalette.vue` auf allen
|
|
authentifizierten Routen.
|
|
- Die Palette navigiert zu Kernflächen und geladenen Projekten, Tasks, Agents
|
|
und Sessions. Für Task, Projekt und Agent kann sie einen korrelierten Run
|
|
vorausfüllen.
|
|
- Iris ist ein globales, standardmäßig geschlossenes Modal. Der gesendete
|
|
Kontext ist auf Route, Surface, Entity-Typ und Entity-ID begrenzt.
|
|
- `backend/Services/MissionControlContextFormatter.cs` normalisiert diesen
|
|
Kontext und markiert ihn als nicht vertrauenswürdige Metadaten, bevor die
|
|
eigentliche Nutzeranweisung folgt.
|
|
- Keyboard-Auswahl, Escape, gegenseitiger Ausschluss der Dialoge und
|
|
Fokus-Rückgabe sind in der UI implementiert.
|
|
- Abdeckung:
|
|
`frontend/tests/mission-control.test.ts` und
|
|
`backend-tests/MissionControlContextFormatterTests.cs`.
|
|
|
|
## 7. Wahrheitsgetreue Telemetrie
|
|
|
|
**Status:** lokal abgenommen
|
|
|
|
- `backend/Services/DashboardService.cs` übernimmt Fortschritt nur aus einem
|
|
gemeldeten Nexus-Task und Tokens nur aus einer gemeldeten
|
|
OpenClaw-Session.
|
|
- Cost bleibt `null`, solange die Runtime keinen autoritativen Wert liefert.
|
|
- Dashboard- und Agentenkomponenten zeigen unbekannte Werte als
|
|
„Nicht gemeldet“ und erzeugen keine synthetischen Thinking-Items,
|
|
hartcodierten Fortschritte, Kosten, Laufzeiten oder nächsten Schritte.
|
|
- Reale Runtime-Status- oder Activity-Typen dürfen weiterhin „thinking“
|
|
enthalten; entfernt wurde die präsentativ erfundene Telemetrie, nicht ein
|
|
autoritatives Ereignis.
|
|
|
|
## Automatisierte Baseline
|
|
|
|
Ausgeführt am 2026-07-30 im Repository-Root beziehungsweise in `frontend/`:
|
|
|
|
| Gate | Ergebnis |
|
|
|---|---|
|
|
| `.tools\dotnet\dotnet.exe test backend-tests/Nexus.Api.Tests.csproj --configuration Release --no-restore` | bestanden: 271, fehlgeschlagen: 0, übersprungen: 0 |
|
|
| `pnpm typecheck` | bestanden |
|
|
| `pnpm test` | 6 Dateien, 11 Tests bestanden |
|
|
| `pnpm build` | bestanden; 1.897 Module transformiert |
|
|
|
|
## Operierte Browser-QA
|
|
|
|
Ausgeführt am 2026-07-30 gegen die sichtbar als `QA SIMULATION` markierte
|
|
Repository-Fixture `scripts/qa/openclaw-ui-mock.mjs`:
|
|
|
|
- alle 19 Seitenrouten bei 1440 px ohne Dokument-Overflow oder sichtbare
|
|
Alerts; die bereits authentifizierte `/login`-Navigation leitete erwartbar
|
|
zu `/dashboard`;
|
|
- alle 18 authentifizierten Seiten bei 375 px ohne Dokument-Overflow;
|
|
- Dashboard, Run Control, Run Detail, Task Board, Calendar und Settings
|
|
zusätzlich bei 768, 1024 und 1920 px ohne Dokument-Overflow;
|
|
- Command Palette per Button und `Ctrl/Cmd+K`, Escape-Schließen,
|
|
Fokus-Rückgabe und Objekt-Navigation;
|
|
- Iris als standardmäßig geschlossenes Modal mit erhaltenem Run-/Task-Kontext;
|
|
- Task-korrelierter Run-Start, exakter Stop und Retry als neuer korrelierter
|
|
Run mit unveränderter Quellhistorie;
|
|
- keine Browser-Warnungen oder -Fehler im finalen Konsolencheck.
|
|
|
|
Die Fixture führte keine reale OpenClaw- oder OpenAI-Aktion aus. Diese
|
|
Browser-QA belegt ausschließlich UI-Verträge, Interaktion, responsive
|
|
Geometrie und den simulierten Lifecycle.
|
|
|
|
## Verbleibende Grenzen vor Produktionsfreigabe
|
|
|
|
1. **Live-Gateway:** Remote-Pairing mit realer Request-ID, Device-Token-Reuse,
|
|
Reconnect und Versionsfehlermodus in der Zielumgebung beweisen.
|
|
2. **End-to-end Provider:** Einen vollständigen
|
|
`Nexus -> OpenClaw -> OpenAI -> Nexus`-Lauf ausführen und belegen, dass
|
|
OpenAI in OpenClaw tatsächlich der primäre Provider ist.
|
|
3. **Live-Events:** SSE-Reconnect, Cursor-Replay, Gap-Recovery und
|
|
Run-Reconciliation unter echtem Gateway-Verkehr und längerer Laufzeit
|
|
testen.
|
|
4. **Multi-Replica:** Den lokalen JSONL-Idempotency-Ledger vor horizontaler
|
|
Skalierung durch einen geteilten transaktionalen Ledger mit eindeutigem
|
|
Key-Claim ersetzen.
|
|
5. **Resume und weitere Control-Flächen:** Same-run-Resume bleibt unsupported.
|
|
Tool-/Policy-, Channel-, Node-, Connector-, Secret- und vollständige
|
|
Schedule-Verwaltung sind weiterhin Produkt-Roadmap, nicht Teil dieses
|
|
Hardening-Slices.
|
|
6. **Datenbank-/Deployment-Nachweis:** Die neue EF-Migration muss in einer
|
|
PostgreSQL-Zielumgebung angewendet und zurücklesbar geprüft werden. In diesem
|
|
Checkpoint gab es keinen Commit, Push oder Deployment.
|
|
|
|
## Kanonische Folgedokumente
|
|
|
|
- [Agent-First Mission Control](../../../AGENT_FIRST_MISSION_CONTROL.md)
|
|
- [OpenClaw Gateway connection contract](../../../OPENCLAW_GATEWAY_CONNECTION.md)
|
|
- [Mission Control Roadmap](../../../MISSION_CONTROL_ROADMAP.md)
|
|
- [Route and agent-first evaluation](ROUTE_AND_AGENT_FIRST_EVALUATION.md)
|