# Panel System — Coverage Matrix (D-2026-08-16-557)

Coverage matrix for `system.panel-system`. Documents what is covered and what is intentionally out of scope.

| Surface | Covered? | Notes |
|---|---|---|
| Create panel | ✓ | `PanelSystem.createPanel(spec)` |
| Destroy panel | ✓ | `PanelSystem.destroyPanel(id)` |
| Float panel | ✓ | `PanelSystem.float(id)` |
| Pin panel L/R | ✓ | `PanelSystem.pin(id, edge)` |
| Pin panel T/B | ✗ (out of scope) | VibeChat is the only panel that docks T/B; that logic lives in VibeChat's own state machine, not in the Panel System |
| Dock panel | ✓ | `PanelSystem.dock(id, edge)` |
| Minimize to pill | ✓ | `PanelSystem.minimize(id)` (Pro Mode gated) |
| Maximize from pill | ✓ | `PanelSystem.maximize(id)` |
| Resize panel | ✓ | `PanelSystem.resize(id, opts)` |
| Mobile 45% rule | ✓ | enforced in `PanelSystem.pin()` when `window.innerWidth < 600` |
| Pill rendering | ✓ (CSS only) | `chrome/pill.css` |
| Panel chrome buttons | ✓ (CSS only) | `chrome/panel-chrome.css` |
| Panel state machine | ✓ | in `runtime/panel-system.js` |
| Pro Mode lock | ✓ | `PanelSystem.minimize()` returns `pro_mode_locked` when `operatingMode === 'pro'` |

## Intentionally out of scope

- Tab content (a panel's tabs are populated by the module that owns the panel — e.g. CMS Panel populates its own 8 tabs)
- Module loading (modules are loaded by the module loader, not the Panel System)
- Theme (panel colors come from the host's theme system)
- Multi-panel coordination (no global "close all" — each panel is independent)
