diff --git a/docs/plans/2026-02-18-flow-editor-ux-impl.md b/docs/plans/2026-02-18-flow-editor-ux-impl.md
new file mode 100644
index 00000000..4eb4c2b6
--- /dev/null
+++ b/docs/plans/2026-02-18-flow-editor-ux-impl.md
@@ -0,0 +1,1327 @@
+# Flow Editor UX Fixes Implementation Plan
+
+> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
+
+**Goal:** Fix three UX problems in the flow editor — unreachable card content, noisy hint text, and forced child-type selection while naming answer options.
+
+**Architecture:** Five phases in order: scrollability + fullscreen modal, reusable InfoTip component + tooltip replacements, answer stub type system (frontend types → new component → canvas wiring → NodeList guard), backend draft/publish validation, then markdown serializer and runtime navigation guard. Each phase builds on the previous and must produce a clean `npm run build` before the next begins.
+
+**Tech Stack:** React 19, TypeScript, Tailwind CSS, Zustand (`treeEditorStore`), FastAPI (`tree_validation.py`), `frontend/src/lib/treeMarkdownSync.ts`
+
+**Working directory:** `/home/michaelchihlas/dev/patherly` (main branch — this plan targets the main codebase, not the worktree, since the canvas code was already merged or will be)
+
+> **Note on worktree vs main:** If the `feature/tree-editor-canvas` branch has not yet been merged to main, run all frontend tasks in `.worktrees/tree-editor-canvas/frontend/` and all backend tasks in `.worktrees/tree-editor-canvas/backend/`. If it has been merged, use the repo root. Check with `git branch --show-current` at the start.
+
+---
+
+## Phase 1: Scrollability + Fullscreen Editor
+
+### Task 1.1: Fix canvas inline card scroll (TreeCanvasNode)
+
+**Files:**
+- Modify: `frontend/src/components/tree-editor/TreeCanvasNode.tsx`
+
+**Step 1: Make the card header sticky when expanded**
+
+Open the file. Find the card header `
` (around line 165) — it's the one with class `flex items-center gap-2 px-3 py-2.5`. It currently has a `cn()` call like this:
+
+```tsx
+className={cn(
+ 'flex items-center gap-2 px-3 py-2.5',
+ !isExpanded && 'cursor-pointer hover:bg-accent/50 rounded-t-xl',
+ !isExpanded && 'rounded-xl'
+)}
+```
+
+Add a sticky class when expanded:
+
+```tsx
+className={cn(
+ 'flex items-center gap-2 px-3 py-2.5',
+ !isExpanded && 'cursor-pointer hover:bg-accent/50 rounded-t-xl',
+ !isExpanded && 'rounded-xl',
+ isExpanded && 'sticky top-0 z-10 bg-card rounded-t-xl'
+)}
+```
+
+**Step 2: Make the expanded editing area scrollable**
+
+Find the expanded content `
` (around line 324) — it's the one that appears under `{isExpanded && (`:
+
+```tsx
+
+```
+
+Change it to:
+
+```tsx
+
+```
+
+**Step 3: Build**
+
+```bash
+cd frontend && npm run build 2>&1 | tail -10
+```
+
+Expected: `✓ built in Xs` with zero errors.
+
+**Step 4: Commit**
+
+```bash
+git add frontend/src/components/tree-editor/TreeCanvasNode.tsx
+git commit -m "fix: make canvas card expanded area scrollable with sticky header
+
+Co-Authored-By: Claude Sonnet 4.6 "
+```
+
+---
+
+### Task 1.2: Add fullscreen toggle to Modal component
+
+**Files:**
+- Modify: `frontend/src/components/common/Modal.tsx`
+- Modify: `frontend/src/components/tree-editor/NodeEditorModal.tsx`
+
+**Step 1: Update Modal.tsx**
+
+The current `Modal.tsx` is ~103 lines. The `ModalProps` interface (lines 5–13) and the component signature (line 15) need a new `allowFullScreen` optional prop.
+
+Replace the entire `Modal.tsx` content with the following (it's short enough to replace in full to be safe):
+
+```tsx
+import { useState, useEffect, useCallback, type ReactNode } from 'react'
+import { X, Maximize2, Minimize2 } from 'lucide-react'
+import { cn } from '@/lib/utils'
+
+interface ModalProps {
+ isOpen: boolean
+ onClose: () => void
+ title: string
+ children: ReactNode
+ /** Optional footer content that stays fixed at bottom (doesn't scroll) */
+ footer?: ReactNode
+ size?: 'sm' | 'md' | 'lg' | 'xl'
+ /** If true, a fullscreen toggle button appears in the modal header */
+ allowFullScreen?: boolean
+}
+
+export function Modal({ isOpen, onClose, title, children, footer, size = 'md', allowFullScreen = false }: ModalProps) {
+ const [isFullScreen, setIsFullScreen] = useState(() => {
+ if (!allowFullScreen) return false
+ try {
+ return localStorage.getItem('rf-editor-fullscreen') === 'true'
+ } catch {
+ return false
+ }
+ })
+
+ const toggleFullScreen = () => {
+ const next = !isFullScreen
+ setIsFullScreen(next)
+ try {
+ localStorage.setItem('rf-editor-fullscreen', String(next))
+ } catch {}
+ }
+
+ // Close on Escape key
+ const handleKeyDown = useCallback(
+ (e: KeyboardEvent) => {
+ if (e.key === 'Escape') {
+ onClose()
+ }
+ },
+ [onClose]
+ )
+
+ useEffect(() => {
+ if (isOpen) {
+ document.addEventListener('keydown', handleKeyDown)
+ document.body.style.overflow = 'hidden'
+ }
+ return () => {
+ document.removeEventListener('keydown', handleKeyDown)
+ document.body.style.overflow = ''
+ }
+ }, [isOpen, handleKeyDown])
+
+ if (!isOpen) return null
+
+ const sizeClasses = {
+ sm: 'max-w-sm',
+ md: 'max-w-md',
+ lg: 'max-w-full sm:max-w-lg',
+ xl: 'max-w-full sm:max-w-4xl',
+ }
+
+ return (
+
+ )
+}
+
+export default Modal
+```
+
+**Step 2: Pass `allowFullScreen` to NodeEditorModal**
+
+In `frontend/src/components/tree-editor/NodeEditorModal.tsx`, find line 86:
+
+```tsx
+
+```
+
+Change to:
+
+```tsx
+
+```
+
+**Step 3: Build**
+
+```bash
+cd frontend && npm run build 2>&1 | tail -10
+```
+
+Expected: Clean build, zero errors.
+
+**Step 4: Commit**
+
+```bash
+git add frontend/src/components/common/Modal.tsx frontend/src/components/tree-editor/NodeEditorModal.tsx
+git commit -m "feat: add fullscreen toggle to Modal, enable in NodeEditorModal
+
+Co-Authored-By: Claude Sonnet 4.6 "
+```
+
+---
+
+## Phase 2: Info-On-Demand Tooltips
+
+### Task 2.1: Create the InfoTip component
+
+**Files:**
+- Create: `frontend/src/components/common/InfoTip.tsx`
+
+**Step 1: Create the file**
+
+```tsx
+interface InfoTipProps {
+ text: string
+}
+
+export function InfoTip({ text }: InfoTipProps) {
+ return (
+
+ i
+
+ )
+}
+```
+
+**Step 2: Build**
+
+```bash
+cd frontend && npm run build 2>&1 | tail -10
+```
+
+Expected: Clean build.
+
+**Step 3: Commit**
+
+```bash
+git add frontend/src/components/common/InfoTip.tsx
+git commit -m "feat: add reusable InfoTip component for field-level help
+
+Co-Authored-By: Claude Sonnet 4.6 "
+```
+
+---
+
+### Task 2.2: Replace hint text in NodeFormDecision
+
+**Files:**
+- Modify: `frontend/src/components/tree-editor/NodeFormDecision.tsx`
+
+**Step 1: Add the InfoTip import**
+
+After the existing imports at the top of the file, add:
+
+```tsx
+import { InfoTip } from '@/components/common/InfoTip'
+```
+
+**Step 2: Remove the root node question hint paragraph**
+
+Around line 89–93 there is:
+
+```tsx
+{isRootNode && (
+
+ What's the main question to diagnose the issue?
+
+)}
+```
+
+Delete this entire block. The input placeholder `"e.g., What type of issue are you experiencing?"` already conveys the intent.
+
+**Step 3: Replace the options hint paragraphs with an InfoTip on the label**
+
+Around lines 133–144, the Options section label and hints look like:
+
+```tsx
+
+{isRootNode ? (
+
+ Add as many options as needed (A, B, C, D...). Each option leads to a completely different troubleshooting path.
+
+) : (
+
+ Each option can branch to a different next step.
+
+)}
+```
+
+Replace with:
+
+```tsx
+
+```
+
+**Step 4: Build**
+
+```bash
+cd frontend && npm run build 2>&1 | tail -10
+```
+
+Expected: Clean build.
+
+**Step 5: Commit**
+
+```bash
+git add frontend/src/components/tree-editor/NodeFormDecision.tsx
+git commit -m "fix: replace hint paragraphs with InfoTip tooltips in NodeFormDecision
+
+Co-Authored-By: Claude Sonnet 4.6 "
+```
+
+---
+
+### Task 2.3: Replace hint text in NodeFormAction
+
+**Files:**
+- Modify: `frontend/src/components/tree-editor/NodeFormAction.tsx`
+
+**Step 1: Add the InfoTip import**
+
+Add at the top after existing imports:
+
+```tsx
+import { InfoTip } from '@/components/common/InfoTip'
+```
+
+**Step 2: Replace the Description hint paragraph**
+
+Around lines 91–93:
+
+```tsx
+