Skip to content

v5.1.0

Latest

Choose a tag to compare

@github-actions github-actions released this 22 Jul 23:08
05a0a53

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