# Graph Report - vo-webui  (2026-07-01)

## Corpus Check
- 47 files · ~43,099 words
- Verdict: corpus is large enough that graph structure adds value.

## Summary
- 495 nodes · 952 edges · 28 communities (26 shown, 2 thin omitted)
- Extraction: 100% EXTRACTED · 0% INFERRED · 0% AMBIGUOUS · INFERRED: 1 edges (avg confidence: 0.5)
- Token cost: 0 input · 0 output

## Graph Freshness
- Built from commit: `211a72a1`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).

## Community Hubs (Navigation)
- [[_COMMUNITY_Community 0|Community 0]]
- [[_COMMUNITY_Community 1|Community 1]]
- [[_COMMUNITY_Community 2|Community 2]]
- [[_COMMUNITY_Community 3|Community 3]]
- [[_COMMUNITY_Community 4|Community 4]]
- [[_COMMUNITY_Community 5|Community 5]]
- [[_COMMUNITY_Community 6|Community 6]]
- [[_COMMUNITY_Community 7|Community 7]]
- [[_COMMUNITY_Community 8|Community 8]]
- [[_COMMUNITY_Community 9|Community 9]]
- [[_COMMUNITY_Community 10|Community 10]]
- [[_COMMUNITY_Community 11|Community 11]]
- [[_COMMUNITY_Community 12|Community 12]]
- [[_COMMUNITY_Community 13|Community 13]]
- [[_COMMUNITY_Community 14|Community 14]]
- [[_COMMUNITY_Community 15|Community 15]]
- [[_COMMUNITY_Community 16|Community 16]]
- [[_COMMUNITY_Community 19|Community 19]]
- [[_COMMUNITY_Community 20|Community 20]]
- [[_COMMUNITY_Community 22|Community 22]]
- [[_COMMUNITY_Community 24|Community 24]]

## God Nodes (most connected - your core abstractions)
1. `get_user()` - 26 edges
2. `get_user()` - 22 edges
3. `lang_cookie()` - 19 edges
4. `hybrid_convert()` - 18 edges
5. `get_db()` - 17 edges
6. `db_cursor()` - 17 edges
7. `page()` - 17 edges
8. `T()` - 17 edges
9. `cascade_workflow()` - 16 edges
10. `db_exec()` - 14 edges

## Surprising Connections (you probably didn't know these)
- `api_complete_task()` --calls--> `get_user()`  [EXTRACTED]
  routes/tasks.py → vo_auth.py
- `api_complete_task()` --calls--> `agent_notify()`  [EXTRACTED]
  routes/tasks.py → vo_notify_pg.py
- `api_review_task()` --calls--> `get_user()`  [EXTRACTED]
  routes/tasks.py → vo_auth.py
- `api_review_task()` --calls--> `db_cursor()`  [EXTRACTED]
  routes/tasks.py → vo_db.py
- `api_review_task()` --calls--> `agent_notify()`  [EXTRACTED]
  routes/tasks.py → vo_notify_pg.py

## Import Cycles
- None detected.

## Communities (28 total, 2 thin omitted)

### Community 0 - "Community 0"
Cohesion: 0.05
Nodes (83): UploadFile, agent_translate(), Translate a document's .md content to target language and cache it.      Args:, get_o365_token(), Get O365 access token from cookie. Returns None if not available., call_graph(), cancel_event(), create_event() (+75 more)

### Community 1 - "Community 1"
Cohesion: 0.09
Nodes (48): api_task_output(), Get agent-generated output for review., activity_log_page(), Request, View function for Virtual Office Web UI., Show full activity log with pagination., agents_view(), Request (+40 more)

### Community 2 - "Community 2"
Cohesion: 0.05
Nodes (65): api_ai_generate(), api_complete_task(), api_review_task(), Request, Task API routes — complete, review, output, and AI generation.  Extracted from v, Trigger AI content generation for a task. Fire-and-forget, returns immediately., Approve or request revision of agent work., main() (+57 more)

### Community 3 - "Community 3"
Cohesion: 0.08
Nodes (7): addBubble(), fetchMessages(), formatTime(), openChat(), sendChatMsg(), showDoc(), switchDocLang()

### Community 4 - "Community 4"
Cohesion: 0.13
Nodes (12): Tests for the main hybrid_convert entry point., Non-PDF extensions (like .docx) go directly to MarkItDown., When LiteParse produces good quality output, use it., When LiteParse quality is low, fall back to MarkItDown., When LiteParse entirely fails, fall back to MarkItDown., When both parsers fail, return error details., When falling back to MarkItDown, LiteParse JSON is still passed through., Image-only PDFs (no text) should fall back due to short output quality penalty. (+4 more)

### Community 5 - "Community 5"
Cohesion: 0.14
Nodes (11): Tests for quality scoring of LiteParse output., Many artifact lines → quality drops., Very short output for a large file → penalty., No artifacts but tiny output for large file., Integration-style checks for the quality pipeline., Simulate LiteParse output from a multi-column PDF with mixed-up columns., Simulate LiteParse output from a single-column layout — should score high., TestQualityIntegration (+3 more)

### Community 6 - "Community 6"
Cohesion: 0.06
Nodes (34): close_pool(), get_dsn(), Database connection module for Virtual Office Web UI.  Uses psycopg2 connection, Get DSN from env var, falling back to local dev default.      Call this instead, Close all connections in the pool. Called at app shutdown., _handle_agent_notify(), _handle_error(), handle_event() (+26 more)

### Community 7 - "Community 7"
Cohesion: 0.18
Nodes (17): _ensure_folder_path(), get_graph_token(), get_unsynced_docs(), _graph_request(), load_secrets(), main(), mark_synced(), Load key=value pairs from a simple .env file. (+9 more)

### Community 8 - "Community 8"
Cohesion: 0.18
Nodes (8): Lines with multiple numeric and short word fragments → column bleed., Single number on a line → likely column bleed., Tab-separated short fragments → column bleed indicator., Mixed pattern like 'word num word num' → column bleed., Tests for the artifact counting used in quality scoring., TestCountArtifacts, _count_artifacts(), Count formatting artifact lines in LiteParse markdown output.      Detects issue

### Community 9 - "Community 9"
Cohesion: 0.17
Nodes (14): describe_visually(), _fmt_size(), _likely_visual_document(), _pixelshot_to_tiles(), _query_gemma_vision(), vo_visual_rag.py — Visual document understanding using pixelshot + Gemma-4 visio, Resize a tile JPEG to reduce size for API call. Returns path to resized image., Send an image to Gemma-4 vision API and return the description.      Returns: (+6 more)

### Community 10 - "Community 10"
Cohesion: 0.11
Nodes (15): image_only_pdf(), Tests for vo_parse.py — Hybrid document parser.  Tests cover:   - Basic PDF pars, Provide a temporary directory for test output., Create a minimal real file to act as a PDF for path checks., Verify shell quoting is secure., convert_via_markitdown should use shlex.quote() not manual quoting., Ensure vo_parse can be imported without errors., Re-import vo_parse and verify no import errors. (+7 more)

### Community 11 - "Community 11"
Cohesion: 0.22
Nodes (13): _add_bg(), _add_logo(), _add_rect(), _add_table(), _add_tb(), _extract_tables(), vo_pptx_render.py — Professional PowerPoint generation with templates.  Uses des, Try to create chart data from a table. Returns None if not numeric. (+5 more)

### Community 12 - "Community 12"
Cohesion: 0.21
Nodes (8): Tests for LiteParse conversion function., When the liteparse binary doesn't exist, FileNotFoundError handled., Timeout should be handled gracefully., Successful LiteParse markdown output is captured., JSON layout file is saved alongside when out_dir is provided., TestConvertViaLiteParse, convert_via_liteparse(), Run LiteParse on a file.      Returns:         dict with keys:             succe

### Community 13 - "Community 13"
Cohesion: 0.21
Nodes (8): Tests for MarkItDown conversion function., Verify that the subprocess call uses shlex.quote() for safety., Successful MarkItDown output is captured., MarkItDown failure returns error details., Timeout should be handled., TestConvertViaMarkItDown, convert_via_markitdown(), Run MarkItDown as subprocess.      Returns:         dict with keys: success, mar

### Community 14 - "Community 14"
Cohesion: 0.29
Nodes (8): auth_callback(), auth_login(), create_session_token(), encrypt_token(), get_redirect_uri(), Request, Encrypt a token so it's safe to store in a cookie., auth_login()

### Community 15 - "Community 15"
Cohesion: 0.25
Nodes (10): add_bg(), add_logo(), add_rect(), add_textbox(), make_template(), Generate Atlas Consulting PowerPoint templates (Light + Dark). Saves to vo-webui, Set solid slide background., Add a filled rectangle. (+2 more)

### Community 16 - "Community 16"
Cohesion: 0.25
Nodes (7): BaseHTTPMiddleware, CSRFProtectMiddleware, Validate a CSRF token. Simple constant-time comparison., Validates CSRF token on all POST/PUT/DELETE requests., validate_csrf_token(), AuthMiddleware, login_page()

### Community 20 - "Community 20"
Cohesion: 0.67
Nodes (3): convert_via_markitdown(), main(), Run MarkItDown as subprocess and return text content or None on failure.

### Community 24 - "Community 24"
Cohesion: 0.50
Nodes (3): backfill_projects(), vo_parse.py — Hybrid document parser for VO: LiteParse fast-path + MarkItDown fa, Batch re-parse all existing source_documents through the hybrid pipeline.     Sk

## Knowledge Gaps
- **1 isolated node(s):** `start-secure.sh script`
  These have ≤1 connection - possible missing edges or undocumented components.
- **2 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.

## Suggested Questions
_Questions this graph is uniquely positioned to answer:_

- **Why does `hybrid_convert()` connect `Community 4` to `Community 0`, `Community 5`, `Community 10`, `Community 12`, `Community 13`, `Community 24`?**
  _High betweenness centrality (0.144) - this node is a cross-community bridge._
- **Why does `cascade_workflow()` connect `Community 2` to `Community 0`, `Community 6`?**
  _High betweenness centrality (0.054) - this node is a cross-community bridge._
- **Why does `_quality_score()` connect `Community 5` to `Community 24`, `Community 8`, `Community 10`, `Community 4`?**
  _High betweenness centrality (0.043) - this node is a cross-community bridge._
- **What connects `Generate Atlas Consulting PowerPoint templates (Light + Dark). Saves to vo-webui`, `Set solid slide background.`, `Add a filled rectangle.` to the rest of the system?**
  _172 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `Community 0` be split into smaller, more focused modules?**
  _Cohesion score 0.052659716653301256 - nodes in this community are weakly interconnected._
- **Should `Community 1` be split into smaller, more focused modules?**
  _Cohesion score 0.0907103825136612 - nodes in this community are weakly interconnected._
- **Should `Community 2` be split into smaller, more focused modules?**
  _Cohesion score 0.054773082942097026 - nodes in this community are weakly interconnected._