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>
17 KiB
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)
- 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
/proposalssystem)
- 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:
/comparepage exists but requires manual draft selection via checkboxes, no shortcuts - Missing:
- Add "Compare" checkbox to each draft row in
/draftslist - Sticky "Compare Selected" button at bottom
- Quick-compare overlay showing side-by-side: score, category, authors, novelty
- Add "Compare" checkbox to each draft row in
- Why: Low-friction way to discover overlaps without navigating away.
- Effort: Template changes + 1 JS handler + reuse existing
/api/compareendpoint.
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_logtable).
🟡 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:
/proposalsexists (admin-only) but is disconnected from public UI; no way to see "which drafts might form a proposal?" - Missing:
- Make
/proposalspublic (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 →"
- Make
- 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
/proposalsroutes (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_refstable; parsing logic for RFC extraction.
9. Dashboard export to Obsidian/Markdown [IMPACT: MEDIUM | EFFORT: MEDIUM]
- Current:
/export/obsidianexists 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;
/draftshas 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-overlapandco-occurrencecommands (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-overlapandco-occurrencecommands.
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
/trendspage 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:
readinessmodule exists; shown in CLIshowcommand; not in web UI - Missing:
- Add readiness score to draft_detail page (already computed)
/readinesspage: 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
readinessmodule.
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.pyexists; 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 pageget_complexity_data()→ complexity page onlyget_citation_influence()→ citations page, could be more prominentget_bcp_analysis()→ no dedicated pageget_false_positive_profile()→ part of monitor, could be own pageget_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)
- ✨ Add "Source draft" link to idea_detail page (if page created) — 15 min
- ✨ Add readiness score to draft_detail — 10 min (already computed)
- ✨ Show proposals on gap_detail (reverse link) — 20 min
- ✨ Author search in draft_detail → author detail page (if page created) — 30 min
- ✨ Export monitor audit log to CSV — 15 min
Recommended Priority
Phase 1 (Week 1–2): Navigation foundation
- Author detail page
- Idea detail page
- Gap-to-draft reverse links
- Make proposals public + improve detail page
Phase 2 (Week 3–4): Discoverability
- Category detail pages
- Search filters (advanced query)
- Trends/analytics pages
Phase 3 (Optional): Depth
- Idea overlap matrix
- Citation improvements
- 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