diff --git a/apps/frontend/src/renderer/components/PhaseProgressIndicator.tsx b/apps/frontend/src/renderer/components/PhaseProgressIndicator.tsx
index 9a98ca7f..f911034b 100644
--- a/apps/frontend/src/renderer/components/PhaseProgressIndicator.tsx
+++ b/apps/frontend/src/renderer/components/PhaseProgressIndicator.tsx
@@ -8,6 +8,8 @@ interface PhaseProgressIndicatorProps {
phase?: ExecutionPhase;
subtasks: Subtask[];
phaseLogs?: TaskLogs | null;
+ /** Fallback progress percentage (0-100) when phaseLogs unavailable */
+ phaseProgress?: number;
isStuck?: boolean;
isRunning?: boolean;
className?: string;
@@ -47,6 +49,7 @@ export const PhaseProgressIndicator = memo(function PhaseProgressIndicator({
phase: rawPhase,
subtasks,
phaseLogs,
+ phaseProgress,
isStuck = false,
isRunning = false,
className,
@@ -140,6 +143,8 @@ export const PhaseProgressIndicator = memo(function PhaseProgressIndicator({
{activeEntries} {activeEntries === 1 ? t('execution.labels.entry') : t('execution.labels.entries')}
+ ) : isRunning && isIndeterminatePhase && (phaseProgress ?? 0) > 0 ? (
+ `${Math.round(Math.min(phaseProgress!, 100))}%`
) : (
'—'
)}
diff --git a/apps/frontend/src/renderer/components/TaskCard.tsx b/apps/frontend/src/renderer/components/TaskCard.tsx
index 9c6fa185..3df8acee 100644
--- a/apps/frontend/src/renderer/components/TaskCard.tsx
+++ b/apps/frontend/src/renderer/components/TaskCard.tsx
@@ -488,6 +488,7 @@ export const TaskCard = memo(function TaskCard({ task, onClick, onStatusChange }