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) <noreply@runfusion.ai>
This commit is contained in:
7
.changeset/fn-8831-settings-default-description.md
Normal file
7
.changeset/fn-8831-settings-default-description.md
Normal file
@@ -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.
|
||||
@@ -35,8 +35,8 @@ On mobile, the search row starts collapsed behind a compact toggle icon beside t
|
||||
<!-- FNXC:SettingsDocs 2026-07-11-18:58: FN-7825 makes the Settings navigation rail read as one clean surface: no vertical content divider, single-line section rows, and a desktop/tablet resize handle with browser-local width persistence. Mobile remains the stacked section picker. -->
|
||||
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**.
|
||||
|
||||
<!-- FNXC:SettingsDefaults 2026-07-04-00:00: FN-7505 requires every user-editable setting's help text to state its own default value, so operators reading a field's description know what it defaults to without checking the reference doc. -->
|
||||
Every user-editable setting's help text (the `.settings-description`/`<small>` 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.
|
||||
<!-- FNXC:SettingsDefaults 2026-08-08-06:23: FN-8831 confirms the canonical-default rule also covers visible, routing-inert compatibility inputs; a setting's runtime effect does not exempt its operator help from describing its schema default. -->
|
||||
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.
|
||||
|
||||
<!-- FNXC:SettingsAutoSaveDocs 2026-08-02-20:55: FN-8395 removes the ambiguous Settings Save affordance. Operators need the persistence timing and close guarantee documented where Settings behavior is introduced. -->
|
||||
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.
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -286,10 +286,14 @@ export function GeneralSection({ form, setForm, projectId, addToast, prefixError
|
||||
</div>
|
||||
<div className="form-group">
|
||||
<div className="settings-field-label-row">
|
||||
{/*
|
||||
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.
|
||||
*/}
|
||||
<label htmlFor="ephemeralAgentsEnabled" className="checkbox-label">
|
||||
<input id="ephemeralAgentsEnabled" type="checkbox" checked={form.ephemeralAgentsEnabled !== false} onChange={(e) => setForm((f) => ({ ...f, ephemeralAgentsEnabled: e.target.checked }))}/>{t("settings.general.useEphemeralTaskWorkerAgents", " Use ephemeral task-worker agents ")}
|
||||
</label>
|
||||
<SettingsHelpTip settingKey="ephemeralAgentsEnabled">{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. ")}</SettingsHelpTip>
|
||||
<SettingsHelpTip settingKey="ephemeralAgentsEnabled">{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. ")}</SettingsHelpTip>
|
||||
</div>
|
||||
</div>
|
||||
{/*
|
||||
|
||||
@@ -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<string, string> = {
|
||||
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<string, string> = {
|
||||
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)",
|
||||
|
||||
@@ -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. ",
|
||||
|
||||
Reference in New Issue
Block a user