From 8104b2144f713196a08ebab89aeb06dafeb12358 Mon Sep 17 00:00:00 2001 From: Mike S Date: Fri, 27 Feb 2026 11:05:45 +0000 Subject: [PATCH] feat(kan-6): add stale card indicator for in-progress tasks >24h --- src/components/KanbanBoard.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/KanbanBoard.tsx b/src/components/KanbanBoard.tsx index 2e2b2c0..0039639 100644 --- a/src/components/KanbanBoard.tsx +++ b/src/components/KanbanBoard.tsx @@ -27,9 +27,10 @@ type Task = { checklist: ChecklistItem[]; prdPath: string | null; prdVersion: number; + updatedAt: string; }; -type ApiTask = Omit & { assignedAgent?: string | null; assigned_agent?: string | null; prd_path?: string | null; prd_version?: number }; +type ApiTask = Omit & { assignedAgent?: string | null; assigned_agent?: string | null; prd_path?: string | null; prd_version?: number; updated_at?: string }; type TaskForm = { title: string; @@ -95,6 +96,7 @@ function mapTask(t: ApiTask): Task { assignedAgent: t.assignedAgent ?? t.assigned_agent ?? null, prdPath: t.prdPath ?? t.prd_path ?? null, prdVersion: t.prdVersion ?? t.prd_version ?? 1, + updatedAt: t.updatedAt ?? t.updated_at ?? '', priority: t.priority || 'Medium', goal: t.goal || t.goalId || 'Unlinked', tags: t.tags || '', @@ -826,6 +828,7 @@ const [rightWidth, setRightWidth] = useState(402); const isWorking = Boolean(workingByTask[task.id]); const blocked = isTaskBlocked(task.tags); const needsHuman = isTaskNeedsHuman(task.tags); + const isStale = task.status === 'in_progress' && (Date.now() - new Date(task.updatedAt).getTime() > 24 * 60 * 60 * 1000); return ( @@ -846,6 +849,7 @@ const [rightWidth, setRightWidth] = useState(402);
openEdit(task)} className="cursor-pointer">
{task.goalId && {task.goalId}} + {isStale && ⏰ Stale}

{task.title}

{task.description &&

{task.description}

}