diff --git a/packages/dashboard/app/components/MemoryView.css b/packages/dashboard/app/components/MemoryView.css
index 1750f6b7ca..e3a45af888 100644
--- a/packages/dashboard/app/components/MemoryView.css
+++ b/packages/dashboard/app/components/MemoryView.css
@@ -10,11 +10,16 @@ The title row now comes from the shared .view-header (which supplies the --space
overflow: hidden;
}
+/*
+FNXC:Navigation 2026-06-22-02:30:
+After the header migrated to the shared .view-header (which is flex-shrink:0), the sibling description and tab bar must also be flex-shrink:0. Without it they collapse under the flex column at constrained heights, letting .memory-view-content overlap the header/tabs. The scroll owner is the active tab pane (.memory-*-tab, flex:1 + min-height:0 + overflow-y:auto); the editor container keeps min-height:0 through the chain so CodeMirror bounds itself and never overruns the action bar.
+*/
.memory-view-description {
color: var(--text-muted);
font-size: 13px;
margin: 0;
padding: 0 var(--space-lg);
+ flex-shrink: 0;
}
.memory-view-tabs {
@@ -24,6 +29,7 @@ The title row now comes from the shared .view-header (which supplies the --space
border-bottom: 1px solid var(--border);
margin: var(--space-md) 0 var(--space-lg);
padding: 0 var(--space-lg);
+ flex-shrink: 0;
}
.memory-view-tab {
diff --git a/packages/dashboard/app/components/__tests__/WorkflowNodeEditor.css.test.ts b/packages/dashboard/app/components/__tests__/WorkflowNodeEditor.css.test.ts
index 2e761da5ef..231d692587 100644
--- a/packages/dashboard/app/components/__tests__/WorkflowNodeEditor.css.test.ts
+++ b/packages/dashboard/app/components/__tests__/WorkflowNodeEditor.css.test.ts
@@ -173,7 +173,14 @@ describe("WorkflowNodeEditor mobile CSS contract", () => {
expect(baseCss).toMatch(/\.wf-editor-modal\s*\{[^}]*min-width\s*:\s*640px\s*;/);
- const editorModalRule = findRule(mobileBlocks, /\.wf-editor-modal,\s*\.wf-create-modal\s*\{[^}]*\}/);
+ // FN-6: the mobile viewport-takeover rule is scoped to the dialog presentation
+ // via :not(.wf-editor-modal--embedded) so the embedded main-view variant keeps its
+ // 100%-of-pane sizing. Match the scoped selector; .wf-create-modal has no embedded
+ // variant and stays unscoped.
+ const editorModalRule = findRule(
+ mobileBlocks,
+ /\.wf-editor-modal:not\(\.wf-editor-modal--embedded\),\s*\.wf-create-modal\s*\{[^}]*\}/,
+ );
expect(editorModalRule).toMatch(/width\s*:\s*100vw\s*;/);
expect(editorModalRule).toMatch(/height\s*:\s*100dvh\s*;/);
expect(editorModalRule).toMatch(/border-radius\s*:\s*0\s*;/);
@@ -344,7 +351,13 @@ describe("WorkflowNodeEditor mobile CSS contract", () => {
const editorCss = readComponentCss("WorkflowNodeEditor.css");
const mobileBlocks = extractMediaBlocks(editorCss, "(max-width: 768px)");
- const overlayRule = findRule(mobileBlocks, /\.modal-overlay:has\(\.wf-editor-modal\),\s*\.modal-overlay:has\(\.wf-create-modal\)\s*\{[^}]*\}/);
+ // FN-6: overlay stretch is likewise scoped to the dialog editor via
+ // :not(.wf-editor-modal--embedded) so the embedded variant's overlay-less main view
+ // isn't forced full-bleed. .wf-create-modal stays unscoped.
+ const overlayRule = findRule(
+ mobileBlocks,
+ /\.modal-overlay:has\(\.wf-editor-modal:not\(\.wf-editor-modal--embedded\)\),\s*\.modal-overlay:has\(\.wf-create-modal\)\s*\{[^}]*\}/,
+ );
expect(overlayRule).toMatch(/padding-top\s*:\s*0\s*;/);
expect(overlayRule).toMatch(/align-items\s*:\s*stretch\s*;/);
diff --git a/packages/dashboard/app/components/settings/sections/GeneralSection.tsx b/packages/dashboard/app/components/settings/sections/GeneralSection.tsx
index 5474de89c7..d9cf656db0 100644
--- a/packages/dashboard/app/components/settings/sections/GeneralSection.tsx
+++ b/packages/dashboard/app/components/settings/sections/GeneralSection.tsx
@@ -190,7 +190,15 @@ export function GeneralSection({ scopeBanner, form, setForm, projectId, addToast
{t("settings.general.controlsWhetherNewlyCreatedTasksHaveGitHubIssue", " Controls whether newly created tasks have GitHub issue tracking enabled by default. Individual tasks can still override this from the task detail modal. ")}
- {t("settings.general.trackingIssuesUseThisTaskAposSTitle", " Tracking issues use this task's title. If a task has no title yet, Fusion can summarize its description using the title summarization model in Project Models. ")}{!form.autoSummarizeTitles && !form.useAiMergeCommitSummary && !form.githubTrackingEnabledByDefault
+ {/*
+ FNXC:SettingsGeneral 2026-06-22-03:20:
+ Tracking-issue helper copy. The FN-6771 JSX→t() extraction left a raw HTML
+ entity ("'") in this default string. As a t() argument the string is a
+ plain JS value (not JSX-decoded), so the entity rendered verbatim as the
+ literal "'" instead of an apostrophe. Use a real apostrophe so the copy
+ reads correctly in both modal and embedded presentations.
+ */}
+ {t("settings.general.trackingIssuesUseThisTaskAposSTitle", " Tracking issues use this task's title. If a task has no title yet, Fusion can summarize its description using the title summarization model in Project Models. ")}{!form.autoSummarizeTitles && !form.useAiMergeCommitSummary && !form.githubTrackingEnabledByDefault
? t("settings.general.enableSummarizationInProjectModelsToConfigureThatModel", " Enable summarization in Project Models to configure that model.")
: ""}
diff --git a/packages/i18n/locales/en/app.json b/packages/i18n/locales/en/app.json
index 29045d0813..db8d1005c1 100644
--- a/packages/i18n/locales/en/app.json
+++ b/packages/i18n/locales/en/app.json
@@ -5741,7 +5741,7 @@
"showTheFloatingChatButtonInTheDashboard": "Show the floating chat button in the dashboard. Chat is still accessible from the Chat tab in the mobile navigation.",
"taskPrefix": "Task Prefix",
"todoThreshold": "Todo threshold",
- "trackingIssuesUseThisTaskAposSTitle": " Tracking issues use this task's title. If a task has no title yet, Fusion can summarize its description using the title summarization model in Project Models. ",
+ "trackingIssuesUseThisTaskAposSTitle": " Tracking issues use this task's title. If a task has no title yet, Fusion can summarize its description using the title summarization model in Project Models. ",
"updateAvailablePrefix": "v{{version}} available",
"updateCheckFailed": "Failed to check for updates",
"updateFailed": "Update failed",