Implements Spec 114 System Console Control Tower pages, widgets, triage actions, directory views, and enterprise polish (badges, repair workspace owners table, health indicator).
168 lines
6.1 KiB
Markdown
168 lines
6.1 KiB
Markdown
# Implementation Plan: System Console Control Tower (Spec 114)
|
|
|
|
**Branch**: `114-system-console-control-tower` | **Date**: 2026-02-27
|
|
|
|
## Summary
|
|
|
|
Implement a platform-only `/system` Control Tower that provides:
|
|
|
|
- Global health KPIs + top offenders (windowed)
|
|
- Cross-workspace Directory (workspaces + tenants) with health signals
|
|
- Global Operations triage (runs + failures + stuck) with canonical run detail
|
|
- Minimal Access Logs (platform auth + break-glass)
|
|
|
|
Approach: extend the existing Filament System panel and reuse existing read models (`OperationRun`, `AuditLog`, `Tenant`, `Workspace`) with DB-only queries and strict data minimization/sanitization.
|
|
|
|
## Technical Context
|
|
|
|
**Language/Version**: PHP 8.4 (Laravel 12)
|
|
**Primary Dependencies**: Filament v5 (Livewire v4), Pest v4, Laravel Sail
|
|
**Storage**: PostgreSQL
|
|
**Testing**: Pest v4
|
|
**Target Platform**: Web (Filament/Livewire)
|
|
**Project Type**: web
|
|
**Performance Goals**: p95 < 1.0s for `/system` list/index pages at typical volumes
|
|
**Constraints**: DB-only at render time; strict data minimization; no cross-plane session bridging
|
|
**Scale/Scope**: cross-workspace platform operator views; growing `operation_runs` volumes
|
|
|
|
**Non-negotiables**
|
|
|
|
- `/system` is a separate plane from `/admin`.
|
|
- Wrong plane / unauthenticated: behave as “not found” (404).
|
|
- Platform user missing capability: forbidden (403).
|
|
- DB-only at render time for `/system` pages (no Microsoft Graph calls while rendering).
|
|
- Data minimization: no secrets/tokens; failures and audit context are sanitized.
|
|
- Mutating actions are confirmed + audited.
|
|
|
|
**Spec source**: `specs/114-system-console-control-tower/spec.md`
|
|
|
|
## Constitution Check (Pre-design)
|
|
|
|
PASS.
|
|
|
|
- Inventory-first + read/write separation: this feature is read-first; v1 manages ops with strict guardrails.
|
|
- Graph contract isolation: no render-time Graph calls; any future sync work goes through existing Graph client contracts.
|
|
- Deterministic capabilities: capability checks use a registry (no raw strings).
|
|
- RBAC-UX semantics: 404 vs 403 behavior preserved.
|
|
- Ops observability: reuse `OperationRun` lifecycle via `OperationRunService`.
|
|
- Data minimization: `RunFailureSanitizer` + `AuditContextSanitizer` are the contract.
|
|
- Filament action safety: destructive/mutating actions require confirmation.
|
|
|
|
## Project Structure
|
|
|
|
### Documentation (this feature)
|
|
|
|
```text
|
|
specs/114-system-console-control-tower/
|
|
├── spec.md
|
|
├── plan.md
|
|
├── research.md
|
|
├── data-model.md
|
|
├── quickstart.md
|
|
└── contracts/
|
|
└── system-console-control-tower.openapi.yaml
|
|
```
|
|
|
|
### Source Code (repository root)
|
|
|
|
```text
|
|
app/
|
|
├── Filament/
|
|
│ └── System/
|
|
│ └── Pages/
|
|
├── Models/
|
|
├── Services/
|
|
└── Support/
|
|
|
|
config/
|
|
database/
|
|
routes/
|
|
tests/
|
|
```
|
|
|
|
**Structure Decision**: Single Laravel web application. System Console features live as Filament Pages under `app/Filament/System/Pages` using existing Eloquent models.
|
|
|
|
## Phase 0 — Research (Complete)
|
|
|
|
Output artifact:
|
|
|
|
- `specs/114-system-console-control-tower/research.md`
|
|
|
|
Resolved items:
|
|
|
|
- System panel already exists and is isolated by guard + session cookie middleware.
|
|
- Existing audit stream already captures platform auth and break-glass events.
|
|
- Existing ops primitives (`OperationRun`, sanitizers, links) are sufficient and should be reused.
|
|
|
|
## Phase 1 — Design & Contracts (Complete)
|
|
|
|
Output artifacts:
|
|
|
|
- `specs/114-system-console-control-tower/data-model.md`
|
|
- `specs/114-system-console-control-tower/contracts/system-console-control-tower.openapi.yaml`
|
|
- `specs/114-system-console-control-tower/quickstart.md`
|
|
|
|
Post-design Constitution Check:
|
|
|
|
- PASS (design remains DB-only, keeps plane separation, uses sanitization contracts, and Spec 114 documents UX-001 empty-state CTA expectations + v1 drilldown scope).
|
|
|
|
## Phase 2 — Implementation Planning (for `tasks.md` later)
|
|
|
|
This section outlines the implementation chunks and acceptance criteria that will become `tasks.md`.
|
|
|
|
### 2.1 RBAC + capabilities
|
|
|
|
- Extend `App\Support\Auth\PlatformCapabilities` to include Spec 114 capabilities.
|
|
- Ensure all new `/system` pages check capabilities via the registry (no raw strings).
|
|
- Keep 404/403 semantics aligned with the spec decisions.
|
|
|
|
### 2.2 Information architecture (/system routes)
|
|
|
|
- Dashboard (KPIs): global aggregated view, windowed.
|
|
- Directory:
|
|
- Workspaces index + workspace detail.
|
|
- Tenants index + tenant detail.
|
|
- Ops:
|
|
- Runs list.
|
|
- Failures list (prefiltered/saved view).
|
|
- Stuck list (queued + running thresholds).
|
|
- Canonical run detail: remove current runbook-only scoping so it can show any `OperationRun` (still authorization-checked).
|
|
- Security:
|
|
- Access logs list (platform login + break-glass only for v1).
|
|
|
|
### 2.3 Ops triage actions (v1 manage)
|
|
|
|
- Implement manage actions with capability gating (`platform.operations.manage`).
|
|
- Actions:
|
|
- Retry run: only when retryable.
|
|
- Cancel run: only when cancelable.
|
|
- Mark investigated: requires reason.
|
|
- All actions:
|
|
- Execute via Filament `Action::make(...)->action(...)`.
|
|
- Include `->requiresConfirmation()`.
|
|
- Produce an `AuditLog` entry with stable action IDs and sanitized context.
|
|
|
|
### 2.4 Configuration
|
|
|
|
- Add config keys for “stuck” thresholds (queued minutes, running minutes).
|
|
- Ensure defaults are safe and can be overridden per environment.
|
|
|
|
### 2.5 Testing (Pest)
|
|
|
|
- New page access tests:
|
|
- non-platform users get 404.
|
|
- platform users without capability get 403.
|
|
- System auth/security regression verification:
|
|
- `/system` login is rate-limited and failed attempts are audited via `platform.auth.login` (existing coverage in `tests/Feature/System/Spec113/SystemLoginThrottleTest.php`).
|
|
- break-glass mode renders a persistent banner and audits transitions (`platform.break_glass.*`) (existing coverage in `tests/Feature/Auth/BreakGlassModeTest.php`).
|
|
- Access logs surface tests:
|
|
- `platform.auth.login` and `platform.break_glass.*` appear.
|
|
- Manage action tests:
|
|
- capability required.
|
|
- audit entries written.
|
|
- non-retryable/non-cancelable runs block with clear feedback.
|
|
|
|
### 2.6 Formatting
|
|
|
|
- Run `vendor/bin/sail bin pint --dirty --format agent` before finalizing implementation.
|