Commit Graph

11746 Commits

Author SHA1 Message Date
gsxdsm
119fcedcfe FN-8276: unify mobile board snap behavior
Make JavaScript the sole authority for mobile Kanban pan settlement.

- Suspend native proximity snapping while a user pan settles, then restore its inline baseline.
- Restore snapping after wheels with no horizontal scroll as well as pointer and touch completion.
- Document the unified magnetism behavior and cover restoration paths with hook tests.

Files changed:
 .changeset/fn-8276-unify-board-magnetism.md        |  7 +++
 docs/dashboard-guide.md                            |  3 +-
 .../hooks/__tests__/useColumnScrollSnap.test.ts    | 53 +++++++++++++++--
 .../dashboard/app/hooks/useColumnScrollSnap.ts     | 66 ++++++++++++++++++++--
 4 files changed, 119 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-8276

Fusion-Task-Lineage: 1ff3ae24-51e8-4c4f-aa5a-7a7b7c84d37c

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 09:05:51 -07:00
gsxdsm
88fd8f3e7a FN-8280: document full-loop agent tool-surface plan
Document the current agent/chat build-loop surface, its gaps, and a safe delivery plan.

- Audit ideation, research, roadmap, execution, verification, and concurrency boundaries
- Define canonical-operation parity and guardrails for future tool exposure
- Link the audit from the agent tooling documentation

Files changed:
 docs/agent-tool-surface-full-loop.md | 138 +++++++++++++++++++++++++++++++++++
 docs/agents.md                       |   2 +-
 2 files changed, 139 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-8280

Fusion-Task-Lineage: ff28e0f4-c934-40a4-b030-9541b74bb913

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 08:47:18 -07:00
gsxdsm
6bf20ea249 fix(ci): quarantine CLI lock-retry flakes + settle planning tab-lock (#2305)
## Summary
- Full Suite after FN-8271 restore turned red again
([29648952207](https://github.com/Runfusion/Fusion/actions/runs/29648952207)):
- **shard 4**: `mcp-lock-retry` / `task-lock-retry` 5s timeouts under
package-lane load
- **shard 3**: planning “never acquires a tab lock…” —
`respondToPlanning` never called after Small/Continue
- Re-quarantine the two CLI lock-retry files in ledger +
`packages/cli/vitest.config.ts` (no timeout appeasement).
- Planning tab-lock test: select Small via radio role, wait for checked,
longer `waitFor` on respond.

## Test plan
- [x] lockstep-cli-quarantine
- [x] planning tab-lock interaction test
- [ ] Full Suite all 4 shards green on main

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

## Summary by CodeRabbit

* **Bug Fixes**
* Improved the reliability of the dashboard planning flow by using more
precise controls and bounded waits during automated interactions.

* **Tests**
* Quarantined two intermittently timing-out CLI integration tests to
reduce full-suite instability.
* Documented the quarantine reasons and tracking details for the
affected tests.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 08:30:28 -07:00
gsxdsm
69e7a34077 FN-8273: add mission auto-merge overrides
Allow operators to override project auto-merge behavior for each mission.

- Add create and update API support for mission auto-merge overrides, including clearing inherited behavior.
- Expose inherited, auto-merge, and single-pull-request choices in all mission forms.
- Apply disabled mission auto-merge to newly triaged tasks and cover storage, API, and UI behavior.
- Document the override and add a CLI changeset.

Files changed:
 .changeset/fn-8273-mission-auto-merge.md           |   7 ++
 docs/missions.md                                   |   4 +
 .../mission-store.sync-auto-merge.test.ts          |  22 ++++
 .../__tests__/postgres/mission-store.pg.test.ts    |  35 ++++++
 packages/core/src/async-mission-store.ts           |   5 +
 packages/core/src/mission-store.ts                 |   5 +
 packages/dashboard/app/api/legacy.ts               |   4 +-
 .../dashboard/app/components/MissionManager.tsx    |  55 +++++++++
 .../__tests__/MissionManager.auto-merge.test.tsx   | 132 +++++++++++++++++++++
 packages/dashboard/app/components/mission-types.ts |   2 +
 packages/dashboard/src/mission-routes.ts           |  18 ++-
 .../routes/__tests__/mission-autoMerge-e2e.test.ts |  66 +++++++++++
 12 files changed, 351 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-8273

Fusion-Task-Lineage: d24d7c22-5a14-4446-b3e1-c35b2f0480c3

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 08:01:44 -07:00
gsxdsm
6308887b45 FN-8274: fix compound-engineering PostgreSQL test URL derivation
Use the shared PostgreSQL test base URL across Compound Engineering's test harnesses.

- Import the core PostgreSQL URL configuration for admin and integration test connections.
- Add a credential-safe source guard for base URL derivation.
- Declare the shared URL export for Compound Engineering tests.

Files changed:
 .../src/__tests__/_harness.ts                      | 15 ++++----
 .../src/__tests__/base-url-derivation.test.ts      | 42 ++++++++++++++++++++++
 .../src/__tests__/pg-test-harness.d.ts             |  1 +
 .../src/__tests__/pipeline-store.pg.test.ts        | 12 +++----
 4 files changed, 57 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-8274

Fusion-Task-Lineage: 84921b47-4275-4357-9e3a-be025863dbb3

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 07:53:32 -07:00
gsxdsm
afb2ed0650 FN-8271: restore quarantined CLI tests under shard load
Restore affected CLI and engine tests by removing load-amplifying fixture work and synchronizing fake-timer recovery.

- Replace the dist-barrel PostgreSQL fixture with an injected in-memory task store.
- Move mission and goal tool coverage to the shared PostgreSQL harness and complete plugin-store mocks.
- Return rescued CLI and heartbeat tests to default lanes and clear their quarantine records.

Files changed:
 .../src/__tests__/extension-dist-barrel.test.ts    | 90 ++++++++--------------
 .../__tests__/extension-mission-goal-tools.test.ts | 27 ++++---
 packages/cli/src/commands/__tests__/plugin.test.ts | 11 +++
 packages/cli/vitest.config.ts                      | 21 +----
 .../src/__tests__/heartbeat-error-recovery.test.ts | 33 ++++----
 packages/engine/vitest.config.ts                   |  7 +-
 scripts/lib/test-quarantine.json                   | 78 +------------------
 7 files changed, 84 insertions(+), 183 deletions(-)

Fusion-Task-Id: FN-8271

Fusion-Task-Lineage: 212a3ec7-db6b-4e80-97c3-1c704822cf60

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 07:48:45 -07:00
gsxdsm
825e6c185c fix(dashboard): settle multi-select Other before input (#2302)
## Summary
- Full Suite
[29646721723](https://github.com/Runfusion/Fusion/actions/runs/29646721723)
shard 3: multi-select Other-only timed out on `planning-other-input`.
- Wait for Other checkbox `toBeChecked()`, then `findByTestId`; apply
same settle to remaining Other paths.

## Test plan
- [x] Other-only multi/single-select + clear/confirm/checkpoint Other
tests
- [ ] Full Suite all 4 shards green on main

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

## Summary by CodeRabbit

* **Tests**
* Improved planning-flow test reliability by waiting for “Other” inputs
and selections to be ready before interacting with them.
* Updated assertions to account for UI state settling during
multi-select and confirmation flows.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 07:17:27 -07:00
gsxdsm
9f8be56f14 fix(dashboard): Settings Memory nav + Loading ready wait (#2301)
## Summary
- Full Suite
[29645564540](https://github.com/Runfusion/Fusion/actions/runs/29645564540):
shards 1–3 green; shard 4 settings suite failed.
- Exact `Memory` nav name (vs `/Memory/` matching **Memory Backups**).
- `waitForSettingsModalReady` waits for Loading… to clear after
fetchSettings.

## Test plan
- [x] memory backend status hook test
- [x] Anthropic Subscription OAuth incomplete toast
- [ ] Full Suite all 4 shards green on main

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

## Summary by CodeRabbit

* **Tests**
* Improved settings modal test synchronization to reliably wait for
loading to finish.
* Refined memory settings navigation checks to target the correct
section and avoid ambiguous matches.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 06:44:58 -07:00
gsxdsm
caffc0d40d fix(dashboard): mock store.getTask for tracking done comments (#2300)
## Summary
- Full Suite
[29644469846](https://github.com/Runfusion/Fusion/actions/runs/29644469846):
shards 1–3 green; shard 4 failed `github-issue-comment`
(`this.store.getTask is not a function`).
- Tracking Done comments re-read the task for landing-commit metadata;
MockStore now implements `getTask` (null → product snapshot fallback).

## Test plan
- [x] `github-issue-comment.test.ts` — 33 passed
- [ ] Full Suite all 4 shards green on main

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

## Summary by CodeRabbit

* **Tests**
* Updated GitHub issue comment test scaffolding to support task lookups
during completion handling.
  * Kept comment-posting assertions deterministic.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 06:07:04 -07:00
gsxdsm
0aacee0aeb fix(dashboard): align planning tests with clarification default-off (#2299)
## Summary
- Full Suite
[29643371961](https://github.com/Runfusion/Fusion/actions/runs/29643371961)
after #2298: shards 1–2 green; shard 3 confirm Other race; shard 4 MCP +
re-emit planning tests.
- MCP lane mock: follow-up prompts return `complete` (product defaults
clarification off).
- Re-emit suite: pass `clarificationEnabled: true` so multi-question
interview invariants still run.
- Confirm Other UI test: `findByTestId("planning-other-input")` after
click.

## Test plan
- [x] mcp-lane-forwarding + planning-answered-question-reemit (14)
- [x] confirm Other desktop/mobile planning-flow
- [ ] Full Suite all 4 shards green on main

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

## Summary by CodeRabbit

* **Tests**
* Improved automated coverage for planning-mode interviews, including
“Other” responses and follow-up prompts.
* Increased test reliability by handling asynchronous input updates more
consistently.
* Added validation for clarification-enabled interviews and completion
behavior in MCP forwarding scenarios.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 05:31:01 -07:00
gsxdsm
ec99f17478 fix: i18n ephemeral policy keys + planning loading race (#2298)
## Summary
- Full Suite
[29642536622](https://github.com/Runfusion/Fusion/actions/runs/29642536622)
after #2297: shards 1–2 green; shard 4 i18n parity + shard 3
PlanningMode loading.
- Add `settings.general.ephemeralAgentTaskCreationPolicy*` to
zh-CN/zh-TW/fr/es/ko (FN-8265 keys were en-only).
- Gate the follow-up SSE question in the PlanningMode loading test so
`.planning-loading` is assertable before the next question arrives (CI
race).

## Test plan
- [x] `@fusion/i18n` parity + gate-coverage tests
- [x] PlanningModeModal loading-after-response test
- [ ] Full Suite all 4 shards green on main

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

## Summary by CodeRabbit

* **New Features**
* Added localized settings text for configuring ephemeral agent
follow-up task creation policies in Spanish, French, Korean, Simplified
Chinese, and Traditional Chinese.
* Added options to allow, require validation, or deny follow-up task
creation.

* **Tests**
* Improved planning mode loading-state test reliability with
deterministic synchronization.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 04:54:34 -07:00
gsxdsm
b3904f6405 FN-8269: replace raw white component colors with tokens
Replace component-level white literals with semantic dashboard tokens and protect the pattern with a hygiene regression scan.

- Add semantic tokens for workflow chip foregrounds and HTML preview canvases
- Apply the tokens to workflow and artifact gallery component CSS
- Extend CSS hygiene coverage and add a patch changeset

Files changed:
 .changeset/fn-8269-fff-tokens.md                     |  7 +++++++
 .../dashboard/app/__tests__/css-hygiene-scan.test.ts | 20 +++++++++++++++++++-
 .../dashboard/app/components/ArtifactsGallery.css    |  4 ++--
 .../app/components/WorkflowAddStepModal.css          |  3 ++-
 .../app/components/WorkflowSimpleCanvas.css          |  3 ++-
 packages/dashboard/app/styles.css                    | 13 +++++++++++++
 6 files changed, 45 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-8269

Fusion-Task-Lineage: 5128286d-cdcf-4c9b-b097-e7eaed7d1713

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 04:44:53 -07:00
gsxdsm
e436635abd FN-8270: restore PostgreSQL migration quarantine tests
Restore seven PostgreSQL-compatible engine suites to the active test runs.

- Model asynchronous insight and goal-store collaborators in reporter and diagnostics tests.
- Await PostgreSQL audit reads in merger reliability tests.
- Remove the restored suites from Vitest exclusions and the quarantine ledger.

Files changed:
 .../__tests__/backlog-pressure-reporter.test.ts    | 19 +++++++----
 .../dependency-blocked-todo-reporter.test.ts       | 15 ++++++---
 .../goal-injection-diagnostics-wiring.test.ts      | 15 ++++++---
 .../__tests__/merger-cwd-fallback-removed.test.ts  | 13 +++++---
 .../integration-worktree-state.test.ts             | 13 +++++---
 .../merge-runner-spawn-enoent-prevention.test.ts   | 15 +++++---
 .../meta-chain-auto-close.test.ts                  |  9 ++++--
 packages/engine/vitest.config.ts                   | 20 ++----------
 scripts/lib/test-quarantine.json                   | 37 +---------------------
 9 files changed, 73 insertions(+), 83 deletions(-)

Fusion-Task-Id: FN-8270
Fusion-Task-Lineage: 65be82ef-f4d4-4a8a-b3cc-63486ee0823a
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 04:40:18 -07:00
gsxdsm
c1c18dfefa test(core): align settings parity + schema 0020 bookkeeping (#2297)
## Summary
- Full Suite run
[29641723814](https://github.com/Runfusion/Fusion/actions/runs/29641723814)
left shards 1–3 green; shard 4 (`@fusion/core`) failed after FN-8265
landed.
- `settings-parity`: `PROJECT_SETTINGS_KEYS` now includes
`NON_DEFAULT_PROJECT_SETTINGS_KEYS` (`ephemeralAgentTaskCreationPolicy`
has no default; resolver owns fallback).
- `schema-applier`: expected applied-migration lists and identity suite
include `TASK_PROPOSAL_CLAIM_VERSION` (`0020`).

## Test plan
- [x] `pnpm --filter @fusion/core exec vitest run
src/__tests__/settings-parity.test.ts
src/__tests__/postgres/schema-applier.test.ts` — 136 passed
- [ ] Full Suite all 4 shards green on main after merge

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

## Summary by CodeRabbit

* **Tests**
* Updated migration validation tests to include the latest task proposal
claim migration.
* Expanded settings parity checks to cover non-default project settings.
* Added coverage confirming migration ordering and immutable migration
identities.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 04:25:32 -07:00
gsxdsm
01519a1183 fix: fetchGlobalSettings mock for PlanningMode autosize/initial (#2296)
## Summary
Full Suite shard 4 failed `PlanningModeModal.autosize` with missing
`fetchGlobalSettings` on the `../../api` mock (product clarification
gating).

- Autosize: add sync-settled `fetchGlobalSettings` (FN-8245 pattern)
- Initial: replace async `mockResolvedValue` with the same sync settle

## Test plan
- [x] Local autosize + initial (29 tests) green
- [ ] PR gate + Full Suite

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

## Summary by CodeRabbit

* **Tests**
* Improved Planning Mode modal test reliability by making global
settings responses consistently complete.
* Reduced timing and race-condition sensitivity across initialization
and autosizing test scenarios.
* Added coverage for handling completed settings-loading flows without
affecting user-facing behavior.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 03:57:25 -07:00
gsxdsm
7c23771433 FN-8265: add task follow-up proposal creation
Enable configured ephemeral workers to propose and create follow-up tasks from mailbox messages.

- Add persisted task-proposal claim state, migrations, and async messaging APIs.
- Register task-proposal creation routes, SSE events, agent tool support, and CLI integration.
- Add mailbox creation controls, settings, documentation, localization, and regression coverage.

Files changed:
 .changeset/fn-8265-task-follow-up-policy.md        |   7 ++
 docs/dashboard-guide.md                            |   2 +-
 docs/settings-reference.md                         |  12 ++-
 packages/cli/src/extension.ts                      |  34 ++++---
 .../src/__tests__/postgres/sqlite-migrator.test.ts |  14 ++-
 .../postgres/task-proposal-claim.pg.test.ts        |  51 +++++++++++
 packages/core/src/async-message-store.ts           |  39 ++++++++
 packages/core/src/index.gate.ts                    |   4 +-
 packages/core/src/index.ts                         |   4 +-
 packages/core/src/message-store.ts                 |  46 ++++++++++
 .../core/src/postgres/migrations/0000_initial.sql  |   2 +
 .../migrations/0020_task_proposal_claim.sql        |   4 +
 packages/core/src/postgres/schema-applier.ts       |  13 ++-
 packages/core/src/postgres/schema/project.ts       |   3 +
 packages/core/src/settings-schema.ts               |  19 +++-
 packages/core/src/task-store/async-persistence.ts  |   2 +-
 packages/core/src/task-store/persistence.ts        |   4 +-
 packages/core/src/task-store/serialization.ts      |   1 +
 packages/core/src/task-store/task-creation.ts      |  51 +++++++++++
 packages/core/src/task-store/task-row-mappers.ts   |   2 +-
 packages/core/src/types.ts                         |  56 +++++++++++-
 packages/dashboard/app/api/legacy.ts               |   5 +
 packages/dashboard/app/components/MailboxModal.tsx |   4 +
 .../app/components/MailboxTaskProposal.css         |   3 +
 .../app/components/MailboxTaskProposal.tsx         |  33 +++++++
 packages/dashboard/app/components/MailboxView.tsx  |   4 +
 .../__tests__/MailboxTaskProposal.test.tsx         |  43 +++++++++
 .../app/components/settings/section-keys.ts        |   2 +-
 .../settings/sections/GeneralSection.search.ts     |  13 ++-
 .../settings/sections/GeneralSection.tsx           |  22 +++--
 .../settings-default-descriptions.test.tsx         |   4 +-
 .../routes/__tests__/task-proposal-routes.test.ts  |  99 ++++++++++++++++++++
 .../src/routes/register-messaging-scripts.ts       | 101 +++++++++++++++++++++
 packages/dashboard/src/sse.ts                      |   7 ++
 packages/engine/src/agent-tools.ts                 |  30 ++++--
 packages/engine/src/executor.ts                    |   9 +-
 packages/engine/src/step-session-executor.ts       |   8 +-
 packages/i18n/locales/en/app.json                  |   5 +
 38 files changed, 696 insertions(+), 66 deletions(-)

Fusion-Task-Id: FN-8265

Fusion-Task-Lineage: 4e864a2f-3485-4a54-8be7-1699b5479a94

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 03:48:38 -07:00
gsxdsm
454a2bda28 fix: settle multi-select Speed checkbox before Other in planning tests (#2295)
## Summary
Full Suite shard 3 (run 29640624429) failed mobile multi-select + Other:
submit payload only had `_other` and dropped `q-priorities: [\"speed\"]`
under load.

Hardens the test to click the Speed **checkbox by accessible name**,
wait for checked, then combine Other (FN-8245 settle discipline).

## Test plan
- [x] Local multi-select planning tests green
- [ ] PR gate
- [ ] Post-merge Full Suite all shards green

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

## Summary by CodeRabbit

* **Tests**
* Improved mobile planning-flow test reliability by ensuring
multi-select choices are committed before entering additional “Other”
text.
* Reduced the risk of intermittent CI failures when combining predefined
options with custom responses.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 03:45:26 -07:00
gsxdsm
36f7705a2c fix: wait for GitHub import re-translate after body edit (#2294)
## Summary
Full Suite shard 3 failed `GitHubImportAutoTranslate` re-request after
body edit: mock call count hit 2 before `translations.get(1).title`
committed. Wait for the map entry.

## Test plan
- [x] Local re-request test green
- [ ] PR gate + Full Suite

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

## Summary by CodeRabbit

* **Tests**
* Updated translation test timing to reliably account for asynchronous
translation results when issue content changes.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 03:18:18 -07:00
gsxdsm
c21bfdbdcc fix: backup automation mock + Claude probes dashboard alias (#2293)
## Summary
Full Suite after #2292: shards 1–3 green; shard 4 failed FN-7537 backup
automation tests with `store.getGlobalSettingsDir is not a function`.

- Add `getGlobalSettingsDir` to routes-automation mock store
- Point backup-parity fixtures’ global dir at the temp fusion dir
- Dashboard Vitest: alias `@fusion-plugin-examples/claude-runtime` →
`probes-entry` (same class as CLI #2292)

## Test plan
- [x] Local manual backup run parity (4 tests)
- [ ] PR gate
- [ ] Post-merge Full Suite

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

## Summary by CodeRabbit

* **Bug Fixes**
* Improved automation backup test coverage for global backup directory
handling.
* Preserved reliable manual backup behavior and event ordering across
supported automation steps.
* Fixed dashboard API test configuration for Claude runtime probe
resolution.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 02:55:59 -07:00
gsxdsm
91eb1b088a FN-8266: add GitHub import Chat prefill
Let operators open Chat from a selected GitHub issue or pull request with its link ready in the composer.

- Add GitHub-only Chat actions to import detail views and route their prefill through modal and embedded surfaces.
- Seed and focus the direct Chat composer without sending, while preserving saved drafts after failed default-session creation.
- Document the workflow and cover import, prefill, and draft-restoration behavior.

Files changed:
 docs/dashboard-guide.md                            | 12 +++-
 packages/dashboard/app/App.tsx                     | 16 +++++
 packages/dashboard/app/components/AppModals.tsx    |  3 +
 packages/dashboard/app/components/ChatView.tsx     | 70 +++++++++++++++++++-
 .../dashboard/app/components/GitHubImportModal.tsx | 28 +++++++-
 .../components/__tests__/ChatView.draft.test.tsx   | 74 ++++++++++++++++++++++
 .../__tests__/GitHubImportModal.test.tsx           | 49 ++++++++++++++
 .../app/components/dashboard/MainContent.tsx       |  5 ++
 .../dashboard/app/components/dashboard/types.ts    |  3 +
 9 files changed, 255 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-8266

Fusion-Task-Lineage: 30102ce8-5aca-4e34-8bb0-6f3c23e64044

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 02:41:35 -07:00
gsxdsm
90e8a10608 fix: resolve claude-runtime probe source for CLI full-suite (#2292)
## Summary
Full Suite after #2291: shards 1–3 green; shard 4 failed CLI suites
with:

`Failed to resolve entry for package
"@fusion-plugin-examples/claude-runtime"`

from `dashboard/src/runtime-provider-probes.ts` under the CLI vitest
package lane.

- Add `plugins/fusion-plugin-claude-runtime/src/probes-entry.ts` (probe
+ model discovery only)
- Alias `@fusion-plugin-examples/claude-runtime` to that entry in CLI
vitest config (same class as Cursor/Grok/OMP source aliases, but avoids
ACP index load)

## Test plan
- [x] Local: vitest-workspace-resolution, task-steer,
extension-task-tools
- [ ] PR gate
- [ ] Post-merge Full Suite green

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

## Summary by CodeRabbit

* **Bug Fixes**
* Improved CLI resolution for Claude runtime diagnostics and provider
model discovery.
* Prevented unnecessary runtime dependencies from affecting CLI test
execution.
* **Refactor**
* Added a lightweight entry point for accessing Claude binary checks and
provider model discovery.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 02:25:39 -07:00
gsxdsm
ce3f55fec9 FN-8263: reflect session advisor state in task-detail eye
Keep the task-detail oversight indicator aligned with the effective session advisor state.

- Show and light the oversight eye for enabled advisor inheritance while lifecycle oversight is off or unresolved.
- Limit unresolved advisor-only menus to the session advisor toggle and repaint the icon after toggles.
- Cover desktop and mobile behavior and document the interaction.

Files changed:
 .changeset/fn-8263-session-advisor-detail-eye.md   |   7 ++
 docs/dashboard-guide.md                            |   6 +-
 .../dashboard/app/components/TaskDetailModal.tsx   |  47 ++++++----
 .../TaskDetailModal.oversight-controls.test.tsx    | 101 +++++++++++++++++++++
 .../TaskDetailModal.oversight-mobile.test.tsx      |  40 ++++++++
 5 files changed, 183 insertions(+), 18 deletions(-)

Fusion-Task-Id: FN-8263

Fusion-Task-Lineage: 61cd134c-7721-4e19-89a9-a406358f54a9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 02:20:31 -07:00
gsxdsm
0bf496ee7b FN-8268: resolve Claude runtime aliases in Vitest
Ensure CLI Vitest runs resolve plugin runtime sources without built distribution artifacts.

- Alias the Claude runtime source entry point for CLI tests.
- Preserve focused execution of explicitly requested quarantined tests.
- Extend workspace-resolution coverage for runtime provider aliases and absent dist outputs.

Files changed:
 packages/cli/src/__tests__/vitest-workspace-resolution.test.ts | 53 ++++++++++++++++------
 packages/cli/vitest.config.ts                                  | 23 +++++++++-
 2 files changed, 62 insertions(+), 14 deletions(-)

Fusion-Task-Id: FN-8268

Fusion-Task-Lineage: c6e27f58-0de6-49ac-aa90-05a9829c0ad6

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 02:15:09 -07:00
gsxdsm
4fd9ccd5ae FN-8267: dismiss mobile artifact viewers on back
Ensure mobile artifact viewers close before dashboard navigation.

- Register mobile viewer entries with navigation history.
- Consume entries for header and Escape dismissals.
- Cover browser and native Back behavior and document it.

Files changed:
 docs/dashboard-guide.md                            |   3 +-
 .../dashboard/app/components/ArtifactsGallery.tsx  |  26 +++-
 .../__tests__/ArtifactsGallery.swipe-back.test.tsx | 170 +++++++++++++++++++++
 3 files changed, 194 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-8267

Fusion-Task-Lineage: 5a5edb10-b6c5-4b9d-89a8-6623306953f6

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 02:05:35 -07:00
gsxdsm
44e20274d7 FN-8261: add GitHub issue planning import option
Add a Planning Mode path alongside direct GitHub issue imports.

- Pass selected issue context into Planning Mode after closing the import surface
- Preserve direct-import tracking while labeling its action clearly
- Cover issue planning behavior and document desktop and mobile flows

Files changed:
 docs/dashboard-guide.md                            |  9 ++-
 packages/dashboard/app/components/AppModals.tsx    |  1 +
 packages/dashboard/app/components/GitHubImportModal.tsx | 46 ++++++++++-
 packages/dashboard/app/components/__tests__/GitHubImportModal.test.tsx | 91 ++++++++++++++++++++--
 packages/dashboard/app/components/dashboard/MainContent.tsx |  1 +
 5 files changed, 137 insertions(+), 11 deletions(-)

Fusion-Task-Id: FN-8261

Fusion-Task-Lineage: 6b121563-7cfa-4ba1-82c9-9ad574738a20

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 02:00:34 -07:00
gsxdsm
c0cce18cfb fix: QuickEntry agent outside-click + quarantine CLI full-suite cascade (#2291)
## Summary
Latest Full Suite after #2290 was green on shards 1–2 and nearly green
on 3–4:

- **Shard 3:** QuickEntry agent picker outside click left the portal
open (product) — capture-phase mousedown + open-token so late
`fetchAgents` cannot re-open a dismissed picker
- **Shard 4:** `@runfusion/fusion` package-lane cascade (87 failures
from `extension-dist-barrel` hookTimeout + lock-retry timeouts under
load) — quarantine the 14 observed files on sight (ledger + vitest
exclude), no timeout appeasement

Also hardens the agent-picker outside-click test.

## Test plan
- [x] Local agent picker portal tests green
- [ ] PR gate
- [ ] Post-merge Full Suite green

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

## Summary by CodeRabbit

- **Bug Fixes**
- Fixed the Quick Add agent picker so it reliably closes when clicking
outside.
- Prevented delayed agent-loading results from reopening the picker
after it has been dismissed.
- Improved the picker’s loading behavior by displaying it immediately
while agents are being retrieved.

- **Tests**
- Added coverage for dismissing the agent picker with an outside click.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 01:54:27 -07:00
gsxdsm
d88e4f9c90 FN-8255: hide inherited-default oversight eye
Suppress transient task-card oversight eyes for unconfigured inherited autonomous workflows.

- Reuse the meaningful oversight badge gate for planner-overseer eye rendering.
- Cover aggregate, selected-workflow, explicit override, and mobile states.
- Document the inherited-default suppression and add a patch changeset.

Files changed:
 .changeset/fn-8255-card-eye-inherited-default-oversight.md |  7 ++
 docs/dashboard-guide.md                            |  3 +-
 packages/dashboard/app/components/TaskCard.tsx     | 21 +++---
 .../__tests__/TaskCard.oversight.test.tsx          | 78 +++++++++++++++++++---
 4 files changed, 88 insertions(+), 21 deletions(-)

Fusion-Task-Id: FN-8255

Fusion-Task-Lineage: 2c48f96f-9f06-4def-b7bb-1020e8505d7b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 01:53:14 -07:00
gsxdsm
e18c3b4584 FN-8262: route OMP models through ACP runtime
Route omp-cli model selections to the bundled OMP ACP runtime instead of pi registry resolution.

- Derive and validate OMP runtime routing for primary and fallback model selections.
- Preserve mock and test-mode short-circuits and provide actionable plugin remediation.
- Add OMP routing regression coverage and a patch changeset.

Files changed:
 .changeset/fn-8262-omp-model-routing.md            |   7 +
 .../agent-session-helpers-omp-routing.test.ts      | 218 +++++++++++++++++++++
 packages/engine/src/agent-session-helpers.ts       |  87 +++++++-
 3 files changed, 306 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-8262

Fusion-Task-Lineage: 7a77031f-8703-484e-9e53-a2ef097ec17e

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 01:47:52 -07:00
gsxdsm
2bd25b0605 FN-8260: prevent truncated planning completions
Prevent incomplete AI responses from reaching the Planning Complete checkpoint.

- Reject completion payloads repaired from truncated JSON and retry once
- Preserve tolerant question parsing and add regression coverage
- Document the retryable incomplete-response behavior and add a patch changeset

Files changed:
 .../fn-8260-planning-truncated-completion.md       |  7 ++
 docs/dashboard-guide.md                            |  3 +-
 .../planning-truncated-completion.test.ts          | 35 +++++++++
 packages/dashboard/src/planning.ts                 | 85 +++++++++++++++++++---
 4 files changed, 117 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-8260

Fusion-Task-Lineage: aff1a1de-7b01-4cad-83a1-06b9684ed9de

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 01:36:38 -07:00
gsxdsm
377cb9c90a FN-8258: complete PostgreSQL quarantine rescues
Complete PostgreSQL-backed rescue coverage while retaining archived shared-branch landing proof.

- Preserve merge details when archiving and restoring tasks for branch-group promotion.
- Migrate remaining quarantine tests and mocks to PostgreSQL-aware boundaries.
- Remove rescued tests from the engine quarantine configuration and ledger.

Files changed:
 .changeset/fn-8258-pg-quarantine.md                |  7 +++
 .../core/src/task-store/archive-lifecycle-2.ts     |  1 +
 packages/core/src/task-store/remaining-ops-6.ts    |  8 ++-
 packages/core/src/task-store/serialization.ts      |  1 +
 .../__tests__/agent-tools-intake-column.test.ts    | 26 ++++------
 .../agent-workflow-tools-exposure.test.ts          | 18 +++----
 .../engine/src/__tests__/executor-task-done-invariant.test.ts | 33 ++++++------
 .../engine/src/__tests__/executor-test-helpers.ts  |  7 +++
 .../src/__tests__/group-merge-coordinator.test.ts  | 43 ++++++++++------
 .../hybrid-executor-multi-node-routing.test.ts     |  5 ++
 .../mission-factory-parity.integration.test.ts     |  2 +-
 .../engine/src/__tests__/routine-runner.test.ts    | 56 +++++++++++++--------
 .../self-healing-meta-archive-guards.test.ts       | 28 +++++------
 .../src/__tests__/triage-token-usage.test.ts       | 58 +++++-----------------
 .../__tests__/workflow-graph-task-runner.test.ts   | 16 +++---
 packages/engine/src/hybrid-executor-gate.ts        |  8 ++-
 packages/engine/vitest.config.ts                   | 12 +----
 scripts/lib/test-quarantine.json                   | 52 +------------------
 18 files changed, 165 insertions(+), 216 deletions(-)

Fusion-Task-Id: FN-8258

Fusion-Task-Lineage: 121c2b52-ad50-4475-b925-7a36ecfaf28b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-18 01:23:31 -07:00
gsxdsm
2ab0413c07 fix: make OMP process lifecycle tests full-suite safe (#2290)
## Summary
After #2289, Full Suite shard 4 still failed on the **OMP** twin of the
Grok process-lifecycle stress test (`import("../index.js")` × 15 under
shard transform load → 5s timeout).

Apply the same fix class as grok-runtime:
- Symbol.for exit reaper on `process-manager`
- Stress test reimports that module
- 15s timeout for cold transform

## Test plan
- [x] Local OMP process-lifecycle green
- [ ] PR gate
- [ ] Post-merge Full Suite

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

## Summary by CodeRabbit

- **Bug Fixes**
  - Improved cleanup of OMP ACP processes when the application exits.
- Prevented duplicate exit handlers and excess listener growth during
runtime reloads.
- Preserved reliable process lifecycle behavior under repeated module
loading.

- **Tests**
  - Added lifecycle coverage for repeated process-manager reloads.
- Optimized the stress test to complete more efficiently while retaining
cleanup assertions.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 01:19:14 -07:00
gsxdsm
57120f3d29 test: preserve default getTask mock for DUPLICATE recovery (#2283)
## Summary
Follow-up to #2275 review feedback: `getTask` mocks for DUPLICATE
recovery tests now return a default current-task fixture for
non-canonical IDs instead of `undefined`.

## Context
CodeRabbit on #2275 noted that returning `undefined` for every id except
the canonical task could break recovery if the subject task is
re-fetched mid-path.

## Test plan
- [x] `triage-split-into-subtasks-delete.test.ts`
- [x] `triage-finalize-duplicate-lineage.test.ts`

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

## Summary by CodeRabbit

* **Tests**
* Improved duplicate-resolution test coverage by preserving task data
during recovery and re-fetch scenarios.
* Added validation for non-canonical task handling to prevent errors
when duplicate tasks are resolved or split.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 00:57:06 -07:00
gsxdsm
e4ddfe0218 fix: make Grok process lifecycle tests full-suite safe (#2289)
## Summary
Full Suite after #2288 still red on shard 4: `process-lifecycle.test.ts`
times out at 5s under shard transform load even after reducing
reimports.

- Move Symbol.for `process.exit` reaper onto `process-manager`
(lifecycle owner)
- Stress test reimports that module (not the full plugin graph)
- Explicit 15s timeout for the cold-transform bound stress test

## Test plan
- [x] Local process-lifecycle green (~2s)
- [ ] PR merge gate
- [ ] Post-merge Full Suite green

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

## Summary by CodeRabbit

- **Bug Fixes**
  - Improved Grok runtime process cleanup during application shutdown.
- Prevented duplicate cleanup handlers from accumulating during repeated
module loading.
- Ensured managed processes are reliably terminated when the process
exits.

- **Tests**
  - Expanded lifecycle coverage to validate repeated loading scenarios.
  - Increased test timeouts for more reliable stress-test execution.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 00:54:33 -07:00
gsxdsm
5c7ed8b26f chore(release): v0.72.0
Version bump via changesets.
2026-07-18 00:52:59 -07:00
gsxdsm
c4a00d7c37 feat(desktop): Windows close-to-tray option in the close dialog
Windows close previously always meant full shutdown (macOS/Linux hid to
the existing tray icon). The close dialog now defaults to Minimize to
tray — Fusion and the embedded PostgreSQL keep running in the
background, restorable from the tray — alongside the exit choices
(stop or keep PostgreSQL). OS session end still skips dialogs and
performs the full stop.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 00:47:06 -07:00
gsxdsm
68ce5c31da fix: harden onboarding/git/desktop batch per multi-agent review findings
- uninstaller: taskkill only the first, digits-only postmaster.pid line
  (the for /f loop ran taskkill on the port/epoch lines — potential
  unrelated-process kill)
- git-missing dialogs use new ConfirmOptions.alwaysAsk so global
  skip-confirmations cannot silently pick an unseen choice
- Windows quit prompt: embedded-local runtimes only, skipped during OS
  session end (sync dialog blocked Windows shutdown)
- 'leave it running' detaches the embedded lifecycle (disarms its
  process shutdown hook) so Electron exit cannot kill the postmaster
  the operator chose to keep (new detachKeepingEmbedded)
- wizard: ref-based double-submit guard around the async git preflight
- clone route: ENOENT invalidate-and-retry matching runGitCommand
- openExternalUrl: drop the async window.open fallback (always
  popup-blocked); log bridge failures instead
- DirectoryPicker: close the panel when listing the created folder
  fails so Select cannot re-commit the parent
- git status probe bounded to two spawns (PATH + first candidate)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 00:33:14 -07:00
gsxdsm
8da52767b6 fix: clear remaining full-suite floaters after #2287 (#2288)
## Summary
#2287 cleared most of Full Suite run 29633869887 / post-merge
29634793317. Shards 1 and 2 went green; remaining floaters:

- **TaskDetailModal.css FN-8154** — assert FN-8166 zeroed mobile
`.detail-activity` inset (`padding-inline-end: 0`), not the pre-8166
`var(--space-md)` residual
- **QuickEntryBox** — wait for cleared input / priority button after
create under shard load (not only `onCreate` mock call)
- **grok process-lifecycle** — prove Symbol.for exit-hook bound with 2
reimports so transform cost stays under 5s on full-suite shards

## Test plan
- [x] Local: FN-8154, QuickEntry clear/priority, process-lifecycle
- [ ] PR merge gate green
- [ ] Post-merge Full Suite on `main` green

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

* **Tests**
* Improved Quick Entry tests to wait for textarea clearing and verify
priority resets to normal after task creation.
* Updated CSS contract assertions for mobile task-detail activity
spacing to match the latest overlay/inset behavior.
* Streamlined the Grok plugin process lifecycle test loop to run fewer
module-evaluation iterations while keeping existing lifecycle and
warning checks.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-18 00:31:41 -07:00
gsxdsm
755063715a feat(desktop): Windows Postgres lifecycle — quit prompt and uninstaller cleanup
Closing the Windows desktop app now asks whether to also shut down the
embedded PostgreSQL server ('leave it running' keeps serving other
Fusion processes; programmatic restarts never prompt and keep the full
stop). The NSIS uninstaller stops the postmaster from postmaster.pid,
removes materialized runtime binaries, and asks before deleting the
database cluster — silent and auto-update uninstalls never touch data.
build/uninstaller.nsh force-added like entitlements.mac.plist (the
build/ ignore targets generated icons).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 00:14:54 -07:00
gsxdsm
c7b1529ef8 feat(dashboard,core): warn before project creation when git is missing
Registering a project on a git-less host used to fail after submission
with a raw spawn error. The setup wizard now probes gitCli up front and
offers: open the Git downloads (picked up without restart thanks to the
stale-PATH resolver), create the project anyway without a git repo
(new skipGitInit passthrough, rejected for clone mode), or cancel.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 00:08:56 -07:00
gsxdsm
7bf83bb458 fix(desktop,dashboard): open OAuth URLs via activation-free IPC on desktop
window.open after awaiting /auth/login can outlive Chromium's transient
user activation and get silently popup-blocked in the desktop app — the
OpenAI Codex flow (method select + localhost callback server) crossed
that threshold while Anthropic's faster flow usually didn't, so Codex
login never opened the browser. Add a shell:openExternal IPC bridge
(http/https only), expose it in preload, and route every dashboard
auth-URL open through an openExternalUrl helper that falls back to
window.open on the web.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 00:03:48 -07:00
gsxdsm
26054de697 feat(dashboard): OpenAI Codex subscription card in onboarding quick start
Placed directly after the Anthropic subscription and before the API-key
options; previously reachable only under Advanced.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 23:59:58 -07:00
gsxdsm
924e0df5ab fix(core): find git installed mid-session despite the stale PATH snapshot
A git installed DURING first-run setup stayed invisible (spawn git
ENOENT on project creation; onboarding indicator stuck on missing)
because the server's PATH snapshot predates the install. New resolver
probes well-known install locations on PATH ENOENT with cache
invalidation, wired into project git init/workspace detection, the
onboarding git status probe, and the dashboard clone route.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 23:56:34 -07:00
gsxdsm
38c6fdc60d fix: green full-suite after mock and stacking drift (#2287)
## Summary
Restacks onto latest main after #2285 and clears the remaining Full
Suite red classes from run
[29633869887](https://github.com/Runfusion/Fusion/actions/runs/29633869887)
(post-#2285):

- **Shard 1:** `agent-skills-flow` vitest TDZ — hoist `mockFiles` via
`vi.hoisted` (same class as skill-resolver in #2285)
- **Shard 2/3:** incomplete mocks after product drift
- `isFullScreenSheetViewport` / `isShortViewport` on viewport mocks
(without overriding dynamic mobile helpers)
  - `fetchCodebaseMetrics` on Command Center `api/legacy` mocks
  - `fetchSettings` on `agent-modals-mobile` api mock
- **Shard 3:** PlanningMode `ui-interactions` race — sync-settle
`fetchGlobalSettings` (FN-8245 pattern from planning-flow)
- **Shard 3:** settings search drift guard — inventory
`SettingsFieldRow` `htmlFor` keys (`mobileNavPrimaryItems`)
- **Shard 2:** FloatingWindow shared-stack product bug — only reclaim
z-index on hidden→visible (not every mount effect), so last-mounted
utility stays on top
- **Shard 4:** grok process-lifecycle timeout under shard load — prove
bound with 5 reimports instead of 15

## Test plan
- [x] `agent-skills-flow.test.ts` green
- [x] `process-lifecycle.test.ts` green
- [x] FileBrowserModal, FloatingWindowStack.cross-type,
agent-modals-mobile, settings-search-index, SystemControlsArea,
PlanningModeModal.ui-interactions + planning-flow (210 tests) green
- [ ] PR merge gate (Lint/Typecheck/Build/Gate)
- [ ] Post-merge Full Suite on `main` green

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

## Summary by CodeRabbit

* **Bug Fixes**
* Improved floating-window stacking so reopened or interacted windows
appear in the correct order.
* Restored consistent layering between floating windows and expanded
dock modals.
* **Tests**
* Updated automated coverage for viewport behavior, codebase metrics,
settings search indexing, and process lifecycle scenarios.
* Improved test reliability and consistency across responsive layouts
and modal interactions.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-17 23:53:50 -07:00
gsxdsm
b60833c419 fix(dashboard): browse panel follows a newly created folder in project setup
selectCreatedDirectory set the input value but left the panel on the
PARENT directory, whose footer Select button commits currentPath — the
natural next click overwrote the just-created folder with its parent.
Navigate the panel into the created directory so input, panel, and
Select agree.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 23:51:55 -07:00
gsxdsm
6cdebe1d61 fix(dashboard): theme-aware links on the onboarding GitHub setup step
GitHub-step anchors had layout-only CSS and rendered the user-agent
default blue, which ignores the dashboard theme. Use var(--color-info)
with hover underline; .btn anchors keep button styling.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 23:51:55 -07:00
gsxdsm
1afce9532a fix: green full-suite after product and CI PG drift (#2285)
## Summary
Main Full Suite was red again after release/desktop workflow drift,
engine mock gaps, mission landed-SHA gating, and compound-engineering PG
admin auth on GHA (`USER=runner`).

## Fixes
| Area | Failure | Fix |
|------|---------|-----|
| desktop `release-workflow` | expected old `find artifacts -type f` |
assert pruned collect + `release-files/*` |
| `step-session-executor` | missing
`resolveExecutorFallbackThinkingLevel` | mock export |
| tool-availability tests | empty tools (cascade from above) | fixed by
mock |
| `skill-resolver` | TDZ on `mockFiles` during import | `vi.hoisted`
filesystem state |
| `merge-error-recovery` | enqueue no-op when not started | set
`started=true` |
| mission behavioral posture | `blocked` (no landed SHA / git probe) |
`mergeDetails.commitSha` + staleness stub |
| GraphTaskNode | missing `useOptionalToast` | mock both toast exports |
| CE `pipeline-store.pg` | psql as `runner` | admin via
`FUSION_PG_TEST_URL_BASE` |

## Test plan
- [x] step-session-executor, skill-resolver, merge-error-recovery,
mission-validator-behavioral-posture (203)
- [x] release-workflow (10)
- [x] `pnpm --filter @fusion/engine test:core` (294)
- [ ] Full Suite (non-blocking) after merge

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

- **Bug Fixes**
- Improved desktop release artifact collection by pruning nested
`runtime` and `migrations` directories and consistently staging release
uploads via a dedicated `release-files` mapping.

- **Tests**
- Enhanced engine merge error-recovery coverage and mission validator
behavioral posture setup.
- Improved test reliability by synchronizing mocked filesystem state,
executor fallbacks, and toast hook variants.
- Updated Postgres test harness/admin commands to use a configurable
base URL; refined related Windows changeset description.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-17 23:22:04 -07:00
gsxdsm
95e011f890 fix(core): auto-repair empty non-UTF-8 embedded Postgres clusters on boot (#2286)
Users whose embedded cluster was initdb'd with an OS-locale encoding by
a pre-fix version now self-heal with zero manual steps: on the
encoding-conversion schema failure the startup factory proves the
cluster is non-UTF-8 AND empty (the baseline transaction never applied,
so no schema or migrated data can exist) and that this process owns the
postmaster, then deletes the data dir and reboots once with the UTF-8
initdb defaults. Joined instances and unproven states keep the manual
re-init hint; one retry ever, so no loops.

Verified on the elevated windows-latest runner: CI seeds a real WIN1252
cluster via initdb and proves a stock 'fn serve' auto-recovers it to a
healthy /api/health (run 29633351848, all jobs green). Also caps the
desktop-windows embedded-PG smoke at 30 min and adds a skip input.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 23:18:40 -07:00
gsxdsm
d4ee80a818 fix(core): Windows embedded Postgres — no local user account, UTF-8 clusters, diagnosable boot errors
Squash of feature/win-elevated-no-user, verified end-to-end on the
elevated windows-latest runner (restricted-token double boot + full
'fn serve' /api/health smoke, both green).

- Elevated Windows boots embedded PostgreSQL via pg_ctl's built-in
  restricted-token re-exec instead of creating a 'fusion-pg' local user
  (operator requirement: Fusion must never create accounts). Removes
  the credential launcher, icacls grants, and cmd/PowerShell wrapper —
  and with them the 'directory name is invalid' and wrapper-log EBUSY
  field failures. Leftover fusion-pg accounts are deleted on start.
- Embedded clusters are always initdb'd --encoding=UTF8 --locale=C
  (GitHub issue #2286: OS-locale WIN1252/WIN1254 clusters could not
  store the UTF-8 schema and crash-looped the dashboard). Existing
  non-UTF-8 clusters get an actionable re-init hint at boot.
- Schema-backend boot failures now surface the full error cause chain
  (DrizzleQueryError hid the real PostgresError behind the SQL text).
- Elevated stop() waits until the port closes and postmaster.pid is
  gone before resolving.
- CI: branch verification workflow (restricted-token proof + elevated
  boot smoke + account-absence assertions); boot-smoke stderr tail
  widened for diagnosability.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 22:45:57 -07:00
gsxdsm
fd87c3f23f fix(core): pin non-admin postgres launcher working directory on elevated Windows
Start-Process -Credential (CreateProcessWithLogonW) validates the working
directory as the TARGET user. The launcher inherited the desktop app's cwd
(admin profile / install dir), which the dedicated fusion-pg user cannot
read, so elevated desktop boots died with "The directory name is invalid"
before postgres ever started. launch.ps1 now pins -WorkingDirectory to the
.pgrunner run dir inside the data dir the user was just granted full
control on. CI never caught it because runner cwds are world-traversable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 21:01:29 -07:00
gsxdsm
7dda1aa3f5 chore(release): v0.71.0
Version bump via changesets.
2026-07-17 20:13:12 -07:00