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

@@ -761,16 +761,30 @@ class Database:
).fetchall()
return [r["name"] for r in rows]
def all_ideas(self) -> list[dict]:
rows = self.conn.execute(
"SELECT * FROM ideas ORDER BY draft_name"
).fetchall()
def all_ideas(self, include_false_positives: bool = False) -> list[dict]:
if include_false_positives:
rows = self.conn.execute(
"SELECT * FROM ideas ORDER BY draft_name"
).fetchall()
else:
rows = self.conn.execute(
"SELECT i.* FROM ideas i "
"WHERE i.draft_name NOT IN "
"(SELECT draft_name FROM ratings WHERE false_positive = 1) "
"ORDER BY i.draft_name"
).fetchall()
return [{"title": r["title"], "description": r["description"],
"type": r["idea_type"], "draft_name": r["draft_name"],
"novelty_score": r["novelty_score"]} for r in rows]
def idea_count(self) -> int:
return self.conn.execute("SELECT COUNT(*) FROM ideas").fetchone()[0]
def idea_count(self, include_false_positives: bool = False) -> int:
if include_false_positives:
return self.conn.execute("SELECT COUNT(*) FROM ideas").fetchone()[0]
return self.conn.execute(
"SELECT COUNT(*) FROM ideas "
"WHERE draft_name NOT IN "
"(SELECT draft_name FROM ratings WHERE false_positive = 1)"
).fetchone()[0]
def ideas_with_drafts(self, unscored_only: bool = False, limit: int = 5000) -> list[dict]:
"""Return ideas joined with draft title, optionally only unscored ones."""