docs: record v0.2.59 production acceptance [skip ci]

This commit is contained in:
AzuTear
2026-07-31 23:20:46 +02:00
parent 144edf58fe
commit 5640da8b91
4 changed files with 212 additions and 9 deletions
@@ -0,0 +1,183 @@
# Nexus v0.2.59 — Produktionsabnahme und nächster Plan
**Datum:** 2026-07-31
**Produktions-URL:** `https://nexus.noveria.net`
**Release-Commit:** `144edf58fe5928a3e04816f4435ea574d64211a1`
**Gitea-CI/CD:** `https://git.noveria.net/bao/nexus/actions/runs/362`
**Scope:** Repository, Gitea-Pipeline, Nexus-Produktion und ausschließlich Baos
OpenClaw-Topologie; keine Ressource von Maxi wurde aufgelistet oder geöffnet.
## Kurzurteil
Nexus v0.2.59 ist als Web-Anwendung und Nexus-Control-Plane sauber ausgeliefert:
Commit- und Image-Provenienz stimmen überein, PostgreSQL und die HTTP-Runtime zu
Baos OpenClaw sind stabil gesund, die Auth-Grenzen greifen und die kontrollierte
Browser-Suite ist grün.
Nexus ist damit **noch nicht** als vollständiger Ersatz für OpenClaws UI
abgenommen. Der entscheidende produktive Protocol-v4-Gateway-Pfad bleibt
absichtlich gesperrt, solange OpenClaw keine offiziell unterstützte externe
`nexus`- oder generische Operator-Client-ID anbietet. Echte Owner-Flows,
Pairing, OpenClaw-Schreibvorgänge und ein vollständiger
`Nexus -> OpenClaw -> OpenAI -> Nexus`-Run wurden ohne eine vom Owner
bereitgestellte Sitzung beziehungsweise ohne erfülltes Identity-Gate nicht
simuliert oder umgangen.
## Release- und Fehlerbehebung
| Commit | Ergebnis |
|---|---|
| `f5552218bc992a79cdd0e32dd30a57a785163f18` | Agent-first-/Performance-V2-Gesamtstand als v0.2.57 ausgeliefert |
| `6f21d9ba97cac58f082bf422e3c81ef3f2aac9c6` | Login-Rate-Limit-Darstellung und SPA-Security-Header als v0.2.58 gehärtet |
| `144edf58fe5928a3e04816f4435ea574d64211a1` | Produktions-Docker-DNS, Token-Fallback und semantisches Health-Gate als v0.2.59 korrigiert |
Die Live-Prüfung fand und behob drei reale Releaseprobleme:
1. Ein normaler ungültiger Login zeigte fälschlich einen Sperr-Countdown,
obwohl noch vier Versuche übrig waren. Die UI zeigt den Countdown jetzt nur
bei einer echten Sperre; ein Playwright-Regressionsfall deckt dies ab.
2. Nginx vererbte Security-Header wegen eigener `add_header`-Direktiven nicht
an `index.html`. HTML-Antworten liefern jetzt HSTS, CSP,
`X-Content-Type-Options`, `X-Frame-Options`, Referrer- und
Permissions-Policy.
3. Nexus verwendete in Produktion `host.docker.internal:18789`, obwohl Baos
OpenClaw im gemeinsamen Docker-Netz unter `openclaw-gateway:18789`
erreichbar ist. Zusätzlich wertete das Deployment jedes HTTP 200 von
`/health` als Erfolg, auch ein `Degraded`-Payload. Produktion verwendet nun
Docker-DNS; Deployment und Rollback akzeptieren nur den obersten Status
`Healthy`.
## Verifizierte Evidenz
| Ebene | Ergebnis |
|---|---|
| Lokales Backend | 368 Tests: 363 bestanden, 5 explizit Docker-gesteuert übersprungen |
| Lokales Frontend | Typecheck grün; 12 Vitest-Dateien und 30 Tests grün; Produktions-Build mit 1.988 Modulen grün |
| Lokales Playwright | 25/25 Tests grün, einschließlich Login-Regression, Deep Links, Owner-/Non-Owner-Grenzen, Query-Deduplizierung, SSE-Resync, Task-Board-Drag-and-drop, Done-Pagination und fünf Viewportbreiten |
| Gitea Run 362 | Backend 40 s, Frontend 2:47 min, Security 3 s, Deployment 34 s; alle Jobs erfolgreich |
| CI-Backend | 363 bestanden, 5 Docker-/Toxiproxy-Fälle mangels explizitem CI-Opt-in übersprungen; Build ohne Warnung oder Fehler |
| CI-Browser | 25/25 bestanden in 1,3 min |
| Provenienz | API- und Web-Image melden v0.2.59 und exakt `144edf58fe5928a3e04816f4435ea574d64211a1` |
| Produktion Health | Drei aufeinanderfolgende Abrufe: Gesamt `Healthy`, PostgreSQL `Healthy`, Runtime `Online`, Detail `HTTP 200` |
| Produktion Routing | `/`, `/login` und 15 geprüfte authentifizierte SPA-Pfade liefern HTTP 200; warme Antworten lagen im Einzelprobe-Fenster bei 4967 ms |
| Auth-Grenzen | Unauthentifizierte Operations-, OpenClaw-Overview- und Chat-Aufrufe liefern 401 mit `application/problem+json` |
| Login live | Ungültige Dummy-Anmeldung liefert verständlichen Fehler, vier verbleibende Versuche, keinen falschen Countdown und einen weiterhin aktiven Login-Button |
| Kleine Breite live | Login bei 693 px: `scrollWidth == clientWidth`, kein horizontaler Seiten-Overflow |
Die 5 Docker-/Toxiproxy-Integrationsfälle sind sowohl lokal als auch in Run 362
sichtbar übersprungen. Sie werden nicht als bestanden gezählt. Die CI-Variable
für den separaten Docker-Integrationstestjob war nicht aktiviert.
## Seiten- und Funktionsmatrix
`Live` bedeutet auf Produktion direkt belegt. `E2E` bedeutet mit kontrollierten,
typisierten Repository-Fixtures im Browser belegt. Ein grüner E2E-Fall ist kein
Ersatz für einen echten OpenClaw-Schreibtest.
| Seite/Familie | Was belegt ist | Was noch nicht live belegt oder fehlt |
|---|---|---|
| `/login` | Live: Auslieferung, Semantik, ungültiger Login, Versuche, kein falscher Lock, Security-Header, kein Overflow | Gültige Owner-Anmeldung, Session-Refresh, Logout und Recovery live; 2FA/Passkeys fehlen |
| `/dashboard` | E2E: Orchestrierungsansicht, Task-Deep-Link, ein deduplizierter Overview-Request, owner-only Iris | Credentialed Live-Daten, echter Iris-Chat, Queue/Usage/Recovery gegen OpenClaw |
| `/agents` und `/agents/:id` | E2E/Contracts: Live-Query-Modell, Detail, Standarddateien, Workspace-Provenienz | Echte Gateway-Inventur, Datei-Read-back und Lifecycle-Aktionen live |
| `/agents/new` und Proposal-Detail | E2E: manueller/Iris-Proposal-Flow, Owner-Freigabe, Non-Owner-Denial, Zustandsmaschine | Produktive Provisionierung bleibt am External-Client-ID-Gate blockiert; kein Live-Testagent erzeugt |
| `/projects` und `/projects/:id` | E2E: Project-Deep-Link sowie verknüpfte Tasks, Agenten und Runs | Live-Delegation, Budgets, KPIs, Automationen und Artifact-Flow |
| `/tasks` und `/tasks/:id` | E2E: ein Initialquery, sichtbare Daten beim Refresh, SSE-Lücke mit genau einem Resync, DnD-Persistenz, Done-Cursor, fünf Breiten | Kein produktiver Owner-Datensatz und kein 1.000/10.000-Lastnachweis; Bulk/Dependencies/Run-Recovery unvollständig |
| `/runs` und `/runs/:id` | E2E/Backend: persist-before-dispatch, Detail, exakter Stop, korrelierter Retry, Transitionen und Links | Echter OpenClaw-/OpenAI-Run, Tools, Usage, Artifacts, Hierarchie und sichere Resume-Strategie |
| `/calendar` | Backend/E2E: typisierte Cron-Verträge und geroutete Oberfläche | Kein Live-CRUD an benanntem Wegwerfjob; Templates, Missed-run-/Retry-Policy und Delivery-Härtung offen |
| `/memory`, `/docs`, `/incidents` | E2E/Contracts: confined Read-Pfade, Quellagent-/Pfadprovenienz und Detaildarstellung | Credentialed Live-Inhalt; sichere Write-/Ingestion-/Versionierungs- und Incident-Aktionsflows fehlen |
| `/models` | E2E/Contracts: bereinigter `models.authStatus` und ehrliche Unknown-Zustände | OpenAI-Primärprovider, Allowlist/Fallback/Budget und echter Modelltest über OpenClaw nicht belegt |
| `/activity` und `/notifications` | E2E: Ergebnisnavigation direkt zum betroffenen Task und globale Entity-Refs | Operative Ack/Snooze-/Approval-/Incident-Aktionen, Export und Retention unvollständig |
| `/security` | E2E/Contracts: Identity-, Scope-, Capability- und Trust-Grenzen als Oberfläche | Reales Pairing, Scope-Upgrade, Remediation, Rotation und Session-Audit live |
| `/settings` | E2E/Backend: Attach-&-Adopt-Zustandsmodell, Setup-/Config-/Wizard-Verträge | Credentialed First-run gegen Bao, offizielle externe Client-ID und produktives Management-Gate |
Der Router enthält aktuell 21 benannte Seiten: Login und 20 authentifizierte
Views einschließlich Agent-Proposal-, Project-, Task- und Run-Details. Die
CI-Suite öffnet alle 20 authentifizierten Core-Deep-Links und prüft die
Seitenhülle zusätzlich bei 375, 768, 1024, 1440 und 1920 px.
## Was jetzt funktioniert
- reproduzierbares Gitea-CI/CD mit Commit-/Versions-Provenienz;
- TLS-Auslieferung, SPA-Routing, Security-Header und Auth-by-default-Grenzen;
- PostgreSQL und OpenClaw-HTTP-Erreichbarkeit über die reale
Produktions-Docker-Topologie;
- ein gemeinsamer OpenAPI-Vertrag, Query-Cache, Domain-Event-/SSE-Modell und
strukturierte Ergebnisnavigation;
- kontrollierte Browserflows für Agent-Proposals, Projekte, Tasks, Runs,
Result-Deep-Links, Rollenbegrenzung und Task-Board-Live-Deltas;
- ein Deployment-Gate, das eine degradierte Runtime nicht mehr als erfolgreichen
Release akzeptiert.
## Was nicht funktioniert oder nicht bewiesen ist
- Der produktive Protocol-v4-Gateway-Connector darf noch nicht verbinden oder
schreiben, weil OpenClaw 2026.7.1 keine offiziell unterstützte externe
Nexus-Identität besitzt. Dies ist eine bewusste Sicherheitsgrenze.
- Ohne eine vom Owner hergestellte Browser-Sitzung wurden die authentifizierten
Produktionsseiten nicht mit realen Daten bedient.
- Kein realer Agent wurde aus Nexus oder durch Iris provisioniert; kein
Agent-Markdown, Configwert oder Cronjob wurde produktiv verändert.
- Der Pfad `Nexus -> OpenClaw -> OpenAI -> Nexus` ist noch nicht als
wiederholbarer, auditierter Produktionslauf bewiesen.
- Die fünf PostgreSQL-/Toxiproxy-Integrationsfälle und die geplanten k6-,
SQL-Plan- und Promptfoo-Gates liefen in diesem Release nicht.
- Die CI-Browserlogs enthalten erwartbare Vite-Proxy-Fehler für
`/api/v1/telemetry/browser`, weil der Fixture-Webserver keinen echten API-Port
8080 startet. Die Tests sind grün; das Rauschen sollte separat entfernt
werden, damit echte Browserfehler wieder auffallen.
## Priorisierter nächster Plan
### P0 — echter agent-first Primärpfad
1. Eine offiziell unterstützte externe `nexus`- oder generische
Operator-Client-ID upstream erhalten, die erste unterstützende stabile
OpenClaw-Version pinnen und den Compatibility-Contract ausführen.
2. Mit Bao als Owner read-only pairen; erwartete 9 Agenten und 7 Cronjobs über
RPC inventarisieren und die UI auf Dashboard, Agents, Calendar, Models,
Security und Settings credentialed-live prüfen.
3. Den separaten `operator.admin`-Upgrade mit Endpoint-/Device-/Scope-/
Capability-Nachweis durchführen. Keine reservierte interne Identity
imitieren.
4. Einen klar benannten Wegwerfagenten über manuellen und Iris-Proposal-Pfad
abnehmen: Approval, genau ein `agents.create`, Datei-Read-back, `partial`/
`in_doubt`-Negativfall und Audit. Maxis Bereiche bleiben ausgeschlossen.
5. Einen benannten Wegwerf-Cron vollständig Create -> Edit -> Run -> History ->
Disable -> Delete prüfen und danach einen korrelierten
`Nexus -> OpenClaw -> OpenAI -> Nexus`-Run mit Reload-Recovery, Stop/Retry
und Audit beweisen.
### P1 — Performance und tägliche Bedienparität
1. Die fünf Docker-/Toxiproxy-Tests in einem isolierten, rücksetzbaren CI-Profil
aktivieren und als eigenen Pflichtnachweis archivieren.
2. Das Task Board mit 1.000 Tasks und 10.000 Activities messen: k6-p95,
SQL-Anzahl, `EXPLAIN (ANALYZE, BUFFERS)`, Payloadgröße und wiederholtes
Navigation-bis-Karten-sichtbar. Erst danach Virtualisierung entscheiden.
3. Run Explorer um Hierarchie, Tools, Approvals, Artifacts, Usage/Kosten und
belastbare Resume-/Replacement-Semantik erweitern.
4. Agent-, Tool-, Model- und Approval-Lifecycle sowie actionable Incidents und
Notifications schließen; Memory/Docs nur mit Provenienz, Versionierung,
Retention und Retrieval-Evals schreibbar machen.
5. Eine echte `/health/ready`-Semantik mit HTTP 503 für degradierte Pflichtteile
ergänzen; `/health/live` bleibt reiner Prozess-Livenesscheck.
### P2 — Release- und Testhygiene
1. Browsertelemetrie im Fixture-Profil explizit deaktivieren oder mocken, damit
CI keine erwartbaren `ECONNREFUSED`-Zeilen erzeugt.
2. `.NET 10` per `global.json` pinnen und `VERSION`, Frontend-Paketversion und
Release-/Tag-Strategie vereinheitlichen.
3. Docker-Compose-/Rollback-Topologie als sanitisiertes Betriebsrunbook
dokumentieren und einen Restore-/Game-day-Nachweis ausführen.
4. Vollständige Keyboard-/Accessibility-Gates sowie operative
Browser-Abnahmen mit einem eigenen nicht-produktiven Owner-Testkonto
automatisieren.
## Freigabegrenze
v0.2.59 ist der belegte Produktionsstand für Auslieferung, Auth-Grenzen,
Nexus-Domänenlogik und OpenClaw-HTTP-Reachability. Das Produktversprechen
„kein täglicher Wechsel zu OpenClaw nötig“ bleibt offen, bis die P0-Schritte mit
einer offiziell unterstützten Gateway-Identität und echten, klar begrenzten
Liveobjekten abgeschlossen sind.