From 8456ce71ab5a1300658878654c389a3376a2977a Mon Sep 17 00:00:00 2001 From: Fusion Date: Wed, 13 May 2026 15:58:20 -0700 Subject: [PATCH] feat(FN-4288): add stall surface docs and changeset Fusion-Task-Id: FN-4288 Fusion-Task-Lineage: 09c6efc0-ea0b-443a-ab45-a89188fcf888 --- .changeset/fn-4288-in-review-stall-dashboard-surface.md | 5 +++++ docs/task-management.md | 2 ++ .../app/components/__tests__/TaskDetailModal.test.tsx | 1 + 3 files changed, 8 insertions(+) create mode 100644 .changeset/fn-4288-in-review-stall-dashboard-surface.md diff --git a/.changeset/fn-4288-in-review-stall-dashboard-surface.md b/.changeset/fn-4288-in-review-stall-dashboard-surface.md new file mode 100644 index 000000000..2d7731a08 --- /dev/null +++ b/.changeset/fn-4288-in-review-stall-dashboard-surface.md @@ -0,0 +1,5 @@ +--- +"@runfusion/fusion": minor +--- + +Surface `task.inReviewStall` in the dashboard. In-review tasks whose state matches a known stall code (merge-blocker, transient-merge-status-no-owner, merge-retries-exhausted, no-worktree-no-merge-confirmed) now show a "Stall" badge on the task card and a code-specific diagnostic row in the task detail modal, with a deep-link to the most recent self-healing "In-review stall surfaced" log entry. diff --git a/docs/task-management.md b/docs/task-management.md index 65ed4e7fc..ccc714b90 100644 --- a/docs/task-management.md +++ b/docs/task-management.md @@ -117,6 +117,8 @@ Self-healing surfaces this diagnosis via task log entries in the form: These entries are rate-limited per `(task, code)` over `taskStuckTimeoutMs`, so unchanged stalls are not spammed every cycle while state transitions can still surface a new code immediately. +**Dashboard surface:** In-review, non-paused tasks with `inReviewStall` set show a `Stall` badge on `TaskCard` and a code-specific diagnostic row in `TaskDetailModal` above the PR section. The diagnostic row includes headline/description/action copy, raw reason text, observed timestamp, and a `View activity log` deep-link that switches to Logs → Activity and highlights the most recent matching `In-review stall surfaced []: ` entry. This UI is diagnostic only: neither the badge nor the jump button mutates task state. + Auto-completion/finalization remains owned by existing recovery passes: - `recoverStaleMergingStatus` - `finalizeNoOpReviewTasks` diff --git a/packages/dashboard/app/components/__tests__/TaskDetailModal.test.tsx b/packages/dashboard/app/components/__tests__/TaskDetailModal.test.tsx index 2696bb5d0..08334ba95 100644 --- a/packages/dashboard/app/components/__tests__/TaskDetailModal.test.tsx +++ b/packages/dashboard/app/components/__tests__/TaskDetailModal.test.tsx @@ -117,6 +117,7 @@ describe("TaskDetailModal in-review stall diagnostics", () => { expect(screen.getByText("Open the Review tab to see which step is blocking, then fix the failure or override the step.")).toBeInTheDocument(); await user.click(screen.getByRole("button", { name: "View activity log" })); + expect(screen.getByRole("button", { name: "Logs" })).toHaveClass("detail-tab-active"); expect(screen.getByRole("button", { name: "Activity" })).toHaveClass("log-subview-btn-active"); const highlighted = document.querySelector(".detail-log-entry--stall-highlight .detail-log-action"); expect(highlighted?.textContent).toContain("In-review stall surfaced [merge-blocker]");