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