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
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Added
Transition graph: deterministic semantic node layout (new tools/graph_layout.py, adds a gensim dependency) — word2vec embedding of user trajectories, recursively clustered and mapped onto nested canvas regions so related events share a region. Deterministic across kernel restarts (fixed seed, single worker, process-independent hash, pinned corpus order). Used for new widgets, Reset layout (new toolbar button), HTML export, and MCP report tabs; manually arranged positions still always win
Transition graph: per-node top-k edge filter as the new default ("Auto" mode, k strongest outgoing edges per node, adjustable stepper) with a toggle back to the manual weight-range slider; saved states and old exported HTML with a [min, max] filter keep working as manual mode
Transition graph: contextual legend (bottom-left, collapsible) explaining node size / edge width / focus and diff colors, with a coverage indicator ("edges: X / Y (Z% of weight)") and interaction hints
Transition graph: edge focus — clicking an edge dims everything else, fits the node pair, and shows the weight label; edge coloring moved to a toolbar button shown while an edge is focused
Transition graph: route statistics — selecting a path (⌘click) shows a badge with stats for that exact contiguous route: unique paths (and share), traversal count, average per path, median / p95 route duration, or the Markov probability product of its edges; the default metric follows the current edge weight and is switchable in the badge. Backed by a new internal route-stats helper (strict contiguous matching, overlapping occurrences counted) — widget-only, not exposed on Eventstream
Transition graph: ego view — with a node focused, a toolbar button expands its neighborhood into a modal mini-sankey: incoming transitions left, outgoing right, self-loops on both sides. The sides show shares, not the graph's edge weights: each source's share of the arrivals (proba_in) and each target's share of the exits (proba_out), with raw counts in the tooltip — the graph payload now carries sparse transition counts to make this exact under any edge weight. Clicking a neighbor re-centers the view on it; diff mode shows the displayed diff values with the red/blue code, and hovering a ribbon shows the same per-group breakdown tooltip as a graph edge. Works in exported HTML too — no kernel needed
Transition graph: GraphView — serializable named visual presets (focus on a node/edge/path, filters, hidden events, viewport; never data parameters). Entry points: transition_graph(views=[...], view=...) kwargs rendered as pills with a Default reset, a "Copy view link" toolbar button, a #view=<base64url> URL fragment on exported HTML, [Tab:view=Name] links in MCP report analysis (plus a views= parameter on the MCP add_transition_graph tool). Node/edge analysis links now go through the same pipeline, so edge links in exported reports use the proper edge focus instead of the marching-ants animation
Changed
Transition graph: focusing a node (search, exported-report links) now fits the node together with its neighborhood instead of zooming onto the node itself, so its edges stay inside the viewport
Transition graph: in focus mode all incoming/outgoing edges are colored (violet/orange) regardless of weight — the confusing gray fallback for weak edges is gone
Transition graph: edge labels are allocated adaptively — small graphs get every edge labeled, large ones a bounded share of the currently visible edges (tightening the filter labels more of what remains); was a fixed top-10
Transition graph: the auto-layout is deterministic — the same graph renders the same picture every time (seeded PRNG around fcose)
Transition graph: the manual edge filter slider is logarithmic for every weight type, spanning exactly the data range (0.5%–100% for probabilities, smallest nonzero weight to max otherwise) — no more dead track zones
Transition graph: in diff mode edge thickness/opacity for probability weights is normalized against the largest |Δp| on the graph instead of the absolute 100%, so the strongest changes render thick instead of uniformly thin; diff self-loops keep their red/blue color in focus mode
Lowered minimum supported Python version from 3.11 to 3.10
Reorganized license files to clarify exact Apache-2.0, Notice file with copyright created
Fixed
diff over a boolean or numeric segment failed with SegmentValueNotFoundError when the values arrived as strings (which is what the widget UI and MCP always send): 'false'/'5' now resolve back to the typed segment levels False/5
Transition graph: probability edges below 1% were silently dropped (including |Δp| < 1pp in diff mode) — removed; hiding is now always explicit via the edge filter and reported by the coverage indicator
Transition graph: a saved edge-weight filter was silently reset after any graph rebuild (e.g. switching the weight type) until the slider was touched
Transition graph: the broken graph_layout backend compute (imported a module that didn't exist and silently returned nothing) is implemented; compute errors are now surfaced to the client instead of swallowed
cluster_analysis_data() now applies the documented n_clusters="3-8" default instead of raising ValueError when it's omitted for the kmeans method; corrected the cluster_analysis/cluster_analysis_data docstrings, which falsely claimed features and overview_metrics default to per-event counts (#89)
add_clusters()'s scaler argument now defaults to "minmax" instead of None, matching the AddClusters processor's own default and cluster_analysis_data()'s documented default. Previously, omitting scaler silently clustered on unscaled features, so add_clusters() could produce a different clustering than cluster_analysis_data() for the same features/n_clusters