diff --git a/docs/gotchas.md b/docs/gotchas.md
index 12ec050..52edbbf 100644
--- a/docs/gotchas.md
+++ b/docs/gotchas.md
@@ -156,13 +156,11 @@ Mỗi migration tạo: `{name}.cs` + `{name}.Designer.cs` + `ApplicationDbContex
**Fix:** Check `if (contract.MaHopDong is null)` trước khi gen. Đã implement trong `ContractWorkflowService.TransitionAsync`.
-### 21. BE adjacency vs FE NEXT_PHASES sync
+### 21. ~~BE adjacency vs FE NEXT_PHASES sync~~ (RESOLVED)
-**Triệu chứng:** FE hiển thị nút chuyển phase, click → BE 403.
+**Đã xử lý:** FE không còn hardcode `NEXT_PHASES` nữa. BE expose `contract.workflow.nextPhases` trong `ContractDetailDto` từ `WorkflowPolicyRegistry.ForContract(contract)`. FE render dynamic từ đó — single source of truth.
-**Nguyên nhân:** FE `NEXT_PHASES` map phải khớp BE `Transitions` dict.
-
-**Fix:** Khi đổi adjacency BE → sync FE `src/pages/contracts/ContractDetailPage.tsx` ngay lập tức (cả 2 app).
+Nếu đổi policy BE: chỉ cần update `WorkflowPolicies.Standard` hoặc `WorkflowPolicies.SkipCcm` trong `Domain/Contracts/WorkflowPolicy.cs`. FE tự reflect.
### 22. Race condition gen mã HĐ khi 2 user cùng transition tới DangDongDau
diff --git a/fe-admin/src/components/WorkflowSummaryCard.tsx b/fe-admin/src/components/WorkflowSummaryCard.tsx
new file mode 100644
index 0000000..3814c65
--- /dev/null
+++ b/fe-admin/src/components/WorkflowSummaryCard.tsx
@@ -0,0 +1,63 @@
+import { Check, Circle, GitBranch } from 'lucide-react'
+import { PhaseBadge } from '@/components/PhaseBadge'
+import { ContractPhaseLabel } from '@/types/contracts'
+import type { WorkflowSummary } from '@/types/contracts'
+import { cn } from '@/lib/cn'
+
+// Shows the active WorkflowPolicy (Standard / SkipCcm / …) as a timeline of
+// phases with the current one highlighted. Drafter + approvers see clearly
+// "where we are" and "what comes next" — no more mental mapping of enum ints.
+export function WorkflowSummaryCard({
+ workflow,
+ currentPhase,
+}: {
+ workflow: WorkflowSummary
+ currentPhase: number
+}) {
+ const currentIdx = workflow.activePhases.indexOf(currentPhase)
+
+ return (
+
+