Three candidate layouts for the same 192-skill registry, computed offline and rendered side-by-side.
Color = Louvain community on the structural graph (held constant across all panels so you can track a
cluster as it migrates between layouts). Hover any node for the skill it represents.
How to read this
Force-directed is the visual baseline — pretty but the global structure is essentially noise; clusters land where they fit, not where they belong.
Laplacian eigenmaps places skills with similar prerequisite neighborhoods near each other. Watch the community colors collapse into coherent regions: that's the signal that the embedding is doing real work.
TF-IDF + SVD ignores edges entirely and lays out by description text. Where this disagrees with the structural layout, you've found a candidate fusion or a misnamed prerequisite.
For a production tree we'd likely run node2vec + UMAP rather than spectral + SVD — same shape of output, better separation. This sampler uses sklearn primitives so it stays dependency-light.
Generated from registry/gaia.json by build_layouts.py. Re-run the script after registry changes to refresh layouts.json.