# IETF Draft Analyzer — Feature & UX Backlog **Scope**: Analysis of web UI (33 templates, 66 routes), CLI (36 commands), data layer (100+ computed functions), and DB schema (10 core tables). **Date**: 2026-03-09 **Analyst**: UX Scout Task #3 --- ## Summary The application is **feature-rich but siloed**: extensive data exists in the DB and is computed in data.py, but only ~60% is exposed in the web UI. Cross-linking between pages is incomplete (e.g., author pages don't link to gap gaps, drafts don't link to related proposals). CLI has powerful analysis commands (embed-ideas, idea-overlap, co-occurrence) but no web UI counterparts. **Quick wins**: 5 features that reuse existing infrastructure with minimal effort. **Medium effort**: 7 features requiring new pages or moderate refactoring. **Design debt**: Navigation flows have dead ends (e.g., single idea clusters → nowhere, gaps → proposals missing web UI). --- ## Detailed Backlog ### 🟢 HIGH IMPACT × SMALL EFFORT #### 1. **Author detail page with draft linkage** [IMPACT: HIGH | EFFORT: SMALL] - **Current**: Authors page shows network graph only; clicking author in draft_detail searches "author name" in drafts - **Missing**: Individual author page (`/authors/`) showing: - Author metadata (affiliation, co-authors) - List of drafts authored (with ratings/scores) - Co-author graph (2-hop collaboration network) - Ideas contributed (via their drafts) - Gaps they could address (category match with drafts) - **Why**: Closes gap between draft_detail → author → their other work. Reuses existing `get_author_network_full()` and co-author logic. - **Effort**: New template + 2 route handlers + 1 data.py function to fetch author profile + co-authors. - **Reuses**: `authors.py`, `get_coauthor_network()`, existing draft query logic. --- #### 2. **Idea detail page with "related ideas" clustering** [IMPACT: HIGH | EFFORT: SMALL] - **Current**: Idea clusters shown as page, but no single-idea view; clicking idea in draft_detail has no action - **Missing**: `/ideas/` page showing: - Idea title, type, description, novelty score - Source draft (link) - 5–10 semantically similar ideas (from other drafts) - Ideas this relates to (same cluster) - Gaps this could address (keyword + semantic match) - **Why**: Idea-centric navigation. Currently all idea access is through drafts or clusters. - **Effort**: New template + route + 1 data.py function (k-nearest neighbors in idea embedding space). - **Reuses**: Idea embeddings already computed; `get_idea_clusters()` logic. --- #### 3. **Gap-to-draft reverse link** [IMPACT: HIGH | EFFORT: SMALL] - **Current**: Gap detail shows what drafts exist on that topic; no link back to gaps from draft_detail - **Missing**: Add section to draft_detail showing: - Which gaps this draft helps address (topic keyword match + semantic) - Related proposals (from `/proposals` system) - **Why**: Closes loop: gap → drafts and draft → gaps. Helps user understand how a draft fits into the roadmap. - **Effort**: New section in draft_detail template + 1 data.py function (`get_gaps_for_draft(draft_name)`). - **Reuses**: Existing gap data + keyword/semantic matching. --- #### 4. **Inline draft comparison widget in drafts list** [IMPACT: MEDIUM | EFFORT: SMALL] - **Current**: `/compare` page exists but requires manual draft selection via checkboxes, no shortcuts - **Missing**: - Add "Compare" checkbox to each draft row in `/drafts` list - Sticky "Compare Selected" button at bottom - Quick-compare overlay showing side-by-side: score, category, authors, novelty - **Why**: Low-friction way to discover overlaps without navigating away. - **Effort**: Template changes + 1 JS handler + reuse existing `/api/compare` endpoint. --- #### 5. **Export audit trail: "What changed?" in monitoring** [IMPACT: MEDIUM | EFFORT: SMALL] - **Current**: Monitor page shows last run stats (new drafts, duration) but no detailed change log - **Missing**: Expandable section per run showing: - New drafts added (names, count) - False positives removed - Ideas extracted (by category) - API costs (tokens used) - **Why**: Transparency into pipeline. Supports cost tracking and debugging. - **Effort**: New template section + 1 data.py function to fetch run details from monitoring tables. - **Reuses**: Existing monitoring data; minor DB schema extension (one `audit_log` table). --- ### 🟡 HIGH IMPACT × MEDIUM EFFORT #### 6. **Category detail pages** [IMPACT: HIGH | EFFORT: MEDIUM] - **Current**: Category counts shown in overview; drafts filterable by category in `/drafts?cat=X`; no dedicated page - **Missing**: `/categories/` page showing: - Category description, count, average score - All drafts in category (sorted by score) - Top ideas in category (clustered) - Top authors in category (by draft count) - Trends: are drafts in this category getting more diverse? Maturing faster? - Gaps specific to this category (e.g., "Authentication" category lacks "revocation" ideas) - **Why**: Makes categories first-class entities; easier content discovery. - **Effort**: 1 template + 1 route + 3 data.py functions (top ideas, top authors, trends). - **Reuses**: Existing category logic, idea clustering, author ranking. --- #### 7. **Proposal detail → drafts linkage (web UI)** [IMPACT: HIGH | EFFORT: MEDIUM] - **Current**: `/proposals` exists (admin-only) but is disconnected from public UI; no way to see "which drafts might form a proposal?" - **Missing**: - Make `/proposals` public (read-only) - Add `/proposals/` route showing: - Proposal title, status, description, intended WG - Linked gaps (current feature) - **Suggested/related drafts** (category + author match) - Links to existing or draft RFCs/BCP refs - Add "Proposal intake" link from gap detail: "This gap could become a proposal. Start here →" - **Why**: Connects gap analysis to standards development workflow. - **Effort**: Route changes + template + 2 data.py functions (related drafts, related RFCs). - **Requires**: Remove admin_required on `/proposals` routes (review auth first). --- #### 8. **Citation/reference graph improvements** [IMPACT: MEDIUM | EFFORT: MEDIUM] - **Current**: Citation page shows RFC/draft references as graph - **Missing**: - **Reverse citations**: "Which other drafts cite this one?" - **Citation patterns**: "What RFC/BCP are most cited in agent drafts?" - **Missing references**: "This draft should cite RFC X because it covers the same topic" (suggest related RFCs) - **Why**: Helps identify foundational standards and co-dependencies. - **Effort**: 2 new data functions + template enhancements. - **Reuses**: Existing `draft_refs` table; parsing logic for RFC extraction. --- #### 9. **Dashboard export to Obsidian/Markdown** [IMPACT: MEDIUM | EFFORT: MEDIUM] - **Current**: `/export/obsidian` exists but exports only notes, not full dashboard state - **Missing**: Export multiple formats: - **Markdown vault**: Obsidian-compatible markdown with frontmatter (category, score, authors, ideas) - **JSON snapshot**: Full state dump (drafts + ratings + ideas + gaps) for offline analysis - **CSV multi-export**: Separate CSVs for each entity type (drafts, authors, ideas, gaps, proposals) - **Why**: Supports research workflows (offline reading, external tool integration). - **Effort**: 2 new route handlers + 2 data.py functions (schema converters). - **Reuses**: Existing `obsidian_export.py`; CSV export logic already in place. --- #### 10. **Search filters: advanced query builder** [IMPACT: MEDIUM | EFFORT: MEDIUM] - **Current**: Search page shows simple text box and keyword search; `/drafts` has basic filters (category, score, source) - **Missing**: Advanced query UI: - Filter by: category, score range, publication date, author, WG, false positive status - Sort by: score, novelty, overlap, momentum, relevance, date - Save/name favorite searches - Full-text search highlighting in results - **Why**: Power users (researchers, standards bodies) need fine-grained filtering. - **Effort**: New template (filter form) + route enhancements + 1 data.py function (advanced search builder). - **Reuses**: Existing FTS5 search; current filter parameters. --- ### 🔵 MEDIUM IMPACT × MEDIUM EFFORT #### 11. **Local LLM (Ollama) analysis shortcuts** [IMPACT: MEDIUM | EFFORT: MEDIUM] - **Current**: Ollama used for embeddings + classification only; Claude handles all analysis - **Missing**: Expose local-only analysis tools in web UI: - **Idea re-classification**: "Reclassify ideas for this draft using local model" (cheaper) - **Draft similarity** (local embeddings): "Find drafts most similar to this one" - **Batch idea extraction preview**: "Show how ideas would be extracted from this draft (preview, no API call)" - **Why**: Reduces Claude API costs; good for data exploration before expensive operations. - **Effort**: 3 new API routes + Flask handlers. - **Reuses**: Existing `embeddings.py` + `classifier.py` + Ollama integration. --- #### 12. **Idea overlap/gap matrix UI** [IMPACT: MEDIUM | EFFORT: MEDIUM] - **Current**: CLI has `idea-overlap` and `co-occurrence` commands (generate reports); no web UI - **Missing**: Interactive web page at `/ideas/overlap`: - Matrix showing which ideas overlap (appear in multiple drafts) - Co-occurrence frequency (if ideas A and B frequently appear together, high signal) - Suggests "merge these ideas" or "these might be the same standard" - **Why**: Helps identify redundant/overlapping work; supports standards consolidation. - **Effort**: 1 new route + 1 data.py function + 1 Plotly heatmap template. - **Reuses**: CLI logic from `idea-overlap` and `co-occurrence` commands. --- #### 13. **Trends analysis page** [IMPACT: MEDIUM | EFFORT: MEDIUM] - **Current**: `get_trends_data()` computed but not exposed (used by complexity page); data.py has trends functions - **Missing**: Dedicated `/trends` page showing: - New drafts per month (trend line) - Score distribution over time (are recent drafts more mature?) - Category growth trends - Author activity (new vs. returning) - API cost trend (tokens/month) - **Why**: Understand field maturity and adoption patterns. - **Effort**: 1 route + 1 template + use existing `get_trends_data()`. - **Reuses**: Existing data; Plotly timeseries. --- #### 14. **Readiness scorer exposé** [IMPACT: MEDIUM | EFFORT: MEDIUM] - **Current**: `readiness` module exists; shown in CLI `show` command; not in web UI - **Missing**: - Add readiness score to draft_detail page (already computed) - `/readiness` page: heatmap of all drafts × readiness factors - "How close to standardization?" indicator - **Why**: Helps standards bodies identify which proposals are most mature. - **Effort**: 1 template update + 1 route + reuse existing `readiness` module. --- #### 15. **Geospatial author view** [IMPACT: LOW | EFFORT: MEDIUM] - **Current**: Author affiliations stored in DB (org) but not geospatial - **Missing**: If org data can be geo-coded (rough): - Map showing author distribution (bubbles by region/country) - "Where is AI/agent standardization happening?" - **Why**: Novel visualization; supports diversity analysis. - **Effort**: Requires org → geo mapping (manual or external API); map widget setup. - **Blocker**: Geo-coding affiliation strings is non-trivial. --- ### 🟠 MEDIUM/LOW IMPACT × LARGE EFFORT #### 16. **Real-time monitoring dashboard** [IMPACT: MEDIUM | EFFORT: LARGE] - **Current**: Monitor page is static; shows last run results - **Missing**: WebSocket-based live updates during fetch/analyze/embed pipeline runs - Real-time progress bars - Live log streaming - Ability to pause/cancel runs - **Why**: Better UX for long-running operations. - **Effort**: WebSocket layer (Flask-SocketIO), background task queue (Celery), run state machine. - **Note**: High complexity; consider only if pipeline runs are frequent bottleneck. --- #### 17. **Semantic search (vs. full-text)** [IMPACT: MEDIUM | EFFORT: LARGE] - **Current**: Search uses FTS5 (lexical); embeddings exist but not used for search - **Missing**: - "Ask" page queries: should embed question, find semantically similar drafts - Extend to all search endpoints (global search) - **Why**: Better recall for conceptual queries ("How do drafts handle agent authorization?") - **Effort**: Requires re-querying embeddings for every search (perf issue) or building vector index (Faiss/Milvus). - **Note**: Good for future; current FTS5 is sufficient. --- #### 18. **Collaborative annotations & tags** [IMPACT: LOW | EFFORT: LARGE] - **Current**: Admin-only notes & tags on draft_detail - **Missing**: - Multi-user collaborative notes (comments, threads) - Tag suggestions (based on similar drafts) - Tag autocomplete - **Why**: Supports community review of drafts. - **Effort**: Auth rework, comments table, collaborative editing. - **Note**: Out of scope unless multi-user access is planned. --- #### 19. **Custom report builder** [IMPACT: MEDIUM | EFFORT: LARGE] - **Current**: Fixed reports (overview, landscape, digest, gaps, etc.) - **Missing**: UI to build custom reports: - Select entities (drafts, ideas, authors, gaps) - Choose dimensions (score, category, date) - Choose output format (PDF, HTML, Markdown) - **Why**: Non-technical users (standards committees) can create reports without CLI. - **Effort**: Report template DSL, PDF generation (weasyprint), export logic. --- #### 20. **Draft family/lineage tracking** [IMPACT: MEDIUM | EFFORT: LARGE] - **Current**: `pipeline/family.py` exists; tracks draft families (related drafts across revisions/forks) - **Missing**: Web UI showing draft lineage: - "This draft evolved from draft-X, also related to draft-Y" - Family tree visualization - Automatic linking of superseding drafts - **Why**: Helps track standardization progress (e.g., "agent-framework-v1 → v2 → RFC"). - **Effort**: Draft relationship inferencing, visualization. - **Note**: Requires careful matching logic; already partially implemented in `family.py`. --- ## Data Utilization Gaps ### Functions computed but not exposed: - `get_trends_data()` → only in complexity page - `get_complexity_data()` → complexity page only - `get_citation_influence()` → citations page, could be more prominent - `get_bcp_analysis()` → no dedicated page - `get_false_positive_profile()` → part of monitor, could be own page - `get_source_comparison()` → no dedicated page (only API) **Quick fix**: Create `/analytics/trends` and `/analytics/sources` pages to expose these. --- ## Navigation & Cross-Linking Issues | Page | Outbound links | Gaps | |------|---|---| | Draft detail | Gap, Author search, Idea clusters | No: "I'm an author, show all my drafts" link; "Reverse gaps" (gaps this draft addresses) | | Author network | Co-authors, drafts (search) | No: Author detail page; no link to gaps this author could address | | Gap detail | Related drafts | No: Reverse link to draft; no "start proposal" CTA | | Idea cluster | Drafts (list) | No: Individual idea page; no link to related gaps | | Proposal (admin) | Gaps | No: Public proposal discovery; no related drafts; no standards WG link | | `/ask` | Search results | No: Persistent query history; no "save search" | --- ## Low-Hanging Fruit (Quick Wins) 1. ✨ **Add "Source draft" link to idea_detail page** (if page created) — 15 min 2. ✨ **Add readiness score to draft_detail** — 10 min (already computed) 3. ✨ **Show proposals on gap_detail** (reverse link) — 20 min 4. ✨ **Author search in draft_detail → author detail page** (if page created) — 30 min 5. ✨ **Export monitor audit log to CSV** — 15 min --- ## Recommended Priority ### Phase 1 (Week 1–2): Navigation foundation 1. Author detail page 2. Idea detail page 3. Gap-to-draft reverse links 4. Make proposals public + improve detail page ### Phase 2 (Week 3–4): Discoverability 5. Category detail pages 6. Search filters (advanced query) 7. Trends/analytics pages ### Phase 3 (Optional): Depth 8. Idea overlap matrix 9. Citation improvements 10. Obsidian/JSON export --- ## Architecture Notes - **DB schema ready**: All needed relationships exist (`draft_refs`, `draft_authors`, `ideas`, `gaps`, `generated_drafts`) - **Data layer mature**: Most data functions exist in `data.py`; just need exposure - **Template patterns consistent**: Easy to add new pages following existing conventions (Tailwind + Plotly) - **CLI-to-web asymmetry**: Some powerful CLI commands (idea-overlap, draft-gen) have no web UI - **Performance**: Current app uses ~10–15 queries per page load; acceptable for 361 drafts. No N+1 issues observed; caching in place via `_cached()` with 5-min TTL. --- ## Cost/Effort Estimates - **Small**: ~15–30 min, no new DB tables, reuses existing functions - **Medium**: 1–3 hours, possible minor DB updates, new routes + templates - **Large**: 4+ hours, significant refactoring or new infrastructure (WebSockets, embeddings, auth) --- **Report compiled by**: UX Scout (Task #3) **Date**: 2026-03-09