feat: ship agent-first mission control v0.2.57
@@ -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
|
||||
```
|
||||
@@ -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, Mobile 375 px
|
||||
|
||||

|
||||
|
||||
### Dashboard, Tablet 768 px
|
||||
|
||||

|
||||
|
||||
### Task Board, Mobile 375 px
|
||||
|
||||

|
||||
|
||||
## 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
|
||||
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 71 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 100 KiB |
|
After Width: | Height: | Size: 108 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 139 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 87 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 93 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 93 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
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
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 61 KiB |