VITTO STUDIO PRODUCTION READINESS REPORT
Documentation for Vitto
Vitto Studio & Hub — Production Readiness Report
Full-Depth Analysis: Studio IDE + Universe Hub + Page Builder Integration GoGrab Platform | March 23, 2026 | Testing Director Deep-Dive
Table of Contents
- Executive Summary
- Critical Bugs (Blockers)
- Hub Page Analysis
- Studio Panel-by-Panel Audit (19 Panels)
- Service Layer Health Matrix (40+ Services)
- Dock Layout System Deep-Dive
- Visual Builder: The Critical Gap + Integration Plan
- Accessibility & Standards Compliance
- Production Readiness Checklist
- Prioritized Enhancement Roadmap
1. Executive Summary
This report is the result of live browser testing of both the Studio (/studio) and Hub (/hub) pages, combined with deep code analysis of 19 panels, 40+ services, the dock layout library (~7,000 LOC), the page-builder library (~5,000 LOC), and the Hub component (745 LOC + 295 HTML + 827 SCSS).
Scores by Subsystem
| Subsystem | Score | Status | Blocking Issues |
|---|---|---|---|
| Hub Page | 88/100 | Production-ready | Stats show 0 pages (possible counting issue), setTimeout debounce leak |
| Live Preview | 85/100 | Near-ready | BUG-001: Module tab click destroys Studio state |
| Git Integration | 80/100 | Near-ready | Missing: interactive staging, conflict resolution |
| Code Editor | 78/100 | Functional | Missing: search, multi-cursor, intellisense |
| AI Generation (Vitto) | 75/100 | Functional | Subscription leaks in SSE bridge |
| Entity Designer | 72/100 | Functional | AI generates only 1 field per entity |
| Deploy Panel | 65/100 | Partial | Custom domains "coming soon", no CI/CD |
| Data Browser | 40/100 | Broken | BUG-002: Collection click navigates to wrong tab |
| Visual Builder | 15/100 | Placeholder | Not connected to page-builder library (82/100) |
| Dock Layout System | 90/100 | Production-ready | Minor: late hydration race, popout disabled |
2. Critical Bugs (Blockers)
BUG-001: Studio State Destruction on Live Preview Navigation
- Severity: CRITICAL (P0)
- Reproduce: Open Studio → Live Preview tab → Click "Quiz Engine" module tab
- Result: Entire Studio loses context → "Untitled DRAFTING" → infinite spinner → all panels gone → requires full page reload (~20 seconds)
- Root Cause: Preview module tabs trigger top-level Angular router navigation instead of iframe-scoped navigation
- Files to investigate:
libs/libs-structural/vitto-studio/src/lib/services/preview.service.ts(line ~400+, preview iframe event handling)libs/libs-structural/vitto-studio/src/lib/panels/visual-canvas-panel.component.ts
- Fix approach: Intercept all
<a>click events inside the Live Preview iframe. Useevent.preventDefault()+ iframe-scoped navigation.
BUG-002: Data Browser Collection Click Fails
- Severity: HIGH (P1)
- Reproduce: Open Data tab → Click any collection (e.g., "animal")
- Result: Tab switches to Code view (empty state) instead of loading collection data
- Root Cause: Collection click event handler likely calls a method that focuses a different panel
- Files to investigate:
libs/libs-structural/vitto-studio/src/lib/panels/data-browser-panel.component.ts(27 LOC wrapper)- The underlying
DataBrowserComponentit wraps
- Fix approach: Ensure collection click loads data within the Data panel, not cross-panel navigation
BUG-003: Deploy Tab Race Condition
- Severity: MEDIUM (P2)
- Reproduce: Click Deploy while Code tab is active (intermittent)
- Result: Shows code editor empty state first, then corrects on second click
- Root Cause: Tab rendering race between dock panel activation and content render
3. Hub Page Analysis
URL Tested: http://localhost:6200/space/chrome-space-1/universe/canguro/hub
Component: UniverseHubComponent (745 LOC + 295 HTML + 827 SCSS)
Library: @libs-space/universe-canvas
What's Working Well
- Clean layout: Overview stats → 5 categorized tool sections → Canvas Preview
- All 14 tool cards render with correct icons, descriptions, and status badges
- Canvas Preview embedded at bottom with live RuntimePreview showing real modules
- Responsive design: 3 breakpoints (1200px, 768px, 480px)
- DRAFT status badge visible in top-right
- Stats showing: 3 Modules, 0 Pages, 0 Galaxies, Last Updated timestamp
- Danger Zone properly styled with warning and "Empty Universe" requiring 2-stage confirmation
- No console errors on load
Issues Found
| Issue | Severity | Detail |
|---|---|---|
| Page count = 0 | MEDIUM | Hub shows "0 PAGES" but Studio shows pages inside modules. Counting logic may filter by type === 'page-module' which doesn't match generated pages. |
| Galaxy count = 0 | LOW | May be expected if galaxies aren't defined, but stat card shows "0" with no explanation |
| setTimeout debounce | LOW | Lines 236-248: Uses setTimeout instead of RxJS debounce. Timer not cleaned on destroy → potential memory leak |
| stats type casting | LOW | deploymentStatus and deployedUrl cast via any instead of proper typing |
| Empty Universe loop | MEDIUM | for...of with async operations has no transaction safety — partial deletion possible if one fails |
| No breadcrumb trail | LOW | Header shows universe name but no full path (Org > Space > Universe) |
| "EDITOR UI" badges | MEDIUM | Red "EDITOR UI" badges visible in Canvas Preview are debug artifacts that shouldn't show in production |
Navigation Map (14 tools)
| Category | Tool | Destination Route | Status |
|---|---|---|---|
| Design & Build | Unified Builder | /universe/{slug}/builder |
RECOMMENDED badge |
| AI Generator | /universe/{slug}/vibe |
READY | |
| Universe Canvas | /universe/{slug}/canvas |
READY | |
| Grid Builder | /modular-universe/universe/{id} |
READY | |
| Content | Modularity | /modularity (space-scoped) |
READY |
| Page Builder | /editor (space-scoped) |
READY | |
| Singularity | /flow-engine (space-scoped) |
READY | |
| Code Editor | /universe/{slug}/code-editor |
READY | |
| Architecture | Universe Architect | /universe/{slug}/architect |
READY |
| Space Map | /space-map (space-scoped) |
READY | |
| Universe Map | /universe-map/{id} |
READY | |
| Deploy | Launch Station | /launch-station (space-scoped) |
READY |
| Quick Deploy | Modal (PlatformDeploymentService) | READY | |
| Settings | Modal (UniverseSettingsModal) | READY | |
| Danger | Empty Universe | 2-stage confirmation → delete all | READY |
4. Studio Panel-by-Panel Audit
Panel Maturity Matrix (19 Panels)
| # | Panel | LOC | Tier | Error Handling | Loading State | Empty State | Inline CSS? |
|---|---|---|---|---|---|---|---|
| 1 | visual-canvas-panel | 217 | Production | None | No | Yes | Yes (110 lines) |
| 2 | component-palette-panel | 27 | Wrapper | None | No | No | Yes |
| 3 | properties-panel | 158 | Production | None | No | Yes | Yes |
| 4 | deploy-panel | 223 | Partial (50%) | Yes | Yes | No | Yes (65 lines) |
| 5 | data-browser-panel | 27 | Wrapper | None | No | No | Yes |
| 6 | entity-designer-panel | 27 | Wrapper | None | No | No | Yes |
| 7 | file-review-panel | 340 | Production | Yes | Yes | Yes | Yes (187 lines) |
| 8 | pipeline-visualizer-panel | 25 | Wrapper | None | No | No | Yes |
| 9 | generations-panel | 131 | Production | Yes | No | Yes | External ✓ |
| 10 | api-explorer-panel | 27 | Wrapper | None | No | No | Yes |
| 11 | branches-panel | 176 | Production | None | No | Yes | Yes |
| 12 | code-editor-panel | 27 | Wrapper | None | No | No | Yes |
| 13 | diff-panel | 175 | Production | None | Yes | Yes | Yes |
| 14 | docs-panel | 27 | Wrapper | None | No | No | Yes |
| 15 | file-tree-panel | 40 | Wrapper | None | No | No | Yes |
| 16 | git-graph-panel | 160 | Production | Partial | Yes | Yes | External ✓ |
| 17 | history-panel | 109 | Production | None | Yes | Yes | Yes |
| 18 | module-tree-panel | 123 | Production | None | No | Yes | Yes |
| 19 | settings-panel | 231 | Production | Partial | No | No | Yes |
Summary: 9 production panels (47%), 1 partial, 9 wrappers (47%). Only 2 panels use external templates/styles (generations, git-graph) — 17 panels violate the project's separate-files standard.
Key Panel Issues
deploy-panel (50% complete):
- Custom domain support shows "coming soon" (TODO)
- Role detection hardcoded (TODO: detect from UserContextService)
- No deploy logs streaming
- No rollback capability
visual-canvas-panel (placeholder builder):
- Shows module cards in grid, NOT a visual design canvas
- Delegates to
VibeUniverseGeneratorComponentwhen empty - No connection to page-builder library at all
EmbeddableToWidgetMapperservice exists but is unused by this panel
settings-panel:
- Delete Project has no confirmation dialog (TODO in code)
- Environment variable management is basic (no validation, no secrets masking)
5. Service Layer Health Matrix
Critical Service Issues
| Service | LOC | Error Handling | Memory Safety | Type Safety | Critical Issues |
|---|---|---|---|---|---|
| StudioVittoBridgeService | 210 | Partial | LEAKY | Good | Nested .subscribe() without cleanup; EventSource not closed on early unsubscribe |
| PreviewService | 656 | Partial | RISKY | Unsafe (4 as any) |
3 untracked subscriptions; compilationInProgress flag non-atomic race; 4 window as any global injections |
| StudioGitService | 182 | Partial | RISKY | Weak | 5 unhandled throw new Error() without catchError; callers get broken Observable chains |
| GenerationService | ~400 | Partial | RISKY | Weak | Subject actions$ never completed; _creatingDraft flag-based mutex non-atomic |
| StudioDeployService | ~200 | Silent | Good | Good | error: () => {} swallows all errors silently; sets status but logs nothing |
| VfsService | 449 | Good | Good | Weak (22 !) |
22 non-null assertions suggest brittle null checking patterns |
| ModuleExportService | 1462 | Partial | Good | Weak (12 !, 9 unknown) |
Largest service; 5 untracked .subscribe() calls |
| ModuleExportApiService | 225 | Good | Good | Excellent | Best-designed service; comprehensive error recovery |
| EntityExtractionService | 528 | Good | Good | Weak | AI timeout at 15s can leave pending promises; local fallback is solid |
| PlatformStateService | ~300 | Good | Good | Good | TODO: 'current-user' hardcoded instead of from auth service |
Subscription Leak Summary
| Service | Untracked .subscribe() calls |
Risk |
|---|---|---|
| PreviewService | 3 | HIGH — long-running compilations |
| ModuleExportService | 5 | MEDIUM — code generation |
| StudioVittoBridgeService | 2 | HIGH — SSE streams |
| GenerationService | 3 | MEDIUM — generation tasks |
| Total | 13 | — |
Hardcoded Values Needing Configuration
| Service | Value | Purpose |
|---|---|---|
| PreviewService | debounceTime(800) |
Rebuild debounce |
| PreviewService | debounceTime(500) |
Generation files debounce |
| PreviewService | MAX_EMPTY_VFS_RETRIES = 5 |
Retry count |
| StudioGenerationListenerService | 600_000 (10 min) |
Generation timeout |
| StudioGenerationListenerService | 200_000 (3.3 min) |
Polling delay |
| StudioGenerationListenerService | 15_000 (15 sec) |
Poll interval |
| EntityExtractionService | 15_000 (15 sec) |
AI timeout |
| PlatformStateService | 'current-user' |
Hardcoded author name |
TODOs Found in Production Code
platform-state.service.ts:282—// TODO: Get from auth service(hardcoded author)platform-state.service.ts:606—// TODO: Add more revert handlersmodularity-integration.service.ts:253—// TODO: Call backend API to create actual filesflow-integration.service.ts:595—// TODO: Implement ${block.type} block logicdeploy-panel.component.ts:220— Custom domain support placeholdergit-graph-panel.component.ts:91—// TODO: detect actual role from UserContextServicesettings-panel.component.ts:206— Confirmation dialog for deletion
6. Dock Layout System Deep-Dive
Total LOC analyzed: ~8,000 (dock-layout lib + Studio integration)
Architecture
The dock system uses a tree-based LayoutState with three node types: SplitLayoutNode, TabsLayoutNode, PanelLayoutNode. State managed via Angular signals with dual persistence (IndexedDB via autoFlashState + localStorage backup).
Strengths
- Cloud sync with optimistic concurrency (409 conflict handling)
- 27 configurable panels with fluent
DockLayoutBuilderAPI - Pinned tabs, preview tabs, locked groups — all functional
- Full drag-drop with hit-testing, tab reorder, floating windows
- Scope isolation per space (Session 253)
- Layout profiles with save/restore/rename
Issues Found
| Issue | Severity | Detail |
|---|---|---|
| Late hydration race | MEDIUM | autoFlashState loads async, but initialize() is sync. Patched with 100ms setTimeout workaround (lines 464-479). |
| Singleton panel race | LOW | Rapid openPanel() calls can bypass singleton check. Application-level guard added but acknowledges it's "belt-and-suspenders". |
| Preview tab position bug | LOW | previewIndex calculated but never used — new preview added at 'center' instead of replacing at exact position. |
| Memory leak in DockWindowService | MEDIUM | startMove() returns cleanup function that caller must invoke. No automatic cleanup. |
| Tab element leak | MEDIUM | registerTabElement() stores DOM refs in Map. If DOM removed but Map not cleaned, prevents GC. |
| Cloud sync no retry | MEDIUM | HTTP failures logged but no retry mechanism. No exponential backoff. User can't manually retry. |
5 as any casts |
LOW | updateNode(nodeId, { pinned: true } as any) — should extend interface. |
| Popout disabled | LOW | enablePopout: false in studio-dock-shell. Feature exists but turned off. |
Missing vs VS Code / JetBrains
| Feature | VS Code | Studio Dock | Gap |
|---|---|---|---|
| Panel zoom | Yes | No | Missing |
| Panel search / quick-switcher | Yes | No | Missing |
| "Group all X panels" | No | No | N/A |
| Custom keybindings | Yes | No | Missing |
| Per-panel auto-save | Yes | No | Missing |
| Popout windows | Yes | Disabled | Disabled |
| Breadcrumb in panels | Yes | No | Missing |
7. Visual Builder: The Critical Gap + Integration Plan
The Two Builders
| Vitto Visual Builder (Studio) | Page Builder Library | |
|---|---|---|
| Score | 15/100 | 82/100 |
| LOC | ~400 (4 stub components) | ~5,000+ (24 services, full canvas) |
| Canvas | Module card grid | Full drag-drop with zoom, grid snap |
| Drag-Drop | None | 2-way (palette + AI panel) |
| Resize | None | 8-point handles, zoom-aware |
| Undo/Redo | None | 50-step snapshot history |
| Responsive | None | 4 breakpoints with inheritance |
| Layouts | None | Free, Grid, Flex, Flow |
| Presets | None | 13 container presets |
| Zone System | None | 4 semantic layouts |
| Code Gen | None | Full Angular component export |
| Persistence | None | IndexedDB auto-save |
| Shortcuts | None | Ctrl+Z/Y, Ctrl+C/V, Delete |
| Connected? | — | NOT connected to Studio |
The Bridge Already Exists
EmbeddableToWidgetMapper service (embeddable-to-widget-mapper.service.ts) already converts Studio's module embeddables into page-builder WidgetInstance[] and Page objects. This bridge is implemented but unused.
Concrete Integration Plan
Phase 1 (1-2 days): Wire page-builder canvas into visual-canvas-panel
File to modify: visual-canvas-panel.component.ts
- Import
PageCanvasComponentandPageStateServicefrom@libs-structural/page-builder - In
effect(), watchUniverseStructureStateService.selectedNode() - Convert selected module →
PageviaEmbeddableToWidgetMapper.mapToPage() - Call
PageStateService.loadPage(page) - Render
<lib-page-canvas>with widget inputs/outputs - Wire
widgetSelectoutput →CanvasSelectionService
Phase 2 (3-5 days): Full editor experience
- Connect properties panel to
PageStateService.selectionState() - Add widget palette for drag-drop additions
- Add toolbar: mode switch (design/preview/code), breakpoint selector, zoom, undo/redo
- Sync widget changes back to Studio's module storage
Phase 3 (1+ weeks): Advanced features
- Code generation from visual design
- AI embeddable suggestions
- Animation library integration
- Component marketplace
8. Accessibility & Standards Compliance
WCAG 2.1 AA Violations
| Criterion | Issue | Components |
|---|---|---|
| 1.1.1 Non-text content | Missing ARIA labels on 30+ icon buttons | StudioToolbar, all panels with action buttons |
| 1.3.1 Info and relationships | Tab-like elements missing role="tablist" |
Dock tab bars, toolbar tabs |
| 2.1.1 Keyboard | No keyboard navigation in canvas, palette, or dock panels | BuilderCanvas, ComponentPalette, all dock panels |
| 2.3.3 Animation from interactions | No prefers-reduced-motion guard |
GenerationsPanel pulse, DeployPanel spinner |
| 4.1.3 Status messages | No aria-live regions for status updates |
Generation progress, deploy status, error messages |
Code Standards Violations
17 of 19 panels use inline templates/styles, violating the project's "separate .ts, .html, .scss files" rule.
Worst offenders (inline CSS):
file-review-panel.component.ts— 187 lines inline CSSvisual-canvas-panel.component.ts— 110 lines inline CSSdeploy-panel.component.ts— 65 lines inline CSS
9. Production Readiness Checklist
Blockers (Must fix before release)
- BUG-001: Fix Live Preview module tab navigation destroying Studio state
- BUG-002: Fix Data Browser collection click navigating to wrong tab
- Memory leaks: Add
takeUntilDestroyed()to 13 untracked subscriptions across 4 services - Silent error swallowing: Fix StudioDeployService
error: () => {}pattern - Unhandled throws: Add catchError to StudioGitService's 5 throw statements
- "EDITOR UI" badges: Remove debug indicators from Hub Canvas Preview
Should fix (before GA)
- Integrate page-builder into visual-canvas-panel (score jump: 15 → 82)
- Add ARIA labels to all icon buttons
- Extract inline CSS to .scss files (17 panels)
- Add error boundaries to all panels with API calls
- Fix
compilationInProgressrace condition in PreviewService - Add confirmation dialog to Settings panel delete
- Resolve 7 TODOs in production code
- Replace 22 non-null assertions in VfsService with proper null checks
- Add cloud sync retry with exponential backoff
- Fix
previewIndexbug in dock layout (calculated but unused)
Nice to have (post-GA)
- Code editor: search, multi-cursor, intellisense, minimap
- Entity designer: auto-field generation, ERD visualization, validation rules
- Deploy: CI/CD pipeline, staging environments, rollback, deploy logs
- Git: interactive staging, conflict resolution, PR creation
- Hub: breadcrumb navigation, proper page counting
- Dock: popout windows, panel zoom, keyboard shortcuts, panel search
10. Prioritized Enhancement Roadmap
Week 1-2: Critical Fixes
| # | Task | Impact | Effort |
|---|---|---|---|
| 1 | Fix BUG-001 (Preview navigation) | Unblocks module previewing | 1-2 days |
| 2 | Fix BUG-002 (Data browser) | Unblocks data management | 0.5-1 day |
| 3 | Add takeUntilDestroyed() to 4 services |
Prevents memory leaks | 1 day |
| 4 | Fix StudioDeployService silent errors | Enables error debugging | 0.5 day |
| 5 | Fix StudioGitService unhandled throws | Prevents broken streams | 0.5 day |
Month 1: High-Impact Improvements
| # | Task | Impact | Effort |
|---|---|---|---|
| 6 | Integrate page-builder into Studio | Visual builder 15→82 | 3-5 days |
| 7 | Extract inline CSS to .scss (17 panels) | Standards compliance | 2 days |
| 8 | Add ARIA labels + keyboard nav | Accessibility | 2-3 days |
| 9 | Add global error boundary | Prevents state destruction | 1 day |
| 10 | Replace flag-based mutexes with RxJS operators | Fixes race conditions | 1 day |
Month 2-3: Feature Enrichment
| # | Task | Impact | Effort |
|---|---|---|---|
| 11 | Code editor enhancements (search, multi-cursor) | Developer experience | 1-2 weeks |
| 12 | Entity designer auto-field generation | AI quality | 1 week |
| 13 | CI/CD pipeline + staging environments | Deploy confidence | 2 weeks |
| 14 | Component marketplace / widget library | Builder power | 2-3 weeks |
| 15 | Collaborative editing (WebSocket/CRDT) | Team workflow | 3-4 weeks |
Appendix: Files Analyzed
Studio Core (19 panels, 40+ services)
libs/libs-structural/vitto-studio/src/lib/panels/— All 19 panel fileslibs/libs-structural/vitto-studio/src/lib/services/— All 40+ service fileslibs/libs-structural/vitto-studio/src/lib/components/— 37 sub-componentslibs/libs-structural/vitto-studio/src/lib/config/studio-dock-panels.config.ts
Dock Layout Library (~7,000 LOC)
libs/libs-ui/dock-layout/src/lib/services/dock-layout.service.ts(1,900 LOC)libs/libs-ui/dock-layout/src/lib/services/dock-state.service.ts(1,188 LOC)libs/libs-ui/dock-layout/src/lib/services/dock-drag.service.ts(859 LOC)libs/libs-ui/dock-layout/src/lib/services/dock-window.service.ts(~200 LOC)libs/libs-ui/dock-layout/src/lib/components/dock-container.component.ts(418 LOC)
Page Builder Library (~5,000 LOC)
libs/libs-structural/page-builder/src/lib/canvas/page-canvas.component.ts(300 LOC)libs/libs-structural/page-builder/src/lib/components/canvas-widget/(400+ LOC)libs/libs-structural/page-builder/src/lib/state/page-state.service.ts(592 LOC)libs/libs-structural/page-builder/src/lib/types/page-builder.types.ts(278 LOC)libs/libs-structural/page-builder/src/lib/services/(24+ service files)
Hub Page
libs/libs-space/universe-canvas/src/lib/components/universe-hub/universe-hub.component.ts(745 LOC)libs/libs-space/universe-canvas/src/lib/components/universe-hub/universe-hub.component.html(295 LOC)libs/libs-space/universe-canvas/src/lib/components/universe-hub/universe-hub.component.scss(827 LOC)
Supporting Infrastructure
libs/libs-foundational/core-angular/src/lib/services/universe-context.service.tslibs/libs-foundational/core-angular/src/lib/services/space-navigation.service.tsapps/gograb-space/src/app/app.routes.tslibs/libs-structural/vitto-studio/src/lib/services/embeddable-to-widget-mapper.service.tslibs/libs-structural/vitto-studio/src/lib/services/studio-interconnection.service.ts
Generated by Testing Director (Cowork Agent) — March 23, 2026 Live testing: Studio (/studio) + Hub (/hub) on localhost:6200 Code analysis: 19 panels, 40+ services, dock layout lib, page-builder lib, hub component