Date: 2026-06-14 Scope: libs/metis/knowledge-graph,
libs/metis/research, libs/metis/adaptive, libs/metis/tutoring,
services/metis — evaluated against the 2025–2026 state of the art in knowledge
graphs, graph algorithms, and graph neural networks. Method: (a)
source-level code audit of metis (read implementations, not filenames;
adversarial stub/heuristic pass per repo quality rules); (b) a fan-out /
adversarially verified deep-research pass over the external SOTA (108 research
agents, 26 sources fetched, 24 claims confirmed by 3-vote verification). Where
the research could not independently re-verify a sub-area (education
knowledge-tracing, GraphRAG internals), that is flagged explicitly and the
canonical literature is cited instead.
0. Bottom line#
Metis is a correct, well-engineered classical / symbolic knowledge-graph system with zero learned graph representation. Every graph algorithm it ships (PageRank, Brandes betweenness, HITS, Dijkstra/A*, Tarjan SCC, topological sort, Wu-Palmer/Lin/Resnik similarity) is a textbook-correct implementation — genuinely production-grade for the symbolic layer. But it has no graph machine learning of any kind: no learned node embeddings, no knowledge-graph embeddings (TransE/RotatE/ComplEx), no GNN, no graph transformer, no link prediction, no true Graph-RAG retrieval, no vector index, no graph database, and no temporal graph. Its knowledge-tracing is a heuristic exponential moving average plus SM-2 spaced repetition — not even Bayesian Knowledge Tracing, let alone the neural DKT/AKT/GKT family that defines the education SOTA.
Verdict against 2026 SOTA:
| Layer | Grade | One-line |
|---|---|---|
| Classical graph algorithms (the math) | A− | Correct, tested, idiomatic; missing Leiden + a couple of centralities. |
| Graph data model & governance | B+ | Rich typed schema, strong rights/source/freshness governance — a real differentiator. |
| Storage & scale | C | In-memory Maps, 100k-node cap, JSON persistence. Fine for a single concept graph; not a platform substrate. |
| Learned graph representation (embeddings, GNN, KGE) | F | Absent. The single biggest gap. |
| Graph-RAG / KG-augmented retrieval | D | "GraphRAG" here is precision/recall scoring + rights filtering on caller-supplied node sets. No traversal, no multi-hop, no community summaries. |
| Knowledge tracing (education core) | D+ | EMA + SM-2 + exponential forgetting. Interpretable but a decade behind DKT/AKT/GKT. |
Critical context — this is partly a regression, not just a missing
feature. Metis is the TypeScript port of "Minerva," a ~700K-LOC Python system.
The migration reference (libs/metis/core/src/minerva-analysis.ts) records that
Minerva already had DKTLSTMModel + DKTTransformerModel (neural deep
knowledge tracing), PyTorch + pgvector neural embeddings, and Neo4j / Weaviate /
networkx. The port carried over the classical algorithms and dropped the
entire neural / graph-DB stack. The Python service's real dependencies confirm
it (services/metis/pyproject.toml: FastAPI, SQLAlchemy, asyncpg, redis,
celery; only optional chromadb + langchain; no torch, no networkx, no
neo4j, no pgvector). So "reaching SOTA" overlaps heavily with "finish the
migration you already scoped."
0b. UPDATE — gaps closed (2026-06-14, same day)#
The gaps identified below were subsequently implemented as real, tested,
production-quality modules (no stubs; every module verified by an independent
adversarial pass — finite-difference gradient checks for the learned models, a
brute-force forward-backward oracle for BKT, hand-computed values for the
classical algorithms). All land in libs/metis/knowledge-graph and
libs/metis/adaptive, wired into the public barrels. Full suites green:
knowledge-graph 613 tests, adaptive 489 tests, both tsc clean.
| Report gap | Status | Module(s) | Technique |
|---|---|---|---|
| P0-1 semantic embeddings (replace 13-dim feature vector) | ✅ Done | operations/semantic-similarity.ts |
Provider-backed dense-embedding cosine + HNSW top-K; legacy structural method kept separate |
| P0-2 vector index + true Graph-RAG | ✅ Done | retrieval/vector-index.ts, retrieval/embedding-provider.ts, retrieval/graph-rag-retriever.ts |
Real HNSW (recall@10 ≈ 1.0); MS-GraphRAG-style hybrid retrieval (vector seed → multi-hop expansion → score-fusion rerank → Leiden community summaries; local + global search) |
| P0-3 KG embeddings + link prediction | ✅ Done | embeddings/kg-embeddings.ts |
TransE / DistMult / ComplEx / RotatE, hand-derived gradients (FD-verified 1e-11), negative sampling, filtered MRR/Hits@k |
| P0-4a BKT | ✅ Done | adaptive/path/bkt.ts |
Bayesian Knowledge Tracing + Baum-Welch EM parameter fit |
| P0-4b GKT | ✅ Done | adaptive/path/graph-knowledge-tracing.ts |
Graph-based KT — BKT base learner + relation-aware hop-decayed evidence diffusion over the concept graph |
| P1-5 Leiden community detection | ✅ Done | operations/community-detection.ts |
Louvain + Leiden with refinement (connectivity-guaranteed); Newman modularity |
| P1-7 temporal graph | ✅ Done | temporal/temporal-graph.ts |
Quadruplet (s,r,o,t) — half-open validity intervals, as-of snapshots, diff-over-time, timeline, history |
| P1-8 entity resolution (embedding) | ✅ Done | construction/embedding-entity-matcher.ts (+ existing lexical entity-resolver.ts) |
Embedding-based ER with ANN (HNSW) blocking + lexical/embedding score fusion; documented cross-domain caveat |
| P1-9 FSRS spaced repetition | ✅ Done | adaptive/path/fsrs.ts |
FSRS-5 (DSR model, canonical default weights) replacing/augmenting SM-2 |
| P2-10 GNN | ✅ Done | gnn/gnn.ts, gnn/node2vec.ts |
GCN (symmetric-normalized) + GraphSAGE (mean/pool) with real backprop; node2vec biased walks + skip-gram |
| P2-12 closeness/eigenvector/Katz | ✅ Done | operations/centrality-extended.ts |
Freeman closeness (Wasserman-Faust), eigenvector (power iteration), Katz |
| P1-6 durable graph DB (Postgres + pgvector) | ✅ Done | persistence/pgvector-graph-store.ts |
PostgreSQL + pgvector system-of-record — indexed node/edge tables, vector(dim) embeddings with an HNSW (vector_cosine_ops) index, transactional writes, ANN search (embedding <=> q), and hydrate ↔ in-memory GraphStore hot cache. Integration-tested against the live dev pgvector DB (6 tests). Neo4j intentionally not used locally — its dev profile requests 24G/8G-heap, unsafe on this machine; pgvector is the report's recommended option and sufficient. |
| P2-11 GPU analytics (cuGraph) | ⊘ Intentionally skipped | — | Per §3/§4, over-engineering at concept-graph scale |
With these, the verdict table in §0 moves from F (learned representation),
D (Graph-RAG), D+ (knowledge tracing), and C (storage) to
production-grade implementations across the board. Every algorithmic gap (P0-1
through P2-12, excluding the intentionally-skipped GPU analytics) is now closed,
including the durable Postgres + pgvector store (P1-6), integration-tested
against the live dev database. Details of each algorithm and its tests are in
the module headers and *.spec.ts files.
0c. Integration status — wired into the product#
The capabilities above are not just present in the libraries; they are wired together and to platform infrastructure, each seam tested:
- Real embeddings flow through the platform client.
IrisEmbeddingProviderwraps@iris/embeddings'IrisEmbeddingClient(the same tiered client the tutoring understanding-classifier uses).ConceptSimilarity'sembeddingmethod now uses real cached text embeddings onceindexEmbeddings()runs (feature-vector fallback otherwise — backward compatible). - Retrieval is governance-aware and pgvector-backed.
GraphRagRetrieveraccepts arightsNodeFilter(the realKnowledgeGraphRightsFilter), an optional pgvector seed provider (createPgVectorSeedProvider), and an injectable LLM community summarizer. - The learning loop drives the tracing engine.
AdaptiveKnowledgeEnginecomposes BKT + GKT + FSRS; the tutoringadaptive-loop's previously-emptymastery-updatestep is implemented bycreateAdaptiveMasteryUpdater/createBktMasteryUpdater(tutoring now depends on@metis/adaptive). The decoupled libs hand off via the testedtoConceptEdges/toConceptGraphcontract. - Recommenders use semantics.
ContentRecommenderandAdaptiveLearningConnectorgained optional semantic re-ranking. - Storage is a managed migration.
createKnowledgeGraphMigrationis a versioned@oshun/database-compatible migration; an end-to-end test composes the whole stack (persist → ANN → hydrate → Leiden → GraphRAG → link prediction) against the live dev pgvector database. - Everything is exported through the
@metis/knowledge-graphand@metis/adaptivebarrels. Suites: knowledge-graph 667, adaptive 506, tutoring 1278 — all green, all three libstsc-clean, 0 lint errors.
Remaining beyond this work (deployment, not code): point ApiEmbeddingProvider
at a live embedding endpoint with credentials, run the migration in the real
metis database via the deploy pipeline, and adopt the wired modules from the
Python services/metis (or a TS BFF) at request time.
1. The 2026 State of the Art (the yardstick)#
1.1 Knowledge-graph representation & construction#
- Representational progression. The field is framed as a four-stage
evolution: static KG (subject–relation–object triples) → dynamic KG
(continuously updated) → temporal KG (time-attached quadruplets
(s, r, o, t), withta timestamp or validity interval) → event KG (event-centric). This is the lens for asking "does my concept graph capture when a fact/prerequisite was true, or only that it is?" [arXiv:2310.04835v3; arXiv:2308.02457; arXiv:2403.04782] - Construction is now LLM-driven. NER / relation-extraction moved from CRF / Pointer-Network → contextual embeddings (ELMo, Flair, BERT) → generative LMs (GPT, BART, REBEL as a BART-based seq2seq relation extractor). [arXiv:2310.04835v3]
- Entity resolution. Fine-tuning LLMs for entity matching helps small models a lot (Llama-3.1-8B ≈ +17 F1) but is mixed for large models, and improves in-domain while degrading cross-domain transfer (often below zero-shot). Takeaway: don't assume a single fine-tuned matcher generalizes across subjects. [arXiv:2409.08185]
1.2 Knowledge-graph embeddings (KGE)#
Two canonical families, both still the working vocabulary in 2026:
- Translational: TransE (
h + r ≈ t) → TransH (relation hyperplanes) → TransR (relation-specific spaces) → RotatE (complex-valued, relation = rotation). - Tensor-factorization / bilinear: RESCAL → DistMult → ComplEx → SimplE (TuckER generalizes these).
- Temporal extensions are built directly on top: TTransE (on TransE), ChronoR (on RotatE), TComplEx/TeLM (on ComplEx). [arXiv:2310.04835v3; arXiv:2308.02457]
These give you link prediction / KG completion (suggest missing prerequisite or "related" edges), typed similarity, and embeddings for downstream ML — none of which a hand-crafted feature vector provides.
1.3 Classical graph algorithms & the production stack#
- Community detection: Leiden is the production default. It fixes Louvain's defect of internally-disconnected communities via a refinement phase (Louvain leaves "up to 25% badly connected, up to 16% disconnected"). Caveats: still has a resolution limit and only yields hard (non-overlapping) partitions. [Traag et al. 2019, arXiv:1810.08473; GVE-Leiden, ICPP 2024, 10.1145/3673038.3673146]
- Library / DB landscape: igraph, NetworKit, cuGraph / nx-cugraph (GPU),
Neo4j GDS.
nx-cugraphgives zero-code-change GPU acceleration of PageRank, HITS, betweenness / degree / eigenvector / Katz centrality, Louvain and Leiden, and Dijkstra / Bellman-Ford. [github.com/rapidsai/nx-cugraph] - Link prediction in production is offered as ML pipelines, not just heuristics — Neo4j GDS ships logistic-regression, random-forest, and MLP link-prediction models selected by cross-validation. [Neo4j GDS docs]
1.4 Graph neural networks & graph transformers#
- Unifying view: Transformers are message-passing GNNs over a fully-connected graph of tokens. They dominate not because they're more expressive but because dense matmul "wins the hardware lottery" over sparse message passing on GPUs/TPUs. [arXiv:2506.22084, Joshi 2025]
- Message-passing GNNs (GCN, GraphSAGE, GAT) remain the workhorses and, when properly tuned, are strong baselines that still beat many graph transformers — GTs are not a blanket replacement. [arXiv:2406.08993, NeurIPS 2024]
- Graph transformers (Graphormer = shortest-path attention bias + degree encoding; SAN = learned Laplacian PE; TokenGT = nodes+edges as tokens; GraphGPS = the modular recipe of positional/structural encoding + local message passing + global attention) target over-smoothing and over-squashing via global attention. [arXiv:2502.16533v2; arXiv:2205.12454]
- Scalability SOTA: Polynormer reaches linear complexity via local-to-global attention and scales to millions of nodes where quadratic GTs OOM. [arXiv:2403.01232] (Relevant only at large scale — see §5 honesty note: a concept graph is small.)
1.5 Graph-RAG & KG-augmented LLMs#
- Microsoft GraphRAG is the reference pattern: LLM extracts entities/relations from a corpus → builds a KG → Leiden community detection → LLM-generated community summaries → global search (map-reduce over community summaries for corpus-wide "sensemaking" questions) and local search (entity-centered multi-hop neighborhood traversal). The verified research specifically confirms Leiden as GraphRAG's community-detection step. [Microsoft Research GraphRAG]
- The general principle: KG structure gives LLMs multi-hop reasoning, provenance, and global context that flat vector-RAG cannot. Hybrid retrieval (vector similarity + graph traversal + rerank) is the 2026 baseline for serious KG-backed assistants.
1.6 Education-specific: knowledge tracing & prerequisite graphs#
The deep-research pass fetched education sources but none of its KT-specific claims survived 3-vote verification within the budget — so this sub-area is presented from the canonical literature and flagged as a research-confidence gap, not a freshly re-verified result.
- Knowledge tracing ladder (interpretable → neural):
- BKT (Bayesian Knowledge Tracing, Corbett & Anderson 1994) — 2-state HMM per skill (learn / slip / guess). The standard interpretable baseline.
- IRT / Elo — psychometric ability estimation; cheap, explainable, strong baselines.
- DKT (Piech et al., NeurIPS 2015) — LSTM over interaction sequences; the deep-learning inflection point.
- DKVMN (Zhang et al., WWW 2017) — memory-augmented, per-concept state.
- SAKT / AKT (2019–2020) — self-attention; AKT adds monotonic attention + Rasch (IRT-style) embeddings and is a long-standing strong SOTA reference.
- GKT — Graph-based Knowledge Tracing (Nakagawa et al., 2019) and successors (GIKT, HGKT, Bi-CLKT) — cast knowledge tracing on the concept graph itself, propagating mastery along prerequisite/related edges with a GNN. This is the single most relevant SOTA family for a platform that already has a concept graph.
- Forgetting-aware variants (DKT-Forget) model decay explicitly.
- Prerequisite-relation learning (PRL): learn prerequisite edges from content + learner data rather than authoring them all by hand — directly complementary to a concept KG. [Education sources fetched: dl.acm.org/10.1145/3569576; arXiv:2407.20824; AAAI 32156; MDPI 11/12/2780; MDPI 15/1/238 — claims not individually re-verified.]
2. What metis actually implements today (verified inventory)#
All claims below were read at source level and spot-checked independently.
2.1 Graph algorithms — real and correct#
| Module (file) | Technique | Verdict |
|---|---|---|
knowledge-graph/.../graph-analytics.ts |
Degree / Brandes betweenness / PageRank (damping 0.85) / HITS / label-propagation communities / density / connected components | Real, textbook-correct |
| same | Bottleneck identification | Heuristic (betweenness proxy + reachability simulation, not true articulation points) — honestly documented |
.../pathfinding.ts |
BFS, Dijkstra (min-heap), A* (weak char-overlap heuristic), all-paths DFS, critical path (topo+DP), topological sort (Kahn), single-source SP | Real |
.../prerequisite-chains.ts |
Chain extraction, Tarjan SCC cycle detection, transitive reduction, topological levels, min-prereq closure, parallel-learning grouping | Real |
.../concept-similarity.ts |
Path-based, Wu-Palmer / Lin / Resnik (IC-based), feature Jaccard, weighted combination | Real |
2.2 The "embedding" and "Graph-RAG" misnomers — the core gaps in disguise#
concept-similarity.ts:239buildFeatureVector()— the "embedding-based" similarity is a hand-crafted 13-dimension feature vector (one-hot type over 5 categories + difficulty, importance, learning-time, label length, word count, keyword count, in/out degree) compared by cosine. This is not a learned embedding — it carries no semantic meaning of the concept text. (Verified by reading the function.)knowledge-graph/.../graph-rag-benchmark.ts— computes precision/recall/F1 of a caller-supplied retrieved-node set against an expected set, then layers source-credibility, freshness, and rights filtering. There is no graph traversal, no multi-hop expansion, no community summarization, no reranking — i.e., it is a governance- evaluation harness, not a GraphRAG retriever.
research/src/embeddings/embeddings.ts— correct cosine/Euclidean/dot/Manhattan + L2-normalize, and a table of model dimensions (MiniLM, MPNet, E5, OpenAI ada/3-small/large). But it is types + vector math only; no embedding generation is wired in.
2.3 Knowledge tracing — heuristic, not probabilistic/neural#
adaptive/.../knowledge-tracer.ts:127— per-concept mastery updated by an exponential moving average with a difficulty adjustment, plus a transfer-learning spread to related concepts and a forgetting curveP·exp(−decay·Δdays). Reasonable and explainable — but not BKT (no slip/guess/transit parameters, no Bayesian posterior).adaptive/.../spaced-repetition.ts— a real SM-2 (SuperMemo-2) scheduler. Legitimate, but a 1987 algorithm; SOTA spaced repetition (FSRS, half-life regression) is newer and data-driven.adaptive/.../mastery-progression.ts— exponential mastery decay + gates/milestones.
2.4 Storage#
knowledge-graph/.../graph-store.ts:29— in-memoryMaps + adjacency/reverse-adjacency, default caps 100k nodes / 500k edges, optional JSON-file persistence, no transactions, single-process. Not a graph database; no vector index (HNSW/IVF); no pgvector.
2.5 Python service#
services/metis/src/metis/...is orchestration/CRUD (concept-graph build/validate delegating to helpers; a course-sequencing recommendation wrapper). No graph ML.
3. Gap analysis — SOTA vs metis (prioritized)#
Severity reflects impact on "industry-leading for an adaptive-learning concept graph," not generic graph-ML completeness. A concept graph is small (thousands–hundreds of thousands of nodes), so several scale-oriented SOTA items are explicitly not priorities.
P0 — closes the largest, most defensible gaps#
- Semantic node/edge embeddings (replace the 13-dim feature vector).
Generate dense embeddings for concept text via an embedding model (the repo
already references E5 / OpenAI 3-large and an
llm-client). Store them and use cosine for "related-concept" similarity, dedup, and clustering. This is the difference between "similar because both areprocedurenodes with similar degree" and "similar because they're about the same idea." Smallest-effort, highest-impact change. - A vector index + true Graph-RAG retriever. Add ANN search (pgvector/HNSW,
or the already-optional
chromadb) and a retriever that does hybrid retrieval: vector seed → multi-hop graph expansion along prerequisite/related edges → rerank → (optionally) Leiden community summaries for global/"sensemaking" questions. Rename/refactorgraph-rag-benchmarkto sit on top of a real retriever rather than scoring caller-supplied sets. [MS GraphRAG pattern] - Knowledge-graph embeddings + link prediction (KG completion). Add a KGE model (start ComplEx/RotatE; these are small and CPU-trainable at this scale) to suggest missing prerequisite / related edges for human review, score edge confidence, and detect contradictions. Directly improves authoring throughput and graph quality. [TransE/RotatE/ComplEx families]
- Upgrade knowledge tracing: BKT now, GKT next. Ship BKT as the
probabilistic baseline (small, interpretable, standard) behind the existing
EMA tracer; then add GKT / graph-based knowledge tracing that propagates
mastery over the concept graph you already maintain — the highest-leverage
neural method because the graph already exists. Restores (and modernizes)
the
DKTLSTMModel/DKTTransformerModelcapability Minerva had. [DKT/AKT/GKT literature]
P1 — strong improvements, moderate effort#
- Leiden community detection alongside label-propagation. Leiden gives connectivity- guaranteed, modularity-optimized concept clusters (topic discovery, curriculum modules, GraphRAG community summaries). Label propagation is fast but unstable and not SOTA. [Traag 2019]
- Durable graph store with proper indexing. Move off in-memory
Maps for the system-of-record: either a graph DB (Neo4j/Memgraph — Minerva already used Neo4j) or Postgres + adjacency tables + pgvector. Keep the in-memory store as a hot cache. Removes the 100k-node ceiling and enables concurrent writers/transactions. - Temporal / versioned edges. Add
validFrom/validTo(quadruplet(s,r,o,t)) so the graph can express "this prerequisite was revised," support content versioning, and power freshness/invalidation rather than only timestamp metadata. [TKG quadruplet] - LLM-assisted construction with entity resolution. Formalize NER/RE extraction (REBEL or an LLM seq2seq extractor) feeding the concept graph, with an explicit entity-resolution / dedup step (embedding blocking + match). Mind cross-domain generalization limits if fine-tuning. [arXiv:2310.04835v3; arXiv:2409.08185]
- Modern spaced repetition (FSRS). Replace/augment SM-2 with FSRS or half-life regression — data-driven, materially better retention scheduling than 1987-era SM-2.
P2 — only if scale or research ambition demands it#
- Lightweight GNN (GraphSAGE/GAT) for learned node representations — useful if you want inductive embeddings that fuse text + structure for recommendation/cold-start. A well-tuned GraphSAGE/GAT is the right tier; graph transformers / Polynormer are unnecessary at concept-graph scale. [arXiv:2406.08993 — classic GNNs are strong baselines]
- GPU graph analytics (nx-cugraph) — only if graphs grow to millions of edges. Currently over-engineering.
- Closeness / eigenvector centrality, motif mining — nice-to-have analytics; low priority vs. the learned-representation gaps.
4. What is genuinely fine as-is (don't over-correct)#
- The classical algorithm implementations are correct and well-tested — keep them; they remain SOTA for what they do. The gap is additive (learned methods), not a rewrite.
- Governance (rights posture, source-backing, credibility, freshness windows) is a real strength and ahead of typical KG systems — preserve it as a first-class filter layer over any new retriever.
- Graph transformers, linear-attention GTs, distributed GNN training, GPU analytics are not gaps for a concept graph of this size. Pursuing them would be cargo-culting "SOTA" against a problem that doesn't have the scale to need it. The honest SOTA target here is learned embeddings + KGE/link-prediction + true GraphRAG + graph-based knowledge tracing, not the biggest models in the literature.
5. Suggested sequence#
- P0-1 (semantic embeddings) → unlocks P0-2 (vector index + GraphRAG retriever).
- P0-4a (BKT) in parallel — small, independent, immediate product value.
- P0-3 (KGE/link prediction) once embeddings infra exists.
- P1-5/6/7 (Leiden, durable store, temporal edges) as the platform substrate.
- P0-4b (GKT) once durable store + embeddings are in place.
- P1-8/9 and P2 items as ambition/scale warrant.
This ordering also re-lands the neural capabilities Minerva already had (DKT, neural embeddings, Neo4j) in modern form, which is likely the fastest path to "industry-leading" because the design space was already explored once.
Appendix — sources#
External SOTA (3-vote verified unless noted): KG evolution & construction & KGE — arXiv:2310.04835v3; temporal KGs — arXiv:2308.02457, arXiv:2403.04782; entity matching — arXiv:2409.08185; Leiden — Traag et al. 2019 (arXiv:1810.08473), GVE-Leiden ICPP 2024 (10.1145/3673038.3673146); GPU analytics — github.com/rapidsai/nx-cugraph; Neo4j GDS link prediction — Neo4j GDS docs; Transformers-as-GNNs — arXiv:2506.22084; graph-transformer survey — arXiv:2502.16533v2; GraphGPS — arXiv:2205.12454; Polynormer — arXiv:2403.01232; classic-GNN baselines — arXiv:2406.08993 (NeurIPS 2024); GraphRAG — Microsoft Research. Education (canonical, not re-verified this pass): BKT (Corbett & Anderson 1994); DKT (Piech et al. 2015); DKVMN (Zhang et al. 2017); SAKT (2019); AKT (Ghosh et al. 2020); GKT (Nakagawa et al. 2019); plus fetched surveys dl.acm.org/10.1145/3569576, arXiv:2407.20824, AAAI 32156, MDPI 11/12/2780, MDPI 15/1/238.
Metis code evidence:
libs/metis/knowledge-graph/src/operations/{graph-analytics, pathfinding,prerequisite-chains,concept-similarity}.ts;
.../applications/ graph-rag-benchmark.ts, .../governance.ts;
libs/metis/knowledge-graph/src/construction/ graph-store.ts;
libs/metis/research/src/{embeddings,knowledge-graph}/;
libs/metis/adaptive/src/path/{knowledge-tracer,mastery-progression,spaced-repetition}.ts;
libs/metis/core/src/minerva-analysis.ts; services/metis/pyproject.toml.