Knowledge graph
Mushi Mushi maintains a per-project knowledge graph of reports, components, fixes, and the developers who touched them.
Storage
| Backend | Role | Status |
|---|---|---|
| pgvector | Embedding-based dedup & similarity | Primary, always-on |
| Apache AGE | True graph queries (Cypher, paths) | Parallel-write (Phase 1) |
blast_radius_cache MV | Per-component blast radius | Refreshed by pg_cron |
intelligence_benchmarks_mv | Cross-customer (k≥5) benchmark | Refreshed nightly |
Why both pgvector and AGE?
pgvector covers the 95% case (semantic dedup, “show me reports like this
one”) with no operational extra cost. AGE handles the 5% that requires true
graph traversal — “every report on <Checkout/> from the last release that
also touched the same Stripe webhook.” AGE is opt-in via the
graph_backend project setting; the parallel write keeps both in sync and
an age_drift_audit table snapshots any divergence so we can repair it.
Indexing
Report and cluster embeddings use HNSW indexes. Codebase-file embeddings
use an IVFFlat index on halfvec(1536). Columns that RLS policies filter
on are indexed, because an RLS subquery on an un-indexed column gets slow as
tables grow.
Bug Ontology
Tags are drawn from a shared Bug Ontology (bug_ontology), stored on each
report as bug_ontology_tags. Because the tag set is shared, the same kind of
issue gets the same tag in every project, without any project seeing another
project’s reports.