Commit Graph

12176 Commits

Author SHA1 Message Date
Phil Larson
bc82d8e0e1 fix(core): thread review lanes through merge readiness (#3514)
## Summary
- thread resolved review lanes through `isTaskReadyForMerge`
- preserve required pre-merge step filtering
- add coverage for a renamed review lane

## Test plan
- `pnpm --filter @fusion/core exec vitest run --silent=passed-only
--reporter=dot src/__tests__/task-merge.test.ts`
- `pnpm --filter @fusion/core typecheck`
- `pnpm check:lane-wiring`
- `pnpm check:changesets`
- `pnpm exec eslint packages/core/src/merge/task-merge.ts
packages/core/src/__tests__/task-merge.test.ts`

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Custom review lanes are now honored during merge-readiness checks and
auto-merge processing.
  * Renamed workflow lanes correctly determine whether tasks can merge.
* Tasks resumed from a paused state are routed and evaluated using the
appropriate review lane.
* The default `in-review` lane remains supported when no custom review
lanes are configured.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: gsxdsm <gsxdsm@users.noreply.github.com>
2026-08-23 15:31:17 -07:00
Phil Larson
febe375b14 fix(core): preserve merge finalization review lanes (#3508)
## Summary
- Forward project review lanes and required pre-merge steps through
merge-confirmed finalization.
- Cover custom review-lane and required-step blockers in the merge
finalization tests.
- Correct future-dated FNXC stamps that were blocking the shared lint
gate.

## Test Plan
- `corepack pnpm --filter @fusion/core exec vitest run
src/__tests__/task-merge.test.ts --silent=passed-only --reporter=dot`
- `corepack pnpm --filter @fusion/core typecheck`
- `corepack pnpm check:lifecycle-columns`
- `corepack pnpm check:lane-wiring`
- `corepack pnpm check:fnxc-future-dates`
- `corepack pnpm check:changesets --strict`
- `git diff --check`


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Bug Fixes**
- Confirmed merge finalization now preserves the selected review lane
and applies its resolved review requirements.
- Required pre-merge steps are correctly enforced for both durable and
non-durable merges.

- **Tests**
- Added coverage for review-lane handling and pre-merge blockers across
merge paths.

- **Documentation**
  - Added release notes documenting the merge finalization fix.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-08-23 15:24:08 -07:00
gsxdsm
a97aa84a20 fix: remove debug probes swept into ab9789f0a8 by mistake
ab9789f0a8 was committed with `git add -A` while an agent was mid-investigation
in this same checkout, so it captured that agent's temporary instrumentation:
eight `process.stderr.write('[F] …')` probe lines inside product code
(executor/mark-stuck-aborted.ts) and a 359-line scratch copy of a test file.
Both were pushed. Reverting both; no product behavior was ever intended to
change in those files.

Also lands the executor-stuck-requeue fix that investigation produced: the
grace-timeout assertion ran before the product finished, because the callback
continues past its timer into resetStepsIfWorkLost -> loadWorkspaceConfig, real
async fs I/O that `vi.advanceTimersByTimeAsync` does not await. The test now
awaits a completion barrier resolved by the requeue's own final moveTask rather
than a timeout or retry. The product was correct.

Lesson for this checkout: stage by explicit path while agents are running.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 15:05:27 -07:00
gsxdsm
ab9789f0a8 fix: correct workspace review fingerprint range and land-intent resolve gating
Two product defects surfaced by workspace-e2e's remaining failures.

1. A merge-boundary fence silently did not apply. captureWorkspaceReviewEvidence
   computes a repository's file list over baseCommitSha..<resolved task branch>,
   but computeReviewDiffFingerprint hardcoded baseRef..HEAD. For a workspace
   entry whose checkout sits on the integration branch those are different
   ranges, so the fingerprint did not describe the files captured beside it: a
   diverged checkout hard-failed an approved repository as content-changed,
   and a checkout at the base produced an empty diff -> undefined fingerprint ->
   the repo dropped out of mergeBoundaryFingerprints, so BOTH the
   approval-missing and content-changed fences stopped applying to it at all.
   computeReviewDiffFingerprint now takes an optional headRef; workspace
   evidence passes the resolved task branch. The singular-review caller, whose
   worktree IS the branch, keeps the ambient HEAD default.

2. Land intents were recorded and resolved under different conditions.
   landOneRepo records an intent only when ctx.workspaceLand is set, which
   landWorkspaceTask passes only for remote targets, but the resolve side was
   gated on durableLandLease alone. A local-only land therefore resolved an
   intent that was never recorded, got "missing", and failed a fully-landed
   repo as a partial land AFTER its integration ref had advanced. Resolve now
   uses the same condition as record.

The approveWorkspaceReview helper's "reviewStep called exactly once" constant
only held because defect 1 suppressed a repository; it now derives the expected
count from the same production capture the review loop uses.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 15:01:39 -07:00
gsxdsm
3533fc8a47 docs: pin the hybrid step-storage contract (the "steps: [] no-op" is not a bug)
An investigation reported that under PostgreSQL `updateTask(id, { steps: [] })`
silently no-ops while a non-empty array writes fine, and worked around it in
fixtures. Reproduced and traced: the write is literal and correct — the row and
task.json both hold `[]`. What actually happens is that an empty array means
"plan not parsed yet", not "this task has no steps", so all four read paths
re-derive steps from PROMPT.md when the stored array is empty: getTaskImpl, the
two list hydrations (reads.ts), and updateStep's auto-init, whose range error
already says outright that "its steps are defined in PROMPT.md".

No product change: removing the re-derivation would strand every task whose plan
lives only in PROMPT.md. Instead both halves of the contract are now pinned by a
PG test and documented at the write site, so the next reader sees the mechanism
instead of re-diagnosing it as a lost write. To make a task genuinely stepless,
remove the step headings from PROMPT.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 14:58:49 -07:00
gsxdsm
e37ebd5af9 chore(release): v0.77.0-beta.8
Version bump via changesets.
2026-08-23 14:49:26 -07:00
gsxdsm
455bdbc007 fix: repair the engine suite and the product regressions it was pointing at
Six parallel agents worked the 150 remaining failures. Engine suite: 297 failing
tests at baseline 3f448f7292 -> 8. 12,391 passing.

The failures were mostly pointing at live regressions, not stale tests. Eleven
product defects found and fixed:

- Operator approval mail dropped from BOTH executor gate closures: a gate paused
  a task for approval and no mailbox row was ever written.
- FN-8840 title-duplicate handling reverted in triage.ts, self-healing.ts, and
  scheduler.ts: a title-only "DUPLICATE: <id>" card consumed a full planner
  session, an operator-authored PROMPT.md could be erased, and a title-only
  redirect became dispatchable again.
- A failed plan-admission audit write set its dedupe marker anyway, silencing
  the stall permanently (FN-8600 regression); engine now has an outcome-reporting
  bounded-audit seam mirroring core's FN-9182.
- A best-effort plan mirror could abort a whole planning attempt after the
  authoritative PROMPT.md had already been written.
- AI-merge cleanup lost its alreadyAbsent/idempotent signal on the real-git path.
- Workspace merge-boundary file comparison ran without its review-evidence fence,
  hard-failing every file for callers with no review episode.
- After a file-scope violation the retry re-selected the rejected squash and
  never re-merged.
- Parallel step branches leaked: a name-based classifier read executor-created
  fusion/step-* branches as operator-owned and skipped cleanup.
- workspace_coordination_leases / workspace_land_intents were missing from
  projectTableNames, so the PG harness never truncated them and leases leaked
  across tests.

Four of those are silent reversions from ONE commit, 1cf86baa1c, labeled a
behavior-preserving "executor pure peels" refactor. It passed its own targeted
verification; only a full-suite audit found them.

Test-side repairs are root-cause fixes at shared factories: required pre-merge
gate declarations, branch-write provenance, fake stores missing production write
seams, dead vi.mock specifiers that silently mocked nothing (allowlist ratcheted
11 -> 8), and stale expectations after deliberate IR/tool/error-class changes.
Tests for deleted features were deleted with their removing commit cited.

Left red deliberately (4): executor-worktree-liveness's unrouted-graph-run
assertion and three workspace-e2e landing-stack layers, each needing a design
ruling rather than a test edit. Two durable-write call sites remain flagged
unresolved rather than given invented fencing verdicts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 12:31:25 -07:00
gsxdsm
3d37cfa7db FN-9201: Prevent mobile nav lift when the iOS keyboard opens
Keep mobile bottom chrome pinned or hidden during keyboard focus transitions, including landscape phone layouts.

- track keyboard-focus intent before visual viewport metrics settle
- clamp focused iOS viewport offsets so fixed bars remain behind the keyboard
- cover runtime bootstrap, landscape integration, nav, focus, and offset behavior
- document the mobile keyboard layout contract and add a patch changeset

Files changed:
 .changeset/fn-9201-mobile-nav-keyboard-lift.md     |  7 ++
 docs/dashboard-guide.md                            |  4 +-
 packages/dashboard/app/App.tsx                     | 43 ++++++++--
 ...ile-nav-keyboard-landscape.integration.test.tsx | 91 ++++++++++++++++++++
 .../__tests__/icb-inline-script.runtime.test.ts    | 74 ++++++++++++++++
 .../mobile-bottom-bars-keyboard-layout.test.ts     | 15 +++-
 .../viewport-compensation-keyboard.test.ts         |  5 +-
 .../__tests__/MobileNavBar.keyboard-lift.test.tsx  | 65 ++++++++++++++
 .../__tests__/useKeyboardFocusPending.test.tsx     | 99 ++++++++++++++++++++++
 .../dashboard/app/hooks/useKeyboardFocusPending.ts | 43 ++++++++++
 packages/dashboard/app/index.html                  | 12 ++-
 .../utils/__tests__/mobileBarKeyboardFlags.test.ts | 22 +++++
 .../app/utils/__tests__/viewportOffset.test.ts     | 32 +++++++
 .../dashboard/app/utils/mobileBarKeyboardFlags.ts  | 10 ++-
 packages/dashboard/app/utils/viewportOffset.ts     |  8 ++
 15 files changed, 510 insertions(+), 20 deletions(-)

Fusion-Task-Id: FN-9201

Fusion-Task-Lineage: 4b3b01d3-8968-432b-9537-a63ee6bbde31

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-23 11:40:06 -07:00
gsxdsm
29f9edf153 test: declare branch-write provenance in reliability fixtures
Three more fixtures wrote a task branch without an origin, so the
`updateTaskUnlockedImpl` provenance boundary threw before any scenario ran —
the same guard, and the same missed-fixture class, as the shared reliability
helper fixed earlier. Each fixture binds a task to its worktree branch on the
engine's behalf, so each now says so.

worktree-lifecycle-certification 0/4 -> 4/4, audit-and-recovery 1/3 -> 3/3,
self-healing-interactions 6/7 -> 7/7.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 11:11:18 -07:00
gsxdsm
f2eda4819d docs: make a behavior change own the tests that assert the old behavior
Fusion agents keep shipping behavior changes that leave stale tests behind, and
targeted verification structurally cannot catch it: it runs the tests for the
files the agent TOUCHED, while the assertions encoding the old behavior live in
files it did not. Measured on one full engine suite run (2026-08-24): 297 failing
tests, ~135 of them from exactly five such changes — the FN-158 pre-merge-gate
guard (~70 fixtures across 13 files), the branch-write provenance guard (18 from
ONE shared fixture), a workflow-IR reorder (10 stale topology assertions), an
updateTaskAtomic seam missing from fake stores (~9), and FN-074's splitting
removal leaving 4 reviewer-prompt tests asserting a deleted contract. Every one
passed its own targeted verification.

- AGENTS.md: new standing rule with the four search triggers (guard added,
  feature removed, order/default/constant/prompt changed, public method added),
  a fix-at-the-shared-factory preference, and an explicit ban on weakening a
  stale test or restoring removed behavior to satisfy one.
- Executor prompt: the same searches, stated as a finish condition.
- Full triage prompt: specs for behavior-changing tasks must include a step that
  NAMES the search, so it is planned rather than left to chance.

The fast triage prompt is deliberately excluded: it carries a hard size budget
(agent-prompts.test.ts caps it at 7500 chars) and adding this pushed it over —
an instance of the very rule being documented, now cited in it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 11:02:02 -07:00
gsxdsm
339d849938 fix: classify legacy adoption review-lane literals
Mark isAtOrPastReviewLane as DELIBERATE-LITERAL so the lifecycle-column
census ratchet stops treating FN-158's physical pre-cutover lane IDs as
new unexamined guards. Refresh the pinned baseline to match.
2026-08-23 11:01:13 -07:00
gsxdsm
eade82f55d FN-9200: preserve docked chat sidebar width
Preserve docked chat behavior across tablet layouts and excluded one-pane hosts.

- Let the inline docked width remain authoritative in the tablet cascade.
- Expand behavioral coverage for viewport eligibility, host exclusions, persistence, resizing, rooms, and header controls.
- Add computed-style coverage for tablet and mobile sidebar widths.

Files changed:
 packages/dashboard/app/components/ChatView.css     |   5 +-
 .../__tests__/ChatView.docked-sidebar-css.test.tsx |  52 +++++
 .../__tests__/ChatView.docked-sidebar.test.tsx     | 212 ++++++++++++++++-----
 3 files changed, 220 insertions(+), 49 deletions(-)

Fusion-Task-Id: FN-9200

Fusion-Task-Lineage: 5e8100ea-1a60-42b5-a64a-5e33b7d4b2c7

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-23 10:35:53 -07:00
gsxdsm
4f40c91b38 test: drop reviewer-prompt tests for the deliberately removed splitting feature
Four tests asserted DEFAULT_REVIEWER_PROMPT still carried the task-SPLITTING
contract: "Subtask breakdown", "12+ implementation steps", "The bar for
splitting is high", and a REVISE directing the planner to fn_task_create 2-5
child tasks. FN-074 removed task splitting across core, dashboard, and engine,
and FN-125 removed the reviewer's ability to create tasks at all. FN-074's
message says it updated affected tests; these were missed and sat red asserting
a contract the product deliberately dropped.

Removed rather than repaired: restoring that prompt text to make them pass would
re-add removed behaviour. The two tests in this block covering the prompt
contract that still exists are untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 10:28:33 -07:00
gsxdsm
324145c1e1 test: repair engine fixtures that predate shipped product guards
The engine suite's failures are not independent bugs; they are a handful of
systemic drifts where a guard shipped and its fixtures were never updated.

- Required pre-merge gates (FN-158): the door refuses a card whose enabled
  optional groups produced no result, and the built-in workflow enables Plan and
  Code Review by default. Merge-mechanics fixtures now declare an explicit empty
  list, stating the intent they always had. group-merge-coordinator's
  "post-Code-Review member" instead gets real PASSING workflowStepResults,
  because recording the pass is what that fixture actually means.
- Branch-write provenance: the shared reliability fixture creates a task with a
  branch, which now requires an explicit origin. It stands in for an
  engine-created branch, so it says so.
- updateTaskAtomic: a production write seam missing from several fake stores,
  copied from the faithful fake in merger-ai.test.ts.
- Durable-write inventory: eight unclassified TaskStore surfaces classified,
  including the two batched reads this branch added.
- workflow-graph-merge-region-collapse asserted completion-summary AFTER
  code-review; the IR wires it before, and production logs agree.

merger-ai.test.ts alone goes 37 -> 0. Engine failures 288 -> ~200.

Also records a first-sighting suite-only flake in the observed register per the
standing rule, rather than quarantining a file with substantial coverage.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 10:18:50 -07:00
gsxdsm
323d55a43b FN-9196: Move archived chat toggle into filter row
Restyle the chat archive control as a compact, responsive filter-line toggle.

- Place the Archived toggle beside the tag filter with stable pressed-state semantics.
- Add token-based responsive styling for desktop, narrow, and mobile sidebars.
- Cover toggle behavior, selected-tag coexistence, and filter-row layout.
- Add a patch changeset for the published Fusion package.

Files changed:
 .changeset/chat-archived-filter-row.md             |  7 ++
 packages/dashboard/app/components/ChatView.css     | 17 +++-
 packages/dashboard/app/components/ChatView.tsx     | 44 +++++++---
 .../ChatView.archived-toggle-row.test.tsx          | 99 ++++++++++++++++++++++
 4 files changed, 151 insertions(+), 16 deletions(-)

Fusion-Task-Id: FN-9196

Fusion-Task-Lineage: 2bd3d000-84be-4798-9b73-de1feac40536

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-23 10:03:46 -07:00
gsxdsm
52d124bde2 FN-9195: Keep the chat composer visible above iOS keyboards
Keep Chat input reachable across software-keyboard viewport changes.

- Track visual viewport changes across phones, tablets, compact docks, and narrow floating Chat hosts.
- Clamp thread height using the measured host offset while preserving iOS focus behavior.
- Add regression coverage, shared viewport test helpers, operator documentation, and a patch changeset.

Files changed:
 .changeset/fn-9195-chat-ios-keyboard-composer.md   |   7 +
 docs/dashboard-guide.md                            |   2 +-
 packages/dashboard/app/components/ChatView.css     |  44 +--
 packages/dashboard/app/components/ChatView.tsx     |  43 ++-
 .../__tests__/ChatView.ios-keyboard.test.tsx       | 335 +++++++++++++++++++++
 .../components/__tests__/ChatView.test-harness.tsx | 103 ++++++-
 6 files changed, 506 insertions(+), 28 deletions(-)

Fusion-Task-Id: FN-9195

Fusion-Task-Lineage: cdada0cc-af6c-4cf8-8ffd-0940d280b07a

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-23 09:55:53 -07:00
gsxdsm
ea48af7ab5 fix: require a durable merge record for the step-finalization exemption
Full-suite set-diff against 3f448f7292 caught three regressions the raw counts
hid (that suite is chronically red: 297 failures at baseline, 294 with the
change).

The step exemption was too broad. It also applied to
recoverAlreadyMergedReviewTasks, the content-scan recovery where mergeDetails is
ABSENT and landing is inferred by finding matching content on the base branch.
That heuristic can match a cherry-pick, so exempting incomplete steps there
would launder a genuinely unfinished task to done on a guess — which is exactly
what landed-content-soft-blocker.real-git.test.ts exists to prevent. The
exemption now requires mergeConfirmed AND a commitSha: FN-9193's actual state,
and nothing weaker. Content-scan recovery and no-op merges keep the blocker.

Also seeds mergeSweepHoldReasons in the shared merge-lane fixture, which the
fixture-drift guard requires of every auto-merge state field.

Verified by set-diff: zero test files now fail that did not fail at baseline.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 09:45:10 -07:00
gsxdsm
a879ead0fc fix: let a proven merge finalize even with unfinished steps
FN-9193's branch landed on main as eaa1d47c, but a Code Review revision request
had reset its steps while the approved merge was in flight. The card was left
mergeConfirmed WITH incomplete steps, and every finalization site refused with
"task has incomplete steps" — so it sat failed, re-reading its own contradiction.
Restarting it made things worse: replanning issued seven fresh pending steps, so
the retry re-created the exact condition blocking it. A loop with no exit.

Holding a landed card out of done un-merges nothing; the code is on the target
branch either way. All four finalization sites now use
getMergeConfirmedFinalizationBlocker, which exempts incomplete steps once
landing is proven and records the unfinished ones on the task instead of
dropping them. A no-op merge that landed no content still blocks — that is the
protective half of the guard being replaced, and the executor's no-op branch
depends on it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 09:26:16 -07:00
gsxdsm
3857e0dc14 FN-9198: Fix narrow chat switcher dropdown rendering
Anchor the direct-conversation switcher to the visible thread header across narrow Chat surfaces.

- position narrow-host switcher menus relative to the thread header
- cover mobile, compact dock, floating, desktop, and empty-menu states
- add the shared 2px spacing token and document the corrected behavior
- add a patch changeset for the published Fusion package

Files changed:
 .../fn-9198-chat-title-switcher-menu-anchor.md     |   7 +
 docs/dashboard-guide.md                            |   2 +-
 .../app/components/ChatThreadTitleSwitcher.css     |  11 +-
 .../__tests__/ChatView.title-switcher.test.tsx     | 144 ++++++++++++++++++++-
 packages/dashboard/app/styles.css                  |   2 +
 5 files changed, 160 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-9198

Fusion-Task-Lineage: 9a1132d2-9b1a-4150-918a-085b42b22e02

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-23 09:21:10 -07:00
gsxdsm
46b329fed9 FN-9199: Replace chat text back marker with arrow icon
Use a consistent icon-and-label back affordance across direct and room chat threads.

- Render the lucide ArrowLeft icon with localized Back text and preserved accessible naming.
- Cover mobile direct and room thread back buttons with icon, text, and accessibility assertions.
- Add a patch changeset for the published Fusion package.

Files changed:
 .changeset/fix-chat-back-arrow.md                          |  6 ++++++
 packages/dashboard/app/components/ChatView.css             |  2 +-
 packages/dashboard/app/components/ChatView.tsx             | 14 ++++++++++++--
 .../app/components/__tests__/ChatView.mobile.test.tsx      |  4 +++-
 .../app/components/__tests__/ChatView.rooms.test.tsx       |  7 ++++++-
 5 files changed, 28 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-9199

Fusion-Task-Lineage: aab2a300-cc2a-4768-b60b-81d7477b8fab

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-23 09:13:23 -07:00
gsxdsm
bd93723d44 FN-9197: Add padding to the chat tag filter
Improve the chat sidebar tag filter spacing while preserving token-based styling.

- Align the tag filter select padding with the sidebar search input.
- Add a stylesheet regression test covering all ChatView hosts.
- Record the operator-facing fix in a patch changeset.

Files changed:
 .changeset/chat-tag-filter-padding.md              |  7 +++
 packages/dashboard/app/components/ChatView.css     | 10 +++-
 .../__tests__/ChatView.tag-filter-padding.test.ts  | 60 ++++++++++++++++++++++
 3 files changed, 75 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-9197

Fusion-Task-Lineage: e2220b2d-b7e5-4de9-8751-da8e3a4a9e69

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-23 09:04:29 -07:00
gsxdsm
038f802ba4 fix: make the workflow graph the only merge authority
ProjectEngine's in-review auto-merge sweep was a second merge authority. It
judged eligibility from column, status, steps and retry budget alone, with no
idea where the card sat in its workflow graph, so it merged work the graph had
never authorized: FN-9191 merged ~2s after fn_task_done, before Code Review had
ever started, and FN-9193 merged while Code Review was re-running — the gate
then requested revision and reset the steps, but the in-flight merge landed the
pre-remediation branch anyway and left the card mergeConfirmed WITH incomplete
steps, unfinalizable for five hours.

- classifyMergeSweepAdmission (core) admits only merge-confirmed finalization,
  a card parked at a merge-region node, an interrupted attempt, or a fenced
  quiescent stall. Every initiation is fenced on satisfied pre-merge gates.
- All four doors prove authority: the sweep, the 300ms column-entry handoff
  (which matches FN-9191's timing better than any sweep tick), the unpause
  re-enqueue, and a position-only pre-dispatch re-check for cards the graph
  moved out of the merge lane while they were queued.
- workflow-merge-region.ts holds the canonical merge-region predicate;
  INTERPRETER_ENTRY_NODE_KINDS now aliases it so the two cannot drift.
- Multi-repo: branch-group integration/promotion are merge-region nodes, an
  in-flight sub-repo land reads as foreign liveness, and a cross-node
  merge-dispatch lease defers.
- Sweep reads are batched, so admission costs O(1) queries per poll.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 03:29:32 -07:00
gsxdsm
3f448f7292 FN-9194: fix mailbox task ID interpolation
Show concrete destination IDs in mailbox task links instead of leaking untranslated placeholders.

- Pass the catalog's `id` variable to visible and accessible task-link labels.
- Cover shared links and all mailbox host, viewport, and conversation-layout surfaces with the shipping catalog.
- Document the task-link label and add a patch changeset.

Files changed:
 .changeset/fn-9194-mailbox-task-link-id.md         |   7 ++
 docs/dashboard-guide.md                            |   2 +-
 .../app/components/MailboxRelatedWorkLink.tsx      |   9 +-
 .../__tests__/MailboxRelatedWorkLink.test.tsx      |  50 ++++++++
 .../MailboxTaskLinkInterpolation.surfaces.test.tsx | 128 +++++++++++++++++++++
 5 files changed, 193 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-9194

Fusion-Task-Lineage: d7afd16a-c951-40c4-aa12-d7b56f9cba7e

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-23 01:16:35 -07:00
gsxdsm
eaa1d47cf0 FN-9193: add docked chat conversation sidebar
Add a persistent, resizable conversation sidebar to non-floating chat on tablet and desktop layouts.

- Keep conversation lists visible beside selected direct and room threads on eligible viewports.
- Persist sidebar visibility and width while preserving mobile, compact, and floating one-pane behavior.
- Add responsive styling, operator documentation, a release changeset, and focused regression coverage.

Files changed:
 .changeset/fn-9193-chat-docked-sidebar.md          |   7 ++
 docs/dashboard-guide.md                            |  12 +-
 packages/dashboard/app/components/ChatView.css     |  58 +++++++++-
 packages/dashboard/app/components/ChatView.tsx     | 120 ++++++++++++++++---
 .../__tests__/ChatView.docked-sidebar.test.tsx     | 128 +++++++++++++++++++++
 .../__tests__/ChatView.sessions-rooms.test.tsx     |  29 ++---
 .../components/__tests__/ChatView.test-harness.tsx |  41 ++++++-
 7 files changed, 360 insertions(+), 35 deletions(-)

Fusion-Task-Id: FN-9193

Fusion-Task-Lineage: 58266e56-9d09-4472-98f4-f9d1d80635a7

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-22 21:13:02 -07:00
gsxdsm
0fc2c23f24 FN-9192: add direct chat title switcher
Make Direct conversation titles open an in-place, keyboard-accessible chat switcher.

- Add a responsive title dropdown with pinned, recent, unread, and active conversation states.
- Reuse existing session-selection and back-navigation paths from ChatView.
- Cover interaction, ordering, limits, keyboard behavior, and Room-title exclusions.
- Document the switcher and add a minor release changeset.

Files changed:
 .changeset/fn-9192-chat-title-switcher.md          |   7 +
 docs/dashboard-guide.md                            |   4 +
 .../app/components/ChatThreadTitleSwitcher.css     | 139 +++++++++++++++
 .../app/components/ChatThreadTitleSwitcher.tsx     | 191 +++++++++++++++++++++
 packages/dashboard/app/components/ChatView.tsx     |  17 +-
 .../__tests__/ChatView.title-switcher.test.tsx     | 171 ++++++++++++++++++
 6 files changed, 528 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-9192

Fusion-Task-Lineage: 1e499595-6d82-4ba3-8599-2470d2e89429

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-22 20:37:46 -07:00
gsxdsm
3af54418cf FN-9191: add the Iceberg dashboard theme
Add a persisted Iceberg palette across dashboard and desktop theme surfaces.

- Define coordinated dark and light Iceberg color tokens and selector swatches.
- Register Iceberg in shared persistence, theme selectors, and first-paint validation.
- Add registry coverage, documentation, visual references, and a release changeset.

Files changed:
 .changeset/fn-9191-iceberg-theme.md                |   6 ++
 docs/dashboard-guide.md                            |   5 +-
 docs/settings-reference.md                         |   4 +-
 packages/core/src/types/ui/execution-and-ui.ts     |   2 +
 .../dashboard/app/__tests__/iceberg-theme.test.ts  | 102 +++++++++++++++++++++
 .../dashboard/app/components/ThemeSelector.css     |  15 +++
 .../components/__tests__/ThemeDropdown.test.tsx    |   3 +-
 .../components/__tests__/ThemeSelector.test.tsx    |   3 +-
 .../__tests__/CommandCenterControls.test.tsx       |   3 +-
 packages/dashboard/app/components/themeOptions.ts  |   2 +
 packages/dashboard/app/index.html                  |   3 +-
 packages/dashboard/app/public/theme-data.css       |  85 +++++++++++++++++
 packages/desktop/src/renderer/index.html           |   2 +
 screenshots/fn-9191-iceberg-theme-dark.png         |   3 +
 screenshots/fn-9191-iceberg-theme-light.png        |   3 +
 15 files changed, 234 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-9191

Fusion-Task-Lineage: a8b441c6-763a-4c38-a682-bffab1fdd293

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-22 19:43:45 -07:00
gsxdsm
012d42008f chore(release): v0.77.0-beta.7
Version bump via changesets.
2026-08-22 19:27:22 -07:00
gsxdsm
b47fb70b81 fix: defer merge on unrun pre-merge gates instead of failing the task
An enabled pre-merge gate that has not reported yet is a not-yet condition,
not a failure. FN-9191 proved the difference is load-bearing: the in-review
auto-merge sweep enqueued the card ~2s after fn_task_done and ~18s before the
graph started its own Code Review node, the merge door correctly refused, and
the auto-merge error path parked it status="failed". Code Review APPROVED two
minutes later, but every subsequent merge — including the graph's own merge
node — then died on "task is marked 'failed'".

- Merge doors throw the typed PreMergeStepsNotRunError for that blocker.
- The auto-merge error path treats it as a deferral: no status write, no
  mergeRetries burn, no operator handoff.
- enqueueEligibleInReviewTasks holds a card out of the merge queue until every
  enabled pre-merge group has a result, so the race stops at admission.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 19:23:15 -07:00
gsxdsm
3edb843f9b fix: start tailscaled in Docker image and preflight tailscale daemon readiness
Tailscale remote access failed in the container with a bare "process exited 1":
the image ships the `tailscale` CLI but nothing ever ran `tailscaled`, so the
`tailscale funnel <port>` spawn died instantly on "failed to connect to local
tailscaled".

- Add scripts/docker-entrypoint.sh, which best-effort starts tailscaled in
  userspace-networking mode (needs neither NET_ADMIN nor /dev/net/tun, so the
  documented `docker run` is unchanged) and then execs the CLI with CMD verbatim.
  Opt out with FUSION_DISABLE_TAILSCALED=1.
- Symlink /var/lib/tailscale into /home/node/.tailscale so the documented
  `-v <vol>:/home/node` mount persists the node login across container recreates,
  and pre-create the daemon's socket/log paths node-owned before the USER switch.
- Preflight daemon reachability and backend state with `tailscale status --json`
  in evaluateRemoteLifecycle instead of only `which tailscale`, so unreachable,
  logged-out, and stopped backends all report an actionable
  runtime_prerequisite_missing reason rather than an unexplained exit 1.

Regression coverage asserts the invariant across all three unusable-backend
surfaces, not just the reported container repro.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 19:09:41 -07:00
gsxdsm
d71aa0d189 test: update schema-applier PG test for migrations 0061-0064
Migrations 0061 (activity-log task-id index), 0062 (remove task/subtask
splitting), 0063 (AI merge review reconciliation), and 0064 (task repository
scope) advanced SCHEMA_BASELINE_VERSION to 0064 without updating this
non-gate PG integration test, leaving it red on the non-blocking suite:

- Bump the immutable-identity assertion to 0064 and pin 0062-0064 identities.
- Append the four new versions to all five getAppliedMigrations() lists.
- Add central.central_activity_log to the hand-built 0000 upgrade fixture so
  the 0061 index migration finds the relation real 0000 DBs have from
  0000_initial.sql (fixture gap, not a product regression).
2026-08-22 18:41:30 -07:00
Fusion Agent
bd7a41315c fix(FN-158): remove residual conflict marker
Fusion-Task-Id: FN-158
2026-08-23 01:38:45 +00:00
Fusion Agent
9d8c14b4e8 FN-165: use session context usage for chat indicator
Use provider-reported pi session context usage to drive the Chat context indicator.

- Track measured and pending session context usage in the dashboard.
- Expose bounded context metadata from chat sessions and update token estimation.
- Add regression coverage, localized labels, documentation, and a changeset.

Files changed:
 .changeset/fn-165-chat-context-usage.md            |  7 ++
 docs/dashboard-guide.md                            |  4 +-
 packages/dashboard/app/components/ChatView.tsx     | 49 ++++++++----
 .../__tests__/ChatView.context-window.test.tsx     | 84 +++++++++++++++++++-
 .../app/utils/__tests__/chatContextUsage.test.ts   | 66 ++++++++++++++++
 .../app/utils/__tests__/estimateChatTokens.test.ts | 10 +++
 packages/dashboard/app/utils/chatContextUsage.ts   | 73 ++++++++++++++++++
 packages/dashboard/app/utils/estimateChatTokens.ts | 39 ++++++++--
 .../dashboard/src/__tests__/chat-manager.test.ts   | 89 +++++++++++++++++++++
 packages/dashboard/src/chat.ts                     | 65 +++++++++++++---
 packages/i18n/locales/en/app.json                  |  3 +
 packages/i18n/locales/es/app.json                  |  3 +
 packages/i18n/locales/fr/app.json                  |  3 +
 packages/i18n/locales/ko/app.json                  |  3 +
 packages/i18n/locales/pt-BR/app.json               |  3 +
 packages/i18n/locales/zh-CN/app.json               |  3 +
 packages/i18n/locales/zh-TW/app.json               |  3 +
 packages/i18n/src/resources.d.ts                   | 19 +++--
 18 files changed, 483 insertions(+), 43 deletions(-)

Fusion-Task-Id: FN-165

Fusion-Task-Lineage: a95a9c7f-80aa-41be-8807-1fbd383f0f1d

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:37:58 +00:00
Fusion Agent
bfaa0f42da FN-158: enforce workspace multi-repo merge boundaries
Support workspace tasks across a shared root with scope-driven repositories and verifiable merge gates.

- Route task work through one workspace directory with per-repository acquisition and isolation.
- Add sandbox session policies and per-repository verification command handling.
- Enforce required pre-merge checks and honest merge blocking for workspace changes.
- Update workspace, workflow, and sandbox documentation and release metadata.

Files changed:
 .changeset/fn-158-workspace-single-root.md         |   7 +
 docs/sandbox.md                                    |   6 +-
 docs/workflow-steps.md                             |   6 +-
 docs/workspaces.md                                 |  12 +-
 .../core/src/__tests__/legacy-adoption.test.ts     |  15 +-
 .../src/__tests__/required-pre-merge-steps.test.ts |  25 ++++
 .../core/src/__tests__/store-bypass-review.test.ts |  24 ++-
 packages/core/src/__tests__/task-merge.test.ts     |  24 +++
 .../core/src/__tests__/worktree-layout.test.ts     |  29 ++++
 packages/core/src/db/legacy-adoption.ts            |  20 ++-
 packages/core/src/index.gate.ts                    |   4 +
 packages/core/src/index.ts                         |   4 +
 .../core/src/merge/required-pre-merge-steps.ts     |  26 ++++
 packages/core/src/merge/task-merge.ts              |  35 ++++-
 packages/core/src/store.ts                         |  59 ++++++--
 packages/core/src/task-store/lifecycle-ops.ts      |   1 +
 packages/core/src/task-store/merge-queue-ops.ts    |   5 +-
 packages/core/src/task-store/moves.ts              |  13 +-
 packages/core/src/task-store/task-artifacts-ops.ts |  11 +-
 packages/core/src/tasks/worktree-layout.ts         |  43 +++++-
 packages/core/src/types/workflow/workflow-steps.ts |   3 +-
 .../executor-workspace-session-cwd.test.ts         |  42 ++++--
 .../src/__tests__/node-worktree-isolation.test.ts  |  13 +-
 .../src/__tests__/pi-create-fn-agent.test.ts       |  16 ++
 .../engine/src/__tests__/project-engine.test.ts    |  20 ++-
 .../src/__tests__/reviewer-workspace.test.ts       |  30 +++-
 .../src/__tests__/run-verification-command.test.ts |  90 +++++++++++-
 .../__tests__/sandbox/sandbox-exec-policy.test.ts  |  16 +-
 .../src/__tests__/sandbox/session-policy.test.ts   |  45 ++++++
 .../__tests__/workspace-add-repo-midflight.test.ts |   9 ++
 .../engine/src/__tests__/workspace-e2e.test.ts     |  13 +-
 .../workspace-root-worktree-routing.test.ts        |  18 +--
 packages/engine/src/agent-tools.ts                 |  15 +-
 packages/engine/src/agents/agent-runtime.ts        |  19 +++
 .../engine/src/agents/agent-session-helpers.ts     |  15 ++
 packages/engine/src/execution/hold-release.ts      |  29 ++++
 .../engine/src/execution/run-verification-tool.ts  | 114 ++++++++++++++-
 .../create-authoritative-workflow-seams.ts         |  20 +--
 packages/engine/src/executor/deps-bags.ts          |   5 +-
 .../executor/ensure-graph-custom-node-worktree.ts  |  24 ++-
 .../executor/ensure-task-worktree-for-planning.ts  |  36 ++---
 .../engine/src/executor/execute-workflow-step.ts   |   4 +-
 .../src/executor/finalize-already-reviewed-task.ts |   6 +-
 .../src/executor/prepare-graph-node-execution.ts   |  14 +-
 .../engine/src/executor/run-graph-custom-node.ts   | 161 +++++++++++++--------
 packages/engine/src/executor/run-implementation.ts | 117 ++++++++++++---
 packages/engine/src/merge/merger-ai.ts             |  16 +-
 packages/engine/src/merger.ts                      |  20 ++-
 packages/engine/src/pi.ts                          | 150 ++++++++++++++++---
 packages/engine/src/project-engine.ts              |  10 +-
 packages/engine/src/runtimes/in-process-runtime.ts |   4 +-
 packages/engine/src/sandbox/bubblewrap-backend.ts  |  55 ++++++-
 packages/engine/src/sandbox/bubblewrap-policy.ts   |  10 +-
 packages/engine/src/sandbox/index.ts               |   1 +
 .../engine/src/sandbox/sandbox-exec-backend.ts     |  45 +++++-
 packages/engine/src/sandbox/sandbox-exec-policy.ts |  18 ++-
 packages/engine/src/sandbox/session-policy.ts      |  41 ++++++
 packages/engine/src/sandbox/types.ts               |  11 ++
 packages/engine/src/self-healing.ts                |   1 +
 packages/engine/src/triage.ts                      |  10 ++
 .../engine/src/worktree/worktree-acquisition.ts    |  53 ++++---
 61 files changed, 1393 insertions(+), 315 deletions(-)

Fusion-Task-Id: FN-158

Fusion-Task-Lineage: ba57f5a2-fa69-4210-8ea7-3d124be3deb2

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:37:58 +00:00
Fusion Agent
7d54e86e80 FN-159: filter AI merge protocol markers from blocking findings
Prevent the AI merge reviewer from persisting its own protocol syntax as blocking review findings.

- Register and filter all review protocol markers and disposition lines.
- Aggregate reviewer prose into bounded findings and preserve reconciliation safety.
- Release prior findings that are not re-confirmed on approved candidates.
- Add reconciliation state, tests, documentation, and a patch changeset.

Files changed:
 .../fn-159-ai-merge-protocol-marker-findings.md    |  7 ++
 docs/architecture.md                               |  2 +-
 packages/core/src/types/task/task-core.ts          |  6 ++
 .../engine/src/__tests__/merger-ai-prompts.test.ts | 39 ++++++++++
 .../src/__tests__/merger-ai-squash-gates.test.ts   |  6 ++
 .../engine/src/__tests__/merger-ai.test.ts         | 58 +++++++++++++++
 .../engine/src/__tests__/workspace-merger.test.ts  |  3 +-
 packages/engine/src/merge/merger-ai-prompts.ts     | 53 +++++++++++---
 packages/engine/src/merge/merger-ai.ts             | 84 ++++++++++++++++++----
 9 files changed, 231 insertions(+), 27 deletions(-)

Fusion-Task-Id: FN-159

Fusion-Task-Lineage: 6eea1dec-1252-4b8d-b227-c84c24ab60af

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:36:33 +00:00
Fusion Agent
794dae3196 fix(FN-149): advance schema ceiling to 0065 so Fusion stops rejecting its own database
FN-149 shipped migration 0065_fn_149_review_convergence_stage.sql and registered
REVIEW_CONVERGENCE_STAGE_VERSION but left SCHEMA_BASELINE_VERSION at "0064". The first
store open applied and recorded 0065; the next open (project store, same boot) hit
assertBinaryNotOlderThanDatabase, saw 0065 > 0064 and threw StaleBinarySchemaError, so
every startup died with "this binary only knows up to 0064" on fresh and upgraded
databases alike.

- Bump SCHEMA_BASELINE_VERSION to "0065" (marker only: applies no SQL, touches no data).
- Move the DB-free migration-wiring assertions out of the PostgreSQL integration file
  into src/__tests__/migration-wiring-integrity.test.ts and wire it into test:unit-gate,
  so the ceiling/migration drift now fails the merge gate instead of main's boot.
- Refresh the stale migration-identity expectations (0062-0065).

Symptom verification: `node scripts/dev-with-memory.mjs --isolated=<tmp> --prebuild none`
exited 1 with the guard error before; it now boots and serves the dashboard.
2026-08-23 01:36:33 +00:00
Fusion Agent
c1818ea819 FN-151: make task reset always complete
Make reset a reliable description-only fresh start by fencing active planning work and cleaning discarded execution state.

- Add reset lifecycle disposal for planning sessions, locks, artifacts, and reset worktrees.
- Preserve operator-provided descriptions while clearing stale execution and planning projections.
- Expose reset routes and add core, dashboard, and engine regression coverage.

Files changed:
 .changeset/fn-151-task-reset-always-completes.md   |   7 +
 docs/architecture.md                               |   3 +
 docs/dashboard-guide.md                            |   6 +-
 .../postgres/task-reset-publication.pg.test.ts     |  71 +++++++++-
 .../core/src/__tests__/task-move-disposer.test.ts  |  38 ++++++
 packages/core/src/index.gate.ts                    |   2 +
 packages/core/src/index.ts                         |   2 +
 packages/core/src/task-store/reset-lifecycle.ts    |  38 +++++-
 packages/core/src/tasks/task-move-disposer.ts      |  36 +++++-
 .../src/__tests__/task-reset-lifecycle.test.ts     | 110 +++++++++++++++-
 .../src/routes/register-task-workflow-routes.ts    |  29 +++--
 .../src/__tests__/agent-document-tools.test.ts     |  49 +++++++
 .../src/__tests__/reset-worktree-removal.test.ts   |  77 +++++++++++
 .../__tests__/triage-reset-planning-fence.test.ts  | 118 +++++++++++++++++
 packages/engine/src/agent-tools.ts                 |  60 +++++++--
 packages/engine/src/agents/planning-liveness.ts    |  19 +++
 packages/engine/src/index.ts                       |   4 +
 packages/engine/src/plan-artifact-writeback.ts     |  27 +++-
 packages/engine/src/planning-reset-fence.ts        |  26 +++
 packages/engine/src/triage.ts                      | 143 +++++++++++++++++++--
 packages/engine/src/worktree/remove-reset-worktree.ts   |  65 ++++++++++
 21 files changed, 882 insertions(+), 48 deletions(-)

Fusion-Task-Id: FN-151

Fusion-Task-Lineage: 1c25d58e-2d23-4340-a489-51f3e2d8a7f4

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:36:32 +00:00
Fusion Agent
a786c45bb9 FN-149: converge review cycles before human escalation
Add bounded review convergence so disputed review gates can resolve independently before requiring operator intervention.

- Add staged remediation, arbitration, dispute tooling, and stale-attempt fencing.
- Preserve review history and findings while exposing convergence state in core, dashboard, and audit paths.
- Add migration, configuration, documentation, changeset, and regression coverage.

Files changed:
 .changeset/fn-149-review-convergence.md            |   7 +
 AGENTS.md                                          |   2 +
 docs/architecture.md                               |   4 +
 docs/dashboard-guide.md                            |   4 +
 docs/run-audit.md                                  |   4 +
 docs/settings-reference.md                         |   4 +
 docs/workflow-steps.md                             |   8 +
 .../src/__tests__/default-workflow-hooks.test.ts   |  13 +
 packages/core/src/__tests__/plan-approval.test.ts  |  21 ++
 .../src/__tests__/reopen-semantics-by-role.test.ts |  25 ++
 packages/core/src/__tests__/review-severity-gate.test.ts     |  18 +-
 packages/core/src/__tests__/workflow-step-results.test.ts    |  52 +++-
 packages/core/src/config/settings-schema.ts        |   6 +
 packages/core/src/index.gate.ts                    |   9 +
 packages/core/src/index.ts                         |   9 +
 packages/core/src/planner/plan-approval.ts         |  27 +-
 .../0065_fn_149_review_convergence_stage.sql       |   3 +
 packages/core/src/postgres/schema-applier.ts       |  10 +
 packages/core/src/postgres/schema/project.ts       |   2 +
 packages/core/src/store.ts                         |   2 +-
 packages/core/src/task-store/persistence.ts        |   4 +
 packages/core/src/task-store/reset-lifecycle.ts    |   2 +
 packages/core/src/task-store/serialization.ts      |   2 +
 packages/core/src/task-store/task-mutation-ops.ts  |   2 +-
 packages/core/src/task-store/task-row-mappers.ts   |   2 +-
 packages/core/src/task-store/task-update.ts        |   4 +
 packages/core/src/tasks/in-review-stall.ts         |  21 ++
 packages/core/src/tasks/manual-retry-reset.ts      |   2 +
 packages/core/src/types/settings/settings-scope.ts |   7 +
 packages/core/src/types/task/task-core.ts          |   3 +
 packages/core/src/types/task/task-review.ts        |   2 +-
 packages/core/src/types/workflow/workflow-steps.ts |  24 +-
 .../src/workflows/builtin-workflow-settings.ts     |  43 +++
 .../core/src/workflows/default-workflow-hooks.ts   |  10 +-
 .../core/src/workflows/workflow-step-results.ts    | 185 ++++++++++++-
 .../dashboard/app/components/TaskReviewTab.tsx     |   6 +-
 .../components/__tests__/TaskReviewTab.test.tsx    |   6 +-
 .../dashboard/src/__tests__/routes-tasks.test.ts   |   7 +
 .../src/routes/register-task-workflow-routes.ts    |   4 +-
 .../__tests__/review-arbitration-release.test.ts   |  46 ++++
 .../src/__tests__/review-arbitration.test.ts       |  57 ++++
 .../__tests__/review-convergence-context.test.ts   |  95 +++++++
 .../review-convergence-escalation.test.ts          | 135 +++++++++
 .../src/__tests__/review-dispute-tool.test.ts      | 113 +++++++
 .../__tests__/review-finding-supersession.test.ts  |  55 ++-
 .../review-findings-injection.test.ts              |  19 +-
 .../__tests__/review-history-preservation.test.ts  | 186 +++++++++++++
 .../__tests__/review-ladder-entry-points.test.ts   | 304 +++++++++++++++++++++
 ...un-audit-sink-health-review-convergence.test.ts | 251 +++++++++++++++++
 .../workflow-graph-optional-step-fix.test.ts       |  59 ++--
 packages/engine/src/execution/replan-target.ts     |   6 +-
 .../clear-terminal-step-failures-for-retry.ts      |   8 +-
 .../src/executor/create-review-dispute-tool.ts     | 126 +++++++++
 packages/engine/src/executor/deps-bags.ts          |   2 +-
 .../engine/src/executor/execute-workflow-graph.ts  |  71 ++++-
 packages/engine/src/executor/execute-workflow-step.ts   |  16 +-
 packages/engine/src/executor/free-reexports.ts     |   1 +
 packages/engine/src/executor/impl-bindings.ts      |   1 +
 .../engine/src/executor/optional-step-revision.ts  |  33 ++-
 .../src/executor/recover-failed-pre-merge-step.ts  |  43 ++-
 .../request-pre-merge-optional-step-fix.ts         |  85 +++---
 packages/engine/src/executor/review-arbitration.ts | 233 +++++++++++++++
 .../src/executor/review-convergence-ladder.ts      | 237 +++++++++++++++
 .../route-graph-failure-to-execution-resume.ts     |  16 +-
 .../route-retryable-remediation.ts                 |   9 +-
 .../engine/src/executor/run-graph-custom-node.ts   |   1 +
 packages/engine/src/executor/run-implementation.ts |   2 +
 .../src/executor/task-executor-session-facades.ts  |   3 +-
 .../engine/src/executor/workflow-rerun-bounce.ts   |  13 +-
 .../executor/workflow-step-failure-injection.ts    |  23 +-
 .../engine/src/executor/workflow-step-failures.ts  |  16 +-
 .../engine/src/executor/workflow-step-verdict.ts   |   2 +
 packages/engine/src/self-healing.ts                |   5 +-
 packages/engine/src/util/run-audit.ts              |   9 +-
 .../src/workflows/workflow-graph-executor.ts       |   8 +-
 .../engine/src/worktree/review-diff-fingerprint.ts |  21 +++
 .../src/worktree/workspace-review-evidence.ts      |   9 +-
 77 files changed, 2719 insertions(+), 166 deletions(-)

Fusion-Task-Id: FN-149
Fusion-Task-Lineage: 9330df9d-5086-4b40-8daa-66f0ea31cf3e
Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:36:32 +00:00
Fusion Agent
e67403cd6a FN-155: add expandable thinking traces to transcripts
Add a reusable expandable thinking trace across chat and agent transcript surfaces.

- Add the ThinkingTrace component, styling, localized labels, and documentation.
- Render trace sections across chat, planning, mission, milestone, workflow, and agent log views.
- Preserve streaming trace data and add regression and surface coverage.

Files changed:
 .changeset/fn-155-thinking-trace.md                |   7 ++
 docs/dashboard-guide.md                            |   4 +
 .../dashboard/app/components/AgentLogViewer.tsx    |  11 +-
 packages/dashboard/app/components/ChatView.css     |  10 +-
 .../app/components/ConversationHistory.tsx         |   3 +-
 .../components/MilestoneSliceInterviewModal.tsx    |   3 +-
 .../app/components/MissionInterviewModal.tsx       |   3 +-
 .../dashboard/app/components/PlanningModeModal.tsx |   9 +-
 .../app/components/StandardChatSurface.tsx         |  21 ++--
 packages/dashboard/app/components/TaskChatTab.tsx  |  17 +--
 .../dashboard/app/components/ThinkingTrace.css     |   7 ++
 .../dashboard/app/components/ThinkingTrace.tsx     |  99 ++++++++++++++++++
 .../app/components/WorkflowResultsTab.tsx          |   4 +
 .../__tests__/ChatView.core-interactions.test.tsx  |  25 +++++
 .../MilestoneSliceInterviewModal.test.tsx          |  15 ++-
 .../__tests__/MissionInterviewModal.test.tsx       |  15 ++-
 .../PlanningModeModal.planning-flow.test.tsx       |  33 +++++-
 .../app/components/__tests__/TaskChatTab.test.tsx  |  16 +++
 .../__tests__/ThinkingTrace.surfaces.test.tsx      |  70 +++++++++++++
 .../components/__tests__/ThinkingTrace.test.tsx    | 115 +++++++++++++++++++++
 .../dashboard/src/__tests__/chat-manager.test.ts   |  11 ++
 packages/engine/src/__tests__/agent-logger.test.ts |  15 +++
 packages/engine/src/__tests__/streaming-delta.test.ts   |  13 +++
 packages/engine/src/execution/streaming-delta.ts   |   4 +
 packages/i18n/locales/en/app.json                  |   8 ++
 packages/i18n/locales/es/app.json                  |   8 ++
 packages/i18n/locales/fr/app.json                  |   8 ++
 packages/i18n/locales/ko/app.json                  |   8 ++
 packages/i18n/locales/pt-BR/app.json               |   8 ++
 packages/i18n/locales/zh-CN/app.json               |   8 ++
 packages/i18n/locales/zh-TW/app.json               |   8 ++
 packages/i18n/src/resources.d.ts                   |   8 ++
 32 files changed, 539 insertions(+), 55 deletions(-)

Fusion-Task-Id: FN-155

Fusion-Task-Lineage: 2aafff54-2146-4480-874b-393dc991d52b

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:36:13 +00:00
Fusion Agent
e5ac9c385a FN-152: repair local PostgreSQL test provisioning
Repair embedded PostgreSQL test-server staging and diagnostics for reliable local and worktree test runs.

- Stage native PostgreSQL runtime files before startup and manage lifecycle state safely.
- Add provisioning diagnostics, harness integration, regression tests, and troubleshooting documentation.
- Expose PostgreSQL test-server lifecycle commands through package scripts.

Files changed:
 ...server-libdir-plpgsql-and-missing-login-role.md |  15 +
 docs/testing.md                                    |  10 +
 package.json                                       |   3 +
 .../__test-utils__/pg-provisioning-diagnostics.ts  |  25 ++
 .../core/src/__test-utils__/pg-test-harness.ts     |   5 +
 .../__tests__/pg-provisioning-diagnostics.test.ts  |  30 ++
 .../__tests__/reliability-interactions/_helpers.ts |  17 +-
 scripts/__tests__/pg-test-server.test.mjs         |  73 +++++
 scripts/pg-test-server.mjs                        | 332 +++++++++++++++++++++
 9 files changed, 505 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-152

Fusion-Task-Lineage: ead05f6e-00fc-42a0-8599-bf4cb2269527

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:36:12 +00:00
Fusion Agent
d42a60ea06 FN-142: fix plan confirmation read-back and no-op routing
Make plan persistence confirmations observe the filesystem-backed prompt and let valid no-op reviews terminate cleanly.\n\n- Verify PROMPT.md by querying the task after writes across planning and review surfaces.\n- Add coverage for workspace scope, duplicate plans, failed read-backs, and mirror failures.\n- Route CLOSE_NO_OP Plan Review outcomes through an explicit terminal workflow action.\n- Document the persistence failure mode and publish a patch changeset.\n\nFiles changed:\n .changeset/fn-142-prompt-write-read-back.md        |   7 ++\n .../prompt-write-read-back-queries-the-task-row.md |  51 +++++++++++\n .../core/src/__tests__/builtin-workflows.test.ts   |  22 +++++\n packages/core/src/workflows/builtin-workflows.ts   |  12 +++\n .../src/__tests__/agent-document-tools.test.ts     | 101 ++++++++++++++++++++-\n .../__tests__/plan-prompt-write-surfaces.test.ts   |  77 +++++++++++++++\n packages/engine/src/agent-tools.ts                 |  15 ++-\n 7 files changed, 283 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-142

Fusion-Task-Lineage: adddffb3-8786-4372-996a-eefef176f31b

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:36:12 +00:00
Fusion Agent
33f4797ceb FN-126: fix inert sync-lane validation
Prevent inert synchronization lanes from bypassing merge-gate validation while preserving task-lane cache and archive lifecycle behavior.

- Reject sync-resolved lane conversions in the static validator.
- Preserve task-lane cache emissions and active-session cleanup across task mutations and archival.
- Add regression coverage, baseline updates, documentation, and a release changeset.

Files changed:
 .changeset/fn-126-inert-sync-lane.md               |   7 +
 .../a-falling-count-is-not-evidence.md             |  12 +
 .../task-lane-cache-emitter-preservation.test.ts   | 269 +++++++++++++++++++++
 .../core/src/task-store/archive-lifecycle-2.ts     |   3 +-
 packages/core/src/task-store/moves.ts              |   3 +-
 packages/core/src/task-store/task-artifacts-ops.ts |   3 +-
 packages/core/src/task-store/task-update.ts       |   3 +-
 packages/core/src/task-store/update-task-deps.ts   |   3 +-
 ...xecutor-archive-releases-active-session.test.ts |  80 ++++++
 packages/engine/src/executor.ts                    |   4 +-
 .../src/executor/executor-side-effect-hosts.ts     |   2 +-
 .../executor/is-backward-move-out-of-planning.ts   |   7 +-
 .../src/executor/task-executor-graph-facades.ts    |   2 +-
 .../engine/src/executor/task-executor-imports.ts   |   1 -
 .../engine/src/executor/wire-executor-lifecycle.ts |  18 +-
 .../check-inert-sync-lane-conversions.test.mjs     |  83 +++++--
 scripts/check-inert-sync-lane-conversions.mjs      |  19 +-
 scripts/lib/inert-sync-lane-baseline.json          |   6 +-
 18 files changed, 479 insertions(+), 46 deletions(-)

Fusion-Task-Id: FN-126

Fusion-Task-Lineage: 0c7a1a3a-9446-44f8-955d-df6c402dfd31

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:36:12 +00:00
Fusion Agent
8b681775ae FN-122: fix local workspace integration across repositories
Make multi-repository workspace merges resolve and land against the correct local integration targets.

- Add local integration-target resolution and durable merge-dispatch leasing.
- Harden workspace merge fencing, failure handling, audit logging, and CLI/dashboard controls.
- Document the workflow and add regression coverage for workspace integration and task-log deduplication.
- Complete the CLI engine mock for the new public lease export.

Files changed:
 .changeset/fn-122-local-workspace-integration.md   |   7 +
 docs/architecture.md                               |   1 +
 docs/dashboard-guide.md                            |   4 +
 docs/settings-reference.md                         |   4 +-
 docs/testing.md                                    |  10 ++
 .../task-command-github-import-tracking.test.ts    |   2 +
 packages/cli/src/commands/__tests__/task.test.ts   |   1 +
 packages/cli/src/commands/dashboard.ts             |  15 +-
 packages/cli/src/commands/task.ts                  |  14 +-
 .../__tests__/postgres/task-log-dedupe.pg.test.ts  |  30 ++++
 packages/core/src/index.ts                         |   2 +-
 packages/core/src/store.ts                         |   5 +-
 packages/core/src/task-store/audit-ops.ts          |  38 ++++
 packages/core/src/types.ts                         |   2 +
 packages/core/src/types/task/task-core.ts          |  16 +-
 packages/core/src/types/task/task-log.ts           |   2 +
 .../app/components/WorkspaceWorktreesSummary.tsx   |  15 +-
 .../settings/sections/WorktreesSection.tsx         |   3 +-
 .../engine/src/__tests__/workspace-e2e.test.ts     | 198 ++++++++++++++++-----
 .../__tests__/workspace-integration-target.test.ts |  75 ++++++++
 .../src/__tests__/workspace-merger-lease.test.ts   |  42 ++++-
 packages/engine/src/index.ts                       |   6 +
 packages/engine/src/merge/merger-ai.ts             | 152 +++++++++++-----
 packages/engine/src/merge/workspace-fence-ref.ts   |  17 +-
 .../src/merge/workspace-integration-target.ts      |  87 +++++++++
 .../engine/src/merge/workspace-land-failure.ts     |   6 +-
 .../src/merge/workspace-merge-dispatch-lease.ts    |  54 ++++++
 packages/engine/src/project-engine.ts              |  25 +++
 28 files changed, 715 insertions(+), 118 deletions(-)

Fusion-Task-Id: FN-122
Fusion-Task-Lineage: 9364bba4-cebc-44e7-b2ae-60967fbc025c
Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:36:12 +00:00
Fusion Agent
0b4dbd219b FN-125: prevent workflow agents from creating tasks
Stop workflow executor agents from creating ordinary tasks while preserving explicit self-spawned dependency handling.

- Gate task creation by session identity and execution context.
- Add self-spawned dependency support, validation, and persistence coverage.
- Update agent prompts, tools, documentation, and CLI integration.
- Add a published-package changeset.

Files changed:
 .changeset/fn-125-removal.md                       |  7 +++
 docs/agents.md                                     |  2 +-
 docs/dashboard-guide.md                            |  2 +-
 docs/settings-reference.md                         |  6 +-
 .../cli/skill/fusion/references/engine-tools.md    | 10 ++--
 .../extension-task-execution-task-creation.test.ts | 70 ++++++++++++++++++++++
 packages/cli/src/extension.ts                      | 49 +++++++++++++--
 .../postgres/store-self-spawned-dep.pg.test.ts     | 56 +++++++++++++++++
 .../src/__tests__/self-spawned-dependency.test.ts  | 18 ++++++
 .../__tests__/session-identity-registry.test.ts    | 14 ++++-
 packages/core/src/agents/agent-prompts.ts          | 27 ++++-----
 .../src/agents/task-execution-task-creation.ts     | 19 ++++++
 packages/core/src/index.ts                         |  7 +++
 packages/core/src/session-identity-registry.ts     |  7 +++
 packages/core/src/store.ts                         |  2 +
 packages/core/src/task-store/errors.ts             | 21 +++++++
 packages/core/src/task-store/task-update.ts        | 10 +++-
 packages/core/src/task-store/update-task-deps.ts   | 12 +++-
 .../__tests__/ephemeral-task-create-gate.test.ts   | 18 +++---
 .../src/__tests__/executor-review-verdicts.test.ts |  3 +-
 packages/engine/src/agent-tools.ts                 |  4 ++
 packages/engine/src/agents/agent-runtime.ts        |  2 +
 .../engine/src/execution/step-session-executor.ts  | 15 ++---
 .../executor/attempt-executor-verification-fix.ts  |  1 +
 .../engine/src/executor/create-spawn-agent-tool.ts |  1 +
 .../engine/src/executor/create-task-done-tool.ts   | 18 +++++-
 .../engine/src/executor/create-task-update-tool.ts | 12 +++-
 .../engine/src/executor/execute-workflow-step.ts   |  1 +
 packages/engine/src/executor/run-implementation.ts | 18 +++---
 packages/engine/src/executor/system-prompt.ts      | 21 +++----
 packages/engine/src/executor/task-add-dep-tool.ts  | 14 ++++-
 packages/engine/src/pi.ts                          | 15 ++++-
 32 files changed, 401 insertions(+), 81 deletions(-)

Fusion-Task-Id: FN-125

Fusion-Task-Lineage: da3d69f6-c9cb-45fd-8691-3dfaf7007514
Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:36:12 +00:00
Fusion Agent
35f0247028 FN-115: restore task-card detail clicks
Restore native task-card activation while preserving intentional board panning.

- Start board panning only after horizontal intent is established.
- Preserve stationary card clicks and add regression coverage for detail locators and touch resizing.
- Document the restored interaction behavior and publish a patch changeset.

Files changed:
 .changeset/fn-115-restore-board-card-click.md      |   7 ++
 docs/dashboard-guide.md                            |   8 +-
 packages/dashboard/app/components/Board.tsx        |   9 +-
 .../app/components/__tests__/Board.test.tsx        |  47 ++++++---
 .../__tests__/board-card-detail-locators.test.tsx  | 108 +++++++++++++++++++++
 .../app/hooks/__tests__/useBoardMousePan.test.tsx  |  75 ++++++++++++++
 packages/dashboard/app/hooks/useBoardMousePan.ts   |  39 ++++++--
 .../app/task-modal-touch-resize-e2e-fixture.tsx    |  20 +++-
 .../task-modal-touch-resize-browser.test.ts        |  75 +++++++++++++-
 9 files changed, 354 insertions(+), 34 deletions(-)

Fusion-Task-Id: FN-115

Fusion-Task-Lineage: 158de270-2a5c-4590-8347-a3c4d6a5db03

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:36:12 +00:00
Fusion Agent
10c399d01e FN-120: fix workspace review evidence and landing recovery
Harden workspace review evidence and automatic landing recovery across workflow execution and merge paths.

- Preserve per-repository review evidence and reroute recoverable workspace review failures.
- Improve workflow lifecycle validation, continuation handling, and automatic recovery for workspace landing.
- Add regression coverage and document the updated workspace behavior.

Files changed:
 .changeset/fn-120-workspace-review-landing.md      |   7 ++
 docs/architecture.md                               |   4 +
 ...e-empty-merge-boundary-finalization-livelock.md |   4 +
 docs/testing.md                                    |   4 +
 docs/workflow-steps.md                             |   4 +
 docs/workspaces.md                                 |   6 +
 .../__tests__/builtin-coding-workflow-ir.test.ts   |  11 +-
 ...workspace-worktrees-concurrent-merge.pg.test.ts |  20 +++
 packages/core/src/db/legacy-adoption.ts            |   4 +
 packages/core/src/store.ts                         |   5 +-
 .../task-store/async/async-workflow-workitems.ts   |  21 ++++
 packages/core/src/task-store/task-mutation-ops.ts  |  20 ++-
 .../src/task-store/workflow-workitems-ops-2.ts     |   6 +-
 .../workflows/builtin-coding-ideas-workflow-ir.ts  |   9 +-
 .../src/workflows/builtin-coding-workflow-ir.ts    |  20 ++-
 .../builtin-stepwise-coding-workflow-ir.ts         |  21 +++-
 ...tin-stepwise-final-review-coding-workflow-ir.ts |  13 +-
 .../src/workflows/workflow-lifecycle-validation.ts |  28 ++++-
 .../__tests__/builtin-workflows-lifecycle.test.ts  |   4 +
 .../engine/src/__tests__/project-engine.test.ts    |  79 ++++++++++++
 .../graph-node-missing-worktree-recovery.test.ts   |  32 ++++-
 .../src/__tests__/reviewer-workspace.test.ts       |   2 +
 .../src/__tests__/task-pipeline-smoke.test.ts      |  10 +-
 .../src/__tests__/workflow-task-runtime.test.ts    |  10 +-
 .../engine/src/__tests__/workspace-e2e.test.ts     |  29 +++++
 .../engine/src/__tests__/workspace-merger.test.ts  |   4 +-
 .../__tests__/workspace-review-evidence.test.ts    |  58 +++++++++
 packages/engine/src/execution/reviewer.ts          |   2 +
 .../create-authoritative-workflow-seams.ts         |  59 +++++----
 .../engine/src/executor/execute-workflow-graph.ts  |  29 ++++-
 packages/engine/src/executor/graph-failure-pure.ts |   6 +
 .../engine/src/executor/handle-graph-failure.ts    |  26 ++++
 ...-unusable-worktree-graph-failure-to-recovery.ts |  22 +++-
 .../engine/src/executor/run-graph-custom-node.ts   |   4 +-
 .../src/executor/workspace-review-per-repo.ts      |  55 +++++----
 packages/engine/src/merge/merger-ai.ts             | 137 ++++++++++-----------
 .../engine/src/merge/workspace-review-reroute.ts   |  52 ++++++++
 packages/engine/src/project-engine.ts              |  47 +++++++
 .../self-healing/auto-recover-worktree-session.ts  |   2 +-
 .../src/workflows/workflow-graph-executor.ts       |  28 ++++-
 .../engine/src/workflows/workflow-merge-nodes.ts   |   6 +-
 .../src/worktree/workspace-review-evidence.ts      | 110 +++++++++++++++++
 .../engine/src/worktree/worktree-acquisition.ts    |  24 +++-
 43 files changed, 874 insertions(+), 170 deletions(-)
Fusion-Task-Id: FN-120
Fusion-Task-Lineage: 61c36613-89bd-44ca-8676-de77662bf53e
Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:36:12 +00:00
Fusion Agent
c47d555123 FN-116: open multiple Quick Chats from conversations
Add in-app Quick Chat windows that open exact Direct conversation snapshots without disturbing the source chat.

- Add pop-out window state, rendering, and close controls for multiple Quick Chats.
- Add context-menu launching and isolated session/preferences handling.
- Add localized labels, dashboard documentation, regression tests, and a release changeset.

Files changed:
 .changeset/fn-116-multiple-quick-chats.md          |  7 +++
 docs/dashboard-guide.md                            |  2 +
 packages/dashboard/app/App.tsx                     | 34 ++++++++++++--
 packages/dashboard/app/components/ChatView.tsx     | 36 +++++++++++++--
 .../app/components/PoppedOutChatWindows.tsx        | 53 ++++++++++++++++++++++
 .../__tests__/ChatView.core-contracts.test.tsx     | 15 ++++++
 .../__tests__/PoppedOutChatWindows.test.tsx        | 25 +++++++++
 .../app/components/dashboard/MainContent.tsx       |  2 +
 .../dashboard/app/components/dashboard/types.ts    |  2 +
 .../app/components/overflowViewRegistry.tsx        |  3 ++
 .../app/components/useRightDockController.tsx      |  3 ++
 .../app/hooks/__tests__/usePoppedOutChats.test.ts  | 24 +++++++++
 packages/dashboard/app/hooks/useChat.ts            | 42 ++++++++++++++--
 packages/dashboard/app/hooks/usePoppedOutChats.ts  | 42 +++++++++++++++++
 packages/i18n/locales/en/app.json                  |  1 +
 packages/i18n/locales/es/app.json                  |  1 +
 packages/i18n/locales/fr/app.json                  |  1 +
 packages/i18n/locales/ko/app.json                  |  1 +
 packages/i18n/locales/pt-BR/app.json               |  1 +
 packages/i18n/locales/zh-CN/app.json               |  1 +
 packages/i18n/locales/zh-TW/app.json               |  1 +
 packages/i18n/src/resources.d.ts                   | 38 ++++++++++++++---
 22 files changed, 313 insertions(+), 22 deletions(-)

Fusion-Task-Id: FN-116

Fusion-Task-Lineage: 486e3092-c4db-4e50-a9df-f2adfeb6fddf

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:35:06 +00:00
Fusion Agent
2430ce69b0 FN-112: capture workspace merge evidence from task worktrees
Capture workspace merge evidence from immutable acquisition baselines to persisted task branches so real linked task worktrees land reviewed changes reliably.

- Compare review fingerprints and landing ranges against the persisted task branch rather than the live worktree HEAD.
- Add linked-task-worktree regression coverage for per-repository landing proof and exactly-once finalization.
- Document the regression and publish the workspace merge fix in a patch changeset.

Files changed:
 .../fn-112-workspace-task-worktree-evidence.md     |  7 ++++
 docs/architecture.md                               |  1 +
 ...e-empty-merge-boundary-finalization-livelock.md |  8 +++-
 .../engine/src/__tests__/_workspace-fixture.ts     | 15 ++++++++
 .../engine/src/__tests__/workspace-e2e.test.ts     | 31 ++++++++++++---
 .../__tests__/workspace-merger-scope-gates.test.ts |  2 +-
 .../engine/src/__tests__/workspace-merger.test.ts  | 45 +++++++++++++++++++++-
 packages/engine/src/merge/merger-ai.ts             | 29 ++++++++++++--
 8 files changed, 125 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-112

Fusion-Task-Lineage: 66e8498e-13f2-461b-ae38-bf750383115b

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:35:06 +00:00
Fusion Agent
294e826ea0 FN-110: integrate Ctrl+F search into chat lists and conversations
Add keyboard-driven search across chat navigation and conversation content.

- Add Ctrl+F search controls for chat lists and conversation messages.
- Support result navigation, highlighting, and localized labels across all dashboard locales.
- Update chat surfaces, documentation, changeset metadata, and regression coverage.

Files changed:
 .changeset/fn-110-chat-find.md                     |   7 +
 docs/dashboard-guide.md                            |   5 +
 packages/dashboard/app/App.tsx                     |   1 +
 packages/dashboard/app/components/ChatView.css     |  41 +++++
 packages/dashboard/app/components/ChatView.tsx     | 162 +++++++++++++++--
 .../dashboard/app/components/CliChatSurface.tsx    |   5 +-
 .../dashboard/app/components/StandardChatSurface.tsx |  14 +-
 .../__tests__/ChatView.content-search.test.tsx     | 197 ++++++++++++++++++++-
 packages/dashboard/vitest.config.ts                |   1 +
 packages/i18n/locales/en/app.json                  |   7 +
 packages/i18n/locales/es/app.json                  |   7 +
 packages/i18n/locales/fr/app.json                  |   7 +
 packages/i18n/locales/ko/app.json                  |   7 +
 packages/i18n/locales/pt-BR/app.json               |   7 +
 packages/i18n/locales/zh-CN/app.json               |   7 +
 packages/i18n/locales/zh-TW/app.json               |   7 +
 packages/i18n/src/resources.d.ts                   |   7 +
 17 files changed, 467 insertions(+), 22 deletions(-)

Fusion-Task-Id: FN-110

Fusion-Task-Lineage: 33ef1888-d250-489a-80b8-f3c5069da532

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:35:06 +00:00
Fusion Agent
eab7635f83 FN-109: enable task-card board panning
Allow users to pan the desktop and tablet board from noninteractive task-card surfaces without disrupting controls or mobile scrolling.

- Start horizontal panning from eligible task-card bodies and text while preserving native controls and editing behavior.
- Wire board pan state and cursor styling across live board roots while keeping mobile snap and touch scrolling unchanged.
- Add regression coverage, documentation updates, and a patch changeset.

Files changed:
 .changeset/fn-109-board-card-pan.md                |  7 ++
 docs/dashboard-guide.md                            |  5 +-
 docs/task-management.md                            |  4 +-
 packages/dashboard/app/components/Board.css        |  7 +-
 packages/dashboard/app/components/Board.tsx        |  8 +-
 .../app/components/__tests__/Board.test.tsx        | 98 ++++++++++++++++------
 .../app/hooks/__tests__/useBoardMousePan.test.tsx  | 47 ++++++++++-
 packages/dashboard/app/hooks/useBoardMousePan.ts   | 12 +--
 8 files changed, 146 insertions(+), 42 deletions(-)

Fusion-Task-Id: FN-109

Fusion-Task-Lineage: 456bd9d3-9767-4b82-9f99-f191abc44b18

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 01:35:06 +00:00
Phil Larson
8fe69ac5c8 test: align workspace callback fixtures and gate (#3500)
## Summary
- update workspace worktree test stores for callback-based entry
mutations
- preserve validation, existing-entry, and singular-routing behavior in
the fakes
- canonicalize the macOS worktree path fixture before comparing
persisted state
- remove the stale inert-seam exception left after the review-column
callback became fully supplied

## Test plan
- `pnpm --filter @fusion/engine exec vitest run
src/__tests__/node-worktree-isolation.test.ts
src/__tests__/workspace-root-worktree-routing.test.ts
src/__tests__/worktree-acquisition.test.ts --silent=passed-only
--reporter=dot`
- `pnpm --filter @fusion/engine exec vitest run
src/__tests__/worktree-acquisition-workspace.test.ts
--silent=passed-only --reporter=dot`
- Directly changed engine workspace suite with PostgreSQL-dependent
blocks skipped: 338 passed, 4 skipped
- `pnpm --filter @fusion/engine typecheck`
- `node scripts/check-inert-flag-seams.mjs`
- `node --test scripts/__tests__/check-inert-flag-seams.test.mjs`
- `pnpm lint`
- `pnpm check:changesets`


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Improved recovery of orphaned worktrees by consistently using
canonical paths.
* Strengthened worktree assignment and updates to preserve existing
entries and prevent stale task state.
* Improved synchronization and validation during concurrent workspace
updates.
* Refined self-healing recovery so branch metadata changes only when
necessary.
* Improved handling of stalled tasks, retry exhaustion, and clearing
obsolete worktree or branch information.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-08-21 19:31:08 -07:00