r210 Minimal Header — AI Summary

Status: ✅ All green · 27/27 unit tests · 47/47 Playwright smoke · 0 typecheck errors · 0 iframes · 0 postMessage

Branch: feat/id9-r210-minimal-header @ 419b339 (pushed to origin)

Base: clean/baseline-plus-wdm @ af00bff (r209 P0 cleanup)

TL;DR

What this means

The operator's chrome is now significantly cleaner. The header went from 12+ elements (Home + Project + 5 pills + 5 eyes + hamburger + spacer) to 4 (Fv log + surface + Gallery + Edge). The 5 surface pills are replaced with 1 cycling button (click to advance MAIN → WORKING → DRAFT → PREVIEW → ORIGIN). The 5 eye icons are gone (WDM attachEyeHandlers call removed). The hamburger is gone (replaced with an explicit Edge icon).

The Gallery icon opens a new PM2 panel backed by a small React GalleryPanel.tsx. The panel reads window.__fvcmsGallery.listModules() and shows a responsive module grid. When the Gallery is in stub state (current vibecoder-standalone build), it shows a helpful empty state pointing to a789 (Unified Gallery Panel plan).

The 3 critical r210 details

1. Vite dual-React gotcha (caught by smoke): the first iteration used dynamic import('react-dom/client') + import('./header/MinimalHeader.tsx') inside mountMinimalHeader(). This caused Vite to bundle a SECOND copy of React → "Invalid hook call" errors. The fix: static imports at the top of host-boot.js so Vite bundles a single React copy.

2. CSS safety net for r202-era IDs: the canonical panel-manager.css still has rules tied to #fvcms-os-header-pill-{surface} and .fvcms-surface-eye (per "no pact edits"). The new mountMinimalHeader injects a display:none !important rule for these IDs in the host-boot.js (not a pact edit) as a safety net for HMR or 3rd-party extensions.

3. WDM attachEyeHandlers() call removed, API preserved: the function still exists in workspace-manager.ts for API stability, but the call in workspace/index.ts:55-56 is removed per operator spec. The togglePillHidden() API is still callable (no-op without pills).

What's next

1. Production deploy (operator call): npm run build + scp to 185.249.73.178

2. Merge with r207/r208 (operator call): r210 is on clean/baseline-plus-wdm @ af00bff; r208 is on feat/id9-r208-integration @ d8e2cca (based on r206 @ 0746358). Need to rebase/merge to combine the r207/r208 mounts with the r210 header.

3. Cross-repo InspectorCard migration (a788, 1-2h): freshvibestudio's InspectorCard.tsx should be a 15 LoC wrapper that imports from avidtech6/vibecoder-standalone. Independent of r210.

Open questions

1. Merge order: r208 (integration) is also pending. Merge r208 first, or fast-track r210 (header chrome) ahead?

2. r210 + r208 host-boot.js merge conflict: r208 added 2 LoC + replaced openVsilPanel; r210 replaces mountOSHeader + adds openGalleryPanel. Likely resolvable, but needs a plan.

3. Gallery panel — empty stub or real data? Currently empty (stub). Will populate when avidtech6/fv-module-gallery is wired (per a789).

4. Edge icon visual: SVG 3-line square, not the r202 ☰ glyph. Operator may want to swap.

Verification

cd /workspace/vibecoder-standalone-r210
npx tsx src/host/header/__tests__/MinimalHeader.test.tsx  # 27/27
npx vite --port 5273 --host 0.0.0.0 &
sleep 5
node scripts/smoke/r210-smoke.spec.cjs  # 47/47

Expected: 27/27 unit + 47/47 Playwright. Total 74/74.