Commit Graph

9020 Commits

Author SHA1 Message Date
gsxdsm
ffef0aad6a docs(solutions): ACP bridge 'Not logged in' — thin spawn env + keychain session isolation
Compound learning: the claude-code-cli-acp bridge returned 'Not logged in'
despite a working claude -p, due to (1) a too-thin spawn env (needs XDG_*/USER/
SHELL beyond HOME/PATH) and (2) macOS login-Keychain session isolation for
detached/headless processes. Six headless tasks misdiagnosed it as an upstream
gap. Cross-linked from the ACP runtime integration pattern doc.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 13:15:38 -07:00
gsxdsm
f816598107 Merge pull request #1681 from Runfusion/feature/acp-route-a-enable
feat(acp): enable Claude CLI via ACP bridge by default (experimental switch) + status
2026-06-16 03:51:49 +08:00
gsxdsm
dc8510447f fix(review): address PR #1681 round-2 comments
- CodeRabbit: spinner class `spin` -> `animate-spin` (matches the card's other
  Loader2 usages).
- CodeRabbit (major): tighten auth-failure detection so it only fires when the
  WHOLE turn is the short "Not logged in" message (<=80 chars), not when a long
  legitimate answer merely mentions the phrase — avoids false positives.
- CodeRabbit (major): expand the auth-signal test to assert the full invariant —
  set on a not-logged-in turn, clear (unlink) on a real response, and NOT flag a
  long answer that mentions the phrase.

pi-claude-cli acp-driver 5/5; typecheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 12:43:08 -07:00
gsxdsm
5696d4497f fix(review): address PR #1681 feedback (acp.active accuracy + FNXC comments)
- Greptile P2: `acp.active` now reflects the ACTUAL dispatch determinant
  (FUSION_CLAUDE_ACP, which includes the operator force-override), not the
  experimental flag alone — so the status isn't misleading when forced on/off.
- CodeRabbit/Greptile P2: add FNXC:ClaudeAcp comments to the new code blocks
  per the AGENTS.md greppable-comment convention.

Already fixed in the prior commit (daa37d08c): the P1 "sticky env" / latch
(applyClaudeAcpEnable now recomputes each call + FUSION_CLAUDE_ACP_FORCE
override) and the enable->disable-on-same-env regression test.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 12:34:44 -07:00
gsxdsm
daa37d08c5 feat(acp): surface bridge auth failure in the UI with fallback / fix-auth (R17)
When the bridged `claude` can't authenticate (detached daemon / no keychain),
the turn returns "Not logged in" instead of a real answer. Rather than silently
relay that, detect it and let the user choose.

- Driver: detect a "Not logged in"-only turn and write a cross-process signal
  (fusion-acp-bridge-auth.json); a real response clears it (acp-driver test).
- Dashboard status: GET /providers/claude-cli/status reports
  acp.authFailed + authReason from the signal.
- UI: the Claude CLI provider card shows an auth-failure banner with
  "Use claude -p" (sets experimentalFeatures.claudeCliAcp=false) and
  "I fixed auth — re-test", plus a fix hint (run `claude` to log in).
- Enable resolution now recomputes each call with an operator force-override
  (FUSION_CLAUDE_ACP_FORCE), so the "Use -p" fallback takes effect on the next
  turn — no restart. claude-acp-enable tests updated.

pi-claude-cli + engine tests green; dashboard typecheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 12:32:00 -07:00
gsxdsm
9314d1c329 Merge pull request #1669 from Runfusion/fix/test-timeout-failures
fix(test-infra): bound test invocations with a fail-fast watchdog + CI timeouts
2026-06-16 03:23:17 +08:00
gsxdsm
2e0bcd75c4 feat(acp): U12 — surface ACP transport state in claude-cli status
GET /providers/claude-cli/status now returns an `acp` block:
{ enabled (experimental flag), bridgeAvailable (KTD10 published path), active
(enabled && acpEnabled && bridgeAvailable) } so operators can see whether Claude
CLI is routing through the ACP bridge vs `claude -p` — important for the
default-on rollout. Additive; typechecks clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 12:16:30 -07:00
gsxdsm
45184aef7e feat(acp): enable Route A via experimental flag (claudeCliAcp), default ON
Replace the manual FUSION_CLAUDE_ACP env enable with an experimental feature
switch. `experimentalFeatures.claudeCliAcp` is ON by default (off only when
explicitly set false); the engine translates it into the FUSION_CLAUDE_ACP
dispatch the pi-claude-cli provider reads, at registerExtensionProviders time.

- Still fail-closed: with no bridge path published (acp-runtime plugin absent),
  the provider falls back to `claude -p`.
- Explicit FUSION_CLAUDE_ACP env always wins (operator / test override).
- New testable helper claude-acp-enable.ts (6/6 tests); flag documented in the
  core experimentalFeatures doc.

So with the acp-runtime plugin installed, Claude CLI now routes through the ACP
bridge by default; set experimentalFeatures.claudeCliAcp=false to force `-p`.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 12:14:20 -07:00
gsxdsm
2bffad1784 Merge remote-tracking branch 'origin/main' into fix/test-timeout-failures
# Conflicts:
#	scripts/test-changed.mjs
2026-06-15 12:13:40 -07:00
gsxdsm
e409f2d437 Merge pull request #1680 from Runfusion/feature/acp-route-a
feat: migrate Claude off `claude -p` to ACP runtime + bridge (Route B + U10; Route A in progress)
2026-06-16 03:08:00 +08:00
gsxdsm
642780220e chore(acp): apply subagent-review follow-ups (changeset, KTD10 tests, docs)
Two-reviewer pass (security + architecture) on KTD10 + the full Route A
increment: no code defects, no P0, merge-ready as a dormant increment. Applying
the P1 follow-ups:

- Add the feature changeset (@runfusion/fusion minor) — the one convention gap.
- KTD10 tests: fail-closed (bridge not resolved -> env stays unset -> -p) and
  idempotency (second onLoad keeps the first published path).
- Document the two intentional, parallel MCP-forwarding paths (U10 engine-adapter
  vs U11 provider-driver) so nobody double-forwards, and the known
  ACP-path-token-usage=0 residual so U12 doesn't treat it as a bug.

Reviewers confirmed: dormancy invariant holds end-to-end (nothing sets
FUSION_CLAUDE_ACP=1; both flag+path required; -p is the default); OAuth pi path
untouched. 206/206 plugin tests, 333/333 pi-claude-cli tests, typecheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 11:40:06 -07:00
gsxdsm
022bee5842 feat(acp): U11/KTD10 — publish bundled bridge path on plugin load
The acp-runtime plugin's onLoad now publishes the identity-pinned bundled
claude-code-cli-acp path to FUSION_CLAUDE_ACP_BRIDGE (when unset), so the
pi-claude-cli kill-switch resolves the bridge WITHOUT a manual env var — no
engine->plugin static coupling. Publishes the path only; the ACP transport stays
OFF until an operator sets FUSION_CLAUDE_ACP=1 (rollout gate). Explicit env
override wins; resolver is pinned to the plugin's node_modules/.bin shim.

204/204 plugin tests green (3 new KTD10 tests); typecheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 11:34:36 -07:00
gsxdsm
239bec74c4 docs(acp): record U11 tool-flow verification PASS — enablement gate cleared
Live run: forwarded MCP tools and native Bash both refuse to execute when we
return cancelled to session/request_permission (no TOCTOU). streamViaAcp's
deny-by-default + break-early is verified safe. Env allow-list (incl. XDG/USER)
validated as required for the bridged claude to authenticate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 11:21:43 -07:00
gsxdsm
71a6c5a05f test(acp): verify kill-switch dispatch routing (U11/R9/R14)
streamSimple routes to streamViaAcp ONLY when FUSION_CLAUDE_ACP=1 AND a bridge
path is provided; otherwise stays on the -p streamViaCli path. Covers the three
cases (off / flag-without-path / flag+path) and asserts the bridge path + env
are forwarded. 333/333 pi-claude-cli tests green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 10:55:27 -07:00
gsxdsm
0d6b3f6660 fix(acp): apply review findings to streamViaAcp (U11)
Three-reviewer pass (correctness/security/reliability) on the highest-risk file.

P0:
- Break-early now gates on isPiKnownClaudeTool: Claude's internal ToolSearch
  (used to load deferred MCP tools) no longer aborts the turn before the real
  fn_* call. Surface+break works from both tool_call updates and
  request_permission. New test replays the U9 [ToolSearch, fn_task_list] sequence.
- Downgrade a tool_use turn that surfaced zero pi tool calls -> stop (mirrors
  provider.ts), so pi never dispatches non-existent tools.
- register the bridge child in the process registry (no orphan on teardown).
- inactivity timeout (30 min, re-armed per chunk) + per-RPC timeouts on
  newSession (a hung bridge now ends the stream and dies).

P1:
- capture bridge stderr + child 'close' handler -> surface exit code/stderr
  (no more silent, undebuggable failures).
- sanitize untrusted agent output: strip ANSI/control chars, per-chunk +
  per-turn caps, bound tool ids/names (no terminal-escape injection / DoS).
- validate bridge path (absolute + exists) before spawn.
- preserve image content blocks in the prompt (flatten-to-text dropped vision).

P2:
- enforce the bridge env allow-list INSIDE the driver (HOME/PATH/terminal only),
  not trusting the caller-supplied object.

Documented residual (kill-switch stays OFF until verified): the bridge's
tool-execution ordering and native-tool (Bash/Read/Write) execution-prevention
need a live behavioral test before any lane enables this path.

pi-claude-cli: 330/330 tests green; typecheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 06:17:11 -07:00
gsxdsm
85c180508c feat(acp): U11 — drive pi-claude-cli provider via the ACP bridge (kill-switch OFF)
Adds streamViaAcp: a drop-in alternative to streamViaCli that drives Claude
through the claude-code-cli-acp bridge over ACP instead of `claude -p`. Returns
the same AssistantMessageEventStream, so streamSimple dispatches to either
transport behind a kill-switch (FUSION_CLAUDE_ACP=1 + an injected bridge path),
OFF by default — the live `-p` path is byte-for-byte untouched until soak.

- Full-history prompt every turn (buildPrompt) — the ACP path has no --resume (R13).
- Forwards schema-only MCP servers so Claude emits correct tool calls; breaks
  early on the first tool_call (cancel turn, surface to pi) so the bridge never
  executes Fusion's tools — mirrors the `-p` break-early pattern.
- Translation reuses the tested createEventBridge by synthesizing Claude stream
  events from ACP session/updates, sharing pi sequencing + tool-name mapping.
- Bridge env forwards only HOME/PATH so `claude` authenticates from the login
  session (R17); never inherited process.env or API keys.

Verified: 3/3 translation unit tests; real-bridge session/update shapes confirmed
(agent_message_chunk text + tool_call); 326/326 existing pi-claude-cli tests green;
typecheck clean.

Remaining for Route A: engine injection of the bridge path (KTD10), U12 picker/
auth/status, U13 workflow verification.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 06:08:27 -07:00
gsxdsm
03d12b6289 docs(acp): record U11 implementation design (ready to execute)
Reverse-engineered the streamViaCli contract and locked the U11 build plan:
AssistantMessageEventStream shape to match, the kill-switch branch point in
streamSimple, the KTD10 injection seam (pi-claude-cli adds @agentclientprotocol/sdk;
bridge path injected like mcpConfigPath), MCP-server construction reusing
ensureMcpConfig, full-history prompting (R13), ACP->pi event translation
paralleling event-bridge.ts, and live-bridge verification via the U9 harness.

No transport change yet — the live `claude -p` path is untouched.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 05:56:47 -07:00
gsxdsm
079844e1c1 feat(acp): forward MCP servers on session/new (U10) + record U9 GO / R17
Route A unblock + the first Route A code increment.

- U9 verdict recorded (plan OQ1 + docs/acp-contract.md): in an authenticated
  interactive session the pinned claude-code-cli-acp 0.1.1 bridge forwards
  session/new mcpServers to Claude, Claude invokes the forwarded Fusion tool,
  and the call traverses the ACP permission gate (session/request_permission).
  Both security-critical answers resolve positively — overturns the headless
  NOT-GO chain (FN-6466/6467/6473/6476), whose only blocker was running
  detached from the login keychain session.
- R17 (daemon auth) recorded and closed for the supported setup: creds are
  macOS Keychain-only; the user's login-session fn daemon has keychain access
  (the existing claude -p provider authenticates there), so the bridge does too.
- U10: thread an optional mcpServers list through the ACP runtime contract.
  newAcpSession now forwards it (was hardcoded []); AgentRuntimeOptions (engine
  + plugin-local copy) gains the field; defaults to [] to preserve Route B's
  read-only ask posture. Tool calls still route through the U5 permission floor.

Plugin typechecks clean; provider-session tests 12/12 (incl. 2 new forwarding
tests). U11-U13 (provider transport swap, picker/auth, workflow verify) remain.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 05:56:47 -07:00
gsxdsm
bc6dfd386e FN-6478: surface paused workflow graph failures
Surface stranded paused workflow exits as actionable executor failures.

- Treat paused or aborted graph exits as benign only while the live task remains in-progress.
- Preserve terminal/review lifecycle state while recording operator-actionable failure evidence for advanced columns.
- Cover user-paused, pause-aborted, existing-failure, in-progress, in-review, todo, and done column recovery paths.
- Document the workflow lifecycle invariant and add a patch changeset.

Files changed:
 .changeset/fn-6478-paused-workflow-executions.md   |   5 +
 docs/architecture.md                               |   1 +
 .../engine/src/__tests__/executor-recovery.test.ts | 283 +++++++++++++++++++++
 packages/engine/src/executor.ts                    |  30 ++-
 4 files changed, 315 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6478

Fusion-Task-Lineage: 219d8612-6604-4dbc-9a3a-a1c7837419c1
2026-06-15 02:30:41 -07:00
gsxdsm
de8f871b4d FN-6479: index upstream ACP MCP forwarding doc
Index the upstream ACP MCP forwarding sponsorship doc so the docs README and CLI index test keep it discoverable.

- Add the upstream ACP MCP passthrough and permission forwarding sponsorship doc link under Audit Reports.
- Add the upstream doc to the required docs README index coverage.
- Guard that CLI Printing Press docs remain indexed in Audit Reports only, not duplicated under Plugins.

Files changed:
 docs/README.md                                      |  5 +++++
 .../cli/src/__tests__/docs-readme-index.test.ts     | 21 +++++++++++++++++++++
 2 files changed, 26 insertions(+)

Fusion-Task-Id: FN-6479

Fusion-Task-Lineage: f23afeba-a989-4552-8857-fe2984df6081
2026-06-15 02:30:41 -07:00
gsxdsm
56d4fd24b3 FN-6476: record ACP auth rerun blockage
Document the authenticated ACP bridge rerun attempt and preserve the Route A blocked verdict.

- Update the ACP contract with FN-6476 readiness proof results showing the pinned bridge still reports an unauthenticated Claude session.
- Keep OQ1 answers unresolved because no forwarded Fusion tool invocation or permission-gate traversal was observed.
- Add FN-6476 status notes to the Claude ACP runtime plan so U9 remains NOT GO without a claude -p fallback.

Files changed:
 docs/acp-contract.md                                      | 11 ++++++++++-
 docs/plans/2026-06-14-001-feat-claude-acp-runtime-plan.md |  3 +++
 2 files changed, 13 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6476

Fusion-Task-Lineage: f37dcc62-9758-47af-bb50-169e902211a5
2026-06-15 02:30:41 -07:00
gsxdsm
fcca1366ef FN-6475: document ACP MCP forwarding sponsorship
Record the upstream sponsorship package for ACP MCP passthrough and permission gating while keeping Route A blocked.\n\n- Add a ready-to-file upstream issue for claude-code-cli-acp MCP passthrough and permission-forwarding support.\n- Link the filed upstream issue from the ACP contract and runtime plan.\n- Preserve the OQ1/U9 NOT GO status until authenticated reruns prove forwarded tool invocation and gating.\n\nFiles changed:\n docs/acp-contract.md                               |   5 +\n .../2026-06-14-001-feat-claude-acp-runtime-plan.md |   3 +\n ...laude-code-cli-acp-mcp-permission-forwarding.md | 121 +++++++++++++++++++++\n 3 files changed, 129 insertions(+)

Fusion-Task-Id: FN-6475

Fusion-Task-Lineage: 3cbd14e3-9388-4cf4-b256-3678459eb926
2026-06-15 02:30:41 -07:00
gsxdsm
1d474a1dff FN-6473: document Route A ACP escalation blockage
Record the authenticated Route A ACP escalation rerun and keep U9 blocked.

- Update the ACP contract OQ1 status to FN-6473 with the observed unauthenticated bridge result.
- Capture the explicit request-permission instrumentation outcome: zero forwarded tool calls and zero permission callbacks.
- Extend the Claude ACP runtime plan with the escalation status and upstream bridge/ACP permission-forwarding requirement.

Files changed:
 docs/acp-contract.md                                      | 13 +++++++++++--
 docs/plans/2026-06-14-001-feat-claude-acp-runtime-plan.md |  3 +++
 2 files changed, 14 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-6473

Fusion-Task-Lineage: 2e6ec23b-a9cd-4fd0-b24e-72ee8bb145ac
2026-06-15 02:30:41 -07:00
gsxdsm
d8fe994ca7 FN-6472: make release dry-runs non-interactive by default
Make dry-run release previews skip stdin prompts unless explicitly requested.

- Add a release prompt gate that suppresses version prompts for default dry-runs and honors --interactive as an opt-in.
- Update release CLI usage text and argument parsing for dry-run interactivity.
- Cover dry-run, --yes, real-release, and release.mjs ordering behavior with script tests.

Files changed:
 scripts/__tests__/release-prompt-gate.test.mjs | 72 ++++++++++++++++++++++++++
 scripts/lib/release-prompt-gate.mjs            | 13 +++++
 scripts/release.mjs                            | 16 ++++--
 3 files changed, 97 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6472

Fusion-Task-Lineage: 07bfd944-f4a0-454a-883f-dadf1aa0b7d4
2026-06-15 02:30:41 -07:00
gsxdsm
830bc7a67c FN-6467: record ACP bridge rerun blocker
Record the FN-6467 U9 rerun outcome so Route A remains gated on authenticated ACP bridge evidence.

- Document the second direct bridge attempt against claude 2.1.177 and claude-code-cli-acp 0.1.1.
- Preserve the accepted 62-tool custom-tools MCP payload details and lockfile integrity evidence.
- Mark forwarded tool invocation and ACP permission-gate traversal as unresolved because the bridge still reports Not logged in.

Files changed:
 docs/acp-contract.md                                      | 15 ++++++++++-----
 docs/plans/2026-06-14-001-feat-claude-acp-runtime-plan.md |  3 +++
 2 files changed, 13 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-6467
Fusion-Task-Lineage: fa2c1e16-7822-421b-80cf-e4ab247641a5
2026-06-15 02:30:41 -07:00
gsxdsm
1b1d6f4359 FN-6466: record blocked ACP bridge spike result
Record the real Route A U9 bridge attempt and keep OQ1 at NOT GO.

- Document that claude-code-cli-acp accepted a non-empty Fusion MCP server declaration.
- Capture the unauthenticated claude blocker before forwarded tool invocation or permission telemetry.
- Keep FN-6460 blocked until an authenticated rerun proves tool forwarding and ACP permission traversal.

Files changed:
 docs/acp-contract.md                                      | 13 +++++++++++--
 docs/plans/2026-06-14-001-feat-claude-acp-runtime-plan.md |  3 +++
 2 files changed, 14 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-6466

Fusion-Task-Lineage: 0bce3b9f-fbab-4562-9a7b-9d5551335fa4
2026-06-15 02:30:41 -07:00
gsxdsm
41d4704138 FN-6465: document ACP Route A recovery blockers
Record the unrecovered Route A U9 verdict and the design-only U14 confirmation so follow-up work preserves the ACP permission-gate blocker.\n\n- Add an ACP contract open-question entry that marks Route A as NOT GO until real MCP forwarding and ACP permission-gate traversal are proven.\n- Capture the FN-6465 recovery outcome in the Claude ACP runtime plan, including the missing FN-6459 evidence and required rerun criteria.\n- Confirm the internal Route A design mechanisms while keeping implementation blocked on U9.\n\nFiles changed:\n docs/acp-contract.md                               | 24 ++++++++++++++++++++++\n .../2026-06-14-001-feat-claude-acp-runtime-plan.md |  9 ++++++++\n 2 files changed, 33 insertions(+)

Fusion-Task-Id: FN-6465

Fusion-Task-Lineage: d4762440-cbb9-4206-b4b2-be578eba30dd
2026-06-15 02:30:41 -07:00
gsxdsm
863ebfaa96 FN-6464: add CLI session relaunch route
Enable exhausted CLI sessions to request a fresh task-backed relaunch from the dashboard.

- Add an authenticated project-scoped relaunch endpoint for task-bound CLI sessions.\n- Wire relaunch intent through the dashboard server to clear resume linkage and re-enqueue the owning task.\n- Enable the session banner Relaunch fresh action and cover API, UI, transport, and runtime wiring behavior.\n- Document the CLI session action contract and add a published package changeset.\n\nFiles changed:\n .changeset/fn-6464-cli-relaunch-route.md           |  5 ++
 docs/agents.md                                     |  4 +
 packages/cli/src/commands/dashboard.ts             |  2 +
 packages/dashboard/app/App.tsx                     | 20 +++--
 .../app/__tests__/app-cli-action-wiring.test.tsx   | 31 +++++++-
 packages/dashboard/app/api/legacy.ts               |  7 ++
 .../__tests__/SessionNotificationBanner.test.tsx   | 52 ++++++++++---
 .../src/__tests__/cli-agent-runtime-wiring.test.ts | 49 +++++++++++-
 .../src/__tests__/cli-session-transport.test.ts    | 36 +++++++++
 .../src/__tests__/cli-sessions-routes.test.ts      | 50 +++++++++++-
 packages/dashboard/src/cli-session-transport.ts    | 38 +++++++++
 packages/dashboard/src/index.ts                    |  3 +-
 packages/dashboard/src/routes/cli-sessions.ts      | 26 ++++++-
 packages/dashboard/src/server.ts                   | 89 ++++++++++++++++++++++
 14 files changed, 390 insertions(+), 22 deletions(-)

Fusion-Task-Id: FN-6464

Fusion-Task-Lineage: f1ce171b-84a7-4893-9288-e1c8f01c3305
2026-06-15 02:30:41 -07:00
gsxdsm
a9815fb1ff FN-6457: add ACP ask runner and bundled Claude bridge setup
Route ACP-backed planning and validation through a read-only ask-once runner with a pinned Claude bridge foundation.

- Add askAcpOnce for single-turn ACP sessions with timeout handling, JSON recovery, clean stop validation, and disposal.
- Refactor validation seams to use ACP runtime prompts and require structured pass verdicts.
- Resolve the Claude ACP bridge from the plugin bundle and add setup checks for identity, environment, probing, and auth readiness.
- Document the ACP Route B plan and update tests for validator, session, runtime, and plugin setup behavior.

Files changed:
 CONCEPTS.md                                        |   6 +
 docs/acp-contract.md                               |  36 ++
 .../2026-06-14-001-feat-claude-acp-runtime-plan.md | 465 +++++++++++++++++++++
 .../engine/src/__tests__/cli-agent-ask.test.ts     | 104 +++++
 .../src/__tests__/cli-agent-validator.test.ts      | 137 +++---
 .../src/__tests__/interactive-ai-session.test.ts   |  96 +++--
 packages/engine/src/agent-runtime.ts               |   6 +-
 packages/engine/src/cli-agent-ask.ts               | 120 ++++++
 packages/engine/src/cli-agent-validator.ts         |  65 ++-
 .../cli-agent/__tests__/one-shot-session.test.ts   |  16 +-
 packages/engine/src/cli-agent/one-shot-session.ts  |  17 +-
 packages/engine/src/index.ts                       |   8 +-
 packages/engine/src/interactive-ai-session.ts      |  33 +-
 plugins/fusion-plugin-acp-runtime/AGENTS.md        |  14 +
 plugins/fusion-plugin-acp-runtime/CHANGELOG.md     |   6 +
 plugins/fusion-plugin-acp-runtime/README.md        |  13 +-
 plugins/fusion-plugin-acp-runtime/package.json     |   3 +-
 .../src/__tests__/index.test.ts                    |  51 ++-
 .../src/__tests__/process-manager.test.ts          |  32 +-
 .../src/__tests__/runtime-adapter.test.ts          |   4 +-
 .../src/__tests__/setup.test.ts                    |  71 ++++
 plugins/fusion-plugin-acp-runtime/src/cli-spawn.ts |  95 ++++-
 plugins/fusion-plugin-acp-runtime/src/index.ts     |  16 +-
 .../src/process-manager.ts                         |  26 +-
 .../src/runtime-adapter.ts                         |  11 +-
 plugins/fusion-plugin-acp-runtime/src/setup.ts     | 104 +++++
 plugins/fusion-plugin-acp-runtime/src/types.ts     |   6 +-
 pnpm-lock.yaml                                     | 139 ++++--
 28 files changed, 1502 insertions(+), 198 deletions(-)

Fusion-Task-Id: FN-6457
Fusion-Task-Lineage: a3364ed7-cb28-4a2b-b898-6ccd0d95fb92
2026-06-15 02:30:41 -07:00
gsxdsm
fee0178b4f FN-6461: block incomplete no-commits no-op finalization
Add a shared no-op finalize guard so no-commits tasks with mostly incomplete steps return to todo instead of silently completing.

- Add core step-evidence evaluation for no-commits no-op finalization.
- Apply the guard across AI empty merge, early empty-own-diff, legacy no-op classifier, direct no-op, and self-healing finalize lanes.
- Emit run-audit/log evidence and preserve progress when demoting blocked tasks.
- Cover guard behavior with core, merger, AI merge, real-git, and self-healing tests.
- Document the finalize integrity invariant and add a patch changeset.

Files changed:
 .changeset/fn-6461-no-commits-finalize-guard.md    |   5 +
 docs/architecture.md                               |   2 +
 .../__tests__/no-commits-finalize-guard.test.ts    |  58 +++++++
 packages/core/src/index.ts                         |   2 +
 packages/core/src/no-commits-finalize-guard.ts     |  42 +++++
 packages/engine/src/__tests__/merger-ai.test.ts    |  59 +++++++
 .../merger-finalize-unproven.real-git.test.ts      | 176 +++++++++++++++++++++
 packages/engine/src/__tests__/self-healing.test.ts | 125 +++++++++++++++
 packages/engine/src/merger-ai.ts                   |  45 ++++++
 packages/engine/src/merger.ts                      | 130 +++++++++++++++
 packages/engine/src/run-audit.ts                   |   6 +
 packages/engine/src/self-healing.ts                |  41 ++++-
 12 files changed, 689 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-6461
Fusion-Task-Lineage: 36647768-42da-414a-9304-d8e0ed61b99c
2026-06-15 02:29:08 -07:00
gsxdsm
da44392fea FN-6462: document OAuth refresh behavior
Document Claude OAuth refresh behavior across user-facing docs.

- Explain that auth status polling can refresh expired Anthropic OAuth credentials automatically.
- Clarify when OAuth expiry banners and notifications remain visible after refresh attempts.
- Update onboarding guidance to set expectations for Claude re-login frequency.

Files changed:
 docs/dashboard-guide.md    |  6 +++++-
 docs/getting-started.md    |  2 +-
 docs/settings-reference.md | 10 ++++++++--
 3 files changed, 14 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6462

Fusion-Task-Lineage: 06a73655-483d-4379-aeba-ac6bf9bb8df9
2026-06-15 02:29:08 -07:00
gsxdsm
cd2da104f9 FN-6458: wire CLI session banner actions
Wire the dashboard session banner to execute supported CLI session actions and disable unsupported ones.

- Route advance, retry, cancel, and reauthenticate banner actions through existing dashboard API/task/settings flows.
- Include CLI waiting and needs-attention sessions in background session filtering for banner visibility.
- Disable unavailable CLI banner actions with accessible labels and disabled styling.
- Cover action wiring, disabled states, and CLI session inclusion with dashboard tests.

Files changed:
 .changeset/fn-6458-cli-banner-actions.md           |  5 ++
 packages/dashboard/app/App.tsx                     | 95 ++++++++++++++++++++-
 .../app/__tests__/app-cli-action-wiring.test.tsx   | 98 ++++++++++++++++++++++
 .../app/components/SessionNotificationBanner.css   | 19 ++++-
 .../app/components/SessionNotificationBanner.tsx   | 60 ++++++++-----
 .../__tests__/SessionNotificationBanner.test.tsx   | 81 +++++++++++++++++-
 .../hooks/__tests__/useBackgroundSessions.test.ts  |  5 ++
 .../dashboard/app/hooks/useBackgroundSessions.ts   | 15 +++-
 8 files changed, 347 insertions(+), 31 deletions(-)

Fusion-Task-Id: FN-6458

Fusion-Task-Lineage: 5f6c57a3-07e2-4353-89e3-c7de20984813
2026-06-15 02:29:08 -07:00
gsxdsm
a26d79cbb6 FN-6454: delete expired quarantined dashboard tests
Apply the dashboard quarantine deletion ratchet by removing stale quarantined suites and clearing the active skip ledger.

- Delete dashboard component and API test files that remained quarantined under the ratchet.
- Empty the dashboard Vitest quarantine exclude list so future quarantines must be newly mirrored.
- Clear the quarantine ledger entries after deleting their associated files.

Files changed:
 ...hatView.regular-composer-no-right-line.test.tsx |  108 -
 .../components/__tests__/MissionManager.test.tsx   | 5654 ------------------
 .../app/components/__tests__/ModalReentry.test.tsx |  439 --
 .../components/__tests__/ModelSelectorTab.test.tsx | 1325 -----
 .../components/__tests__/NewAgentDialog.test.tsx   | 2043 -------
 .../__tests__/OAuthReloginBanner.test.tsx          |  237 -
 .../__tests__/PlanningModeModal.favorites.test.tsx |  540 --
 .../__tests__/PlanningModeModal.questions.test.tsx | 1230 ----
 .../PlanningModeModal.swipe-back.test.tsx          |  239 -
 .../components/__tests__/SkillsView.css.test.ts    |   89 -
 .../app/components/__tests__/mobile-css.test.tsx   |  143 -
 .../dashboard/src/__tests__/mission-e2e.test.ts    | 6176 --------------------
 packages/dashboard/src/__tests__/planning.test.ts  | 3633 ------------
 packages/dashboard/vitest.config.ts                |   40 +-
 scripts/lib/test-quarantine.json                   |   70 +-
 15 files changed, 8 insertions(+), 21958 deletions(-)

Fusion-Task-Id: FN-6454
Fusion-Task-Lineage: f18e940d-f8ee-4ade-aedb-714b8e39e2a4
2026-06-15 02:29:08 -07:00
gsxdsm
dc4c2b2204 FN-6453: clean up AI-merge worktrees after setup failures
Ensure AI-merge clean-room directories are cleaned up even when setup fails before worktree registration.

- Move clean-room directory creation inside the cleanup guard so terminal setup failures can remove it.
- Skip cleanup only when no merge root was ever created, while still unregistering any registered paths.
- Add regression coverage for active-session registration failure after mkdtemp and before git worktree add.

Files changed:
 .../ai-merge-worktree-cleanup.test.ts              | 31 ++++++++++++++++++++++
 packages/engine/src/merger-ai.ts                   | 21 ++++++++++-----
 2 files changed, 45 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-6453

Fusion-Task-Lineage: 364b329b-c3e7-4902-8ca8-673360b0d9ac
2026-06-15 02:29:08 -07:00
gsxdsm
8d228fc212 Merge pull request #1679 from Runfusion/fix/full-suite-schema-and-cancel-error
fix: repair two post-merge Full Suite failures
2026-06-15 16:57:35 +08:00
gsxdsm
1815b87022 Merge pull request #1678 from plarson/fix/mission-stale-feature-repair
fix(engine): retriage stale mission feature links
2026-06-15 16:51:41 +08:00
gsxdsm
a2f5dd4d01 Merge pull request #1677 from plarson/fix/task-detail-log-entry-rendering
fix(dashboard): guard task detail log rendering
2026-06-15 16:51:04 +08:00
gsxdsm
f80b301af2 chore(release): v0.43.1
Version bump via changesets.
2026-06-14 22:43:49 -07:00
Phil Larson
283f689d8a fix(engine): retriage stale mission feature links 2026-06-14 19:26:55 -07:00
gsxdsm
62335f8814 fix: repair two post-merge Full Suite failures
The non-blocking Full Suite tier on main was red on shards 2 and 4:

- roadmap-store schema assertion lagged core's SCHEMA_VERSION bump to 117
  (landed in FN-6277), so it still expected 116.
- useCeSessions "cancel surfaces a transport error" failed deterministically:
  a session with an in-flight status keeps the poll fallback running, and a
  successful background list refresh called setError(undefined), wiping the
  cancel error before it could be observed. Background refreshes (poll + push)
  now leave action errors intact; only user-initiated/initial refreshes clear.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 15:56:26 -07:00
gsxdsm
f7635faf37 FN-6452: backfill plugin proof-point evidence
Document the restored FN-6437 proof-point results in the external plugin runbook.

- Replace the pending-verification placeholder with the recorded NOT MET verdict for @runfusion/fusion@0.43.0.
- Add package, integrity, environment, command, scaffold, and TypeScript failure evidence from the restored report.
- Preserve explicit gaps for list/enable proof and follow-up checks that were blocked by the released scaffold failure.

Files changed:
 docs/plugins/external-proof-point-runbook.md | 132 +++++++++++++++++++++++++--
 1 file changed, 124 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-6452

Fusion-Task-Lineage: 14d3b848-59cd-43bb-b725-6586182906ee
2026-06-14 15:29:35 -07:00
gsxdsm
fa71525850 FN-6438: add external plugin proof-point runbook
Add a durable proof-point runbook for validating external plugins against released Fusion CLI builds.

- Document release selection, npm integrity capture, scaffold/build/test/install/enable validation, and pass/fail criteria for external plugin proof points.
- Link the runbook from the docs index so it remains discoverable with other plugin authoring docs.
- Extend the docs README index test to require the new proof-point runbook entry.

Files changed:
 docs/README.md                                     |   1 +
 docs/plugins/external-proof-point-runbook.md       | 211 +++++++++++++++++++++
 .../cli/src/__tests__/docs-readme-index.test.ts    |   1 +
 3 files changed, 213 insertions(+)

Fusion-Task-Id: FN-6438

Fusion-Task-Lineage: 5c768d7e-4465-42ac-9535-f16dc42ab6d0
2026-06-14 15:29:35 -07:00
gsxdsm
56d9743a58 FN-6451: ignore local Paseo config
Keep Paseo-generated repo-root configuration out of source control.

- Add a documented .gitignore entry for paseo.json.\n- Preserve local Paseo worktree-manager configuration as untracked repo noise.\n\nFiles changed:\n .gitignore | 4 ++++\n 1 file changed, 4 insertions(+)

Fusion-Task-Id: FN-6451

Fusion-Task-Lineage: 412c2dda-c461-4dbb-a413-fb69eb8b7736
2026-06-14 15:29:35 -07:00
gsxdsm
b7c23c09c3 FN-6450: enable touch scrolling for agent detail tabs
Enable mobile users to swipe across the agent detail tab strip.

- Restores horizontal touch panning on the agent detail tabs while preserving vertical pan behavior.
- Documents the mobile touch-action requirement next to the tab-strip CSS.
- Adds a mobile regression test covering pan-x touch-action and horizontal overflow.

Files changed:
 packages/dashboard/app/components/AgentDetailView.css     |  6 ++++++
 .../__tests__/AgentDetailView.mobile-scroll.test.tsx      | 15 +++++++++++++++
 2 files changed, 21 insertions(+)

Fusion-Task-Id: FN-6450
Fusion-Task-Lineage: 7006af83-4490-4fe0-a357-7d19b7b522c0
2026-06-14 15:29:35 -07:00
gsxdsm
e526ad2b2c FN-6447: rescue session reconnect teardown
Rescue the session reconnect SSE test by shutting down route-owned background work before temp cleanup.

- Isolate the focused API harness from TaskStore EventEmitter startup workers.
- Dispose API routes and scheduled AI session cleanup before deleting the test temp root.
- Remove session-reconnect from the dashboard quarantine ledger and vitest skip list.

Files changed:
 .../src/__tests__/session-reconnect.test.ts        | 22 ++++++++++++++++++----
 packages/dashboard/vitest.config.ts                |  6 ++++--
 scripts/lib/test-quarantine.json                   |  5 -----
 3 files changed, 22 insertions(+), 11 deletions(-)

Fusion-Task-Id: FN-6447

Fusion-Task-Lineage: a3fef28c-b92b-4f47-9181-a63bb31e4f48
2026-06-14 15:29:35 -07:00
gsxdsm
12efd3fd3f FN-6445: reject quality skip-list overlaps
Prevent dashboard curated skip-list entries from masking tests already covered by quality projects.

- Add validation that flags skip-list files included by quality lanes.
- Cover overlap, empty-reason overlap, and genuine orphan cases in inventory tests.
- Document that skip-lists are only for genuinely non-executed dashboard tests.

Files changed:
 docs/testing.md                                 |  1 +
 scripts/__tests__/check-test-inventory.test.mjs | 29 ++++++++++++++++++++++---
 scripts/check-test-inventory.mjs                |  9 ++++++++
 3 files changed, 36 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-6445

Fusion-Task-Lineage: 1741f684-8dfc-41fc-8f30-baa3700ac11b
2026-06-14 15:29:35 -07:00
gsxdsm
c9680b5767 FN-6448: document Quick Chat mobile reliability
Document Quick Chat's mobile send and stop-button reliability expectations.\n\n- Note the mobile delivery watchdog for stranded queued messages.\n- Describe duplicate pointer/touch send protection and immediate stop handling.\n- Document the streaming stop control's square touch-target sizing.\n\nFiles changed:\n docs/dashboard-guide.md | 3 +++\n 1 file changed, 3 insertions(+)

Fusion-Task-Id: FN-6448

Fusion-Task-Lineage: e5d4e5b5-05ba-47bc-9b64-0d641b8d75a8
2026-06-14 15:29:35 -07:00
gsxdsm
c12e7e39fb FN-6444: rescue dashboard route API tests
Rescue deterministic dashboard route/API tests from the curated skip-list and quarantine the remaining stale suites.

- Remove dashboard src route/API tests from the curated skip-list once they either run in backfill or move to quarantine.
- Add dated quarantine coverage for stale mission, planning, and session reconnect suites.
- Update rescued route/API test expectations and FNXC comments to match current deterministic behavior.

Files changed:
 .../dashboard/src/__tests__/chat-manager.test.ts   |  4 ++
 .../dashboard/src/__tests__/evals-routes.test.ts   |  8 +++-
 .../src/__tests__/github-tracking-delete.test.ts   |  4 ++
 ...ithub-tracking-periodic-reconcile-sweep.test.ts |  8 +++-
 .../src/__tests__/insights-routes.test.ts          | 12 ++++--
 .../__tests__/routes-run-audit-goal-events.test.ts |  6 ++-
 .../src/__tests__/routes-run-cited-goals.test.ts   |  6 ++-
 .../shared-branch-group-entry-points.test.ts       |  6 +--
 packages/dashboard/src/__tests__/usage.test.ts     |  4 ++
 packages/dashboard/vitest.config.ts                |  6 +++
 scripts/lib/dashboard-curated-skiplist.json        | 44 ----------------------
 scripts/lib/test-quarantine.json                   | 15 ++++++++
 12 files changed, 66 insertions(+), 57 deletions(-)

Fusion-Task-Id: FN-6444

Fusion-Task-Lineage: f314da67-d05e-48c5-9c9c-890c28cf0e5b
2026-06-14 15:29:35 -07:00
gsxdsm
6cc873e23f FN-6446: make Secrets view fill mobile width
Ensure the Secrets page root expands within the project content flex row on narrow screens.

- Let the Secrets view root flex to available width with a zero min-width.
- Preserve existing height and spacing behavior while avoiding intrinsic card-width collapse.
- Cover the mobile layout contract with a root-container CSS assertion.

Files changed:
 packages/dashboard/app/components/SecretsView.css                  | 7 +++++++
 .../dashboard/app/components/__tests__/SecretsView.mobile.test.tsx | 7 +++++++
 2 files changed, 14 insertions(+)

Fusion-Task-Id: FN-6446

Fusion-Task-Lineage: 34f55d8e-ee57-432c-b1ce-165cc43333ee
2026-06-14 15:29:35 -07:00
gsxdsm
1f540b29d7 FN-6443: rescue dashboard session tests
Rescue skipped dashboard session tests by making planning responses durable before continuation.

- Persist planning-session response history before agent continuation so retry and replay state survives generation errors.
- Isolate dashboard session tests on dedicated SQLite handles and close them before temp cleanup.
- Restore engine mocks for workflow authoring tools and remove the rescued session tests from the curated dashboard skiplist.
- Add a patch changeset for the published CLI bundle.

Files changed:
 .changeset/fn-6443.md                              |  5 +++
 .../src/__tests__/session-cross-tab.test.ts        | 38 ++++++++++++++--------
 .../src/__tests__/session-error-recovery.test.ts   |  2 ++
 .../session-persistence-roundtrip.test.ts          |  2 ++
 .../src/__tests__/session-reconnect.test.ts        | 21 ++++++++++--
 packages/dashboard/src/planning.ts                 | 11 ++++---
 scripts/lib/dashboard-curated-skiplist.json        | 16 ---------
 7 files changed, 58 insertions(+), 37 deletions(-)

Fusion-Task-Id: FN-6443

Fusion-Task-Lineage: 953534e7-6857-4cd5-9a5a-5772354cac5a
2026-06-14 15:29:35 -07:00