+ {/* Header */}
+
+
+
+
+
Technique Review Queue
+
+ Techniques updated in MITRE ATT&CK that need to be reviewed
+
+
+
+
+ {total > 0 && (
+
+ {total} pending
+
+ )}
+
+
+
+
+ {/* What does this mean? */}
+ {total > 0 && (
+
+
+ What does this mean?{" "}
+ The MITRE ATT&CK sync detected that these techniques were updated in the official
+ ATT&CK dataset. A lead or admin should review each one to confirm the change has
+ been acknowledged before marking it as reviewed.
+
+
+ )}
+
+ {/* Empty state */}
+ {total === 0 && (
+
+
+
All caught up!
+
+ No techniques are currently flagged for review.
+
+
+ )}
+
+ {/* Table grouped by tactic */}
+ {byTactic.map(([tactic, items]) => (
+
+ {/* Tactic header */}
+
+
{tactic}
+ {items.length}
+
+
+
+
+
+
+ | MITRE ID |
+ Name |
+ Coverage |
+ Action |
+
+
+
+ {items.map((tech) => (
+
+ |
+
+ {tech.mitre_id}
+
+ |
+
+ {tech.name}
+ |
+
+
+ {STATUS_LABELS[tech.status_global] ?? tech.status_global}
+
+ |
+
+
+ {/* View detail */}
+
+
+ {/* Mark as reviewed — leads/admin only */}
+ {canReview && (
+
+ )}
+
+ |
+
+ ))}
+
+
+
+
+ ))}
+
+ );
+}
diff --git a/frontend/src/pages/TechniqueDetailPage.tsx b/frontend/src/pages/TechniqueDetailPage.tsx
index 4a97cc5..83bd6d0 100644
--- a/frontend/src/pages/TechniqueDetailPage.tsx
+++ b/frontend/src/pages/TechniqueDetailPage.tsx
@@ -163,7 +163,7 @@ export default function TechniqueDetailPage() {