Commit Graph

2845 Commits

Author SHA1 Message Date
gsxdsm
b7c6443a7b Restore Claude Sonnet 5 in the picker + address PR review feedback (#1862)
Sonnet 5 had disappeared from every surface: pi-ai 0.79.9 (the installed
version) lacks it, and FN-7374 removed the static row expecting the live
registry to carry it. Live-verified that claude-sonnet-5 returns 200 on
api.anthropic.com/v1 with a raw ANTHROPIC_API_KEY and runs via the Claude
CLI (it 403s on subscription-OAuth /v1 — scope-gated; runtime fallback
applies). Note: pi-ai 0.80.3 ships sonnet-5 natively, so this SUPPLEMENTAL
row dedupes once the install catches up.

- core: re-add claude-sonnet-5 to SUPPLEMENTAL_ANTHROPIC_PROVIDER_REGISTRATION
  and restore its static pricing (revert FN-7374); update pricing tests.
- engine/dashboard tests: flip the FN-7374 "withheld" assertions to the
  restored "advertised" behavior.

PR feedback:
- Trim the two FNXC comments (auth-storage.ts, pi.ts) to concise
  requirement prose per coding guidelines (CodeRabbit).
- Replace the now-inert getApiKey mock in two subscription routing tests
  with a clarifying note (Greptile).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 16:19:03 -07:00
gsxdsm
a1af5de609 fix(anthropic): restore direct OAuth execution for Claude subscriptions
Claude subscription (Max/Pro) chats regressed to 404/502/429 because
FN-7396 rerouted subscription OAuth to a /v1-based `anthropic-subscription`
runtime provider — reintroducing issue #1857 that FN-7391 had fixed. Both
routed the OAuth token to api.anthropic.com/v1, the surface that broke.

Proven in code that v0.51.0 (working) sent subscription OAuth directly to
/v1 via pi-ai's built-in `anthropic` provider (Claude Code impersonation:
Bearer + anthropic-beta oauth headers), NOT through the CLI. Restore that:

- auth-storage: getApiKey("anthropic") resolves subscription/legacy OAuth
  again (raw API key still wins), so the built-in provider gets the token.
- pi.ts: remove the runtime reroute and the /v1 `anthropic-subscription`
  execution provider so anthropic/* selections stay on the built-in provider.
- register-model-routes: advertise `anthropic` for OAuth users so direct
  OAuth is selectable in the picker.

Three independent surfaces, no rerouting: direct OAuth, raw ANTHROPIC_API_KEY
(precedence), and explicit pi-claude-cli.

Fixes #1857

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 15:40:16 -07:00
gsxdsm
f998fe3ffc FN-7397: pass plugin context to lifecycle hooks
Ensure task lifecycle plugin hooks receive a PluginContext when fired through runtime event bridges.

- Append the plugin context for task-created, task-moved, and task-completed hooks when callers only provide raw lifecycle arguments.
- Preserve existing explicit-context hook calls and add coverage for loader and runner lifecycle dispatch paths.
- Cover Compound Engineering sync completion handling so taskStore is available in onTaskCompleted.

Files changed:
 .changeset/fn-7397-plugin-hook-context.md          |  7 +++
 packages/core/src/__tests__/plugin-loader.test.ts  | 52 +++++++++++++++++++++-
 packages/core/src/plugin-loader.ts                 | 34 +++++++++++++-
 .../engine/src/__tests__/plugin-runner.test.ts     | 25 ++++++++++-
 .../src/__tests__/sync.test.ts                     | 29 +++++++++++-
 5 files changed, 141 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-7397

Fusion-Task-Lineage: 7661714c-cf2a-4f4d-bec1-fc6bc11c0613

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-01 15:39:34 -07:00
gsxdsm
19e59ec6c8 FN-7396: separate Anthropic OAuth routing paths
Separate Anthropic subscription OAuth execution from raw API-key and Claude CLI routing.

- Route subscription-backed Anthropic selections through a dedicated anthropic-subscription provider instead of raw anthropic API-key storage or implicit CLI execution.
- Preserve Anthropic OAuth refresh, status, usage, and re-login banner behavior across separated and legacy credential rows.
- Add dashboard and engine coverage for OAuth subscription auth, raw API-key isolation, and explicit Claude CLI routing.
- Document the separated Anthropic subscription, API-key, and CLI surfaces and add a release changeset.

Files changed:
 .../fn-7396-anthropic-oauth-cli-api-paths.md       |   7 ++
 docs/dashboard-guide.md                            |   4 +-
 docs/settings-reference.md                         |  12 ++-
 .../__tests__/OAuthReloginBanner.test.tsx          | 118 +++++++++++++++++++++
 .../dashboard/src/__tests__/routes-auth.test.ts    |  29 +++++
 packages/dashboard/src/__tests__/usage.test.ts     | 109 ++++++++++++++++++-
 .../dashboard/src/routes/register-auth-routes.ts   |  20 +++-
 packages/dashboard/src/usage.ts                    |  21 +++-
 packages/engine/src/__tests__/auth-storage.test.ts |  65 ++++++++++++
 .../src/__tests__/pi-create-fn-agent.test.ts       |  55 ++++++++--
 packages/engine/src/auth-storage.ts                |  61 +++++++++--
 packages/engine/src/pi.ts                          |  70 ++++++++----
 12 files changed, 521 insertions(+), 50 deletions(-)

Fusion-Task-Id: FN-7396

Fusion-Task-Lineage: f5f42a40-b855-46ad-b2ae-3509e903f286

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-01 15:39:34 -07:00
gsxdsm
775ff5fb9c FN-7391: route Anthropic subscription chats through Claude CLI
Keep Anthropic OAuth subscription credentials away from the direct /v1 provider while preserving raw API-key routing.

- Treat direct anthropic auth as raw API-key-only in auth storage and model discovery.
- Re-route persisted anthropic model selections to the Claude CLI provider when no raw Anthropic API key is configured.
- Add regression coverage for OAuth-only routing, raw API-key preservation, and provider list separation.
- Document the distinct raw API key, OAuth subscription, and Claude CLI routes.

Files changed:
 .../fn-7391-anthropic-subscription-cli-routing.md  |   7 ++
 docs/settings-reference.md                         |   2 +-
 .../dashboard/src/__tests__/routes-auth.test.ts    |  74 ++++++++++++++
 .../dashboard/src/routes/register-model-routes.ts  |  27 +++++-
 packages/engine/src/__tests__/auth-storage.test.ts | 108 +++++++--------------
 .../src/__tests__/pi-create-fn-agent.test.ts       | 100 +++++++++++++++++++
 packages/engine/src/auth-storage.ts                |  45 ++++-----
 packages/engine/src/pi.ts                          |  61 ++++++++++++
 8 files changed, 319 insertions(+), 105 deletions(-)

Fusion-Task-Id: FN-7391

Fusion-Task-Lineage: d1fecc2d-7f31-408c-bf65-0e65b7fd88b1

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-01 15:39:33 -07:00
gsxdsm
d7ee6ce87f fix: tolerate recovered CE question ids (#1855)
## Summary
- add an opt-in `allowAnswerQuestionIdDrift` flag for interactive AI
sessions
- keep strict question-id validation by default
- enable the tolerance only for Compound Engineering recovered sessions
so persisted session rows can answer after dashboard
restarts/non-deterministic rehydration

## Test Plan
- `corepack pnpm --filter @fusion/engine exec vitest run
src/__tests__/interactive-ai-session.test.ts --silent=passed-only
--reporter=dot`
- `corepack pnpm --filter @fusion/engine typecheck`
- `corepack pnpm --filter @fusion-plugin-examples/compound-engineering
build`


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

* **Bug Fixes**
* Improved interactive session recovery so persisted answers can
continue after dashboard restarts, even if the question ID changes
during rehydration.
* Keeps strict question-ID validation by default; mismatches still fail
unless drift is explicitly allowed.
* **New Features**
* Added `allowAnswerQuestionIdDrift` option to permit accepting the
persisted question ID during recovered session answering.
* **Tests**
* Added/updated coverage for strict mismatch error behavior and the
successful completion path when drift is enabled.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-01 15:21:17 -07:00
gsxdsm
14bb7a3707 feat(FN-7360): remove legacy workflow step engine
The step execution engine was already gone (runWorkflowSteps deleted,
workflow_steps table dropped in migration 132). This removes what remained:
the linear step compiler (compileWorkflowToSteps/validateLinearity/
WorkflowCompileError), which survived only as a validator + step-preview
generator.

parseWorkflowIr/validateV2 (which accepts branching graphs) is now the sole
workflow validity gate at save/select/refine and in the graph task runner.
Custom branching workflows are now selectable and run on the graph
interpreter instead of being rejected as non-linear.

- core: delete workflow-compiler.ts; rework store.validateWorkflowCompilable
  onto parseWorkflowIr; move MERGE_REGION_NODE_KINDS into
  workflow-lifecycle-validation; retag workflow-steps-to-ir as legacy lowering
- engine: drop the compiler double-validation in workflow-graph-task-runner
- dashboard: remove POST /api/workflows/:id/compile + client wrapper; drop the
  interpreterOnly response field and editor banner; no post-save compile check
- i18n: remove the orphaned workflowNodes.interpreterOnly key across locales
- tests: reframe two workflow-selection tests whose premise inverted; fix a
  pre-existing red in builtin-lead-generation (completion-summary node)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 11:28:03 -07:00
gsxdsm
af6e671e72 FN-7385: preserve live worktrees with fresh fallback
Preserve active worktree owners by retrying acquisition on a fresh sibling checkout.

- Add executor fallback that detects active cleanup refusals and creates bounded sibling branches in fresh generated worktrees.\n- Cover DB-only, same-task workflow-step, existing-branch, and exhausted-suffix conflict paths with regression tests.\n- Document the live worktree conflict fallback and add a patch changeset for the published CLI package.\n\nFiles changed:\n .../fn-7385-active-worktree-fresh-fallback.md      |   7 +\n docs/architecture.md                               |   1 +\n .../__tests__/executor-worktree-conflict.test.ts   | 103 +++++++++++++-\n .../engine/src/__tests__/executor-worktree.test.ts | 153 ++++++++++++++++++---\n packages/engine/src/executor.ts                    |  90 ++++++++----\n 5 files changed, 312 insertions(+), 42 deletions(-)

Fusion-Task-Id: FN-7385

Fusion-Task-Lineage: 02c31656-1248-49c0-9063-0750cc8e41c6

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-01 10:55:57 -07:00
gsxdsm
d94c3591d3 FN-7381: honor project auto plan approval
Honor project-level auto plan approval across fresh and recovered triage finalization.

- Merge effective workflow settings during approved-task recovery before resolving the manual plan approval gate.
- Keep release authorization and Workflow Plan Review independent from manual plan approval bypasses.
- Add regression coverage for stored workflow approval settings overridden by project auto approval.
- Document the planApprovalMode precedence and release the fix as a patch.

Files changed:
 .changeset/fn-7381-auto-plan-approval.md           |  7 ++++
 docs/settings-reference.md                         |  2 +-
 docs/workflow-steps.md                             |  2 ++
 .../src/__tests__/effective-settings-merge.test.ts | 12 +++++++
 .../triage-plan-review-unavailable-retry.test.ts   | 27 +++++++++++++-
 packages/engine/src/__tests__/triage.test.ts       | 42 ++++++++++++++++++++++
 packages/engine/src/triage.ts                      | 13 ++++---
 7 files changed, 99 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-7381
Fusion-Task-Lineage: c00fd0d9-ec0a-4dc5-8d6f-b49640157365
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-01 10:49:58 -07:00
gsxdsm
37027632e0 FN-7378: upgrade pi SDK dependencies
Upgrade the bundled pi SDK packages and compatibility imports for the 0.80.3 release.

- Bump @earendil-works/pi-ai and @earendil-works/pi-coding-agent consumers to ^0.80.3.
- Update pi SDK import paths for the new compatibility and API export map layout.
- Refresh dependency contract tests and add a patch changeset for the published CLI package.

Files changed:
 .changeset/fn-7378-pi-sdk-upgrade.md               |   7 ++
 packages/cli/package.json                          |   4 +-
 packages/cli/src/__tests__/package-config.test.ts  |   8 +-
 packages/dashboard/package.json                    |   2 +-
 packages/engine/package.json                       |   4 +-
 .../custom-providers-openai-completions.test.ts    |   8 +-
 pnpm-lock.yaml                                     | 108 ++++++++++-----------
 7 files changed, 72 insertions(+), 69 deletions(-)

Fusion-Task-Id: FN-7378

Fusion-Task-Lineage: ed8847dc-2adf-4ede-aa75-045f2e2436a0

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-01 10:37:44 -07:00
gsxdsm
427ce04a6f FN-7374: stop advertising Claude Sonnet 5 statically
Stop Fusion from statically offering Claude Sonnet 5 when account availability is unknown.

- Remove the supplemental direct Anthropic Claude Sonnet 5 model registration and static pricing row.
- Keep Claude CLI supplemental metadata from force-adding Sonnet 5 while preserving other extra Claude models.
- Update model registry, pricing, adapter, and provider tests to expect unavailable or upstream-only Sonnet 5 handling.
- Add a patch changeset for the operator-facing fix.

Files changed:
 .changeset/fn-7374-anthropic-sonnet-5-404.md       |  7 ++++++
 packages/core/src/__tests__/model-pricing.test.ts  | 20 +++++++---------
 packages/core/src/anthropic-models.ts              | 24 +++----------------
 packages/core/src/model-pricing.ts                 | 11 ++-------
 .../dashboard/src/__tests__/routes-auth.test.ts    | 13 ++++++----
 .../src/__tests__/pi-create-fn-agent.test.ts       | 28 ++++++----------------
 .../src/cli-agent/adapters/__tests__/pi.test.ts    |  6 ++---
 packages/pi-claude-cli/index.ts                    | 13 ++--------
 .../src/__tests__/process-manager.test.ts          |  4 ++--
 .../pi-claude-cli/src/__tests__/provider.test.ts   | 12 ++--------
 10 files changed, 44 insertions(+), 94 deletions(-)

Fusion-Task-Id: FN-7374

Fusion-Task-Lineage: 9c498bb4-c4c1-4dd8-ae80-869dfb1d4c2c

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-01 10:23:39 -07:00
gsxdsm
919420e11a FN-7373: enforce active worktree cap
Enforce maxWorktrees at the task-store transition boundary so active execution worktrees cannot exceed the operator cap.

- Reject allocated moves into in-progress when existing active or pending holders already meet maxWorktrees.
- Count in-progress tasks and pending in-progress transitions while excluding the task being moved.
- Cover scheduler and hold-release paths with regression tests and document the hard-cap invariant.
- Add a patch changeset for the published CLI package.

Files changed:
 .changeset/fn-7373-max-worktrees-cap.md            |  7 ++
 docs/architecture.md                               |  2 +-
 packages/core/src/__tests__/store-movement.test.ts | 80 +++++++++++++++++++++-
 packages/core/src/store.ts                         | 50 ++++++++++++++
 packages/engine/src/__tests__/hold-release.test.ts | 52 ++++++++++++++
 .../__tests__/scheduler-workflow-cutover.test.ts   | 53 ++++++++++++++
 6 files changed, 242 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-7373
Fusion-Task-Lineage: be4a9649-f6ae-475f-9395-07433e98de5c
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-01 10:18:32 -07:00
gsxdsm
12ee9a92d2 FN-7361: add exact tool permission overrides
Add exact tool-name permission overrides for permanent agent tool usage.

- Add persisted toolRules policy support with normalization, project-default inheritance, and escalation comparison.
- Enforce exact tool dispositions before category rules in engine gating and permanent-agent decisions.
- Extend the permission editor, agent/settings routes, translations, docs, and tests for fine-grained tool controls.

Files changed:
 .changeset/fn-7361-tool-permissions.md             |   7 +
 docs/agents.md                                     |  18 ++-
 docs/settings-reference.md                         |  12 +-
 .../agent-permission-policy-resolution.test.ts     |  58 +++++++-
 .../src/__tests__/agent-permission-policy.test.ts  |  17 +++
 ...settings-schema-agent-permission-policy.test.ts |   6 +-
 packages/core/src/agent-permission-policy.ts       |  87 ++++++++++--
 packages/core/src/index.ts                         |   2 +-
 packages/core/src/types.ts                         |  19 ++-
 .../dashboard/app/components/AgentDetailView.tsx   |  17 +--
 .../app/components/AgentPermissionPolicyEditor.css |  59 +++++++-
 .../app/components/AgentPermissionPolicyEditor.tsx | 156 ++++++++++++++++++++-
 .../__tests__/AgentPermissionPolicyEditor.test.tsx |  92 +++++++++++-
 .../settings/sections/AgentPermissionsSection.tsx  |   6 +-
 .../dashboard/src/__tests__/routes-agents.test.ts  |  79 +++++++++++
 .../src/__tests__/routes-settings.test.ts          |  21 +++
 .../src/routes/register-agent-core-routes.ts       |  37 +++--
 .../agent-action-gate-project-default.test.ts      |  34 +++++
 .../engine/src/__tests__/agent-action-gate.test.ts |  43 ++++++
 .../src/__tests__/gating-classifications.test.ts   |  55 ++++++++
 packages/engine/src/agent-action-gate.ts           |  17 ++-
 packages/engine/src/permanent-agent-gating.ts      |  11 +-
 packages/i18n/locales/en/app.json                  |  15 +-
 packages/i18n/locales/es/app.json                  |  15 +-
 packages/i18n/locales/fr/app.json                  |  15 +-
 packages/i18n/locales/ko/app.json                  |  15 +-
 packages/i18n/locales/zh-CN/app.json               |  15 +-
 packages/i18n/locales/zh-TW/app.json               |  15 +-
 28 files changed, 878 insertions(+), 65 deletions(-)

Fusion-Task-Id: FN-7361

Fusion-Task-Lineage: 006e4311-91a5-4792-9a54-feaba892129a

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-01 09:45:30 -07:00
Phil Larson
ad8db59374 fix: tolerate recovered CE question ids 2026-07-01 09:41:20 -07:00
gsxdsm
67f93cedd9 FN-7370: show thinking effort in model log markers
Display configured thinking effort alongside runtime task-log model markers.

- Add a shared formatter for model marker annotations and use it for triage, executor, reviewer, and workflow-step logs.
- Teach dashboard model parsing to ignore parenthesized marker diagnostics while preserving provider/model resolution.
- Cover thinking-effort markers with engine and dashboard tests, docs, and a patch changeset.

Files changed:
 .changeset/fn-7370-thinking-effort-model-logs.md   |  7 +++
 docs/agents.md                                     |  2 +
 packages/dashboard/app/components/TaskChatTab.tsx  |  7 +--
 .../app/components/__tests__/TaskChatTab.test.tsx  |  6 +--
 ...skDetailModal.models-progress-workflow.test.tsx |  6 +--
 .../__tests__/WorkflowResultsTab.test.tsx          |  6 +--
 .../__tests__/effective-model-resolution.test.ts   | 17 ++++--
 .../app/components/effective-model-resolution.ts   | 23 +++++---
 .../src/__tests__/executor-model-marker.test.ts    | 62 ++++++++++++++++++++++
 .../engine/src/__tests__/executor-test-helpers.ts  |  4 ++
 .../__tests__/executor-workflow-step-model.test.ts | 23 +++++++-
 packages/engine/src/__tests__/pi.test.ts           | 12 ++++-
 packages/engine/src/__tests__/reviewer.test.ts     | 37 +++++++++++++
 packages/engine/src/__tests__/triage.test.ts       | 20 ++++++-
 packages/engine/src/executor.ts                    | 17 ++++--
 packages/engine/src/pi.ts                          | 19 +++++++
 packages/engine/src/reviewer.ts                    |  7 +--
 packages/engine/src/triage.ts                      |  4 +-
 18 files changed, 244 insertions(+), 35 deletions(-)

Fusion-Task-Id: FN-7370

Fusion-Task-Lineage: 2c94a20c-77e1-41db-8af0-76239b30e3c4

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-01 09:30:00 -07:00
gsxdsm
24279c9aee fix(FN-7360): trust landed task merge proof
Auto-merge finalization now ignores stale branch-only residue once durable merge proof exists, so squash-landed tasks do not stay stuck in review because their task branch history is noisy.

Fusion-Task-Id: FN-7360
2026-07-01 09:06:01 -07:00
gsxdsm
88bcbce0fe fix(FN-7360): prevent contaminated task branch bases
Pin fresh task worktree creation to the resolved integration branch when no explicit executionStartBranch is present, so ambient root checkout state cannot leak sibling task commits into new branches.

Use task baseCommitSha for merge-finalization branch proof when available, allowing already-landed mergeConfirmed tasks to finalize even if historical branch ancestry contains foreign commits.

Fusion-Task-Id: FN-7360
2026-07-01 08:39:58 -07:00
gsxdsm
62c58402ff fix(workflow): raise step review timeout default 2026-07-01 08:22:04 -07:00
gsxdsm
62c4aae038 FN-7358: recover Sonnet 5 chat fallbacks
Recover Sonnet 5 chat sends by applying configured fallback models and clearer failure context.

- Allow explicit dashboard chat model selections to use the configured fallback on retryable provider/model failures.
- Preserve selected provider/model context in no-fallback chat errors so operators can identify unavailable models.
- Expand provider not-found detection and regression coverage for Anthropic Sonnet 5 404 payloads.
- Document fallback behavior and add the published package changeset.

Files changed:
 .changeset/fn-7358-sonnet-5-response-failed.md     |  7 +++
 docs/settings-reference.md                         |  2 +-
 .../dashboard/src/__tests__/chat-manager.test.ts   | 71 +++++++++++++++++++---
 packages/dashboard/src/chat.ts                     | 67 +++++++++++++++++---
 packages/engine/src/__tests__/pi.test.ts           | 71 +++++++++++++++++++++-
 .../src/__tests__/transient-error-detector.test.ts |  4 ++
 packages/engine/src/pi.ts                          |  4 +-
 packages/engine/src/transient-error-detector.ts    |  4 +-
 8 files changed, 208 insertions(+), 22 deletions(-)

Fusion-Task-Id: FN-7358

Fusion-Task-Lineage: 095a3218-1d4a-4ccb-a8c9-c9f81822b084

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-01 07:33:56 -07:00
gsxdsm
b07105dbfb fix(workflows): address workflow node PR feedback 2026-07-01 00:51:01 -07:00
gsxdsm
3a2f3b5ade refactor(workflow): extract node runner boundaries 2026-07-01 00:51:01 -07:00
gsxdsm
8079722314 fix(FN-7291): retry fallback for provider model 404s
Classify structured provider model-not-found payloads as model-selection failures so configured fallback models run when Claude Sonnet 5 is unavailable on an account or API surface.
2026-07-01 00:33:38 -07:00
gsxdsm
33279538f0 fix(FN-7335): log pause abort recovery details 2026-06-30 23:45:01 -07:00
gsxdsm
234248a3cd fix(FN-7335): retry active merge pause aborts 2026-06-30 23:45:01 -07:00
gsxdsm
a3ad0c8ecf fix(FN-7335): keep fast completion summaries 2026-06-30 23:45:01 -07:00
gsxdsm
7d2bd9794e FN-7337: make planner chats lazy and archive-scoped
Task planner chats now stay out of global chat history until a user interacts and are retained until task archive.

- Load task planner chat tabs with lookup-only resume before any user send.
- Show task-planner sessions in global Chat only after messages exist, including SSE refresh handling.
- Keep interacted planner chats for done tasks while deleting task-scoped planner sessions on archive.
- Cover chat store deletion, planner tab behavior, route filtering, and chat-list refresh with regression tests.

Files changed:
 .changeset/fn-7337-planner-chat-retention.md       |   7 ++
 docs/dashboard-guide.md                            |   4 +-
 packages/core/src/__tests__/chat-store.test.ts     |  44 +++++++++
 packages/core/src/chat-store.ts                    |  22 +++++
 packages/dashboard/app/api/legacy.ts               |  35 ++++++-
 .../app/components/TaskPlannerChatTab.tsx          |  13 ++-
 .../__tests__/TaskPlannerChatTab.test.tsx          |  91 +++++++++++++-----
 .../dashboard/app/hooks/__tests__/useChat.test.ts  |  41 ++++++++
 packages/dashboard/app/hooks/useChat.ts            |  15 ++-
 .../dashboard/src/__tests__/chat-routes.test.ts    | 105 +++++++++++++++++++++
 .../dashboard/src/routes/register-chat-routes.ts   |  17 +++-
 packages/dashboard/src/server.ts                   |  10 +-
 packages/engine/src/runtimes/in-process-runtime.ts |   8 ++
 13 files changed, 378 insertions(+), 34 deletions(-)

Fusion-Task-Id: FN-7337

Fusion-Task-Lineage: 7ef9ed8f-af2e-4fa9-a2b6-0e8c8a805d5e

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-30 23:45:01 -07:00
gsxdsm
e2702bab6b feat(workflows): add reviewer inline fixes 2026-06-30 18:37:10 -07:00
gsxdsm
2335a07620 FN-7291: add Claude Sonnet 5 Anthropic support
Adds Claude Sonnet 5 to Anthropic model catalogs, pricing, and pi execution paths.

- Register supplemental direct Anthropic model metadata for Claude Sonnet 5 with deduping.
- Surface the model through dashboard model routes and engine session creation for non-Claude-CLI pi sessions.
- Add Claude CLI provider metadata, pricing coverage, tests, and a published package changeset.

Files changed:
 .changeset/fn-7291-sonnet-5-anthropic.md           |   7 ++
 packages/core/src/__tests__/model-pricing.test.ts  |  28 +++++
 packages/core/src/anthropic-models.ts              | 127 +++++++++++++++++++++
 packages/core/src/index.ts                         |   7 ++
 packages/core/src/model-pricing.ts                 |  13 ++-
 .../dashboard/src/__tests__/routes-auth.test.ts    |  67 +++++++++++
 packages/dashboard/src/routes.ts                   |   6 +-
 .../dashboard/src/routes/register-model-routes.ts  |   5 +-
 .../src/__tests__/pi-create-fn-agent.test.ts       |  67 +++++++++++
 .../src/cli-agent/adapters/__tests__/pi.test.ts    |  16 +++
 packages/engine/src/pi.ts                          |   2 +
 packages/pi-claude-cli/index.ts                    |  13 +++
 .../src/__tests__/process-manager.test.ts          |   4 +-
 .../pi-claude-cli/src/__tests__/provider.test.ts   |  31 ++++-
 14 files changed, 384 insertions(+), 9 deletions(-)

Fusion-Task-Id: FN-7291

Fusion-Task-Lineage: 6494fce8-4101-47f5-9137-306408fd7920

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-30 13:20:27 -07:00
gsxdsm
7e74fe3a9b FN-7293: honor workflow review revision overrides
Allow workflow review steps to opt into unbounded or capped revision retries while keeping recovery caps accurate.

- Add workflow settings for Plan Review and Code Review max revisions with display, docs, and changeset coverage.
- Resolve optional-step revision budgets through workflow settings, node overrides, and existing fallback limits.
- Track revision attempts per workflow step and hydrate slim self-healing rows before enforcing retry caps.
- Cover unbounded, capped, per-step, and slim-row recovery behavior with focused tests.

Files changed:
 .changeset/fn-7293-unbounded-review-revisions.md   |   7 +
 docs/settings-reference.md                         |  12 +-
 docs/workflow-editor.md                            |   4 +-
 docs/workflow-steps.md                             |   3 +-
 .../builtin-workflow-settings-triage.test.ts       |  28 +++-
 .../core/src/__tests__/builtin-workflows.test.ts   |  29 ++++-
 .../__tests__/workflow-settings-resolver.test.ts   |  73 +++++++++++
 packages/core/src/builtin-plan-review-group.ts     |   6 +-
 packages/core/src/builtin-workflow-settings.ts     |  30 +++++
 packages/core/src/index.ts                         |   5 +
 packages/core/src/workflow-ir-types.ts             |  15 ++-
 packages/core/src/workflow-ir.ts                   |   5 +-
 packages/core/src/workflow-settings-resolver.ts    |  49 ++++++-
 .../__tests__/WorkflowSettingsPanel.test.tsx       |  52 ++++++++
 .../app/components/workflow-setting-display.ts     |  18 +++
 packages/engine/src/__tests__/self-healing.test.ts | 143 ++++++++++++++++++++-
 .../workflow-graph-optional-step-fix.test.ts       | 130 ++++++++++++++++++-
 packages/engine/src/executor.ts                    |  77 +++++++++--
 packages/engine/src/self-healing.ts                |  82 ++++++++++--
 packages/engine/src/workflow-graph-executor.ts     |   5 +-
 20 files changed, 725 insertions(+), 48 deletions(-)

Fusion-Task-Id: FN-7293

Fusion-Task-Lineage: 19ee533f-ab8d-4e20-9a27-9cf0cf6dfec9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-30 13:12:27 -07:00
gsxdsm
01e04333ce FN-7294: pass user context into workflow reviewers
Pass operator-authored task context into reviewer and workflow gate prompts.

- Include de-duped user comments and legacy steering in Plan Review, code review, and workflow-step prompt agents.
- Preserve reviewer comment context on reduced context-limit retry prompts and refresh comments before in-session review calls.
- Document workflow prompt-agent comment behavior, add regression coverage, and add a patch changeset.

Files changed:
 .changeset/FN-7294-reviewer-comment-context.md     |   7 +
 docs/workflow-steps.md                             |   7 +
 .../src/__tests__/agent-user-comments.test.ts      |  81 ++++++++--
 .../executor-review-step-indexing.test.ts          | 165 ++++++++++++++++++++-
 .../src/__tests__/reviewer-workspace.test.ts       |  39 +++++
 packages/engine/src/__tests__/reviewer.test.ts     |  26 +++-
 packages/engine/src/__tests__/triage.test.ts       |  49 ++++++
 packages/engine/src/agent-user-comments.ts         |  42 ++++--
 packages/engine/src/executor.ts                    |  31 +++-
 packages/engine/src/reviewer.ts                    |  10 +-
 packages/engine/src/triage.ts                      |  20 ++-
 11 files changed, 443 insertions(+), 34 deletions(-)

Fusion-Task-Id: FN-7294

Fusion-Task-Lineage: ea5ff33e-99ba-4fdd-9257-9778849b91bb

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-30 12:56:03 -07:00
gsxdsm
658b3511c7 FN-7293: scope external evidence to per-step review 2026-06-30 12:25:43 -07:00
gsxdsm
5f67c85fea FN-7285: add workflow icons and trim built-in labels
Adds workflow icon metadata while preserving readable workflow names without built-in suffixes.

- Store and validate compact plain-text workflow icons across core APIs, imports, exports, tools, and analytics.
- Render Fusion marks for built-in workflows and custom text icons beside existing workflow labels on board, switcher, detail, and editor surfaces.
- Update workflow editor creation/copy flows, docs, release notes, and tests for icon metadata and shorter built-in names.

Files changed:
 .changeset/fn-7285-workflow-icons.md               |   7 ++
 docs/dashboard-guide.md                            |  12 +--
 .../cli/skill/fusion/references/extension-tools.md |   2 +
 .../core/src/__tests__/builtin-workflows.test.ts   |   8 +-
 packages/core/src/__tests__/db-migrate.test.ts     |   7 +-
 .../core/src/__tests__/workflow-analytics.test.ts  |  15 +--
 .../__tests__/workflow-definition-store.test.ts    |  31 ++++++
 packages/core/src/builtin-workflows.ts             |  20 ++--
 packages/core/src/db.ts                            |  11 +-
 packages/core/src/index.ts                         |   4 +
 packages/core/src/store.ts                         |  24 ++++-
 packages/core/src/workflow-analytics.ts            |   7 +-
 packages/core/src/workflow-definition-types.ts     |  31 ++++++
 packages/dashboard/app/api/legacy.ts               |   2 +
 packages/dashboard/app/components/Board.tsx        |  18 ++--
 packages/dashboard/app/components/Column.tsx       |   2 +-
 packages/dashboard/app/components/TaskCard.tsx     |   7 +-
 .../dashboard/app/components/TaskDetailModal.tsx   |  20 ++--
 packages/dashboard/app/components/WorkflowIcon.css |  42 ++++++++
 packages/dashboard/app/components/WorkflowIcon.tsx |  49 +++++++++
 .../app/components/WorkflowNodeEditor.css          |  32 ++++++
 .../app/components/WorkflowNodeEditor.tsx          | 113 ++++++++++++++++-----
 .../dashboard/app/components/WorkflowSwitcher.css  |   9 ++
 .../dashboard/app/components/WorkflowSwitcher.tsx  |  15 ++-
 .../dashboard/app/components/WorktreeGroup.tsx     |   2 +-
 .../app/components/__tests__/Board.test.tsx        |  12 +--
 .../app/components/__tests__/Lane.test.tsx         |   6 +-
 .../__tests__/WorkflowNodeEditor.test.tsx          |  57 +++++++++--
 .../components/__tests__/WorkflowSwitcher.test.tsx |  68 ++++++++-----
 .../__tests__/board-mobile-initial-render.test.tsx |   2 +-
 .../__tests__/CommandCenter.test.tsx               |   4 +-
 .../command-center/areas/WorkflowArea.tsx          |   2 +
 .../areas/__tests__/WorkflowArea.test.tsx          |   6 +-
 .../settings/sections/GeneralSection.tsx           |   6 +-
 .../register-command-center-routes.test.ts         |   2 +-
 .../__tests__/workflow-import-export.test.ts       |  32 +++++-
 packages/dashboard/src/routes/board-workflows.ts   |   6 +-
 .../src/routes/register-workflow-routes.ts         |  32 +++++-
 packages/engine/src/__tests__/agent-tools.test.ts  |   4 +-
 packages/engine/src/agent-tools.ts                 |   6 +-
 40 files changed, 590 insertions(+), 145 deletions(-)

Fusion-Task-Id: FN-7285
Fusion-Task-Lineage: 0fa689a2-f19d-4d1b-9a40-cc0b2181200a
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-30 12:21:25 -07:00
gsxdsm
9460497dd5 FN-7292: bridge Anthropic subscription auth into runtime requests
Anthropic model requests now resolve subscription OAuth credentials when no raw API key is present.

- Route Anthropic runtime auth through raw API keys, legacy OAuth, subscription OAuth, models.json, and fallback resolver sources with explicit logout precedence.
- Refresh subscription OAuth using the Anthropic OAuth provider while persisting rotated tokens under the subscription storage id.
- Cover subscription alias resolution, logout behavior, fallback visibility, refresh persistence, and reload behavior with auth-storage tests.
- Add a patch changeset for the published Fusion CLI package.

Files changed:
 .../fn-7292-anthropic-subscription-runtime-auth.md |   7 +
 packages/engine/src/__tests__/auth-storage.test.ts | 357 +++++++++++++++++++++
 packages/engine/src/auth-storage.ts                | 266 ++++++++++++---
 3 files changed, 577 insertions(+), 53 deletions(-)

Fusion-Task-Id: FN-7292

Fusion-Task-Lineage: c98c2f1c-8297-4473-ba66-5b6320bc0c00

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-30 12:09:09 -07:00
gsxdsm
7eca99c8b1 FN-7283: clear optional workflow steps in fast mode
Fast mode now treats optional workflow steps as opt-out by default while preserving manual reselection.

- Clear default-on optional workflow steps when switching task creation forms into Fast mode.
- Submit explicit empty optional-step selections in Fast mode to prevent store defaults from reappearing.
- Allow explicitly enabled optional workflow groups to run under Fast mode and during recovery.
- Document the Fast-mode optional-step contract and add regression coverage for dashboard and engine flows.

Files changed:
 .changeset/FN-7283-fast-mode-optional-steps.md     |   7 ++
 docs/workflow-steps.md                             |  15 ++-
 packages/dashboard/app/components/NewTaskModal.tsx |  27 +++--
 .../dashboard/app/components/QuickEntryBox.tsx     |  29 ++++-
 packages/dashboard/app/components/TaskForm.tsx     |  42 +++++--
 .../app/components/__tests__/NewTaskModal.test.tsx |  58 +++++++++
 .../components/__tests__/QuickEntryBox.test.tsx    |  84 +++++++++++++
 .../app/components/__tests__/TaskForm.test.tsx     |  85 ++++++++++++-
 .../__tests__/executor-fast-mode-workflows.test.ts | 134 +++++++++++++++++++++
 packages/engine/src/executor.ts                    | 107 ++++++++++------
 packages/engine/src/workflow-graph-executor.ts     |  14 ++-
 11 files changed, 539 insertions(+), 63 deletions(-)

Fusion-Task-Id: FN-7283

Fusion-Task-Lineage: e7028af8-3d05-4db7-8db9-a16c7f7575de

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-30 09:46:26 -07:00
gsxdsm
4441b72bbc fix(FN-7273): prevent stale step resume regressions 2026-06-30 08:07:40 -07:00
gsxdsm
5ec04ec5cb fix(FN-7271): keep fast coding tasks from skipping implementation 2026-06-30 07:31:59 -07:00
gsxdsm
3e0391eada FN-7267: expose MCP tools to planning sessions
Expose configured MCP session tools to read-only planning and mission lanes while keeping other read-only sessions locked down.

- Add an explicit allowMcpToolsInReadonly option to createFnAgent and apply it only to connected MCP tools.
- Opt planning, streaming planning, mission, milestone, and slice interview sessions into read-only MCP tools.
- Expand regression coverage for MCP forwarding, read-only filtering, and session tool disposal behavior.
- Document the read-only MCP opt-in model and add a published package changeset.

Files changed:
 .changeset/fn-7267-planning-mission-mcp.md         |  7 +++
 docs/mcp.md                                        |  4 +-
 .../src/__tests__/mcp-lane-forwarding.test.ts      |  4 ++
 .../dashboard/src/milestone-slice-interview.ts     |  4 ++
 packages/dashboard/src/mission-interview.ts        |  4 ++
 packages/dashboard/src/planning.ts                 |  4 ++
 .../src/__tests__/mcp-surface-coverage.test.ts     | 25 +++++++-
 .../src/__tests__/pi-create-fn-agent.test.ts       | 67 ++++++++++++++++++++++
 .../src/__tests__/pi-mcp-session-tools.test.ts     |  6 +-
 .../workflow-step-readonly-allowlist.test.ts       | 17 +++++-
 packages/engine/src/pi.ts                          | 17 +++++-
 packages/engine/src/workflow-step-tool-policy.ts   | 15 ++++-
 12 files changed, 163 insertions(+), 11 deletions(-)

Fusion-Task-Id: FN-7267

Fusion-Task-Lineage: 8d9cac1a-edcc-453d-bda1-9abb58de7f86

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-30 00:09:36 -07:00
gsxdsm
41ff08a158 fix(FN-7261): prevent premature fast workflow merges
Block the merge requester when fast workflow traversal reaches merge before implementation steps are complete, and recover stale no-op merge proof by requeuing executable work instead of looping in blocked finalization.

Fusion-Task-Id: FN-7261
2026-06-29 23:36:34 -07:00
gsxdsm
eb83c81ffb fix(FN-7265): align per-step review workflow 2026-06-29 23:25:17 -07:00
gsxdsm
cfd9d5b32e test(FN-7249): cover phantom worktree recovery 2026-06-29 22:30:23 -07:00
gsxdsm
9e23d6c403 fix(FN-7265): stop duplicate graph plan reviews 2026-06-29 22:29:22 -07:00
gsxdsm
5a6d110483 fix(engine): stop phantom-reservation audit churn and preserve worktree on phantom reclaim
reconcilePhantomCommittedReservations emitted a task:reconcile-phantom-committed-reservation audit row every maintenance tick for the same orphaned committed reservations even when zero child rows were pruned (~19k no-op writes/day). Gate the audit emission on actual pruned work; the FN-7069 contract is unchanged (committed reservation stays committed so the ID is never reused).

clearPhantomExecutorBinding unconditionally unregistered held worktree paths from activeSessionRegistry, defeating the moveTask(preserveWorktree:true) the self-healing phantom reclaim pairs it with: re-dispatch then acquired a brand-new worktree instead of reattaching (FN-7249 lost its first worktree this way). Add a preserveWorktrees option that clears only the stale in-memory executor/lock bookkeeping and leaves the session-registry path entries intact; the self-healing caller opts in. Non-self-healing callers keep the default full-clear behavior.
2026-06-29 21:56:14 -07:00
gsxdsm
095007c640 fix(FN-7262): honor step session setting 2026-06-29 21:51:13 -07:00
gsxdsm
09687f723c fix(FN-7261): confirm AI no-op merge finalization 2026-06-29 21:38:57 -07:00
gsxdsm
be9e231004 fix(FN-7248): skip completed steps on resume 2026-06-29 19:23:38 -07:00
gsxdsm
ed21597690 FN-7251: suppress missing skill-pattern info logs
Suppress non-actionable missing configured skill-pattern messages while preserving resolver diagnostics.

- Filter configured skill-pattern miss diagnostics out of pi runtime logging paths.
- Keep missing configured patterns available as resolver diagnostics for programmatic visibility.
- Cover direct skill resolution and fn-agent creation logging with regression tests.
- Add a patch changeset for the published Fusion CLI package.

Files changed:
 .../fn-7251-suppress-missing-skill-pattern-logs.md |  7 +++
 .../src/__tests__/pi-create-fn-agent.test.ts       | 21 ++++++---
 .../engine/src/__tests__/skill-resolver.test.ts    | 50 ++++++++++++++++++----
 packages/engine/src/pi.ts                          |  1 +
 packages/engine/src/skill-resolver.ts              | 13 ++++++
 5 files changed, 78 insertions(+), 14 deletions(-)

Fusion-Task-Id: FN-7251

Fusion-Task-Lineage: 3c61c349-f216-410b-9ead-24c310bb2415

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-29 19:17:37 -07:00
gsxdsm
9fd286b1d3 fix(FN-7242): keep code review remediation recovering 2026-06-29 18:41:43 -07:00
gsxdsm
90b62b7884 FN-7246: preserve explicit empty step dependencies
Preserve authored empty workflow step dependencies so parallel roots remain independent.

- Keep parser and TaskStep projections from dropping explicit empty dependsOn arrays.
- Treat missing dependsOn as the legacy previous-step fallback while allowing [] to mean no dependencies.
- Cover heading and JSON parsers plus parallel foreach scheduling with regression tests and docs.

Files changed:
 .changeset/fn-7246-workflow-depends-on-empty.md              |  7 +++++++
 docs/workflow-steps.md                                       |  4 ++--
 packages/core/src/__tests__/step-parsers.test.ts             |  8 ++++----
 packages/core/src/step-parsers.ts                            | 30 +++++++++++++++++++++---------
 packages/core/src/types.ts                                   | 13 +++++++++----
 packages/engine/src/__tests__/workflow-parse-steps.test.ts   | 12 ++++++++++++
 packages/engine/src/__tests__/workflow-step-parallel.test.ts | 30 +++++++++++++++++++++++++++++-
 packages/engine/src/workflow-graph-foreach.ts                |  9 +++++++--
 packages/engine/src/workflow-node-handlers.ts                |  6 +++++-
 9 files changed, 96 insertions(+), 23 deletions(-)

Fusion-Task-Id: FN-7246

Fusion-Task-Lineage: a75687fa-5711-4509-b60f-43669323a6c0

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-29 18:05:44 -07:00
gsxdsm
6f2b8ab6e5 FN-7244: retry unavailable Plan Review without replanning
Preserve existing task specs when Plan Review retries after reviewer outages.

- Route plan-review-unavailable triage tasks through the Plan Review/finalization path instead of the planner.
- Validate existing PROMPT.md content and fail clearly when it is missing, empty, or invalid.
- Preserve retry status across interrupted triage work and cover retry behavior with engine tests.
- Document the retry lifecycle and add a patch changeset.

Files changed:
 .../fn-7244-plan-review-unavailable-retry.md       |   7 +
 docs/architecture.md                               |   2 +
 docs/workflow-steps.md                             |   2 +
 .../triage-plan-review-unavailable-retry.test.ts   | 251 +++++++++
 packages/engine/src/__tests__/triage.test.ts       | 604 +++++++++++++++++++++
 packages/engine/src/triage.ts                      | 108 +++-
 6 files changed, 945 insertions(+), 29 deletions(-)

Fusion-Task-Id: FN-7244

Fusion-Task-Lineage: 80e790e3-d2b9-4309-beec-3dbf6a03db39

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-29 17:40:00 -07:00
gsxdsm
72e50ac8c6 fix(artifacts): support task image artifact previews (#1821)
## Summary
Task image artifacts can now complete the full loop: agents and chat
flows can register base64 image bytes, and task details can display
those artifacts with an expandable preview instead of leaving them as
undiscoverable metadata.

This keeps binary payloads on the existing managed artifact storage
path, validates that base64 payloads are real non-empty image data, and
documents the new `dataBase64` field for engine-tool callers. The task
details artifacts gallery now treats image cards as expandable while
leaving document, audio, video, and generic artifact cards on their
existing behavior.

## Validation
- `pnpm --filter @fusion/dashboard exec vitest run
app/components/__tests__/TaskDocumentsTab.test.tsx
src/routes/__tests__/artifacts-route-integration.test.ts
--silent=passed-only --reporter=dot`
- `pnpm --filter @fusion/engine exec vitest run
src/__tests__/agent-artifact-tools.test.ts --silent=passed-only
--reporter=dot`

---

[![Compound
Engineering](https://img.shields.io/badge/Built_with-Compound_Engineering-6366f1)](https://github.com/EveryInc/compound-engineering-plugin)
![AI_Assistant](https://img.shields.io/badge/AI_Assistant-000000)


<!-- stage-review-badge-begin -->

---

<a href="https://stagereview.app/Runfusion/Fusion/pull/1821">
  <picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://stagereview.app/assets/gh-open-in-stage-dark.svg">
<img src="https://stagereview.app/assets/gh-open-in-stage-light.svg"
alt="Open in Stage">
  </picture>
</a>

<!-- stage-review-badge-end -->

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

* **New Features**
* Added inline base64 (`dataBase64`) support for registering image
artifacts from agent tools, including task-scoped chat registration.
* Task details now allow expanding image media artifacts in a preview
lightbox with accessible keyboard interaction.
* **Bug Fixes**
* Improved verification for media streaming by validating raw binary
responses; added HTTP 200/404 coverage for image endpoints.
* **Documentation**
* Updated `fn_artifact_register` tool documentation to include the
optional `dataBase64` parameter.
* **Tests**
* Added coverage for base64 validation/error handling and lightbox
expand/close behavior (including Escape and Tab focus trapping).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-06-29 17:33:50 -07:00