From 82033b503748aeb839af17d9c0b7e770ebe1afd3 Mon Sep 17 00:00:00 2001 From: kitos Date: Mon, 6 Jul 2026 12:02:07 +0200 Subject: [PATCH] feat(tests): types and API client for red/blue review workflow --- frontend/src/api/tests.ts | 25 +++++++++++++++++++++++++ frontend/src/types/models.ts | 15 +++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/frontend/src/api/tests.ts b/frontend/src/api/tests.ts index 79c8d61..0c789a5 100644 --- a/frontend/src/api/tests.ts +++ b/frontend/src/api/tests.ts @@ -197,6 +197,31 @@ export async function startBlueWork(testId: string): Promise { return data; } +// ── Lead Review Gates (red_review / blue_review) ──────────────────── + +export interface RedReviewPayload { + decision: "approve" | "reopen"; + notes?: string; +} + +export interface BlueReviewPayload { + decision: "approve" | "reopen" | "gap"; + notes?: string; + system_gaps?: string; +} + +/** Assigned Red Lead approves or reopens a test sitting in red_review. */ +export async function reviewAsRedLead(testId: string, payload: RedReviewPayload): Promise { + const { data } = await client.post(`/tests/${testId}/review-red`, payload); + return data; +} + +/** Assigned Blue Lead approves, reopens, or flags a capability gap on a test in blue_review. */ +export async function reviewAsBlueLead(testId: string, payload: BlueReviewPayload): Promise { + const { data } = await client.post(`/tests/${testId}/review-blue`, payload); + return data; +} + // ── Lead Validation ──────────────────────────────────────────────── /** Red Lead approves/rejects the red side. */ diff --git a/frontend/src/types/models.ts b/frontend/src/types/models.ts index f7d02c5..84280b9 100644 --- a/frontend/src/types/models.ts +++ b/frontend/src/types/models.ts @@ -48,7 +48,9 @@ export type TechniqueStatus = export type TestState = | "draft" | "red_executing" + | "red_review" // Red Lead reviews the operator's work before it queues for Blue Team | "blue_evaluating" + | "blue_review" // Blue Lead reviews the operator's work before cross-validation | "in_review" | "validated" | "rejected" @@ -121,6 +123,19 @@ export interface Test { red_tech_assignee: string | null; blue_tech_assignee: string | null; + // Red Team review fields + red_reviewer_assignee: string | null; + red_review_by: string | null; + red_review_at: string | null; + red_review_notes: string | null; + + // Blue Team review fields + blue_reviewer_assignee: string | null; + blue_review_by: string | null; + blue_review_at: string | null; + blue_review_notes: string | null; + system_gaps: string | null; + // On-hold fields is_on_hold: boolean; hold_reason: string | null;