Document the repository-local Beads issue workflow for contributors.
- Add the bd ready/claim/create/close/sync workflow with expected outcomes.
- Document Beads issue types and priority levels.
- Clarify that local Beads tracking is separate from the Fusion storage evaluation.
Files changed:
docs/contributing.md | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 57 insertions(+)
Fusion-Task-Id: FN-6330
Fusion-Task-Lineage: 9a56def0-40bf-4e61-8582-4bb66e382a3a
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
Stabilize the process supervisor cascade teardown assertion without relying on the lifetime timer.
- Disable maxLifetimeMs for the explicit cascade teardown test so it cannot race the test's wait window.
- Assert the supervised child exits from SIGTERM and the supervisor registry is cleaned up.
- Keep the grandchild termination assertion explicit after cascade cleanup.
Files changed:
packages/core/src/__tests__/process-supervisor.test.ts | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-6293
Fusion-Task-Lineage: 56fbedee-57e3-4b33-b84e-03fc1a7b7212
Title summarization now accepts oversized task descriptions while bounding the model prompt.
- Remove the 2000-character validation ceiling for summarize-title requests.
- Truncate long descriptions only at model-input time with a dedicated exported cap.
- Update route/API docs and tests for long-description behavior.
- Add a patch changeset for the published Fusion package.
Files changed:
.changeset/fn-6305-title-summarize-any-length.md | 5 +++
packages/core/src/__tests__/ai-summarize.test.ts | 43 ++++++++++++++++++----
packages/core/src/ai-summarize.ts | 34 +++++++++++------
packages/core/src/index.ts | 1 +
packages/dashboard/app/api/legacy.ts | 2 +-
.../src/__tests__/routes-planning.test.ts | 25 +++++++++++++
packages/dashboard/src/routes.ts | 2 +-
7 files changed, 92 insertions(+), 20 deletions(-)
Fusion-Task-Id: FN-6305
Fusion-Task-Lineage: 69a83173-ac85-489f-b4cc-d1a70b6d25eb
Direct-chat composer no longer scrolls on focus (which aborted the iOS keyboard
raise on every tap after a dismiss). Layout-viewport drift is now undone on blur
— immediately plus a short follow-up cancelled on the next focus — so each focus
starts at scrollY 0 and the keyboard lock's scrollTo is a no-op.
Also hide the mobile bottom nav while the keyboard is up: it previously pinned to
bottom:0 and relied on the keyboard to cover it, but on iOS the layout viewport
does not shrink, so the bar overlapped the composer. It now slides off-screen
(translateY(100%) + pointer-events:none); safe because the nav is a sibling of
the input, not an ancestor.
Folds into the existing iOS chat-keyboard changeset.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The send/stop buttons run their action on pointerdown/touchstart and set a
shared handledMobileActionRef latch so the trailing synthetic onClick does not
double-fire. The latch was only cleared inside onClick, but iOS suppresses that
click after preventDefault() in touchstart — leaving it stuck true, so the next
real click (e.g. after switching chats) was swallowed and the button looked
dead. Make the latch self-clearing (auto-reset timer + consume-on-click) so it
can never persist across taps; also stops a stuck stop-button latch from killing
the next send tap.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Makes workflow edge details behave like a full-screen mobile editor stage while keeping the mobile tabs visible.
- Add a mobile edge-detail editor body state that hides the canvas and expands the inspector.\n- Add a dismiss control to the mobile edge inspector.\n- Preserve the top mobile tab row sizing and cover the edge-detail/mobile-tab CSS contracts with tests.
Files changed:\n .../app/components/WorkflowNodeEditor.css | 19 +++++++++++++\n .../app/components/WorkflowNodeEditor.tsx | 22 ++++++++++++---\n .../__tests__/WorkflowNodeEditor.css.test.ts | 11 ++++++++\n .../__tests__/WorkflowNodeEditor.test.tsx | 31 ++++++++++++++++++++++\n 4 files changed, 80 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-6297
Fusion-Task-Lineage: be7cea97-0790-4d88-9fa5-3d484b4d3dfb
Move frontend UX criteria out of triage self-instructions and into deterministic workflow policy.
- Add a shared frontend UX policy helper that matches frontend file scopes and injects the byte-equivalent checklist idempotently.
- Apply the policy during triage finalization and persist the updated PROMPT.md when applicable.
- Replace the legacy prompt-based injection instructions with a pointer to the deterministic policy.
- Cover path matching, insertion behavior, and checklist parity with focused core tests.
- Add a minor changeset for the published Fusion package.
Files changed:
.changeset/fn-6237-frontend-ux-policy.md | 5 +
.../core/src/__tests__/frontend-ux-policy.test.ts | 119 +++++++++++++++++
packages/core/src/agent-prompts.ts | 29 +---
packages/core/src/frontend-ux-policy.ts | 148 +++++++++++++++++++++
packages/core/src/index.ts | 1 +
packages/engine/src/triage.ts | 19 ++-
6 files changed, 291 insertions(+), 30 deletions(-)
Fusion-Task-Id: FN-6237
Fusion-Task-Lineage: 7ac95064-9ec6-4760-8609-20c35075aca1
Replace the position:fixed body pin for the inline chat composer with an
overflow-only viewport lock so iOS no longer blurs the focused textarea
when the keyboard opens. Modals keep the position:fixed lock.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The mobile chat keyboard collapsed the instant it opened on iOS because
the keyboard scroll-lock pinned body to position:fixed a beat after the
composer was already focused — pinning an ancestor to position:fixed
after focus blurs the input on iOS Safari (no visible jump, since the
dashboard base layout is already at scrollY 0).
Add useMobileKeyboardViewportLock: an overflow-only viewport lock
(overflow:hidden on html/body + scrollTo(0,0)) that does NOT touch
position, mirroring the working Quick Chat panel. App-level and ChatView
keyboard pins use it now; modals keep the position:fixed lock unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>