# Settings Reference [← Docs index](./README.md) This guide documents Fusion settings from `packages/core/src/types.ts`. ## Settings Scopes Fusion uses a two-tier settings system: - **Global settings** (`~/.fusion/settings.json`): user preferences shared across projects - **Project settings** (`.fusion/config.json`): execution/runtime behavior for one project At runtime, settings are merged. **Project settings override global settings** when keys overlap. ## Settings API Endpoints | Endpoint | Purpose | |---|---| | `GET /api/settings` | Get merged settings (global + project). | | `PUT /api/settings` | Update project settings only. | | `GET /api/settings/global` | Get global settings only. | | `PUT /api/settings/global` | Update global settings only. | | `GET /api/settings/scopes` | Get separated `{ global, project }` view. | --- ## Global Settings Defaults from `DEFAULT_GLOBAL_SETTINGS`; key scope from `GLOBAL_SETTINGS_KEYS`. | Setting | Type | Default | Description | |---|---|---:|---| | `themeMode` | `"dark" \| "light" \| "system"` | `"dark"` | Dashboard theme mode. | | `colorTheme` | `ColorTheme` | `"default"` | Dashboard color theme preset. | | `defaultProvider` | `string` | `undefined` | Default AI provider. | | `defaultModelId` | `string` | `undefined` | Default AI model ID. | | `fallbackProvider` | `string` | `undefined` | Fallback provider when the primary default model hits transient provider failures. | | `fallbackModelId` | `string` | `undefined` | Fallback model ID (must pair with `fallbackProvider`). | | `defaultThinkingLevel` | `"off" \| "minimal" \| "low" \| "medium" \| "high"` | `undefined` | Default reasoning effort for AI sessions. | | `ntfyEnabled` | `boolean` | `false` | Enable ntfy push notifications. | | `ntfyTopic` | `string` | `undefined` | ntfy topic name. | | `ntfyEvents` | `("in-review" \| "merged" \| "failed" \| "awaiting-approval" \| "awaiting-user-review")[]` | `["in-review","merged","failed","awaiting-approval","awaiting-user-review"]` | Event types that trigger ntfy notifications. | | `ntfyDashboardHost` | `string` | `undefined` | Dashboard host used to build deep links in notifications. | | `defaultProjectId` | `string` | `undefined` | Default project for multi-project CLI operations when `--project` is omitted. | | `setupComplete` | `boolean` | `undefined` | Tracks completion of first-run setup. | | `favoriteProviders` | `string[]` | `undefined` | Pinned providers shown first in model selectors. | | `favoriteModels` | `string[]` | `undefined` | Pinned models in `{provider}/{modelId}` format. | | `openrouterModelSync` | `boolean` | `true` | Sync OpenRouter model catalog into model pickers at startup. | | `modelOnboardingComplete` | `boolean` | `undefined` | Whether AI onboarding has been completed or dismissed. | | `executionGlobalProvider` | `string` | `undefined` | Global baseline provider for task execution. Project `executionProvider` overrides this. | | `executionGlobalModelId` | `string` | `undefined` | Global baseline model ID for task execution. | | `planningGlobalProvider` | `string` | `undefined` | Global baseline provider for planning/triage. Project `planningProvider` overrides this. | | `planningGlobalModelId` | `string` | `undefined` | Global baseline model ID for planning/triage. | | `validatorGlobalProvider` | `string` | `undefined` | Global baseline provider for validator/reviewer runs. Project `validatorProvider` overrides this. | | `validatorGlobalModelId` | `string` | `undefined` | Global baseline model ID for validator/reviewer runs. | | `titleSummarizerGlobalProvider` | `string` | `undefined` | Global baseline provider for title summarization. Project `titleSummarizerProvider` overrides this. | | `titleSummarizerGlobalModelId` | `string` | `undefined` | Global baseline model ID for title summarization. | | `daemonToken` | `string` | `undefined` | Daemon authentication token (`fn_<32 hex chars>`) used by CLI clients. | | `daemonPort` | `number` | `4040` | Port for daemon/serve mode binding. | | `daemonHost` | `string` | `"0.0.0.0"` | Host for daemon/serve mode binding. | | `settingsSyncEnabled` | `boolean` | `false` | Enable automatic settings synchronization between nodes. | | `settingsSyncAuth` | `boolean` | `false` | Include model auth credentials in settings sync operations. | | `settingsSyncInterval` | `number` | `900000` | Automatic sync interval in ms. Valid values: `300000`, `900000`, `1800000`, `3600000`. | | `settingsSyncConflictResolution` | `"last-write-wins" \| "always-ask" \| "keep-local" \| "keep-remote"` | `"last-write-wins"` | Conflict strategy for divergent synced settings. | --- ## Project Settings Defaults from `DEFAULT_PROJECT_SETTINGS`; key scope from `PROJECT_SETTINGS_KEYS`. | Setting | Type | Default | Description | |---|---|---:|---| | `globalPause` | `boolean` | `false` | Hard stop: terminate active engine sessions and pause scheduling immediately. | | `globalPauseReason` | `string` | `undefined` | Optional reason for `globalPause` (`"rate-limit"` for automatic pauses, `"manual"` for user-triggered pauses). Cleared on unpause. | | `enginePaused` | `boolean` | `false` | Soft pause: stop dispatching new work while letting active sessions finish. | | `maxConcurrent` | `number` | `2` | Max concurrent task-lane AI agents (triage, executor, merge). | | `maxTriageConcurrent` | `number` | `2` | Max concurrent triage/specification agents. | | `globalMaxConcurrent` | `number` | `4` | System-wide max concurrent agents across all projects. | | `maxWorktrees` | `number` | `4` | Max git worktrees. | | `pollIntervalMs` | `number` | `15000` | Scheduler poll interval (ms). | | `groupOverlappingFiles` | `boolean` | `true` | Serialize execution when file scopes overlap. | | `autoMerge` | `boolean` | `true` | Auto-finalize tasks from `in-review`. | | `mergeStrategy` | `"direct" \| "pull-request"` | `"direct"` | Completion mode (local direct merge vs PR-first). | | `worktreeInitCommand` | `string` | `undefined` | Shell command run after worktree creation. | | `testCommand` | `string` | `undefined` | Merge-time test command (hard gate). When unset, Fusion auto-detects from lockfile. | | `buildCommand` | `string` | `undefined` | Merge-time build command (hard gate). | | `recycleWorktrees` | `boolean` | `false` | Reuse worktrees from a pool for faster startup. | | `worktreeNaming` | `"random" \| "task-id" \| "task-title"` | `"random"` | Naming mode for new worktree directories. | | `taskPrefix` | `string` | `"FN"` | Prefix used for newly generated task IDs. | | `includeTaskIdInCommit` | `boolean` | `true` | Include task ID as commit scope in generated commits. | | `commitAuthorEnabled` | `boolean` | `true` | Apply explicit `--author` attribution on Fusion commits. | | `commitAuthorName` | `string` | `"Fusion"` | Commit author name when `commitAuthorEnabled` is true. | | `commitAuthorEmail` | `string` | `"noreply@runfusion.ai"` | Commit author email when `commitAuthorEnabled` is true. | | `planningProvider` | `string` | `undefined` | Provider for planning/triage agents. | | `planningModelId` | `string` | `undefined` | Model ID for planning/triage agents. | | `planningFallbackProvider` | `string` | `undefined` | Fallback provider for planning/triage. | | `planningFallbackModelId` | `string` | `undefined` | Fallback model ID for planning/triage. | | `defaultProviderOverride` | `string` | `undefined` | Project-level override for global default provider baseline. | | `defaultModelIdOverride` | `string` | `undefined` | Project-level override for global default model baseline. | | `executionProvider` | `string` | `undefined` | Provider for task execution agents. | | `executionModelId` | `string` | `undefined` | Model ID for task execution agents. | | `validatorProvider` | `string` | `undefined` | Provider for plan/code reviewers. | | `validatorModelId` | `string` | `undefined` | Model ID for plan/code reviewers. | | `validatorFallbackProvider` | `string` | `undefined` | Fallback provider for reviewers. | | `validatorFallbackModelId` | `string` | `undefined` | Fallback model ID for reviewers. | | `modelPresets` | `ModelPreset[]` | `[]` | Reusable executor/validator model presets. | | `autoSelectModelPreset` | `boolean` | `false` | Auto-select presets by task size. | | `defaultPresetBySize` | `{ S?: string; M?: string; L?: string }` | `{}` | Mapping for `S`/`M`/`L` → preset ID. | | `autoResolveConflicts` | `boolean` | `true` | Enable automatic merge conflict resolution. | | `smartConflictResolution` | `boolean` | `true` | Alias/preferred flag for smart conflict handling. | | `strictScopeEnforcement` | `boolean` | `false` | Block merges on out-of-scope file changes. | | `buildRetryCount` | `number` | `0` | Build retry attempts during merge. | | `verificationFixRetries` | `number` | `1` | Auto-fix retry attempts when verification fails during merge. | | `buildTimeoutMs` | `number` | `300000` | Build timeout in milliseconds (5 minutes). | | `requirePlanApproval` | `boolean` | `false` | Require manual approval before triage → todo. | | `specStalenessEnabled` | `boolean` | `false` | Enforce automatic re-triage for stale specs. | | `specStalenessMaxAgeMs` | `number` | `21600000` | Spec staleness threshold in ms (6 hours). | | `taskStuckTimeoutMs` | `number` | `undefined` | Inactivity timeout for stuck-task recovery. | | `aiSessionTtlMs` | `number` | `604800000` | TTL in ms for persisted planning/subtask/mission sessions (7 days). | | `aiSessionCleanupIntervalMs` | `number` | `3600000` | Interval in ms for AI session cleanup sweeps (1 hour). | | `autoUnpauseEnabled` | `boolean` | `true` | Auto-unpause after rate-limit-triggered pauses; manual pauses stay paused until explicitly unpaused by the user. | | `autoUnpauseBaseDelayMs` | `number` | `300000` | Base unpause delay in ms (5 min). | | `autoUnpauseMaxDelayMs` | `number` | `3600000` | Max auto-unpause delay in ms (1 hour). | | `maxStuckKills` | `number` | `6` | Max stuck-task terminations before permanent failure. | | `maxPostReviewFixes` | `number` | `1` | Max auto-revival attempts for in-review tasks failing pre-merge workflow steps. | | `maxSpawnedAgentsPerParent` | `number` | `5` | Max child agents per parent task. | | `maxSpawnedAgentsGlobal` | `number` | `20` | Max spawned agents across one executor instance. | | `maintenanceIntervalMs` | `number` | `900000` | Periodic maintenance interval in ms (15 min). | | `autoArchiveDoneTasksEnabled` | `boolean` | `true` | Enable periodic auto-archiving of done tasks. | | `autoArchiveDoneAfterMs` | `number` | `172800000` | Age in ms after entering done before auto-archive (48h). | | `archiveAgentLogMode` | `"none" \| "compact" \| "full"` | `"compact"` | Agent log retention strategy for cold archive snapshots. | | `autoUpdatePrStatus` | `boolean` | `false` | Auto-refresh PR status badges. | | `autoCreatePr` | `boolean` | `false` | Auto-create PRs for completed tasks. | | `autoBackupEnabled` | `boolean` | `false` | Enable scheduled DB backups. | | `autoBackupSchedule` | `string` | `"0 2 * * *"` | Backup cron schedule. | | `autoBackupRetention` | `number` | `7` | Number of backups to retain. | | `autoBackupDir` | `string` | `".fusion/backups"` | Relative backup directory path. | | `autoSummarizeTitles` | `boolean` | `false` | Auto-generate titles for long untitled descriptions. | | `titleSummarizerProvider` | `string` | `undefined` | Provider for title summarization. | | `titleSummarizerModelId` | `string` | `undefined` | Model ID for title summarization. | | `titleSummarizerFallbackProvider` | `string` | `undefined` | Fallback provider for title summarization. | | `titleSummarizerFallbackModelId` | `string` | `undefined` | Fallback model ID for title summarization. | | `scripts` | `Record` | `undefined` | Named script map used by script-mode workflow steps and setup hooks. | | `setupScript` | `string` | `undefined` | Script key from `scripts` to run before task execution. | | `insightExtractionEnabled` | `boolean` | `false` | Enable scheduled memory insight extraction. | | `insightExtractionSchedule` | `string` | `"0 2 * * *"` | Insight extraction cron schedule. | | `insightExtractionMinIntervalMs` | `number` | `86400000` | Minimum interval between extractions (24h). | | `memoryEnabled` | `boolean` | `true` | Enable project memory integration. | | `memoryBackendType` | `string` | `"qmd"` | Memory backend type. Built-ins include `qmd` (Quantized Memory Distillation, default), `file`, and `readonly`; custom backends can also be registered. | | `memoryAutoSummarizeEnabled` | `boolean` | `false` | Enable automatic memory summarization when memory exceeds threshold. | | `memoryAutoSummarizeThresholdChars` | `number` | `50000` | Character threshold for auto-summarization. | | `memoryAutoSummarizeSchedule` | `string` | `"0 3 * * *"` | Cron schedule for auto-summarize checks. | | `memoryDreamsEnabled` | `boolean` | `false` | Enable dream processing that synthesizes daily notes and promotes durable lessons. | | `memoryDreamsSchedule` | `string` | `"0 4 * * *"` | Cron schedule for dream processing. | | `tokenCap` | `number` | `undefined` | Proactive token threshold for context compaction. | | `runStepsInNewSessions` | `boolean` | `false` | Run each task step in a fresh agent session. | | `maxParallelSteps` | `number` | `2` | Max concurrent step sessions when per-step sessions are enabled. | | `missionStaleThresholdMs` | `number` | `600000` | Mission stale threshold in ms while `activating` (10 min). | | `missionMaxTaskRetries` | `number` | `3` | Max automatic retries for failed mission-linked tasks. | | `missionHealthCheckIntervalMs` | `number` | `300000` | Mission health-check interval in ms (5 min). | | `agentPrompts` | `AgentPromptsConfig` | `undefined` | Custom role prompt templates and assignments. | | `promptOverrides` | `Record` | `undefined` | Segment-level prompt overrides (set a key to `null` to clear it). | | `reflectionEnabled` | `boolean` | `false` | Enable/disable agent self-reflection workflows. | | `reflectionIntervalMs` | `number` | `3600000` | Periodic reflection interval in ms. | | `reflectionAfterTask` | `boolean` | `true` | Trigger reflection after task completion. | | `reviewHandoffPolicy` | `"disabled" \| "comment-triggered" \| "always"` | `"disabled"` | Policy for agent-to-user review handoff detection. | | `showQuickChatFAB` | `boolean` | `false` | Show floating quick-chat button (chat remains available via More menu). | | `experimentalFeatures` | `Record` | `{}` | Project-scoped experimental feature flags. | > **Note:** Agent `metadata.skills` is not a top-level project setting, but it is the primary mechanism for controlling execution-time skill selection. The engine's `buildSessionSkillContext` function reads this metadata from the assigned agent and uses it to resolve which skills are available in the agent session. If `metadata.skills` is absent or empty, the engine falls back to role-based skills (`executor`, `reviewer`, `merger`, `triage`). --- ## Model Selection Hierarchy Fusion uses a dual-scope model settings system with five lanes. Global settings provide baseline defaults, and project settings provide per-project overrides. ### Triage/specification model 1. Per-task `planningModelProvider` + `planningModelId` 2. Project `planningProvider` + `planningModelId` 3. Global `planningGlobalProvider` + `planningGlobalModelId` 4. Project `defaultProviderOverride` + `defaultModelIdOverride` 5. Global `defaultProvider` + `defaultModelId` 6. Automatic provider/model resolution ### Executor model 1. Per-task `modelProvider` + `modelId` 2. Project `executionProvider` + `executionModelId` 3. Global `executionGlobalProvider` + `executionGlobalModelId` 4. Project `defaultProviderOverride` + `defaultModelIdOverride` 5. Global `defaultProvider` + `defaultModelId` 6. Automatic provider/model resolution ### Reviewer model 1. Per-task `validatorModelProvider` + `validatorModelId` 2. Project `validatorProvider` + `validatorModelId` 3. Global `validatorGlobalProvider` + `validatorGlobalModelId` 4. Project `defaultProviderOverride` + `defaultModelIdOverride` 5. Global `defaultProvider` + `defaultModelId` 6. Automatic provider/model resolution ### Title summarization model 1. Project `titleSummarizerProvider` + `titleSummarizerModelId` 2. Global `titleSummarizerGlobalProvider` + `titleSummarizerGlobalModelId` 3. Project `planningProvider` + `planningModelId` 4. Project `defaultProviderOverride` + `defaultModelIdOverride` 5. Global `defaultProvider` + `defaultModelId` 6. Automatic provider/model resolution > **Note:** Runtime fallback precedence logic is implemented in engine and dashboard routes (FN-1711). The hierarchy above reflects the full schema contracts added in FN-1710. --- ## Prompt Overrides Fusion supports fine-grained customization of AI agent prompts through the `promptOverrides` setting. This enables surgical customization of specific prompt segments without replacing entire role prompts (which `agentPrompts` does). ### Supported Prompt Keys | Key | Agent Role | Description | |-----|-----------|-------------| | `executor-welcome` | executor | Introductory section for the executor agent | | `executor-guardrails` | executor | Behavioral guardrails and constraints | | `executor-spawning` | executor | Instructions for spawning child agents | | `executor-completion` | executor | Completion criteria and signaling | | `triage-welcome` | triage | Introductory section for the triage/specification agent | | `triage-context` | triage | Context-gathering instructions | | `reviewer-verdict` | reviewer | Verdict criteria and format | | `merger-conflicts` | merger | Merge conflict resolution instructions | | `agent-generation-system` | — | System prompt for AI-assisted agent specification generation | | `workflow-step-refine` | — | System prompt for refining workflow step descriptions into detailed agent prompts | ### How It Works 1. **Override Selection**: When a prompt key is present with a non-empty value, that override replaces the default prompt segment. 2. **Fallback to Defaults**: Missing or empty values fall back to the built-in default content. 3. **Cascade**: `agentPrompts` provides full-role template customization, while `promptOverrides` provides segment-level customization. Both can be used together — `promptOverrides` applies to the segment even within a custom role template. ### Clearing Overrides To clear a specific override, set it to `null`: ```json { "promptOverrides": { "executor-welcome": null } } ``` To clear all overrides, set `promptOverrides` to `null`: ```json { "promptOverrides": null } ``` ### Configuration Example ```json { "settings": { "promptOverrides": { "executor-welcome": "Custom executor welcome message for this project...", "executor-guardrails": "## Custom Guardrails\n- Project-specific rules...", "triage-welcome": "Custom triage introduction..." } } } ``` --- ## JSON Examples ### 1) Team baseline for reliable automation ```json { "settings": { "maxConcurrent": 3, "maxWorktrees": 6, "mergeStrategy": "direct", "autoResolveConflicts": true, "taskStuckTimeoutMs": 600000, "runStepsInNewSessions": true, "maxParallelSteps": 2 } } ``` ### 2) Multi-model routing for plan/execute/review ```json { "settings": { "defaultProvider": "anthropic", "defaultModelId": "claude-sonnet-4-5", "planningProvider": "openai", "planningModelId": "gpt-4.1", "validatorProvider": "openai", "validatorModelId": "gpt-4o" } } ``` ### 3) Size-based preset auto-selection ```json { "settings": { "modelPresets": [ { "id": "small-fast", "name": "Small / Fast", "executorProvider": "openai", "executorModelId": "gpt-4o-mini" }, { "id": "large-deep", "name": "Large / Deep", "executorProvider": "anthropic", "executorModelId": "claude-sonnet-4-5", "validatorProvider": "openai", "validatorModelId": "gpt-4o" } ], "autoSelectModelPreset": true, "defaultPresetBySize": { "S": "small-fast", "L": "large-deep" } } } ``` See also: [Workflow Steps](./workflow-steps.md) for how `scripts` and workflow model overrides are used. --- ## Experimental Features The `experimentalFeatures` setting provides a first-class mechanism for managing project-scoped experimental feature toggles. This allows teams to explicitly mark capabilities as experimental and toggle them on/off from a dedicated section in the Settings dashboard. ### How It Works 1. **Feature Registry**: Features are stored as key-value pairs where keys are feature names and values indicate enabled/disabled state. 2. **Default Behavior**: Features not present in the map are considered disabled (fallback to `false`). 3. **UI Integration**: The Experimental Features section in Settings provides toggle controls for each configured feature. 4. **Consumption**: Engine code can read `experimentalFeatures[key]` to check if a feature is enabled. ### Example JSON Shape ```json { "settings": { "experimentalFeatures": { "my-new-feature": true, "another-experiment": false } } } ``` ### Dashboard UI The Experimental Features section in Settings shows: - Feature name and enabled/disabled toggle for each configured feature - Project scope indicator (features are project-specific, not global) - Description explaining the purpose of experimental features --- ## Background Memory Summarization & Audit Fusion can automatically extract insights from project memory and prune transient content on a schedule. This feature is disabled by default and can be enabled via settings. ### How It Works 1. **Scheduled Extraction**: When `insightExtractionEnabled` is `true`, a background automation runs on the configured `insightExtractionSchedule` (default: daily at 2 AM). 2. **AI-Powered Analysis**: The automation uses an AI agent to read canonical long-term memory (`.fusion/memory/MEMORY.md`) from the layered `.fusion/memory/` workspace plus `.fusion/memory-insights.md`, extract new insights, and produce a pruned working memory candidate. 3. **Insight Merging**: New insights are automatically merged into `.fusion/memory-insights.md` under the appropriate category (Patterns, Principles, Conventions, Pitfalls, Context). Duplicates are skipped. 4. **Memory Pruning**: The AI agent also produces a pruned version of working memory containing only durable items: - **Preserved**: Architecture, Conventions, Pitfalls, Context sections with durable content - **Pruned**: Task-specific notes, one-time observations, outdated entries 5. **Audit Report**: After each extraction run, a `.fusion/memory-audit.md` file is generated with: - Working memory status (presence, size, sections) - Insights memory status (insight counts by category) - Last extraction results (success/failure, insight count, duplicates skipped) - **Pruning outcome** (applied/skipped, size delta, reason) - Health status (healthy/warning/issues) - Individual audit checks ### Output Files | File | Description | |------|-------------| | `.fusion/memory/MEMORY.md` | Long-term memory (updated when pruning is applied and validated) | | `.fusion/memory.md` | Deprecated legacy fallback (migration compatibility only; not canonical storage) | | `.fusion/memory-insights.md` | Long-term insights distilled from working memory | | `.fusion/memory-audit.md` | Human-readable audit report after each extraction | ### Settings Interaction | Setting | Effect | |---------|--------| | `insightExtractionEnabled` | Enables/disables the automation | | `insightExtractionSchedule` | Cron expression for when extraction runs (default: `"0 2 * * *"` = daily at 2 AM) | | `insightExtractionMinIntervalMs` | Minimum time between extractions (default: 24 hours) | ### Safety Guarantees - **Pruning validation**: Before pruning is applied, the candidate is validated to ensure it preserves at least 2 of 3 required sections (Architecture, Conventions, Pitfalls). Invalid candidates are safely ignored. - **Graceful failures**: Malformed AI output does not destroy existing memory. Prior files are preserved. - **Isolated processing**: Post-run callback errors are logged but do not flip successful runs to failed. - **Startup sync**: Automation schedule is synchronized before the cron runner starts, preventing stale config races. - **Non-destructive by default**: If the AI produces no prune candidate or validation fails, working memory remains unchanged. ### Configuration Example ```json { "settings": { "insightExtractionEnabled": true, "insightExtractionSchedule": "0 2 * * *", "insightExtractionMinIntervalMs": 86400000 } } ``` ### Cron Expression Format Standard cron format: `minute hour day-of-month month day-of-week` | Expression | Meaning | |-----------|---------| | `0 2 * * *` | Daily at 2:00 AM (default) | | `0 */6 * * *` | Every 6 hours | | `0 9 * * 1` | Weekly on Monday at 9:00 AM | ### Scheduling Scope Fusion supports scoped automations and routines: - **Global scope** (`scope: "global"`) — Executes across all projects. Useful for backups, insight extraction, and cross-project maintenance. - **Project scope** (`scope: "project"`) — Executes within a single project only. Useful for project-specific CI, tests, and deployments. **Defaults and resolution:** - When `scope` is omitted, Fusion treats the entry as `project` scope with `projectId: "default"`. - Global-scope entries ignore `projectId`. - Project-scope lookups require `projectId`; missing values fall back to `"default"`. **Settings that interact with scheduling:** - `autoBackupEnabled` / `autoBackupSchedule` — Backup automation respects scope like any other scheduled task. - `insightExtractionEnabled` / `insightExtractionSchedule` — Insight extraction can be configured as global or project-scoped.