feat(FN-4288): add stall surface docs and changeset

Fusion-Task-Id: FN-4288
Fusion-Task-Lineage: 09c6efc0-ea0b-443a-ab45-a89188fcf888
This commit is contained in:
Fusion
2026-05-13 15:58:20 -07:00
committed by gsxdsm
parent 56b5f28458
commit 076f132790
3 changed files with 8 additions and 0 deletions

View File

@@ -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.

View File

@@ -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. 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 [<code>]: <reason>` 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: Auto-completion/finalization remains owned by existing recovery passes:
- `recoverStaleMergingStatus` - `recoverStaleMergingStatus`
- `finalizeNoOpReviewTasks` - `finalizeNoOpReviewTasks`

View File

@@ -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(); 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" })); 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"); expect(screen.getByRole("button", { name: "Activity" })).toHaveClass("log-subview-btn-active");
const highlighted = document.querySelector(".detail-log-entry--stall-highlight .detail-log-action"); const highlighted = document.querySelector(".detail-log-entry--stall-highlight .detail-log-action");
expect(highlighted?.textContent).toContain("In-review stall surfaced [merge-blocker]"); expect(highlighted?.textContent).toContain("In-review stall surfaced [merge-blocker]");