You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Epic tracking the fixes from a design + performance + UX audit of the knowledge-graph visualization (the "Grafo" page, the law-detail graph tab, and the related-laws panel). Audit run 2026-07-03 by a dedicated Fable-5 agent against the real code.
Verdict
Structurally sound but not yet something to headline to users. The engineering hygiene is genuinely good (memoised simulation data, offscreen + reduced-motion pausing, lazy chunking, server-side 250-node cap), but what users actually SEE is a single-colour force blob with four decorative legend entries, five dead buttons, fabricated right-rail copy, and no hover feedback — and the advertised "global graph" view doesn't exist in the UI (useGlobalGraph has zero consumers).
Headline findings
Monochrome hairball — communities computed and thrown away. The backend computes a community per node and carries it to meta.community, but the canvas never reads it — every live node renders one indigo (or grey if repealed). The 5-kind legend advertises article/reference/amendment kinds that only exist in mock data.
Edge kinds have never rendered.projectEdge hard-codes kind: 'cites' (graph.ts:50-57) even for the subgraph endpoint where the backend does ship kind. The 4-colour edge palette + legend are decorative. The graph is directed but has no arrowheads — "A modifies B" vs "B modifies A" (legally critical) is invisible.
Five dead controls on the Grafo page: the search input, "Filtros avanzados", "PNG" export, both zoom buttons, and "Pin" have no handlers. Inert aria-labelled buttons are worse than absent ones.
Fabricated right-rail copy — every law node shows "Norma con 169 artículos y 1.248 referencias entrantes." (a constant string), while real metadata sits unused in node.meta.
No hover affordance (no tooltip, no neighbour highlight, no cursor change) — the single highest-leverage polish, and cheap in this library.
RelatedLaws shows arbitrary subgraph members, not related laws — it filters nodes of the depth-2 subgraph, not edges, so it lists 2-hop laws with no direct relation, in backend iteration order.
The "global graph" is unshipped and would melt if wired as-is (per-request nx.pagerank + greedy_modularity over thousands of nodes, uncached). PageRank/communities must be precomputed at build time (the code already flags this).
@xyflow/react is a dependency with zero imports — the "xyflow for detail" locked decision is no longer in code.
Backlog (→ split into the sprint issues below)
Full detail (file:line evidence + metrics) in memory/fable_graph_viewer_audit_2026-07-03.md.
Sprint A — correctness + quick wins (ship before showing the page):
Ship Sprint A+B before showing the Grafo page in marketing material. Related-laws correctness overlaps the graph reference-inference epic VforVitorio#775.
Epic tracking the fixes from a design + performance + UX audit of the knowledge-graph visualization (the "Grafo" page, the law-detail graph tab, and the related-laws panel). Audit run 2026-07-03 by a dedicated Fable-5 agent against the real code.
Verdict
Structurally sound but not yet something to headline to users. The engineering hygiene is genuinely good (memoised simulation data, offscreen + reduced-motion pausing, lazy chunking, server-side 250-node cap), but what users actually SEE is a single-colour force blob with four decorative legend entries, five dead buttons, fabricated right-rail copy, and no hover feedback — and the advertised "global graph" view doesn't exist in the UI (
useGlobalGraphhas zero consumers).Headline findings
communityper node and carries it tometa.community, but the canvas never reads it — every live node renders one indigo (or grey if repealed). The 5-kind legend advertisesarticle/reference/amendmentkinds that only exist in mock data.projectEdgehard-codeskind: 'cites'(graph.ts:50-57) even for the subgraph endpoint where the backend does shipkind. The 4-colour edge palette + legend are decorative. The graph is directed but has no arrowheads — "A modifies B" vs "B modifies A" (legally critical) is invisible.node.meta.RelatedLawsshows arbitrary subgraph members, not related laws — it filters nodes of the depth-2 subgraph, not edges, so it lists 2-hop laws with no direct relation, in backend iteration order.nx.pagerank+greedy_modularityover thousands of nodes, uncached). PageRank/communities must be precomputed at build time (the code already flags this).@xyflow/reactis a dependency with zero imports — the "xyflow for detail" locked decision is no longer in code.Backlog (→ split into the sprint issues below)
Full detail (file:line evidence + metrics) in
memory/fable_graph_viewer_audit_2026-07-03.md.Sprint A — correctness + quick wins (ship before showing the page):
fix(graph): surface typed edges end-to-end(backendkindon/graph+ read it inprojectEdge) [S]fix(graph): honest right rail — real metadata + true 1-hop neighbours in RelatedLaws[S]feat(graph): deep-linkable seed (/graph?law=<id>) + context-preserving law-detail handoff[S]fix(graph): theme-reactive canvas + dim-vs-hide filter semantics[S]chore(frontend): drop unused @xyflow/react dependency[S]Sprint B — design:
feat(graph): colour nodes by community, encode kind by ring/shape, data-driven legend[M]feat(graph): hover tooltip + neighbourhood highlight + directional arrows[M]fix(graph): wire or remove the five dead controls (zoom, search, PNG, filters, pin)[M]Sprint C — scale:
perf(graph): precompute PageRank + communities at build time + truncation metadata[M]feat(graph): global corpus view with node budget + LOD[L] (depends on [Feature]: Auto-update con Tauri Updater plugin #6)feat(graph): path-between-laws UI on /graph/path[M]test(graph): unit + e2e coverage for the viz path[M]Top 3 highest-leverage moves
Ship Sprint A+B before showing the Grafo page in marketing material. Related-laws correctness overlaps the graph reference-inference epic VforVitorio#775.
Labels: epic, area: graph.
Upstream: VforVitorio#782