Files
ietf-draft-analyzer/FEATURE_BACKLOG.md
Christian Nennemann 61cdab16b9 fix: dev mode auth regression from blueprint refactor
The _initialized singleton in auth.py prevented hooks from registering
on the correct app instance when create_app() was called twice (once
eagerly at import, once from __main__). Removed the guard and made
the module-level app lazy. Also adds feature backlog and architecture
assessment from the review team.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 03:52:02 +01:00

357 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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/<author_id>`) 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/<idea_id>` page showing:
- Idea title, type, description, novelty score
- Source draft (link)
- 510 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/<category>` 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/<slug>` 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 12): 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 34): 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 ~1015 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**: ~1530 min, no new DB tables, reuses existing functions
- **Medium**: 13 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