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
- 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.
Record skill-backed workflow nodes into workflowStepResults and teach task progress surfaces to include those graph-node records without re-showing disabled optional workflow checks.
- classify image artifact support as a minor feature changeset
- reject non-image, empty, and signature-mismatched dataBase64 payloads
- trap keyboard focus in the task image lightbox
- assert media streaming with raw image bytes
Fusion-Task-Id: FN-7143
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Keep the Workflow simple-editor tab bar contained while preserving horizontal touch scrolling.
- Clamp the mobile tab strip to the editor width and make it the horizontal scroll owner.
- Preserve intrinsic tab button widths and pan gestures for narrow touch viewports.
- Add CSS, component, and shared overflow regression coverage for the full six-tab strip.
- Add a patch changeset for the published Fusion package.
Files changed:
.changeset/fn-7236-workflow-mobile-tab-scroll.md | 7 +++
.../dashboard-overflow-containment.test.tsx | 32 ++++++++++++-
.../app/components/WorkflowNodeEditor.css | 32 ++++++++++++-
.../__tests__/WorkflowNodeEditor.css.test.ts | 29 ++++++++++++
.../__tests__/WorkflowNodeEditor.test.tsx | 55 +++++++++++++++++++++-
5 files changed, 152 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-7236
Fusion-Task-Lineage: 1601d4c2-2039-4410-809c-7dcdfea04301
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Mobile task details now participate in history navigation so native swipe-back dismisses or unwinds the detail modal.
- Push a navigation entry whenever task detail opens through the app-level modal path.
- Restore the previous task detail snapshot when backing out of nested detail opens before closing the modal.
- Add mobile swipe-back coverage for board, list, dock, nested, and explicit close surfaces.
- Include a patch changeset for the published Fusion CLI package.
Files changed:
.changeset/fn-7232-swipe-back-task-detail.md | 7 +
packages/dashboard/app/App.tsx | 5 +-
packages/dashboard/app/components/AppModals.tsx | 26 +-
.../__tests__/TaskDetail.swipe-back.test.tsx | 572 +++++++++++++++++++++
packages/dashboard/vitest.config.ts | 1 +
5 files changed, 605 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-7232
Fusion-Task-Lineage: 0291d01c-2008-490c-b0d1-0f0641fbd18c
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Raise task-detail chat tool-call typography while preserving compact collapsed rows.
- Increase task chat tool summary, kicker, label, and detail text to the base spacing font token.
- Add CSS regression coverage to prevent the smaller calc font size from returning across desktop, mobile, and narrow hosts.
- Include the TaskChatTab suite in the dashboard chat quality test lane and add a patch changeset.
Files changed:
.changeset/fn-7240-task-chat-tool-font.md | 7 ++++++
packages/dashboard/app/components/TaskChatTab.css | 11 ++++++----
.../app/components/__tests__/TaskChatTab.test.tsx | 25 +++++++++++++++++++---
packages/dashboard/vitest.config.ts | 2 ++
4 files changed, 38 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-7240
Fusion-Task-Lineage: 4d3ed287-27b7-4107-bc42-0119d5a4f1e9
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>