From 15418d2936e9b040e7caf2311e4e6d36fc4a75e0 Mon Sep 17 00:00:00 2001 From: gsxdsm Date: Fri, 7 Aug 2026 23:31:59 -0700 Subject: [PATCH] FN-8831: document ephemeral agent default Document the canonical enabled default for the routing-inert ephemeral-agent compatibility setting. - Add the enabled default to Settings help and English localization. - Cover the help text and canonical-default inventory with dashboard tests. - Update operator documentation and add a patch changeset. Files changed: .changeset/fn-8831-settings-default-description.md | 7 +++++++ docs/dashboard-guide.md | 4 ++-- .../components/__tests__/SettingsModal.general.test.tsx | 14 ++++++++++++++ .../app/components/settings/sections/GeneralSection.tsx | 6 +++++- .../__tests__/settings-default-descriptions.test.tsx | 12 +++++++++--- packages/i18n/locales/en/app.json | 1 + 6 files changed, 38 insertions(+), 6 deletions(-) Fusion-Task-Id: FN-8831 Fusion-Task-Lineage: 11ab2275-cfbc-4778-ba0c-466520d2e0fc Co-authored-by: Fusion (runfusion.ai) --- .changeset/fn-8831-settings-default-description.md | 7 +++++++ docs/dashboard-guide.md | 4 ++-- .../__tests__/SettingsModal.general.test.tsx | 14 ++++++++++++++ .../settings/sections/GeneralSection.tsx | 6 +++++- .../settings-default-descriptions.test.tsx | 12 +++++++++--- packages/i18n/locales/en/app.json | 1 + 6 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 .changeset/fn-8831-settings-default-description.md diff --git a/.changeset/fn-8831-settings-default-description.md b/.changeset/fn-8831-settings-default-description.md new file mode 100644 index 0000000000..5a75a63fba --- /dev/null +++ b/.changeset/fn-8831-settings-default-description.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: State the enabled default for the ephemeral-agent compatibility setting. +category: fix +dev: Maps the surfaced Settings help to its canonical project default. diff --git a/docs/dashboard-guide.md b/docs/dashboard-guide.md index 84790bb437..d1a9aa24c2 100644 --- a/docs/dashboard-guide.md +++ b/docs/dashboard-guide.md @@ -35,8 +35,8 @@ On mobile, the search row starts collapsed behind a compact toggle icon beside t On desktop and tablet, the Settings navigation rail has no hard divider between navigation and content; section rows stay on one line and use ellipsis for unusually long labels. Drag the thin handle between the navigation rail and content pane to widen or narrow the rail. Fusion remembers that width in browser storage and restores it for both the standalone Settings modal and embedded Settings page. Mobile keeps the stacked **Settings Section** picker and does not show the resize handle. Its native menu groups sections by the same topic headers as the desktop rail; paired scoped entries keep **Global** immediately before **Project**. - -Every user-editable setting's help text (the `.settings-description`/`` hint under a field) states its own default value — for example “Default: 3.”, “Default: enabled.”, or “No default — unset (inherits the global setting).” for values that fall back to another scope. Canonical default values come from `DEFAULT_GLOBAL_SETTINGS` / `DEFAULT_PROJECT_SETTINGS` in `packages/core/src/settings-schema.ts`; the dashboard copy never invents a number. A guard test (`settings-default-descriptions.test.tsx`) enforces that every surfaced setting states its default and that every `DEFAULT_SETTINGS` key is either documented or explicitly allowlisted as not surfaced in the Settings UI. + +Every user-editable setting's help text (including a shared Settings help tip) states its own default value — for example “Default: 3.”, “Default: enabled.”, or “No default — unset (inherits the global setting).” for values that fall back to another scope. This includes visible compatibility inputs even when they no longer control runtime routing. Canonical default values come from `DEFAULT_GLOBAL_SETTINGS` / `DEFAULT_PROJECT_SETTINGS` in `packages/core/src/config/settings-schema.ts`; the dashboard copy never invents a number. A guard test (`settings-default-descriptions.test.tsx`) enforces that every surfaced setting states its default and that every `DEFAULT_SETTINGS` key is either documented or explicitly allowlisted as not surfaced in the Settings UI. Settings form changes save automatically after a short pause. The footer no longer includes a **Save** button and closing Settings does not ask about unsaved changes: Close, Escape, and clicking outside the modal first flush any pending edit. The footer shows quiet **Saving…**, **Saved**, or save-failure status; correct the value and retry after a failure. diff --git a/packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx b/packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx index 5f800c8ec8..8a97911b2a 100644 --- a/packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx +++ b/packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx @@ -1392,6 +1392,20 @@ describe("SettingsModal", () => { expect(screen.getByRole("option", { name: "Require changelog update (existing changelog)" })).toBeInTheDocument(); }); + it("renders the enabled default in routing-inert ephemeral agent compatibility help", async () => { + renderModal({ initialSection: "general" }); + await waitForSettingsModalReady(); + + const helpTrigger = screen.getByTestId("settings-help-ephemeralAgentsEnabled"); + const helpId = helpTrigger.getAttribute("aria-describedby"); + expect(helpId).toBeTruthy(); + + const helpNote = document.getElementById(helpId!); + expect(helpNote).toHaveAttribute("role", "note"); + expect(helpNote).toHaveTextContent(/default: enabled/i); + expect(helpNote).toHaveTextContent(/does not affect scheduler assignment or admission, executor workflow dispatch or re-entry, mission start, or workflow-stage principal routing/i); + }); + it("persists the routing-inert ephemeral agent compatibility input", async () => { renderModal({ initialSection: "general" }); await waitForSettingsModalReady(); diff --git a/packages/dashboard/app/components/settings/sections/GeneralSection.tsx b/packages/dashboard/app/components/settings/sections/GeneralSection.tsx index 973e97e7c1..6efabd621d 100644 --- a/packages/dashboard/app/components/settings/sections/GeneralSection.tsx +++ b/packages/dashboard/app/components/settings/sections/GeneralSection.tsx @@ -286,10 +286,14 @@ export function GeneralSection({ form, setForm, projectId, addToast, prefixError
+ {/* + FNXC:EphemeralAgentCompatibility 2026-08-08-06:12: + FN-8831 requires this visible compatibility input to state its canonical enabled default in the shared help tip. It remains routing-inert: the saved value never controls scheduler admission, executor dispatch or re-entry, mission start, or workflow-stage principal routing. + */} - {t("settings.general.ephemeralAgentsCompatibilityHint", " Retained for configuration compatibility. This setting does not affect scheduler assignment or admission, executor workflow dispatch or re-entry, mission start, or workflow-stage principal routing. ")} + {t("settings.general.ephemeralAgentsCompatibilityHint", " Retained for configuration compatibility. Default: enabled. This setting does not affect scheduler assignment or admission, executor workflow dispatch or re-entry, mission start, or workflow-stage principal routing. ")}
{/* diff --git a/packages/dashboard/app/components/settings/sections/__tests__/settings-default-descriptions.test.tsx b/packages/dashboard/app/components/settings/sections/__tests__/settings-default-descriptions.test.tsx index 1f0f7c9298..30522ab983 100644 --- a/packages/dashboard/app/components/settings/sections/__tests__/settings-default-descriptions.test.tsx +++ b/packages/dashboard/app/components/settings/sections/__tests__/settings-default-descriptions.test.tsx @@ -20,7 +20,7 @@ import realEnApp from "../../../../../../i18n/locales/en/app.json"; * reason each, so a genuinely new setting cannot silently skip documentation. * * Source of truth for canonical default values: `DEFAULT_GLOBAL_SETTINGS` / - * `DEFAULT_PROJECT_SETTINGS` / `DEFAULT_SETTINGS` in `packages/core/src/settings-schema.ts`. + * `DEFAULT_PROJECT_SETTINGS` / `DEFAULT_SETTINGS` in `packages/core/src/config/settings-schema.ts`. * See task document "plan" on FN-7505 for the full field \u2192 default \u2192 i18n-key table. */ @@ -44,7 +44,7 @@ const DEFAULT_INDICATOR_RE = /default|inherits|unset/i; * FN-7505 code review caught GlobalGeneralSection/GeneralSection/MergeSection stating * `gitlabEnabled` defaults to "enabled" and GlobalModelsSection stating * `openrouterAppAttribution` defaults to a literal URL/title, when both are actually - * `undefined` in DEFAULT_GLOBAL_SETTINGS/DEFAULT_PROJECT_SETTINGS (settings-schema.ts). + * `undefined` in DEFAULT_GLOBAL_SETTINGS/DEFAULT_PROJECT_SETTINGS (`packages/core/src/config/settings-schema.ts`). * A generic "mentions the word default" check cannot catch a WRONG default value, only * a missing one. `resolveCanonicalDefault` + the checks in the third `it()` below assert * the description's stated default agrees with the actual schema default for every mapped @@ -252,6 +252,12 @@ const SETTING_DESCRIPTION_KEYS: Record = { worktreeRebaseLocalBase: "worktrees.inAdditionToTheRemoteRebaseAboveAlso", worktrunk: "worktrees.disabledByDefaultOptInWhenEnabledFusion", // GeneralSection (project) + /* + * FNXC:EphemeralAgentCompatibility 2026-08-08-06:12: + * FN-8831 keeps the visible compatibility checkbox in the surfaced-description inventory. + * Its English help must state the enabled schema default while preserving that it is routing-inert. + */ + ephemeralAgentsEnabled: "general.ephemeralAgentsCompatibilityHint", allowAbsoluteFileBrowserPaths: "general.allowAbsoluteFileBrowserPathsHint", capacityRiskBannerEnabled: "general.warnOnTheBoardWhenTodoWorkExceeds", capacityRiskTodoThreshold: "general.bannerFiresWhenTodoCountIsStrictlyGreater", @@ -336,7 +342,7 @@ const NOT_SURFACED_ALLOWLIST: Record = { nested enabled flag rather than a top-level plain description field. */ voiceInput: "nested Voice Input section object; enable toggle owns Default: off for voiceInput.enabled", - // Moved to workflow settings (U4) — see MOVED_SETTINGS_KEYS in settings-schema.ts. + // Moved to workflow settings (U4) — see MOVED_SETTINGS_KEYS in `packages/core/src/config/settings-schema.ts`. workflowStepTimeoutMs: "moved to workflow settings (U4)", workflowStepScopeEnforcement: "moved to workflow settings (U4)", planOnlyScopeLeakEnforcement: "moved to workflow settings (U4)", diff --git a/packages/i18n/locales/en/app.json b/packages/i18n/locales/en/app.json index f3b952a488..78cc696dfd 100644 --- a/packages/i18n/locales/en/app.json +++ b/packages/i18n/locales/en/app.json @@ -5967,6 +5967,7 @@ "upperBoundOnMessagesFetchedFromTheRoom": "Upper bound on messages fetched from the room store for compaction consideration. Default: 200.", "upToDate": "You're up to date ✓", "useEphemeralTaskWorkerAgents": " Use ephemeral task-worker agents ", + "ephemeralAgentsCompatibilityHint": "Retained for configuration compatibility. Default: enabled. This setting does not affect scheduler assignment or admission, executor workflow dispatch or re-entry, mission start, or workflow-stage principal routing.", "warnOnTheBoardWhenTodoWorkExceeds": "Warn on the board when todo work exceeds the threshold and no idle agents are available. Default: disabled.", "whenEnabledDefaultFusionSpawnsShortLived": " When enabled (default), Fusion spawns short-lived ", "whenEnabledFusionChecksOpenAndClosedIssues": " When enabled, Fusion checks open and closed issues in the target repo for likely duplicates (using File Scope paths and key symptoms) before creating a new tracking issue. Uncheck to always create a new issue. Default: enabled. ",