Task detail chat now renders adjacent text log chunks as continuous bubbles.
- Combine consecutive non-tool, non-thinking chat entries within each agent role group before rendering.
- Preserve tool and thinking segment boundaries while simplifying segment keys for grouped text.
- Add dashboard tests for single, consecutive, and cross-role text bubble behavior.
- Document the text chunk grouping behavior in the dashboard guide.
Files changed:
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/components/TaskChatTab.tsx | 28 ++++++++-----
.../app/components/__tests__/TaskChatTab.test.tsx | 48 ++++++++++++++++++++++
3 files changed, 66 insertions(+), 12 deletions(-)
Fusion-Task-Id: FN-6344
Fusion-Task-Lineage: e88f0383-7d91-4272-8c9b-532a382074d4
Reconcile the FN-352 no-commit coordination guard skip with main's
independently-landed FN-424 work. Both branches added a no_commits
guard bypass at the same fn_task_done call site:
- FN-352 (this branch): getNoCommitEligibilityReason(task) covering
Review Level 1 coordination prompts with board-only scope and
explicit no-source intent (e.g. "Do not change product source").
- FN-424 (main): evaluatePromptDerivedNoCommitEligibility(...) plus
non-blocking audit logging of the skip.
Their prompt phrase-matching differs, so neither alone satisfies the
merged test file. Resolved by OR-ing both eligibility checks and
wrapping the skip in main's audit-logging block. Both helpers still
refuse the contradictory implementation+coordination prompt.
All 18 executor-task-done-invariant tests pass; engine typecheck clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Quarantine the flaky deferred-hook title summarization coverage while preserving focused store-create coverage.
- Extract the deferred task-created hook summarization test into its own file.
- Exclude the extracted test file from the core Vitest suite.
- Record the flake investigation and quarantine rationale in the test quarantine ledger.
Files changed:
.../store-create-summarize-deferred-hook.test.ts | 67 ++++++++++++++++++++++
packages/core/src/__tests__/store-create.test.ts | 44 --------------
packages/core/vitest.config.ts | 1 +
scripts/lib/test-quarantine.json | 5 ++
4 files changed, 73 insertions(+), 44 deletions(-)
Fusion-Task-Id: FN-6326
Fusion-Task-Lineage: a37189b3-b88b-483f-b2bf-471fde806b35
Allow the chat composer to recognize live CLI sessions as steerable agent sessions.
- Pass live CLI session state from the task detail modal into the chat tab.\n- Keep paused and user-paused tasks blocked even when a CLI session exists.\n- Cover live, ended, and missing CLI session states in chat composer tests.\n\nFiles changed:\n packages/dashboard/app/components/TaskChatTab.tsx | 18 +++--\n .../dashboard/app/components/TaskDetailModal.tsx | 22 ++++--\n .../app/components/__tests__/TaskChatTab.test.tsx | 92 ++++++++++++++++++++--\n 3 files changed, 111 insertions(+), 21 deletions(-)
Fusion-Task-Id: FN-6338
Fusion-Task-Lineage: 7229c059-e094-4be3-bfba-b15d8c5069f9
Self-healing now resumes stranded assigned in-progress work when an agent has no active run or execution.
- Add a self-healing pass that groups stale assigned in-progress tasks by durable agent and calls the executor resume seam without moving tasks backward.
- Emit run-audit telemetry for reattached orphaned executions and wire the resume hook through the in-process runtime.
- Cover grace windows, pause/active-run/active-execution guards, task filtering, and registration order with engine tests.
- Document the recovery behavior and add a patch changeset for the published CLI package.
Files changed:
.changeset/fn-6336-reattach-orphaned-executions.md | 5 +
docs/agents.md | 2 +
docs/architecture.md | 2 +
...lf-healing-reattach-orphaned-executions.test.ts | 217 +++++++++++++++++++++
packages/engine/src/run-audit.ts | 1 +
packages/engine/src/runtimes/in-process-runtime.ts | 1 +
packages/engine/src/self-healing.ts | 122 ++++++++++++
7 files changed, 350 insertions(+)
Fusion-Task-Id: FN-6336
Fusion-Task-Lineage: 6d8519b9-d8b0-4726-9b45-bfa445b7883e
Stabilize the checkout leasing AgentStore regression test setup.
- Recreate the nested checkout-leasing AgentStore with an in-memory database after replacing the TaskStore.
- Keep the disk-backed TaskStore for persistence assertions while avoiding a shared disk-backed AgentStore database lifecycle.
- Let the top-level cleanup own AgentStore closure to avoid double-closing in the nested hook.
Files changed:
packages/core/src/__tests__/agent-store.test.ts | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-6312
Fusion-Task-Lineage: a7f95ba4-fe8b-4367-9f65-6696b1a3867a
Reliably settles task-detail chat transcripts to the latest output after load and reactivation.
- Add a bounded animation-frame settle loop that re-pins populated transcripts while late layout growth occurs.
- Cancel pending settle frames on cleanup to avoid stale scroll writes after unmount or rerender.
- Cover async transcript height growth and settle-loop cleanup in TaskChatTab tests.
- Add a patch changeset for the published CLI package.
Files changed:
.changeset/fn-6337-chat-scroll-settle.md | 5 +
packages/dashboard/app/components/TaskChatTab.tsx | 52 +++++++++-
.../app/components/__tests__/TaskChatTab.test.tsx | 108 +++++++++++++++++++++
3 files changed, 163 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-6337
Fusion-Task-Lineage: d31de363-7ee6-4098-ac43-991dc33192e4
Refine task chat transcripts so collapsed tool groups summarize real invocations and expand into paired call/result details.
- Count tool calls by invocation instead of raw tool log rows.
- Show deduped tool names, overflow counts, and error badges in collapsed summaries.
- Pair tool calls with their result or error details when expanded.
- Cover the grouped summary behavior with dashboard tests and documentation.
Files changed:
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/components/TaskChatTab.css | 36 +++++--
packages/dashboard/app/components/TaskChatTab.tsx | 116 +++++++++++++++++----
.../app/components/__tests__/TaskChatTab.test.tsx | 105 ++++++++++++++++---
4 files changed, 213 insertions(+), 46 deletions(-)
Fusion-Task-Id: FN-6332
Fusion-Task-Lineage: 7c14b76c-dcaa-4227-8393-cb24f99b765d
Resolve conflicts from main's FN-6232 single-source triage prompt refactor:
- Drop the inline FAST_TRIAGE_SYSTEM_PROMPT const removed by main; the fast
triage prompt now lives in agent-prompts.ts (planning-fast seam).
- Migrate the PR's no-commit/operational-routing heuristic edits into the
fast block of agent-prompts.ts (standard block already carried them).
- Point triage tests at FAST_PLANNING_PROMPT/TRIAGE_POLICY_PROMPT instead of
the removed const.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Close plugin-store migration test database handles so migration cleanup does not hang.
- Close legacy project database handles after seeding plugin rows.
- Close central and local database handles after idempotency assertions.
- Preserve the migration coverage while preventing open handles from delaying test teardown.
Files changed:
packages/core/src/__tests__/plugin-store.test.ts | 86 ++++++++++++++----------
1 file changed, 49 insertions(+), 37 deletions(-)
Fusion-Task-Id: FN-6317
Fusion-Task-Lineage: 36f6a1da-6ec8-4dae-89a4-6caf1e566def
Keep the mobile board layout stable while Quick Chat owns the keyboard viewport.
- Treat fullscreen mobile overlays as suppressors for App-level footer hiding.
- Pass Quick Chat mobile open state into the shared keyboard flag helper.
- Cover iOS, Android, modal, and non-mobile keyboard flag behavior.
- Document the Quick Chat mobile keyboard board-shift root cause and fix.
Files changed:
.../quick-chat-mobile-keyboard-board-shift.md | 58 ++++++++++++++++++++++
packages/dashboard/app/App.tsx | 4 +-
.../utils/__tests__/mobileBarKeyboardFlags.test.ts | 57 ++++++++++++++++++++-
.../dashboard/app/utils/mobileBarKeyboardFlags.ts | 10 +++-
4 files changed, 126 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-6329
Fusion-Task-Lineage: f7c37252-c0ea-44f0-b4e3-5aa2022cf7bc
Clarify and cover the settings scopes response shape including workflow settings.
- Document that GET /api/settings/scopes returns workflowSettings with global and project scopes.
- Assert workflowSettings is always a non-null object for default and project-scoped route tests.
- Preserve exact workflow setting payload coverage when workflow overrides are present.
Files changed:
docs/settings-reference.md | 2 +-
packages/dashboard/src/__tests__/routes-settings.test.ts | 11 +++++++++++
2 files changed, 12 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6322
Fusion-Task-Lineage: 08796f9d-be99-46a1-8326-251a8d79dda4
Refine Chat active-state styling by dropping edge highlights while preserving active tints.
- Remove the scope-tab active bottom underline shadow.
- Remove the active chat-row left border and compensating padding offset.
- Add CSS contract coverage to prevent the removed desktop and mobile highlights from returning.
Files changed:
packages/dashboard/app/components/ChatView.css | 3 --
.../app/components/__tests__/ChatView.test.tsx | 47 ++++++++++++++++++++++
2 files changed, 47 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-6309
Fusion-Task-Lineage: e6645f38-a77c-4426-900b-71334d2145a9
Keep the App test suite aligned with the mobile scroll lock hook exports.\n\n- Add a vi.fn() mock for useMobileKeyboardViewportLock in the existing useMobileScrollLock module mock.\n- Preserve the iOS and lock-state mocks used by App test coverage.\n\nFiles changed:\n packages/dashboard/app/components/__tests__/App.test.tsx | 1 +\n 1 file changed, 1 insertion(+)
Fusion-Task-Id: FN-6323
Fusion-Task-Lineage: cc257afe-2ab7-4e97-b04f-2ccae28eaf38
Quarantine unrelated engine test flakes so the gate avoids known unstable fixtures.
- Add the soft-delete blocker residue reliability test to the quarantine ledger and reliability interaction exclusions.
- Add the bubblewrap sandbox backend test to the quarantine ledger and engine-core exclusions.
Files changed:
packages/engine/vitest.config.ts | 6 +++++-
scripts/lib/test-quarantine.json | 10 ++++++++++
2 files changed, 15 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6319
Fusion-Task-Lineage: 9a47ae20-76b8-47d8-8858-f4fe51ea807e
Task Chat can now steer active assigned sessions while tasks are being reviewed or merged.
- Permit composer steering for in-review reviewing, merging, merging-fix, and fixing statuses when an agent is assigned or checked out.
- Keep paused, user-paused, unassigned, todo, and done tasks disabled with clearer active-session messaging.
- Cover in-review steering and disabled-session states in TaskChatTab tests and update dashboard documentation.
Files changed:
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/components/TaskChatTab.tsx | 13 +++--
.../app/components/__tests__/TaskChatTab.test.tsx | 61 ++++++++++++++++++++--
3 files changed, 67 insertions(+), 9 deletions(-)
Fusion-Task-Id: FN-6314
Fusion-Task-Lineage: 42c0f4f7-58f5-4e0c-837f-9f4b7c497fa3