main's workflow-graph-executor now collapses the merge-policy region
(merge-gate, branch-group-*, merge-attempt) into a single synthetic
`merge` node. Reconcile the S05 work-item-driver test's visitedNodeIds
assertion to match, and union the `observed` recording-primitive fields
from both branches (executedTasks + merge attempt/run/workflow ids).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Styles the simple workflow editor so its mobile-style controls are available and documented across desktop and narrow layouts.
- Move simple editor tab, add, action, and touch-target styling out of the mobile-only media query.
- Cover desktop simple editor affordances for custom and built-in workflows with regression tests.
- Document desktop simple editor tabs and the surfaced workflow action buttons.
Files changed:
docs/dashboard-guide.md | 6 +-
.../app/components/WorkflowNodeEditor.css | 286 +++++++++++----------
.../__tests__/WorkflowNodeEditor.test.tsx | 53 ++++
3 files changed, 201 insertions(+), 144 deletions(-)
Fusion-Task-Id: FN-6381
Fusion-Task-Lineage: fd7f1ada-6e50-4d92-b455-7f38fb46c1e2
Contain the mobile dashboard document viewport while preserving intended inner horizontal scrollers.
- Lock mobile html/body/#root and fullscreen overlay chrome to the viewport inline axis.
- Default mobile touch handling to vertical-only panning and opt board/code/table scrollers back into horizontal gestures.
- Add CSS fixture regression coverage plus a solution note for mobile horizontal pan containment.
Files changed:
docs/solutions/ui-bugs/mobile-horizontal-pan-document-viewport-containment.md | 62 +++++++++++
packages/dashboard/app/__tests__/mobile-horizontal-pan-containment.test.ts | 116 +++++++++++++++++++++
packages/dashboard/app/styles.css | 47 +++++++--
3 files changed, 219 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-6365
Fusion-Task-Lineage: 4673da28-1438-4ea5-b32c-25bc52285273
Add a full-modal expansion affordance for task-detail chat conversations.
- Add an expand/collapse toolbar button to the task chat tab with accessible labels and icon states.
- Let the task detail modal switch into a chat-expanded layout and reset that state when leaving chat or entering edit mode.
- Cover the chat toggle and layout behavior with dashboard component tests and document the control.
Files changed:
docs/dashboard-guide.md | 1 +
packages/dashboard/app/components/TaskChatTab.css | 22 +++++
packages/dashboard/app/components/TaskChatTab.tsx | 21 ++++-
.../dashboard/app/components/TaskDetailModal.css | 42 +++++++++
.../dashboard/app/components/TaskDetailModal.tsx | 13 ++-
.../app/components/__tests__/TaskChatTab.test.tsx | 37 ++++++++
.../TaskDetailModal.attachments-and-tabs.test.tsx | 100 +++++++++++++++++++++
7 files changed, 233 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-6370
Fusion-Task-Lineage: 787300bb-b928-45cf-a5c1-7fed5f375111
Clamp the workflow editor left sidebar and its children so long content cannot create horizontal scroll.
- Hide horizontal overflow on desktop and list-stage sidebar layouts while preserving vertical scrolling.\n- Allow nested sidebar sections, lists, palette controls, and code snippets to shrink or wrap within the sidebar.\n- Add CSS contract coverage for the sidebar overflow behavior across desktop and mobile list-stage layouts.\n\nFiles changed:\n .../app/components/WorkflowNodeEditor.css | 25 ++++++++++++\n .../__tests__/WorkflowNodeEditor.css.test.ts | 47 ++++++++++++++++++++++\n 2 files changed, 72 insertions(+)
Fusion-Task-Id: FN-6379
Fusion-Task-Lineage: 9da54129-faaf-4a81-906b-d76e9746b426
Refine the task-detail chat composer so the send action stays narrow and inline with the input.
- Replace the composer placeholder with the steering-focused copy.
- Convert the send button to an accessible icon-only control with loading state labels.
- Keep the send control inline at mobile breakpoints and cover the behavior in tests and docs.
Files changed:
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/components/TaskChatTab.css | 14 +++++++----
packages/dashboard/app/components/TaskChatTab.tsx | 11 ++++++---
.../app/components/__tests__/TaskChatTab.test.tsx | 27 ++++++++++++++++++++--
4 files changed, 44 insertions(+), 10 deletions(-)
Fusion-Task-Id: FN-6369
Fusion-Task-Lineage: b7e0717f-4cba-4380-a08a-e01fc12985e3
Recover stale iOS document scroll after returning to the Fusion dashboard.
- Add an iOS-only restore hook that clears orphaned body offsets and scrolls the document back to the origin when unlocked.
- Wire the restore reset from the dashboard app shell for mobile layouts.
- Cover visible/page-show restores, platform no-ops, active-lock guards, and orphaned style cleanup.
- Document the mobile restore drift solution for future regressions.
Files changed:
.../mobile-ios-restore-document-scroll-drift.md | 59 ++++++++++
packages/dashboard/app/App.tsx | 4 +-
.../hooks/__tests__/useMobileScrollLock.test.ts | 121 ++++++++++++++++++++-
.../dashboard/app/hooks/useMobileScrollLock.ts | 61 +++++++++++
4 files changed, 243 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-6364
Fusion-Task-Lineage: 9243cab8-5fbb-4332-ac4d-aabefde4161c
Adds an in-transcript control for returning to the newest task chat output after reviewing older messages.
- Track whether the task chat transcript is near the bottom and preserve live-follow behavior.
- Render an accessible sticky Latest button when populated transcripts are scrolled up, including mobile styling.
- Cover empty/loading, desktop, mobile, and click-to-jump behavior in TaskChatTab tests.
- Document the Latest jump affordance in the dashboard guide.
Files changed:
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/components/TaskChatTab.css | 40 +++++++++++
packages/dashboard/app/components/TaskChatTab.tsx | 40 ++++++++++-
.../app/components/__tests__/TaskChatTab.test.tsx | 82 ++++++++++++++++++++++
4 files changed, 162 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-6359
Fusion-Task-Lineage: 9b4a3533-2969-4f0d-a4de-6ba895662726
Reset mobile keyboard restore sampling so collapsed viewports clear stale keyboard-open metrics.
- Add a restore-specific sampling path for visibilitychange/pageshow that can reset the viewport baseline and bypass the impossible-sample hold once.
- Preserve the existing in-session impossible-sample guard and tail polling behavior for normal focus/resize updates.
- Cover iOS restore, stale offset drift, genuinely open restored keyboards, and Android-style shrink reset cases.
- Document the mobile keyboard restore stale viewport fix for future UI debugging.
Files changed:
.../mobile-keyboard-restore-stale-viewport.md | 59 ++++++++
.../app/hooks/__tests__/useMobileKeyboard.test.ts | 160 +++++++++++++++++++++
packages/dashboard/app/hooks/useMobileKeyboard.ts | 75 +++++++---
3 files changed, 275 insertions(+), 19 deletions(-)
Fusion-Task-Id: FN-6362
Fusion-Task-Lineage: 3919d892-b2d5-419a-abeb-84ac298ca2d5
Adds bounded retry handling so stale Fusion test temp roots are reclaimed instead of leaking after transient removal failures.
- Share prefix-scoped pruning between isolated HOME and worker temp roots.
- Retry rm-rf on transient busy/non-empty failures and treat ENOENT as successful cleanup.
- Warn once with bounded child diagnostics after persistent prune failures.
- Cover worker and home pruning retry, failure, and ENOENT behavior in script tests.
Files changed:
scripts/__tests__/test-changed.test.mjs | 118 ++++++++++++++++++++++++++++++++
scripts/test-changed.mjs | 84 ++++++++++++++---------
2 files changed, 168 insertions(+), 34 deletions(-)
Fusion-Task-Id: FN-6371
Fusion-Task-Lineage: a81e6849-5eb0-4bc0-8030-9f8eaed4e35a
Stabilizes memory extraction and audit route tests by restoring the expected createFnAgent mock behavior.\n\n- Add a focused helper that returns structured insight extraction output from the mocked AI session.\n- Reset the mock around memory extract and audit tests so earlier route tests cannot leak incompatible behavior.\n\nFiles changed:\n .../src/__tests__/routes-settings.test.ts | 28 ++++++++++++++++++++++\n 1 file changed, 28 insertions(+)
Fusion-Task-Id: FN-6363
Fusion-Task-Lineage: d4b93c51-3d30-4a97-90e9-72e2dd660501
Keep triage planning from advancing or continuing work after a task is paused.
- Abort active triage sessions and reviewer subagents when task updates mark the task paused.
- Skip approved-spec recovery and final approved-spec transitions while a task remains paused.
- Add regression coverage for paused planning, pause-driven aborts, and published package changeset metadata.
Files changed:
.changeset/pause-triage-planning.md | 5 +
.../src/__tests__/triage-pause-abort.test.ts | 237 +++++++++++++++++++++
packages/engine/src/triage.ts | 57 +++++
3 files changed, 299 insertions(+)
Fusion-Task-Id: FN-6361
Fusion-Task-Lineage: 33d849d5-1461-49ae-9fe0-be98b534ac35
Task-detail Chat now accepts guidance even when no steerable session is active and queues it for the next run.
- Keep the task chat composer enabled whenever there is draft text and no send is in flight.
- Replace the blocking no-session hint with active-session versus queued-for-next-session copy.
- Extend TaskChatTab coverage across idle, paused, inactive CLI, and send-in-flight states.
- Quarantine the unrelated flaky dashboard settings route test observed during broad verification.
Files changed:
packages/dashboard/app/components/TaskChatTab.tsx | 21 ++--
.../app/components/__tests__/TaskChatTab.test.tsx | 135 +++++++++++++++++----
packages/dashboard/vitest.config.ts | 5 +-
scripts/lib/test-quarantine.json | 5 +
4 files changed, 133 insertions(+), 33 deletions(-)
Fusion-Task-Id: FN-6354
Fusion-Task-Lineage: b0f0d033-bb4d-4eaa-a15d-f06b82643ade
Expose the docs README index suite as a focused CLI test lane and document its deterministic invocation.
- Add a package script for running only the docs README index Vitest file.
- Lock the package-config contract around the new script and dashboard quality runner expectations.
- Clarify the CI shard docs to pass Vitest shard flags without a bare separator.
Files changed:
docs/contributing.md | 2 +-
packages/cli/package.json | 1 +
packages/cli/src/__tests__/package-config.test.ts | 37 ++++++++++++++++++-----
3 files changed, 31 insertions(+), 9 deletions(-)
Fusion-Task-Id: FN-6355
Fusion-Task-Lineage: 2a02bc5f-2407-4bad-8aed-afa519826ce7
Stabilize the cli-agent re-entry regression test by awaiting the original run after the replacement session succeeds.
- Keep the first cli-agent run promise instead of dropping it with void.
- Assert the active task session still points at the first PTY before simulating re-entry.
- Kill and await the first session at the end so no hub or store work outlives teardown.
Files changed:
packages/engine/src/__tests__/cli-agent-executor.test.ts | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6341
Fusion-Task-Lineage: 3e365f21-0d05-496a-adec-aa782aa83503
Updates the roadmap store schema-version expectation to match the current core migration level.
- Rename the schema-version test from 114 to 116.
- Assert the roadmap store database schema version is 116 after init.
Files changed:
.../fusion-plugin-roadmap/src/store/__tests__/roadmap-store.test.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-6348
Fusion-Task-Lineage: 0db4a46d-1d75-4eb1-bfeb-0483eeddb689
Record stepless built-in workflow defaults so zero-step selections survive task creation.\n\n- Return an explicit workflow selection for built-in workflows that compile to zero steps.\n- Cover both normal and reserved-id task creation for coding and interpreter-deferred stepwise defaults.\n- Add a patch changeset for the published Fusion package.\n\nFiles changed:\n .changeset/FN-6335-zero-step-workflow-defaults.md | 5 +++++\n packages/core/src/__tests__/builtin-workflows.test.ts | 14 ++++++++++++++\n packages/core/src/store.ts | 4 +++-\n 3 files changed, 22 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6335
Fusion-Task-Lineage: 521ef05d-bef7-4d26-9f6a-592363f522d1
Rescues the database recovery corruption test by reducing its fixture size and removing its quarantine.
- Reduce recovery test fixture rows so sqlite3 .recover is not overfed while still corrupting a B-tree page.
- Re-enable packages/core/src/__tests__/db.test.ts in the core Vitest config.
- Remove the db recovery test entry from the quarantine ledger.
Files changed:
packages/core/src/__tests__/db.test.ts | 5 +++--
packages/core/vitest.config.ts | 1 -
scripts/lib/test-quarantine.json | 5 -----
3 files changed, 3 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-6334
Fusion-Task-Lineage: c4555976-fe98-4f25-a1b5-e70bfd991b16
Display user steering comments alongside agent output and wake immediate-response agents when new messages are sent.
- Render persisted and optimistic user messages in the task chat transcript with mobile styling.
- Propagate updated task detail data after sends and roll back optimistic messages on failures.
- Cover steering route validation, immediate heartbeat wakeups, chat rendering, and workflow alias round-trips.
- Add a patch changeset for the published CLI package.
Files changed:
.changeset/fn-6345-task-chat-user-messages.md | 5 +
packages/dashboard/app/components/TaskChatTab.css | 32 ++++
packages/dashboard/app/components/TaskChatTab.tsx | 170 ++++++++++++++++-----
.../dashboard/app/components/TaskDetailModal.tsx | 8 +-
.../app/components/__tests__/TaskChatTab.test.tsx | 150 +++++++++++++++++-
.../app/components/__tests__/board-mobile.test.tsx | 2 +-
.../__tests__/workflow-flow-mapping.test.ts | 4 +-
.../app/components/workflow-flow-mapping.ts | 4 +-
.../src/__tests__/routes-tasks-ops.test.ts | 86 +++++++++++
9 files changed, 414 insertions(+), 47 deletions(-)
Fusion-Task-Id: FN-6345
Fusion-Task-Lineage: 0355cc67-bd23-4e90-9034-bbaae277cfd6
Classify the archive FTS churn and merge-queue hook timeouts as deterministic test-cost fixes instead of quarantines.
- Reduce the archive FTS churn fixture while preserving rebuild shrinkage and search coverage.
- Use in-memory TaskStore setup for merge-queue cases that do not require disk persistence.
- Keep disk-backed coverage for legacy migration and competing-store lease arbitration.
- Verification: targeted archive FTS + merge-queue run passed in 7.47s versus 27.69s before the fix.
Files changed:
.../core/src/__tests__/archive-db-fts-maintenance.test.ts | 6 +++---
packages/core/src/__tests__/store-merge-queue.test.ts | 15 ++++++++++-----
2 files changed, 13 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-6325
Fusion-Task-Lineage: a6191c99-f7f1-4766-9e01-ccc3f0673bcd
Keep the mobile board test API mock aligned with WorkflowSelector's optional-step loading.
- Add fetchWorkflowOptionalSteps to the dashboard API mock used by board-mobile tests.
- Return an empty optional-step list so WorkflowSelector mount effects can settle without missing mock failures.
Files changed:
packages/dashboard/app/components/__tests__/board-mobile.test.tsx | 1 +
1 file changed, 1 insertion(+)
Fusion-Task-Id: FN-6342
Fusion-Task-Lineage: 750c296d-b559-4b71-9038-1640e0ce6b68
Limits task card archiving UI to completed tasks while preserving coverage for hidden states.
- Render the archive button only when a task is in the done column.
- Update TaskCard tests to assert archive action visibility for done tasks and absence for other live columns.
- Keep the header action placement assertion focused on done task cards.
Files changed:
packages/dashboard/app/components/TaskCard.tsx | 2 +-
.../app/components/__tests__/TaskCard.test.tsx | 23 +++++++++++++++++-----
2 files changed, 19 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-6340
Fusion-Task-Lineage: e1373fd1-5e50-4784-bf04-fa13ef0a08cb