feat: ship agent-first mission control v0.2.57
This commit is contained in:
@@ -0,0 +1,222 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user