feat: acknowledge Compose Doctor preflight findings per stack (#1560)

* feat: acknowledge Compose Doctor preflight findings per stack

Add node-scoped preflight acknowledgements with read-time filtering.

Supports four expiry modes and activeStatus for banner, tab dot, and readiness.

* fix: align preflight acknowledge UI with design system

Use Combobox, modal chrome, mono fields, and non-destructive clear confirm.

* fix: update test mocks to match new preflight field names

The preflight-acknowledgements feature renamed status-\>activeStatus and
highestSeverity-\>activeHighestSeverity in the preflight report shape. The
corresponding test mocks in three files still used the old field names,
causing 6 test failures across backend and frontend.

- backend: update-guard-service mock now passes activeStatus
- frontend PreflightPanel: Report interface and report() helper now include
  activeStatus, activeHighestSeverity, activeCount, acknowledgedCount
- frontend StackAnatomyPanel doctor: mock API response now includes
  activeHighestSeverity and activeStatus
This commit is contained in:
Anso
2026-07-05 04:12:03 -04:00
committed by GitHub
parent 122c1b8073
commit 4077546492
16 changed files with 1002 additions and 54 deletions
+10
View File
@@ -26,6 +26,11 @@ export interface PreflightFinding {
remediation?: string;
/** Service the finding is scoped to, when applicable. */
service?: string;
/** True when an active acknowledgement covers this finding. */
acknowledged?: boolean;
acknowledgementId?: number;
acknowledgementReason?: string;
acknowledgementExpiry?: 'forever' | 'until_compose_change' | 'days' | 'until_image_change';
}
/** The full report returned by both the GET (latest) and POST (run) routes. */
@@ -42,6 +47,11 @@ export interface PreflightReport {
sourceHash: string | null;
renderedHash: string | null;
findings: PreflightFinding[];
/** Severity/status after filtering acknowledged findings. */
activeStatus: PreflightStatus;
activeHighestSeverity: PreflightSeverity | null;
activeCount: number;
acknowledgedCount: number;
}
/** A declared `env_file:` that is required and absent on disk (names only). */