feat: ship agent-first mission control v0.2.57
CI - Build & Test / Backend (.NET) (push) Successful in 42s
CI - Build & Test / Frontend (Vue/TS) (push) Successful in 2m46s
CI - Build & Test / Security Check (push) Successful in 3s
CI - Build & Test / Deploy Nexus (push) Successful in 56s

This commit is contained in:
AzuTear
2026-07-31 22:39:47 +02:00
parent 3bc7622977
commit f5552218bc
535 changed files with 95242 additions and 8791 deletions
@@ -0,0 +1,101 @@
# Authenticated dashboard design migration audit
## Outcome
The dashboard V2 language now covers all 16 other authenticated routes through
a shared token source, presentation layer, and aligned legacy shell. Dashboard
and Login remain visually unchanged. No product behavior, backend contract,
route registration, store/service/composable logic, or permission rule was
modified.
## Implemented layers
1. Expanded `nexus-tokens.css` into the V2 source for surfaces, text, accents,
status colors, focus, typography, page geometry, and legacy aliases.
2. Added `nexus-components.css` for route frames, headers, glass panels,
controls, badges, modals, and state surfaces.
3. Aligned `App.vue`, `AppSidebar`, and `AppHeader` with the dashboard's galaxy,
248px sidebar, 62px topbar, glass, and responsive navigation.
4. Applied standard, workspace, or reading-width contracts to every migrated
route family.
5. Replaced presentation emoji/glyph icons with existing Lucide icons and added
accessible names, semantic interactive elements, keyboard equivalence, and
visible focus.
6. Unified both authenticated navigation shells around the four dashboard
categories and added a persistent Settings destination to the dashboard
footer. Shared-shell and dashboard destinations now use RouterLinks, while
detail routes retain the active state of their parent section.
## Evidence matrix
| Evidence | Coverage | Result |
| --- | --- | --- |
| Fresh dashboard reference | `/dashboard`, `1440 × 900` | Passed |
| Full desktop route matrix | all 18 registered routes, `1440 × 900` | Passed |
| Full migrated mobile matrix | 16 migrated routes, `375 × 812` | Passed |
| Representative responsive matrix | 5 route families at `768`, `1024`, `1920px` | Passed |
| Automated geometry | document width and route-root geometry | Passed |
| Same-viewport visual comparison | dashboard reference beside migrated Agents | Passed |
| Core interactions | filters, forms, modal, detail changes, board, chat, notifications | Passed |
| Keyboard/accessibility | names, semantics, focus, equivalent activation | Passed |
| Frontend gates | typecheck, tests, build | Passed |
Evidence is under `screenshots/`. The final reference is
`screenshots/00-dashboard-reference-1440.png`; route captures are under
`screenshots/design-migration-routes/`; and the combined visual comparison is
`screenshots/design-qa-comparison-dashboard-vs-agents-1280.png`.
## Measured contracts
- Sidebar: `248px` desktop.
- Topbar: `62px`.
- Page title: Space Grotesk `24px / 30px`, weight `700`.
- Desktop/mobile inset: `20px / 14px`.
- Maximum route widths: standard `1180px`, workspace `1440px`, reading/form
`880px`.
- No document-level horizontal overflow at the required breakpoints.
- Task Board columns retain their intentional internal horizontal scroller.
## Findings resolved during QA
- The inherited 768px shell breakpoint initially hid the sidebar without
exposing the mobile navigation button. The shell now switches coherently at
`900px`.
- Scoped Settings width rules initially overrode the shared reading-width
modifier. Higher-specificity shared contracts now enforce `880px` for every
reading/form root.
- Undefined or ambiguous legacy color aliases and hard-coded route colors were
replaced by V2 semantic tokens.
- Presentation emoji/glyph icons and unnamed icon controls were replaced with
Lucide icons and explicit accessible names.
- The shared sidebar initially exposed one flat list and the dashboard omitted
Settings. Both shells now expose the same category framework and persistent
Settings access without changing routes, handlers, stores, or permissions.
- A RouterLink migration initially shadowed each dashboard item's target with
the current route. The prop/current-route names are now distinct, and browser
checks confirmed the real registered destinations.
## Residuals
There are no P0-P2 design defects. A deliberate Task Board route leave aborts
the fixture-backed live stream and logs the existing polling-fallback warning.
This is outside the presentation scope and does not affect the rendered result
or interaction path.
## Verification
```text
pnpm typecheck -> passed
pnpm test -> passed (1 file, 2 tests)
pnpm build -> passed (1,882 modules)
git diff --check -> passed; line-ending notices only
```
Navigation follow-up evidence:
```text
navigation-groups-after-dashboard.png
navigation-groups-after-settings.png
navigation-groups-after-settings-375.png
navigation-groups-comparison-dashboard-vs-settings-1440.png
```
+148
View File
@@ -0,0 +1,148 @@
# Nexus Seitenaudit
**Datum:** 2026-07-26
**Commit:** `3bc7622977f4a6c2f2e98ab4aa856a2e45c3cf49`
**Auditumfang:** Alle 18 in `frontend/src/router.ts` registrierten Seiten plus
ungültige Navigationsziele und sechs Viewport-Größen.
## Methodik und Evidenzgrenze
Die Anwendung wurde lokal gebaut und im Browser mit repräsentativen,
deterministischen API-Fixtures betrieben. Dadurch konnten Authentifizierung,
Routen, Inhalte, Lade-/Leerzustände, Interaktionen und Responsive-Verhalten
reproduzierbar geprüft werden.
Die Fixtures ersetzen keinen Live-Systemtest:
- keine reale PostgreSQL- oder OpenClaw-Verbindung,
- kein produktiver Nginx-/Traefik-Pfad,
- SSE absichtlich nicht als Live-Vertrag bewertet,
- fixturebedingte Datums- oder Reconnect-Anzeigen gelten nicht als
Produktdefekte.
Jeder Screenshot stammt aus diesem Auditlauf und liegt unter
[`screenshots/`](screenshots/).
## Leitbefunde
1. **Dashboard ist zwischen 375 und 1024 px nicht nutzbar.** Agent-Cards,
Header und Iris-Panel überlappen oder werden abgeschnitten.
2. **Bei 768 px greift der mobile Sidebar-Breakpoint noch nicht.** Die feste
248-px-Sidebar lässt dem Board nur einen schmalen Restbereich.
3. **Zwei UI-Shells erzeugen einen Produktbruch.** Dashboard und restliche
Seiten unterscheiden sich in Navigation, Sprache, Dichte, Tokens und
Verhalten.
4. **Vier Dashboard-Navigationsziele sind nicht registriert.** Der
Wildcard-Redirect kaschiert das Problem und zeigt wieder `/dashboard`.
5. **Daten nach Login werden nicht zuverlässig initialisiert.** Projects,
Models und Activity bleiben bis zum manuellen Refresh leer.
6. **Task Board verliert auf kleinen Displays den Gesamtüberblick.** Es zeigt
praktisch nur die erste Spalte und erzeugt große leere Höhen.
7. **Kontrast und Schriftgrößen sind zu schwach.** Das betrifft besonders
Labels, Metadaten, Buttons und sekundäre Texte.
## Visuelle Kernevidenz
### Dashboard, Desktop 1440 px
![Dashboard desktop](screenshots/02-dashboard-desktop.png)
### Dashboard, Mobile 375 px
![Dashboard mobile](screenshots/19-dashboard-mobile-375.png)
### Dashboard, Tablet 768 px
![Dashboard tablet](screenshots/23-dashboard-tablet-768.png)
### Task Board, Mobile 375 px
![Task Board mobile](screenshots/20-task-board-mobile-375.png)
## Audit pro registrierter Seite
| Route | Status | Wesentliche Befunde | Evidenz |
|---|---|---|---|
| `/login` | P1 | Visuell fokussiert, aber sehr dunkel. Bei 320×568 werden oberer Brand-Bereich und untere Inhalte nicht gemeinsam sichtbar; der Flow benötigt Scrollen. | [Desktop](screenshots/01-login-desktop.png), [320 px](screenshots/22-login-mobile-320.png) |
| `/dashboard` | P0 | Eigenständige V2-Shell; dichte, überlappende Agent-Topologie; Suche und „Ask Iris“ ohne vollständige Aktion; feste Dashboard-Aktivmarkierung. Zwischen 375 und 1024 px schwer bis vollständig unbrauchbar. | [1440](screenshots/02-dashboard-desktop.png), [375](screenshots/19-dashboard-mobile-375.png), [768](screenshots/23-dashboard-tablet-768.png), [1024](screenshots/24-dashboard-1024.png), [1920](screenshots/25-dashboard-wide-1920.png) |
| `/memory` | P2 | Kohärente List-/Detailansicht, aber sehr kleine und kontrastarme Metadaten. Der große leere Detailbereich gibt beim Einstieg wenig Orientierung. | [Desktop](screenshots/03-memory-desktop.png) |
| `/docs` | P2 | Such- und Kategorienstruktur sind verständlich. Initial bleibt viel leerer Raum; kein automatisch ausgewähltes Dokument und zu schwache Sekundärtexte. | [Desktop](screenshots/04-docs-desktop.png) |
| `/agents/:id` | P1 | Informationsarchitektur ist brauchbar. „Zurück zum Team“ navigiert jedoch zu nicht registriertem `/team` und landet über Wildcard auf dem Dashboard. | [Detail](screenshots/05-agent-detail-desktop.png), [Fehlredirect](screenshots/05b-agent-back-redirect-desktop.png) |
| `/security` | P0 | Übersicht ist visuell nachvollziehbar, vermittelt aber mehr Sicherheit als die tatsächliche Controller-Autorisierung bietet. Deaktivierte 2FA und kritische Zugriffslücken sind nicht als Release-Blocker erkennbar. | [Desktop](screenshots/06-security-desktop.png) |
| `/incidents` | P2 | Solide List-/Detailstruktur. Kleine Typografie, schwache Statusdifferenzierung und ein großer initial leerer Detailbereich bremsen den Scan. | [Desktop](screenshots/07-incidents-desktop.png) |
| `/calendar` | P2 | Termine und Zeitbezug sind gut strukturiert. Refresh und Metadaten sind visuell zu zurückhaltend. | [Desktop](screenshots/08-calendar-desktop.png) |
| `/projects` | P1 | Nach normalem Login zunächst leer. Erst manueller Refresh lädt Daten. Geladener ModuleView wirkt weitgehend ungestaltet und nicht wie Teil derselben Anwendung. | [Vor Refresh](screenshots/09-projects-desktop.png), [nach Refresh](screenshots/09b-projects-after-refresh-desktop.png) |
| `/projects/:id` | P2 | Klare Stammdaten und Task-Zuordnung. Sehr große Leerflächen; destruktive Archivaktion erhält relativ viel visuelles Gewicht. | [Desktop](screenshots/10-project-detail-desktop.png) |
| `/tasks` | P1 | Funktionsreicher Board-Flow, aber fünf Spalten überlaufen bereits auf Desktop. Auf 375 px ist nur eine Spalte plus Restkante sichtbar; keine gute mobile Statusnavigation. | [Desktop](screenshots/11-tasks-desktop.png), [375 px](screenshots/20-task-board-mobile-375.png) |
| `/tasks/:id` | P1 | Detail- und Subtask-Struktur sind brauchbar. Existierende Priorität `Critical` erscheint leer, weil die Select-Option fehlt. | [Desktop](screenshots/12-task-detail-desktop.png) |
| `/agents` | P2 | Stärkste Legacy-Übersichtsseite: konsistentes Grid und verständliche Rollen. Ganze `article`-Cards sind jedoch clickbar statt semantische Links/Buttons zu verwenden. | [Desktop](screenshots/13-agents-desktop.png) |
| `/models` | P1 | Initial leer wegen fehlender Store-Hydration. Nach Refresh inhaltlich vorhanden, aber visuell als roher ModuleView ohne klare Hierarchie. | [Vor Refresh](screenshots/14-models-desktop.png), [nach Refresh](screenshots/14b-models-after-refresh-desktop.png) |
| `/activity` | P1 | Dasselbe Hydration-Problem. Geladene Activity ist funktional lesbar, wirkt aber wie eine unvollständige Zwischenansicht. | [Vor Refresh](screenshots/15-activity-desktop.png), [nach Refresh](screenshots/15b-activity-after-refresh-desktop.png) |
| `/chat` | P1 | Kernfunktion ist erkennbar, Oberfläche wirkt jedoch unfertig: schwache Hierarchie, rohe Form-Controls und keine belastbare mobile Conversation-Struktur. | [Desktop](screenshots/16-chat-desktop.png) |
| `/notifications` | P2 | Filter und Gruppierung sind vorhanden. Kontrast ist schwach; Emoji-Icons brechen die sonstige Icon-Sprache und besitzen uneinheitliche Semantik. | [Desktop](screenshots/17-notifications-desktop.png) |
| `/settings` | P2 | Am besten gelöste responsive Legacy-Seite. Formfelder bleiben bei 375 px nutzbar. Globale Topbar-Icons und kleine Labels bleiben Accessibility-Risiken. | [Desktop](screenshots/18-settings-desktop.png), [375 px](screenshots/21-settings-mobile-375.png) |
## Nicht registrierte oder defekte Ziele
| Quelle | Ziel | Tatsächliches Verhalten |
|---|---|---|
| Dashboard-Sidebar | `/orchestration` | Wildcard -> `/dashboard` |
| Dashboard-Sidebar | `/research` | Wildcard -> `/dashboard` |
| Dashboard-Sidebar | `/hosts` | Wildcard -> `/dashboard` |
| Dashboard-Sidebar | `/costs` | Wildcard -> `/dashboard` |
| Agent Detail | `/team` | Wildcard -> `/dashboard` |
`TeamView.vue` existiert, ist aber nicht im Router registriert. Der
Wildcard-Redirect macht diese Integrationsfehler für Nutzer schwer
diagnostizierbar.
## Responsive-Matrix
| Viewport | Ergebnis |
|---|---|
| 320 px | Login scrollbar und vertikal gequetscht; kein kompakter First-Viewport-Flow |
| 375 px | Dashboard P0-defekt; Task Board nur eingeschränkt navigierbar; Settings brauchbar |
| 768 px | Schlechtester Dashboard-Zwischenzustand durch Off-by-one-Breakpoint und feste Sidebar |
| 1024 px | Dashboard weiterhin überlappend und abgeschnitten |
| 1440 px | Grundsätzlich bedienbar, aber Dashboard-Header/Cards kollidieren und Task Board läuft horizontal über |
| 1920 px | Dashboard erstmals stabiler, erzeugt jedoch übermäßig viel ungenutzten Raum |
## Accessibility-Spot-Check
Keine vollständige WCAG-Prüfung. Sichtbar und im DOM nachvollziehbar:
- zahlreiche Icon-Buttons ohne Accessible Name,
- clickbare `article`-Elemente statt Links oder Buttons,
- sehr kleine Textgrößen bis in den einstelligen Pixelbereich,
- schwache Kontraste für Text, Controls und Statusinformationen,
- horizontale Informationsarchitektur ohne gleichwertige mobile Alternative,
- Platzhalter-Controls, deren sichtbare Affordance keine Aktion auslöst.
## Priorisierte Korrekturen
### P0
1. Dashboard zwischen 375 und 1024 px neu layouten; 768-px-Grenze explizit
testen.
2. Navigation nur aus registrierten Routen erzeugen oder fehlende Seiten
bewusst implementieren.
3. Security-Seite und Release-Status an die tatsächlichen
Zugriffskontrollbefunde koppeln.
### P1
1. Eine gemeinsame Shell, Tokenbasis und Navigation für alle Seiten festlegen.
2. Operations Store direkt nach erfolgreichem Login hydratisieren.
3. Task Board mit mobiler Statusauswahl oder segmentierter Liste statt
abgeschnittener Fünf-Spalten-Fläche ausstatten.
4. `Critical` im gesamten Priority-Vertrag unterstützen.
5. Suche, Ask-Iris, Logout und Back-Navigation entweder funktionsfähig machen
oder ihre Affordance entfernen.
### P2
1. Standardgrößen und Kontrast anheben.
2. Empty-/Loading-/Error-Zustände mit klarer nächster Aktion gestalten.
3. Interaktive Cards und Icon-Buttons semantisch und keyboard-tauglich machen.
4. Projects, Models, Activity und Chat aus dem generischen ModuleView in
kohärente Produktseiten überführen.
@@ -0,0 +1,117 @@
# Structural proof preflight
- Product, route, or flow: Nexus authenticated legacy shell and the first migrated grid route, `/agents`
- Selected direction or inspected source: `/dashboard`, captured in `screenshots/02-dashboard-desktop.png`
- First bounded slice: shared V2 tokens, legacy sidebar/topbar/content frame, and the Agents overview
- Explicit exclusions: dashboard and login visuals; route targets; stores, services, API contracts, backend behavior, and domain state transitions
- Owner: Codex
- Status: passed
## Entry contract
- Entry mode: task-first
- Minimum context required before the first real action: current route title, gateway state, agent count, and any loading/error warning
- Why each preceding block is necessary: the shell orients the user; the route header identifies the operational scope; gateway feedback determines whether agent data is trustworthy
- First real action or task-entry control: open an agent profile
- Success destination: the existing `/agents/:id` route
- Blocked-destination reason and recovery: when no agents are returned, the existing empty state names gateway reachability and configuration as the recovery path
| Viewport or container | Initial `scrollY` | Identifying context rectangle | Action rectangle | Required reserve | Destination and sticky offset | Settled result |
| --- | ---: | --- | --- | ---: | --- | --- |
| Narrowest supported / `375px` | 0 | `x=14`, `y=76`, `w=332`; identity and gateway status wrap inside the page frame | first agent card `x=14`, `y=186`, `w=332`; keyboard activation verified | 14px page inset | `/agents/iris`; 62px topbar remains visible | passed; no page or content x-overflow |
| Representative wide / `1280px` rendered browser ceiling | 0 | `x=268`, `y=82`, `w=977`; title uses Space Grotesk 24/30, 700 | first agent card `x=268`, `y=161`, `w=316` | 20px page inset | `/agents/iris`; 62px topbar remains visible | passed; 248px sidebar and 62px topbar measured |
## Section grammar
| Order | Section | Primary role | User question | Evidence or input | Layout grammar | Density and disclosure | Narrow transformation | State responsibility |
| ---: | --- | --- | --- | --- | --- | --- | --- | --- |
| 1 | Legacy shell | orient | Where am I and what can I open? | registered navigation and existing counts | fixed sidebar plus topbar | compact operational chrome | sidebar becomes an overlay | active route, connection status, mobile navigation |
| 2 | Route header | orient | Which agent surface and gateway state am I seeing? | agent count and gateway response | title cluster plus status badge | concise | stack and wrap | loading, gateway warning, error |
| 3 | Agent grid | act | Which agent should I inspect? | existing agent data | responsive card grid | operational summary per agent | 3 to 2 to 1 columns | runtime state and profile navigation |
| 4 | Empty/error message | recover | Why is no agent available and what can I check? | existing error and empty copy | single glass state panel | readable | full-width | diagnostic and next valid check |
- Accidental preamble removed or justified: no decorative preamble is added before the route identity.
- Repeated wrappers or layout grammars that need a product reason: cards are reserved for comparable agents and operational panels.
- Evidence kept with its claim: gateway state remains in the route header; runtime state remains inside its agent card.
- Actions kept with their object and consequence: profile navigation remains on the corresponding agent card.
- Recovery kept in destination context: loading, warning, error, and empty feedback stays inside the Agents page.
## Signature-gesture distribution
- Gesture: blue-to-violet gradient with controlled glow
- One dominant use: active navigation and primary action
- Supporting echo 1: brand mark
- Supporting echo 2: a meaningful active or blocked status
- Prohibited sections or states: ordinary data cards, neutral inputs, metadata, empty states, long-form copy, and destructive confirmation surfaces
- Plain operational, error, and recovery grammar: glass surface, semantic border/status color, no decorative glow
## Content and type pressure
| Pressure input | Exact fixture or source | Narrow result | Wide result | Fix or accepted rationale | Status |
| --- | --- | --- | --- | --- | --- |
| Longest heading | existing route titles such as `Notifications` and `Project Detail` | retained at 24/30 and allowed to wrap | retained at 24/30 | wrap rather than shrink below the title contract | passed for the slice |
| Longest control label | `Iris, Chief of Staff: View Profile` accessible name | keyboard reachable without changing visual copy | card action remains local to its object | preserve copy; allow action rows to wrap | passed |
| Largest value or identifier | `claude-sonnet-4-5` | contained in the card metadata track | contained in the three-column grid | mono text keeps the existing ellipsis policy | passed |
| Longest error, limitation, and recovery copy | authored error plus the existing gateway/configuration recovery copy | both wrap inside 332px | state surface remains inside the page frame | full-width glass state panels with natural wrapping | passed |
| Required localization | current German and English UI strings | German copy wraps naturally; English labels remain intact | no content rewrite | do not rewrite product copy in this visual migration | passed |
| `200%` zoom | represented structurally by the single-column narrow transformation and adjacent breakpoint matrix | no x-overflow | n/a | page remains vertically scrollable; controls wrap | accepted; final responsive matrix passed |
| Narrow parent container | 375px required viewport | `scrollWidth=clientWidth=375`; content overflow delta `0` | n/a | `min-width: 0`, safe wrapping, and no page-level x overflow | passed |
- Important instructions, limitations, provenance, status, safety, consequences, and recovery are at least `14px`: required for final proof.
- Any `12px` use is truly secondary and nonessential, with contrast and line-height evidence: reserved for compact interface labels; metadata uses JetBrains Mono at 11px minimum.
- Min-content and unbreakable-content policy: content columns use `minmax(0, 1fr)` and `min-width: 0`; identifiers wrap or use an existing internal scroller only on horizontal workspaces.
- Risky breakpoints and adjacent widths: 375, 767/768, 1023/1024, 1440, and 1920px.
## State-and-copy truth table
| State | Entry cause | Visible facts | Allowed actions | Forbidden stale copy or values | Recovery or next action | Focus target | URL, history, and storage effect |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Initial/loading | route mounts and requests data | route title and loading message | navigation remains available | stale success state must not be presented as current | wait or navigate elsewhere | route heading | unchanged |
| Success | API returns agents and gateway data | count, gateway state, cards, runtime metadata | open an agent, navigate, refresh | loading/error copy | select an agent profile | first actionable card | existing router history only |
| Failure | API or gateway request fails | existing diagnostic message | navigate or refresh | stale cards presented as newly loaded | retry through the existing refresh/re-entry path | error message then next control | unchanged |
| Recovery/empty | response contains no agents | existing empty-state reason and checks | navigate or re-enter after configuration changes | invented agents or changed recovery copy | check gateway reachability/configuration | empty-state heading | unchanged |
- Additional orthogonal states required: connected, thinking, blocked, ready, stale, error, unsupported, mobile navigation open/closed, and keyboard focus.
- Atomic stale-content removal rule: visual CSS must not change existing state guards or data replacement behavior.
- Exact reset or recovery snapshot: current store and component behavior remains the source of truth.
## Action vocabulary ledger
| User intent | Idle control | Pending or progress | Success or result | Failure and next action | Recovery, undo, or reversal |
| --- | --- | --- | --- | --- | --- |
| Refresh operational data | Refresh | existing loading/spinner treatment | updated current state | existing error message | invoke Refresh again |
| Inspect an agent | View Profile / agent card | route transition | agent detail route | existing route/error behavior | return through existing navigation |
- Same user-recognized verb and domain noun retained through the journey: yes; no product copy or action is renamed by the visual migration.
- Labels, statuses, toasts, confirmations, errors, recovery, and assistive announcements agree: existing strings remain authoritative.
- Empty and failure states name the next valid action: existing page copy is preserved and presented accessibly.
## Proof architecture
- Stable semantic selectors, state attributes, and dedicated value nodes: route root classes, shell landmarks, existing data/state classes, and `data-route` on the legacy content frame
- Assertions intentionally independent of translated copy, neighboring text, wrappers, and visual position: geometry and overflow checks target landmarks and route roots
- Explicit settle conditions for scroll, fonts, media, transitions, async state, and geometry: document fonts loaded, fixture/API requests settled, no pending transitions, and two animation frames after route mount
- Independent oracle or source of truth: router registration plus the independently authored audit fixture; production stores and API contracts are not modified
- Required positive and negative assertions: every registered route renders; no page-level horizontal overflow; dashboard/login source files remain visually untouched; navigation/events/handlers remain registered
- Source, build, harness, fixture, oracle, and capture bindings: repository HEAD and working tree, frontend build, local fixture, route matrix, and dated screenshots under this audit folder
- Capture claim ledger location: `design-qa.md` and `docs/audits/2026-07-26/DESIGN_MIGRATION_AUDIT.md`
- Failure classification: product / harness / evidence / environment
## Structural slice gate
| Gate | Narrow evidence | Wide evidence | Independent rendered review | Status |
| --- | --- | --- | --- | --- |
| Entry mode and minimum context remain true | title, count, gateway state, and first agent/action are visible | same hierarchy inside the standard page frame | accepted from rendered captures | passed |
| First action is reachable and completely framed | first card is fully framed and opens by Enter | first row is visible above the fold | `/agents/iris` navigation verified | passed |
| Section roles and layout grammars remain distinct | shell, identity, grid/state surface remain separate | same roles with three-column grid | accepted | passed |
| Signature-gesture budget is respected | gradient is limited to active navigation, brand/primary action, and card identity accents | ordinary panels remain plain glass | accepted | passed |
| Long content, localization, and min-content pressure pass | long descriptions, model IDs, tags, and recovery copy wrap without x-overflow | three-column content remains contained | accepted for bounded slice | passed |
| Core path passes success, failure, and recovery | success grid, empty recovery, and API error were rendered | success grid rendered | fixture states captured independently | passed |
| Focus, state copy, controls, and recovery agree | focused agent card measured with 2px blue outline and 2px offset | keyboard Enter opened the existing destination | accepted | passed |
| Proof selectors, settle conditions, negatives, oracle, and capture binding pass | `data-route`, route root, landmark geometry, authored fixture, and dated captures recorded | same | typecheck passed; dashboard/login source files untouched | passed |
- Automated result: candidate
- Independent rendered-review result: accepted
- Defects and classification: the initial comparison host was capped at 1280px; exact 1440px route checks and 1920px family checks were completed separately and passed.
- Contract corrections: moved the gateway chip below the identity cluster on narrow screens; kept all recovery copy in glass state panels; added keyboard-equivalent link semantics to agent cards.
- Expansion decision: proceed
Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

@@ -0,0 +1,86 @@
# Dashboard orchestration focus
## Outcome
The dashboard is now an orchestration stage: compact operational status frames
the top, compact focus tasks frame the bottom, and Iris enters only when the
owner invokes the topbar action.
This is a `distill` correction for an operational product surface. It preserves
the established Galaxy/Glass direction and all existing dashboard stores,
requests, events, task data, chat messages, agent actions, and route behavior.
## Implementation
- Removed the permanently visible `360px` Iris rail from the dashboard
workspace.
- Made the existing topbar action an explicit `Iris Chat` trigger with
`aria-haspopup="dialog"`, `aria-expanded`, and `aria-controls`.
- Rendered the existing `IrisChat.vue` data and send handler inside a native
modal dialog. The dialog is absent by default, focuses the message field,
closes through its named button or Escape, and returns focus to the trigger.
- Reduced the operations status surface to one `46px` row. Narrow layouts keep
active/planning/blocker signals and remove lower-priority idle/cost detail.
- Reduced the task surface to one `44px` focus row with priority, state, title,
and owner retained through visible or accessible text.
- Increased the first multi-row auto-layout offset to avoid node overlap and
introduced compact agent cards at `680px` and below.
- Replaced the affected blank inline icon slots with the installed Lucide
components.
No backend, API, store, service, DTO, route, permission, chat-send, task, or
agent-selection contract changed.
## Measured geometry
At `1440 x 1000`:
| Surface | Before | After | Change |
| --- | ---: | ---: | ---: |
| Live orchestration | `774 x 731px` | `1152 x 808px` | `+48.8%` width, `+10.6%` height |
| Iris rail | `360 x 902px` | absent until invoked | full workspace width recovered |
| Operations status | `57px` high | `46px` high | `-19%` |
| Focus tasks | `87px` high | `44px` high | `-49%` |
## Operated proof
- Default state: Iris dialog absent and `aria-expanded="false"`.
- Pointer path: Iris Chat open -> named close button -> dialog removed -> focus
returned to Iris Chat.
- Keyboard path: Iris Chat open -> input focused -> Escape -> dialog removed ->
focus returned to Iris Chat.
- Input path: message text enables the named send action; the existing send
handler remains unchanged.
- Native dialog top layer and backdrop passed at desktop and `375px`.
- No page overflow, clipped nodes, or node intersections at `375`, `680`,
`681`, `768`, `1024`, `1440`, or `1920px`.
The after-state used a temporary controlled browser fixture so the layout could
be exercised without credentials or external API dependency. The fixture and
temporary QA entry were removed after capture. Evidence maturity is controlled
local browser proof, not deployment evidence.
## Evidence
- `screenshots/dashboard-orchestration-before-1440.png`
- `screenshots/dashboard-orchestration-before-693.png`
- `screenshots/dashboard-orchestration-after-1440.png`
- `screenshots/dashboard-orchestration-after-375.png`
- `screenshots/dashboard-iris-modal-after-1440.png`
- `screenshots/dashboard-iris-modal-after-375.png`
## Technical gates
```text
vue-tsc --noEmit -> passed
vitest run -> passed (1 file, 2 tests)
vite build -> passed (1,873 modules)
git diff --check -> passed; line-ending notices only
```
The Codex `pnpm` wrapper attempted a package-manager bootstrap before executing
the repository scripts. Restricted registry access and its non-interactive
dependency-purge prompt blocked that wrapper path; the already-installed local
script binaries above completed successfully.
No commit, push, or deployment was performed.
@@ -0,0 +1,60 @@
# Dashboard sidebar unification
## Outcome
The dashboard now renders the same `AppSidebar.vue` component as every other
authenticated route. This removes the final visible navigation fork without
changing dashboard content, domain state, stores, API contracts, or route
registration.
## Implementation
- Replaced the dashboard-only `Sidebar.vue` render in `NexusLayout.vue` with
`AppSidebar.vue`.
- Preserved the dashboard task count through the existing task store.
- Bound the active destination to the current Vue Router route.
- Kept the existing mobile close event and backdrop behavior.
- Aligned the dashboard topbar and backdrop breakpoint with the shared
sidebar's `900px` overlay breakpoint.
## Rendered proof
| Evidence | Viewport | Result |
| --- | --- | --- |
| Dashboard before | `1440 x 900` | Separate sidebar confirmed |
| Settings reference | `1440 x 900` | Shared component authority |
| Dashboard after | `1440 x 900` | Matches shared sidebar |
| Dashboard mobile | `375 x 812` | Overlay, categories, Settings, and footer visible |
| Same-viewport comparison | `1440 x 900` | Identical sidebar geometry and styling |
Evidence files are stored under `screenshots/`.
## Interaction and geometry
- Dashboard -> Agents -> Dashboard passed.
- Dashboard -> Settings passed at `375px`.
- Active states use `aria-current="page"`.
- The overlay closes after navigation.
- No document-level horizontal overflow at `375`, `768`, `1024`, `1440`, or
`1920px`.
- At `768px`, the sidebar is hidden off-canvas and the named topbar toggle is
visible.
- Browser console: no errors. Existing fixture/API fallback warnings remain.
## Technical gates
```text
pnpm typecheck -> passed
pnpm test -> passed (1 file, 2 tests)
pnpm build -> passed (1,873 modules)
git diff --check -> passed; line-ending notices only
```
## Severity result
- P0: none
- P1: none
- P2: none
Evidence maturity: controlled local browser proof. No commit, push, or
deployment was performed.
@@ -0,0 +1,290 @@
# Nexus: Seiten- und Agent-First-Evaluation
**Datum:** 2026-07-27
**Commit-Basis:** `3bc7622` plus uncommittete Design-Migration im Working Tree
**Routen:** 18 registrierte Routen
**Ziel:** Nexus als alleinige tägliche Mission-Control-Oberfläche und
agent-first Control Plane über OpenClaw, mit OpenAI als primärem Provider
innerhalb von OpenClaw
## Kurzurteil
Nexus ist inzwischen ein visuell eigenständiges und deutlich kohärenteres
Operations-Cockpit. Das Task-System, Agentenprofil und die Gateway-Anbindung
bilden eine belastbare Basis. Für das konkretisierte Produktziel ist es aber
noch kein vollständiger Ersatz für die tägliche OpenClaw-Oberfläche und noch
keine durchgehend agent-first Control Plane.
**Zielreife: 40 / 100**
**Entscheidung:** **No-Go für OpenClaw-UI-Unabhängigkeit**, aber **brauchbare
interne Alpha als Dashboard und Task-Orchestrierung**.
Die frühere Bewertung von 54/100 maß die Release-Reife des damaligen
Funktionsumfangs. Die aktuelle 40/100 misst den größeren, nun verbindlichen
Zielumfang: tägliche OpenClaw-Bedienparität in Nexus, OpenAI als Primärprovider
in OpenClaw und dauerhafte agentische Steuerung.
**Architekturkorrektur:** Die ursprüngliche Fassung dieser Evaluation nahm
einen direkten OpenAI-Pfad in Nexus und einen optionalen OpenClaw-Adapter an.
Verbindlich ist stattdessen `Nexus -> OpenClaw -> OpenAI`. Die Zielreife bleibt
bei 40/100, weil die unveränderten Security-, Session-, Control-, Eval- und
Bedienlücken den produktiven End-to-End-Betrieb weiterhin blockieren.
## Bewertungsmodell
| Bereich | Gewicht | Reife | Gewichteter Beitrag |
|---|---:|---:|---:|
| OpenClaw-UI-Unabhängigkeit / Steuerungsparität | 25 % | 28 | 7,0 |
| Agent-first Workflows | 20 % | 35 | 7,0 |
| OpenAI-over-OpenClaw Providersteuerung | 15 % | 20 | 3,0 |
| Seiten-UX, Design und Accessibility | 15 % | 74 | 11,1 |
| Domäne und Backend-Architektur | 10 % | 70 | 7,0 |
| Security und Governance | 10 % | 25 | 2,5 |
| Tests, Tracing, Evals und Observability | 5 % | 40 | 2,0 |
| **Gesamt** | **100 %** | | **39,6 -> 40** |
## Evidenz und Grenzen
- Der aktuelle Kernfluss Dashboard -> Agents -> Agent Detail -> Projects wurde
in diesem Lauf bei `1440 x 1000` im Browser erfasst und visuell geprüft.
- Nach einem vollständigen Routen-Reload war die Preview-Authentifizierung
nicht mehr verfügbar. Deshalb wurden die übrigen 14 Routen anhand ihrer
aktuellen Vue-Komponenten, Stores, Routerziele, API-Aufrufe und
Backend-Verträge geprüft.
- Es wurde kein produktiver OpenClaw-, PostgreSQL-, Proxy- oder
Provider-End-to-End-Lauf ausgeführt.
- Dies ist keine vollständige WCAG-, Penetrations- oder Lastprüfung.
- Bestehende Codeänderungen wurden in diesem Evaluationsschritt nicht
funktional verändert.
## Frischer visueller Kernfluss
### 1. Dashboard - visuell stark, funktional teilweise
![Dashboard](screenshots/01-dashboard.jpg)
Die Live-Orchestrierung besitzt klare Hierarchie und genügend Arbeitsfläche.
Status- und Task-Leisten sind sinnvoll verdichtet. Kritisch bleiben die
nicht-funktionale Suchaffordance, der lokale statt persistente
„Agent hinzufügen“-Vorgang und fehlende Run-/Trace-Aktionen.
### 2. Agents - gute Übersicht, unvollständige Steuerung
![Agents](screenshots/02-agents.jpg)
Rollen, Status und Gateway-Zustand sind schnell erfassbar. Es fehlen
Lebenszyklusaktionen wie Erstellen, Importieren, Aktivieren, Deaktivieren,
Neustarten und Capability-/Policy-Übersichten.
### 3. Agent Detail - gute Diagnosebasis, kein vollständiges Agent Cockpit
![Agent Detail](screenshots/03-agent-detail.jpg)
Profil, aktuelle Aktivität und Config-Dateien bilden eine brauchbare Basis.
Sessions, Runs, Tools, Freigaben, Budgets, Evals und Lifecycle-Steuerung fehlen.
„Zurück zum Team“ navigiert weiterhin auf das nicht registrierte `/team` und
wird durch den Wildcard-Redirect maskiert.
### 4. Projects - Kernaktion vorhanden, Zustand nicht erklärt
![Projects](screenshots/04-projects.jpg)
Ein Projekt kann angelegt werden. Wenn der Operations-Snapshot nicht geladen
ist, bleibt danach eine große leere Fläche ohne klaren Empty-, Error- oder
Reconnect-Zustand. Agenten, Runs, Ziele, Artefakte und Budgets sind nicht Teil
der Portfolioansicht.
## Evaluation aller 18 Seiten
Skala: 1 = Platzhalter/Blocker, 3 = brauchbare Teilfunktion, 5 = Zielzustand.
| Route | Reife | Was heute funktioniert | Was verbessert werden muss / fehlt | Priorität |
|---|---:|---|---|---|
| `/login` | 3,5/5 | Owner-Login, Passwortsichtbarkeit, Rate-Limit-Feedback | Recovery, 2FA/Passkeys, Session-/Geräteverwaltung, sauberer Return-to-Route-Flow | P1 |
| `/dashboard` | 3/5 | Live-Topologie, Status, Fokus-Tasks, Iris-Modal, Modellwechsel | Echte Command Bar; „Agent hinzufügen“ persistieren; Run-IDs, Trace, Kosten, Tool-Aufrufe, Pause/Resume/Cancel; klare Offline-/Error-Zustände | P0 |
| `/memory` | 2/5 | Liste, Suche, Lesen | Erstellen, Bearbeiten, Löschen, Quellen/Freshness, Versionen, Scope, Retrieval-Tests, Retention und Memory Policies | P1 |
| `/docs` | 2/5 | Liste, Kategorien, Suche, Lesen | Upload, Authoring, Sync/Import, Versionen, Zitierbarkeit, Ingestion-Status, Freigaben und Knowledge-Tests | P1 |
| `/agents/:id` | 2,5/5 | Profil, Live-Zusammenfassung, Aktivität, erlaubte Config-Dateien speichern | Defekten `/team`-Backlink korrigieren; Runs/Sessions, Lifecycle, Tools/Rechte, Budgets, Secrets-Referenzen, Evals und Restart | P0 |
| `/security` | 1,5/5 | Read-only Statusübersicht | Tatsächliche Policy-/Auth-Lage statt nur Konfigurationswerte; Remediation, Sessions, Schlüsselrotation, Audit, 2FA/Passkeys und Security Alerts | P0 |
| `/incidents` | 2/5 | Incident-Liste und Detail lesen | Erstellen, Acknowledge, Zuweisen, Severity/Timeline, Remediation-Aktionen, Verknüpfung mit Run/Task, Resolve und Postmortem | P1 |
| `/calendar` | 2/5 | Cron-/Upcoming-Liste und Refresh | Erstellen, Bearbeiten, Pause/Resume, Run now, Retry, Löschen, Zeitzone, Owner, Run-Historie und Fehlerdetails | P0 |
| `/projects` | 2/5 | Projekt anlegen, Karten aus Operations-Snapshot öffnen | Explizite Loading/Empty/Error-Zustände; Ziele, Agententeam, Runs, Tasks, Artefakte, Kosten, Health und Automationen | P1 |
| `/projects/:id` | 2,5/5 | Projekt bearbeiten/archivieren, zugehörige Tasks lesen | Task/Run direkt anlegen und delegieren; Ziel/KPI, Team, Artefakte, Timeline, Budget und Automationen | P1 |
| `/tasks` | 4/5 | Erstellen, Board, Statuswechsel, Iris-Waiting, Detailpanel, Subtasks, Editieren | Board-Level-Fehler sichtbar machen; Run-/Trace-Bezug, Abhängigkeiten, Bulk-Aktionen, einheitliche Approval Queue, Cancel/Retry/Resume | P1 |
| `/tasks/:id` | 4/5 | Vollständiges Editieren, Status/Priorität, Assignee, Due Date, Subtasks, Aktivität/Kommentare | Agent Run, Tool-Aufrufe, Outputs/Artefakte, Approval-Historie, Retry/Resume/Cancel und Abhängigkeitsgraph | P1 |
| `/agents` | 3/5 | Agenteninventar, Gateway-Status, Profileinstieg | Create/Import/Disable/Delete/Restart, Filter, Capability- und Permission-Summary, Run-Last und Kosten | P1 |
| `/models` | 1,5/5 | Read-only Routing-Liste | OpenAI-Primärpolicy über OpenClaw, Modellkatalog, sichere Auth-Profil-/Secret-Referenzen, Defaults, Fallbacks, Limits, Preis/Qualität/Latenz und Tests | P0 |
| `/activity` | 2/5 | Snapshot-Timeline, Typfilter, Sortierung, Pagination | Autoritativer Event-Stream, Suche, Run-/Correlation-ID, Actor, Diff, Export, Retention und sichere Payload-Ansicht | P1 |
| `/chat` | 1,5/5 | Einzelne Iris-Nachrichten an `/api/v1/chat`, lokale Conversation-ID | Persistente Threadliste, Streaming, Anhänge, Tool-/Approval-Karten, Run-Erstellung, Stop/Retry/Resume, Kontextkontrolle; „Preview“ ablösen | P0 |
| `/notifications` | 2,5/5 | Liste, Read/Read-all, Tastaturbedienung | Loading/Error darstellen; Task-Detail statt nur Board; Acknowledge/Snooze, Preferences, Kanäle, Routingregeln und Approval-Aktionen | P1 |
| `/settings` | 2,5/5 | Profil, Passwort, Benutzerverwaltung | Gateway-/Provider-Setup, OpenAI-Status und sichere OpenClaw-Secret-Referenzen, Modellpolitik, Tool-Rechte, Approval Policies, Budgets, Connectoren, Retention, Rollen und Audit | P0 |
## Produktweite Kernbefunde
### 1. Sichtbare Kernaktionen sind teilweise inert oder nur lokal
- Die Suchleisten in beiden Shells sind keine Inputs und öffnen keine Command
Palette.
- „Ask Iris“ in der Legacy-Topbar besitzt keinen Click-Handler.
- „Agent hinzufügen“ auf dem Dashboard fügt einen Agenten nur in den lokalen
Pinia-Zustand ein; es entsteht kein Agent im Backend oder Runtime-System.
- Mehrere Stores schlucken Fehler und zeigen dann leere oder scheinbar
erfolgreiche Flächen.
Für eine agent-first Oberfläche sind dies Hard Blocker, weil genau diese
Affordanzen den primären Arbeitsweg versprechen.
### 2. Der OpenClaw-Pfad ist korrekt, die OpenAI-Primärpolicy aber unvollständig
`IAgentRuntime` bietet nur Status und Chat. Der einzige registrierte Adapter ist
`OpenClawRuntime`; das entspricht der verbindlichen Zielarchitektur.
`ModelRoutingService` führt jedoch zwei DeepSeek-Ziele und ein OpenAI-Ziel auf.
Damit ist OpenAI noch nicht als primärer Provider für die relevanten
Agentenrollen belegt. Es fehlen eine sichere OpenClaw-Auth-Profilverwaltung,
rollenbezogene OpenAI-Policies, Live-Providerbeleg, dauerhafte
Session-/Subagent-Korrelation, Streaming, Tool-Lifecycle, Freigaben und Tracing.
### 3. Die Task-Domäne ist der stärkste agentische Kern
Task Board, Task Detail, Child Tasks, Handoffs, Aktivität, Approval-Aktionen und
die zehn Nexus-MCP-Tools bilden den besten vorhandenen Baustein. Das MCP ist
aber noch auf die Task-Domäne begrenzt und deckt weder Runs/Sessions noch Tools,
Provider, Zeitpläne, Wissen oder Artefakte ab.
### 4. Live-Orchestrierung ist noch keine autoritative Run-Ansicht
Agentenstatus und Aktivität werden gepollt; Teile der „Thinking“-Darstellung
werden präsentativ aus Texten abgeleitet. Token- und Kostenwerte sind in der
Agent-Mapping-Schicht derzeit Defaultwerte. Für operative Entscheidungen
braucht die Ansicht dauerhafte Run-, Event-, Usage- und Trace-Daten.
### 5. Security blockiert eine produktive Control Plane
- `AddAuthorization()` besitzt keine authenticated-by-default Fallback Policy.
Mehrere `/api/v1`-Controller sind nicht mit `[Authorize]` geschützt.
- Bridge und MCP akzeptieren einen bekannten, vom Aufrufer gesetzten
`X-Agent-Id` als Identität, bevor ein starker Service-Nachweis verlangt wird.
- Die Task-Board-/Stale-Endpunkte sind `[AllowAnonymous]` und autorisieren
teilweise über denselben Header.
- `docs/gateway-api-research.md` enthält credential-artige Literalwerte. Diese
müssen als kompromittiert behandelt, rotiert, aus dem Working Tree und
gegebenenfalls aus der Git-Historie entfernt werden.
Die Security-Seite zeigt Konfigurationswerte, macht diese strukturellen
Release-Blocker aber nicht sichtbar.
## Unabhängigkeit von der OpenClaw-Oberfläche: Capability-Parität
| Capability | Aktueller Stand | Lücke |
|---|---|---|
| Gateway Health/Version | Vorhanden | Konfiguration, Reload, Update und Recovery fehlen |
| Agenteninventar/Config | Teilweise | Vollständiger Lifecycle und Policies fehlen |
| Chat | Teilweise | Persistente Sessions, Streaming, Tools und Run-Steuerung fehlen |
| Tasks/Delegation | Stark | Run-/Trace-/Artifact-Bezug und einheitliche Approvals fehlen |
| Sessions/Runs | Fehlt | Listen, starten, resume, branch, cancel, retry, terminate |
| Subagenten/Handoffs | Task-Handoff teilweise | Run-Hierarchie, Spawn/Stop und Ownership fehlen |
| Tool-Katalog/Rechte | Fehlt | Schema, Namespace, Allowlist, Approval Policy, Audit |
| Cron/Schedules | Read-only UI | Vollständiger CRUD- und Ausführungs-Lifecycle fehlt |
| Modelle/Provider | Read-only/hardcodiert | OpenAI-Primärpolicy in OpenClaw, sichere Auth-Profile, Routing, Fallbacks und Live-Beleg fehlen |
| Memory/Docs | Read-only | Ingestion, Schreiben, Kuratierung, Versionen und Tests fehlen |
| Dateien/Artefakte | Config-Markdown teilweise | Allgemeiner Upload/Download, Versionierung, Run-Zuordnung fehlt |
| Channels/Connectors | Fehlt | Einrichtung, Status, Rechte und Datenfreigaben fehlen |
| Nodes/Hosts | Fehlt | Inventar, Health und kontrollierte Runtime-Aktionen fehlen |
| Approvals | Task-Approval teilweise | Zentrale Tool-/Run-/Datenfreigaben fehlen |
| Traces/Evals/Usage | Fehlt/teilweise abgeleitet | Autoritative Runs, Tool-Traces, Kosten, Latenz und Eval-Suites fehlen |
| Secrets | Fehlt | Sichere Verwaltung, Rotation und Referenzen fehlen |
| Incidents/Notifications | Read-mostly | Operative Bearbeitung, Eskalation und Remediation fehlen |
## Empfohlene Zielarchitektur
Der vorhandene C#-Stack und OpenClaw-Pfad werden gezielt ausgebaut:
1. **Nexus bleibt Product Control Plane:** ASP.NET Core besitzt Nutzer, RBAC,
Projekte, Tasks, menschliche Freigaben und das Control-Plane-Audit.
2. **OpenClaw bleibt verpflichtende Runtime:** Agenten, Sessions, Subagenten,
Tools, Cron, Channels, Nodes und Modellrouting bleiben dort autoritativ.
3. **OpenAI wird Primärprovider in OpenClaw:** Credentials liegen ausschließlich
in OpenClaw; Nexus zeigt und ändert nur sichere Referenzen und Policies.
4. **Typisierte Gateway-Fassade:** Der generische Gatewayclient wird in sichere
Read-/Control-Verträge mit Scopes, Schema, Idempotenz, Versionsprüfung,
Approval und Audit aufgeteilt.
5. **Keine doppelte Runtime:** Nexus korreliert OpenClaw-Sessions mit Tasks,
Projekten, Approvals und Artifacts, baut aber keinen zweiten Session Store.
Siehe den kanonischen Zielvertrag:
[`docs/AGENT_FIRST_MISSION_CONTROL.md`](../../../AGENT_FIRST_MISSION_CONTROL.md)
und die vollständige
[`docs/MISSION_CONTROL_ROADMAP.md`](../../../MISSION_CONTROL_ROADMAP.md).
Relevante Primärquellen:
- [OpenClaw Gateway und Runtimekonzept](https://docs.openclaw.ai/)
- [OpenClaw Provider und Modellreferenzen](https://docs.openclaw.ai/providers)
- [OpenClaw Operator-Scopes](https://docs.openclaw.ai/gateway/operator-scopes)
- [OpenAI API-Key-Sicherheit](https://developers.openai.com/api/docs/guides/production-best-practices#api-keys)
- [Evaluation best practices](https://developers.openai.com/api/docs/guides/evaluation-best-practices#single-agent-architectures)
## Priorisierte Roadmap
### P0 - Control-Plane-Grundlage und Vertrauen
1. Authenticated-by-default erzwingen, Agent-/Service-Identität stark
authentifizieren, negative Proxy-End-to-End-Tests ergänzen und
credential-artige Werte rotieren/entfernen.
2. Durable-Run-Domäne mit Session, Parent/Child, Events, Tools, Approvals,
Artefakten, Usage und Audit einführen.
3. OpenAI in OpenClaw als Primärprovider konfigurieren, sichere
Auth-Profil-/Secret-Referenzen verwenden und den realen
Nexus-OpenClaw-OpenAI-Pfad Ende-zu-Ende belegen.
4. Globale Command Bar und „Ask Iris“ auf jeder Seite funktional machen;
sichtbare lokale/platzhalterhafte Aktionen entweder persistieren oder klar
als Simulation kennzeichnen.
5. Agent-, Session-, Tool-/Permission-, Model-/Provider-, Secret- und
Schedule-Lifecycle als erste OpenClaw-Paritätsstufe liefern.
6. Defekten `/team`-Backlink, fehlende Route-/Session-Hydration und
verschluckte Kernfehler schließen.
### P1 - Agentischer Betriebsalltag
1. Run Explorer mit Streaming, Trace, Tool-Aufrufen, Approval-Karten,
Cancel/Retry/Resume und Artefakten.
2. Kontextuelle Delegation und Automatisierung auf Project, Task, Incident,
Doc und Calendar.
3. Memory-/Docs-Ingestion, Versionierung, Herkunft/Freshness und
Retrieval-Evals.
4. Zentrale Approval Inbox, operative Notifications und Incident-Remediation.
5. Modellrouting mit OpenAI-Defaults, Fallbacks, Budgets, Limits,
Kosten-/Latenz-/Qualitätsvergleich.
6. Autoritativer Event-Stream mit Korrelation, Retention, Suche und Export.
### P2 - Plattformreife
1. Channels, Connectors, Nodes/Hosts und kontrollierte Gateway-Administration.
2. Eval-Dashboard, Regression-Datasets, Prompt-/Policy-Versionen und
Qualitätsgates.
3. Run-/Agent-Templates, wiederverwendbare Automationen und Projekt-Playbooks.
4. Granulare Rollen, Mandanten-/Teamgrenzen, Aufbewahrung und Compliance.
## Abnahme für „kein OpenClaw-Wechsel mehr“
- Ein kompletter Workflow von Absicht -> Plan -> Agent/Subagent -> Tool
Approval -> Artefakt -> Review -> Abschluss ist ausschließlich in Nexus
bedienbar.
- Runs und Sessions können nach Reload oder Neustart fortgesetzt werden.
- Jede riskante Aktion besitzt Policy, Freigabe und Audit-Eintrag.
- Jede Modellinferenz aus Nexus läuft über OpenClaw; OpenAI ist dort als
Primärprovider nachgewiesen und Nexus besitzt keinen direkten OpenAI-Pfad.
- Alle 18 Routen besitzen Route-, Loading-, Empty-, Error-, Keyboard- und
Responsive-Smoke-Tests.
- Reale Provider-/Gateway-/PostgreSQL-/Proxy-End-to-End-Tests sind grün.
- Tool-Auswahl, Argumente, Ergebnisqualität, Kosten und Latenz werden durch
reproduzierbare Evals geprüft.
## Schlussfolgerung
Nexus sollte nicht neu begonnen werden. Die vorhandene Task-Domäne,
Backend-Schichtung, Gateway-Abstraktion und neue Designsprache sind wertvoll.
Der nächste Meilenstein darf jedoch keine weitere reine Seitenrunde sein:
Zuerst müssen Security, eine typisierte OpenClaw Control Plane, der belegte
OpenAI-Primärbetrieb in OpenClaw und die universelle Iris-/Session-Steuerung den
tatsächlichen Control-Plane-Kern bilden.
Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Some files were not shown because too many files have changed in this diff Show More