Architecture designer, author cluster names, FP filtering, new pages

- Add /architecture page: system-of-systems view with 8 layers, component
  cards, gap markers, source coverage chart, and clickable detail sidebar
- Give author clusters meaningful names from orgs + draft topic keywords
- Filter false positives (73 drafts, 54 ideas) from idea clusters,
  architecture, ideas listing, and search results
- Add NIST source fetcher with curated catalog of 11 AI publications
- New pages: trends, complexity, sources, false positives, idea analysis
- Clickable gap cards with full details (evidence, priority, nearby work)
- Component detail panel with linked drafts and top ideas

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-08 19:58:40 +01:00
parent a46a01bd8c
commit 8515e46d5d
19 changed files with 5672 additions and 202 deletions

View File

@@ -55,6 +55,14 @@ from webui.data import (
get_ask_synthesize,
get_category_summary,
global_search,
get_architecture,
get_source_comparison,
get_false_positive_profile,
get_citation_influence,
get_bcp_analysis,
get_trends_data,
get_complexity_data,
get_idea_analysis,
)
app = Flask(
@@ -306,6 +314,17 @@ def idea_clusters():
return render_template("idea_clusters.html", clusters=data)
@app.route("/architecture")
def architecture():
data = get_architecture(db())
return render_template("architecture.html", arch=data)
@app.route("/api/architecture")
def api_architecture():
return jsonify(get_architecture(db()))
@app.route("/similarity")
def similarity():
network = get_similarity_graph(db())
@@ -331,7 +350,9 @@ def authors():
@app.route("/citations")
def citations():
graph = get_citation_graph(db())
return render_template("citations.html", graph=graph)
influence = get_citation_influence(db())
bcp = get_bcp_analysis(db())
return render_template("citations.html", graph=graph, influence=influence, bcp=bcp)
@app.route("/monitor")
@@ -674,6 +695,88 @@ def create_app(dev: bool = False) -> Flask:
return app
# ── Sources & False Positives ────────────────────────────────────────────
@app.route("/sources")
def sources_page():
data = get_source_comparison(db())
return render_template("sources.html", data=data)
@app.route("/false-positives")
def false_positives_page():
data = get_false_positive_profile(db())
return render_template("false_positives.html", data=data)
@app.route("/api/sources")
def api_sources():
data = get_source_comparison(db())
return jsonify(data)
@app.route("/api/false-positives")
def api_false_positives():
data = get_false_positive_profile(db())
return jsonify(data)
# ── Citation Influence & BCP ─────────────────────────────────────────────
@app.route("/api/citations/influence")
def api_citation_influence():
return jsonify(get_citation_influence(db()))
@app.route("/api/citations/bcp")
def api_bcp_analysis():
return jsonify(get_bcp_analysis(db()))
# ── Trends & Complexity ──────────────────────────────────────────────────
@app.route("/trends")
def trends():
data = get_trends_data(db())
return render_template("trends_analysis.html", data=data)
@app.route("/complexity")
def complexity():
data = get_complexity_data(db())
return render_template("complexity.html", data=data)
@app.route("/api/trends")
def api_trends():
data = get_trends_data(db())
return jsonify(data)
@app.route("/api/complexity")
def api_complexity():
data = get_complexity_data(db())
return jsonify(data)
# ── Idea Analysis ────────────────────────────────────────────────────────
@app.route("/idea-analysis")
def idea_analysis():
data = get_idea_analysis(db())
return render_template("idea_analysis.html", data=data)
@app.route("/api/idea-analysis")
def api_idea_analysis():
data = get_idea_analysis(db())
return jsonify(data)
if __name__ == "__main__":
import argparse