Move aggregate workflow identity below task-card footer content so it stays anchored at the bottom-left.
- Reposition the optional workflow badge out of the meta-badge row and into its own bottom-left row.
- Add responsive styling so long workflow names wrap within the card footer area without creating extra actions.
- Expand TaskCard layout tests for badge ordering across metadata, footer, and action surfaces.
- Add a patch changeset for the published Fusion package.
Files changed:
.changeset/fn-7277-workflow-badge-bottom-left.md | 7 ++++
packages/dashboard/app/components/TaskCard.css | 22 +++++++++-
packages/dashboard/app/components/TaskCard.tsx | 31 ++++++++------
.../__tests__/TaskCard.badge-wrap.test.tsx | 16 +++++++
.../__tests__/TaskCard.footer-wrap.test.tsx | 33 +++++++++++++++
.../app/components/__tests__/TaskCard.test.tsx | 49 +++++++++++++++++++++-
6 files changed, 143 insertions(+), 15 deletions(-)
Fusion-Task-Id: FN-7277
Fusion-Task-Lineage: 5dd05d2a-1728-49d3-8cbf-b99d6293730b
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Harden mobile navigation history so reopened task detail surfaces remain dismissible after stale back events.
- Reconcile duplicate navigation entries with replaceState while preserving existing history state.
- Treat stale or desynced popstate navIndex values as a top-entry dismiss instead of a no-op.
- Cover close-and-quick-reopen swipe-back races across the hook, task-detail modal, and app navigation tests.
- Add the navigation history tests to the dashboard quality test allowlists and include a patch changeset.
Files changed:
.changeset/fn-7275-swipe-back-reliability.md | 7 ++
.../__tests__/TaskDetail.swipe-back.test.tsx | 14 +++-
.../__tests__/navigation-history.test.tsx | 18 +++--
.../hooks/__tests__/useNavigationHistory.test.ts | 43 +++++++++-
.../dashboard/app/hooks/useNavigationHistory.ts | 92 ++++++++++++++--------
packages/dashboard/vitest.config.ts | 3 +-
6 files changed, 128 insertions(+), 49 deletions(-)
Fusion-Task-Id: FN-7275
Fusion-Task-Lineage: f01e46c3-e6ad-45ef-a848-e8e2012ea3d1
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Move the mobile task-detail workflow badge next to the updated timestamp while preserving desktop placement.
- Add separate desktop and mobile workflow badge render targets in the task detail modal.
- Hide the header badge on mobile and reveal the timestamp-row badge with scoped responsive styles.
- Cover the mobile badge placement and CSS guardrails in task detail tests.
- Add a patch changeset for the published Fusion package.
Files changed:
.changeset/fn-7271-mobile-workflow-badge.md | 7 +++++++
.../dashboard/app/components/TaskDetailModal.css | 18 ++++++++++++++++++
.../dashboard/app/components/TaskDetailModal.tsx | 7 ++++++-
.../__tests__/TaskDetailModal.rendering.test.tsx | 10 ++++++++--
...DetailModal.responsive-and-dependencies.test.tsx | 21 +++++++++++++++++----
5 files changed, 56 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-7271
Fusion-Task-Lineage: def0b5c5-b881-45f8-aa7c-80243d8de8ec
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Block the merge requester when fast workflow traversal reaches merge before implementation steps are complete, and recover stale no-op merge proof by requeuing executable work instead of looping in blocked finalization.
Fusion-Task-Id: FN-7261
reconcilePhantomCommittedReservations emitted a task:reconcile-phantom-committed-reservation audit row every maintenance tick for the same orphaned committed reservations even when zero child rows were pruned (~19k no-op writes/day). Gate the audit emission on actual pruned work; the FN-7069 contract is unchanged (committed reservation stays committed so the ID is never reused).
clearPhantomExecutorBinding unconditionally unregistered held worktree paths from activeSessionRegistry, defeating the moveTask(preserveWorktree:true) the self-healing phantom reclaim pairs it with: re-dispatch then acquired a brand-new worktree instead of reattaching (FN-7249 lost its first worktree this way). Add a preserveWorktrees option that clears only the stale in-memory executor/lock bookkeeping and leaves the session-registry path entries intact; the self-healing caller opts in. Non-self-healing callers keep the default full-clear behavior.
Preserve the board lane position when mobile users return from full-panel task detail.
- Capture and restore board, column, project-content, and document scroll offsets for board detail navigation.
- Retry board scroll restoration across bounded animation frames after remount and hydration.
- Cover mobile and desktop Back to board behavior with focused tests and document the mobile scroll contract.
- Add a patch changeset for the published CLI package.
Files changed:
.changeset/fn-7258-mobile-board-scroll.md | 7 ++
docs/dashboard-guide.md | 2 +
.../__tests__/navigation-history.test.tsx | 111 ++++++++++++++++++---
.../hooks/__tests__/useBoardScrollRestore.test.ts | 43 +++++++-
.../dashboard/app/hooks/useBoardScrollRestore.ts | 45 ++++++---
.../utils/__tests__/boardScrollSnapshot.test.ts | 91 +++++++++++++++--
.../dashboard/app/utils/boardScrollSnapshot.ts | 41 +++++++-
7 files changed, 305 insertions(+), 35 deletions(-)
Fusion-Task-Id: FN-7258
Fusion-Task-Lineage: 97faf031-4244-4117-9948-45491c364134
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Route Android Back through Fusion's mobile navigation stack before native fallback.
- Dispatch a cancelable native-back event from the Capacitor shell before browser-history or app-exit fallback.
- Handle the native-back event in dashboard navigation history so mobile task details dismiss like browser Back and swipe-back.
- Cover Android Back behavior across native shell and task-detail navigation tests.
- Add a patch changeset for the published CLI/mobile bundle.
Files changed:
.changeset/fn-7257-android-back-task-detail.md | 7 +
.../__tests__/TaskDetail.swipe-back.test.tsx | 214 +++++++++++++++++++++
.../dashboard/app/hooks/useNavigationHistory.ts | 15 ++
packages/mobile/src/__tests__/native-shell.test.ts | 151 ++++++++++++++-
packages/mobile/src/index.ts | 7 +-
packages/mobile/src/plugins/native-shell.ts | 103 +++++++++-
6 files changed, 494 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-7257
Fusion-Task-Lineage: 90d0bc32-8968-4876-a5b4-51b34888d480
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Keep the Files modal focused on the selected file when users switch worktrees.
- Preserve selected file state during workspace changes and restore the sidebar to the file parent directory.\n- Keep mobile users in the editor pane when switching worktrees with an active file.\n- Cover desktop and mobile worktree-switch reload behavior in FileBrowserModal tests.\n- Add a patch changeset for the Files modal fix.\n\nFiles changed:\n .changeset/fn-7252-file-browser-worktree-reload.md | 7 +\n .../dashboard/app/components/FileBrowserModal.tsx | 21 ++-\n .../components/__tests__/FileBrowserModal.test.tsx | 153 +++++++++++++++++++++\n .../dashboard/app/hooks/useWorkspaceFileBrowser.ts | 4 +\n 4 files changed, 182 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-7252
Fusion-Task-Lineage: b791e3d7-6a68-48aa-aeb4-c826cec7f760
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
## Summary
Task image artifacts can now complete the full loop: agents and chat
flows can register base64 image bytes, and task details can display
those artifacts with an expandable preview instead of leaving them as
undiscoverable metadata.
This keeps binary payloads on the existing managed artifact storage
path, validates that base64 payloads are real non-empty image data, and
documents the new `dataBase64` field for engine-tool callers. The task
details artifacts gallery now treats image cards as expandable while
leaving document, audio, video, and generic artifact cards on their
existing behavior.
## Validation
- `pnpm --filter @fusion/dashboard exec vitest run
app/components/__tests__/TaskDocumentsTab.test.tsx
src/routes/__tests__/artifacts-route-integration.test.ts
--silent=passed-only --reporter=dot`
- `pnpm --filter @fusion/engine exec vitest run
src/__tests__/agent-artifact-tools.test.ts --silent=passed-only
--reporter=dot`
---
[](https://github.com/EveryInc/compound-engineering-plugin)

<!-- stage-review-badge-begin -->
---
<a href="https://stagereview.app/Runfusion/Fusion/pull/1821">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://stagereview.app/assets/gh-open-in-stage-dark.svg">
<img src="https://stagereview.app/assets/gh-open-in-stage-light.svg"
alt="Open in Stage">
</picture>
</a>
<!-- stage-review-badge-end -->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added inline base64 (`dataBase64`) support for registering image
artifacts from agent tools, including task-scoped chat registration.
* Task details now allow expanding image media artifacts in a preview
lightbox with accessible keyboard interaction.
* **Bug Fixes**
* Improved verification for media streaming by validating raw binary
responses; added HTTP 200/404 coverage for image endpoints.
* **Documentation**
* Updated `fn_artifact_register` tool documentation to include the
optional `dataBase64` parameter.
* **Tests**
* Added coverage for base64 validation/error handling and lightbox
expand/close behavior (including Escape and Tab focus trapping).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Summary
- Adds a fail-closed resolver for explicit review checkout metadata.
- Routes both in-session step reviews and graph step reviews through the
validated checkout when present.
- Keeps existing workspace per-repo review behavior when no explicit
checkout is configured.
## Verification
- `corepack pnpm check:changesets` — pass
- `corepack pnpm lint` — pass
- `corepack pnpm build` — pass
- `corepack pnpm --filter @fusion/engine exec vitest run
src/__tests__/reviewer-workspace.test.ts --reporter=dot --no-color` —
pass, 11 tests
## Note
- Full `corepack pnpm test` on current main is blocked by existing
workflow gate expectation drift covered separately by PR #1822; this
branch avoids duplicating those commits.
<!-- stage-review-badge-begin -->
---
<a href="https://stagereview.app/Runfusion/Fusion/pull/1823">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://stagereview.app/assets/gh-open-in-stage-dark.svg">
<img src="https://stagereview.app/assets/gh-open-in-stage-light.svg"
alt="Open in Stage">
</picture>
</a>
<!-- stage-review-badge-end -->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Review steps now correctly run in the intended external checkout when
one is provided.
* Read-only reviewers now use the validated review workspace path
instead of defaulting to the task worktree.
* Added regression coverage to ensure review execution uses the expected
checkout location.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Current Gate status
`Gate` is failing on current `origin/main` before these PR changes. I
reproduced the same engine-core failures directly on `origin/main`
(`task-pipeline-smoke.test.ts` and
`workflow-graph-executor-parity.test.ts`, caused by the new
`completion-summary` / `post-merge-verification` default workflow
nodes). The PR-local review feedback is addressed and focused validation
passes; the remaining Gate failure should be fixed in the upstream
workflow-test drift PR, not copied into this PR branch.
## Summary
- Mocks `git remote get-url origin` for dashboard PR lifecycle tests via
`execFileSync`, matching the production repository resolver.
- Keeps the missing-repository error covered for cases where no project
remote is resolvable.
- Tightens dashboard PR lifecycle assertions so PR status checks use the
resolved owner/repo.
## Verification
- `corepack pnpm build` — pass
- `corepack pnpm --filter @runfusion/fusion exec vitest run
src/commands/__tests__/dashboard.test.ts --silent=passed-only
--reporter=dot --no-color` — pass, 86 tests
- `corepack pnpm --filter @runfusion/fusion exec vitest run
src/commands/__tests__/dashboard.test.ts -t
"processPullRequestMergeTask|PR-first auto-merge queue"
--silent=passed-only --reporter=dot --no-color` — pass, 7 tests
- Clean rebuilt stale bundled plugin dist, then `corepack pnpm --filter
@runfusion/fusion exec vitest run --changed
24d78816a0 --passWithNoTests
--silent=passed-only --reporter=dot --no-color` — pass, 75 files / 1186
tests
- `corepack pnpm check:changesets` — pass
- `corepack pnpm lint` — pass
- `corepack pnpm typecheck` — pass
No changeset: test-only fixture coverage; no package runtime behavior
changed.
## CI note
The current Gate failure is the pre-existing engine-core workflow
expectation drift fixed by PR #1822. Lint, Typecheck, Build, CodeRabbit,
and Greptile passed on this PR.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Tests**
* Expanded dashboard and pull request merge coverage to verify
repository detection and merge-status handling across merge lifecycle
paths.
* Added a failure-path assertion for when the app can’t determine the
current repository, ensuring the operation stops and surfaces the
expected error.
* Improved assertions for auto-merge and manual merge flows to confirm
the correct repository lookup occurs in each scenario.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Current Gate status
`Gate` is failing on current `origin/main` before these PR changes. I
reproduced the same engine-core failures directly on `origin/main`
(`task-pipeline-smoke.test.ts` and
`workflow-graph-executor-parity.test.ts`, caused by the new
`completion-summary` / `post-merge-verification` default workflow
nodes). The PR-local review feedback is addressed and focused validation
passes; the remaining Gate failure should be fixed in the upstream
workflow-test drift PR, not copied into this PR branch.
## Summary
- Waits for the task store's secrets database handle to close during
shutdown before returning.
- Updates workflow gate expectations for the current built-in lifecycle
nodes.
- Adds a patch changeset for the published CLI package.
## Test Plan
- `corepack pnpm install`
- `corepack pnpm check:changesets`
- `corepack pnpm lint`
- `corepack pnpm build`
- `corepack pnpm test`
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Improved shutdown behavior so task-store cleanup now waits for secrets
storage to close before finishing.
* Reduced the chance of teardown race conditions and incomplete cleanup
during app shutdown.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->