C3
Designed by Claude Sonnet 5. ATWL specification + example + the 54-workflow library, pre-formalised in ATWL. ↓ download raw .atwl
Workflow header & template
workflow vis-community-evolution-analysis
template: define-unit (windows, authors, networks) →
loop(define-unit (detect communities) → characterise (quality) →
visualise → assess) →
characterise (overlaps) →
loop(define-unit (match lineages) → contextualise → visualise →
assess) →
characterise (core & leaders) → visualise → abstract →
loop(build-model (topics) → visualise → abstract → assess) →
characterise (author trajectories) → contextualise → visualise →
abstract →
loop(abstract (integrate) → assess) →
generate-knowledge
description: "Identify communities of collaborating researchers in the
IEEE VIS literature (1990-2024) via time-windowed co-authorship
networks, track their evolution (continuation, merger, splitting,
birth, dissolution) across windows, characterise core stability,
leadership, research foci, and cross-community researcher mobility"
Input
artifact D_papers : entities
origin: given
internal structure: elementary
embedment: {set, time}
features:
- id: f_authors
value structure: list
value type: reference
description: "DBLP-disambiguated author identifiers"
- id: f_year
value structure: atomic
value type: temporal
description: "Publication year"
- id: f_title
value structure: atomic
value type: text
description: "Paper title"
- id: f_abstract
value structure: atomic
value type: text
description: "Paper abstract"
- id: f_keywords
value structure: list
value type: text
description: "Author-supplied keywords"
- id: f_citations
value structure: atomic
value type: numeric
description: "Citation count"
description: "3596 IEEE VIS/InfoVis/VAST/SciVis papers (1990-2024) with
disambiguated author lists"
artifact S_window_config : specification
origin: given
representation form: "parameter settings"
description: "Initial time-window scheme: window length and stride
(e.g. 3-year sliding windows, 1-year stride) for constructing
successive co-authorship snapshots"
Phase A: Units Of Analysis - Windows, Authors, Networks
transform T_define_windows :
intent: define-unit
manner: "time-partitioning into sliding windows"
input: D_papers, S_window_config
output: D_time_windows
actor: machine
description: "Partition the publication timeline into overlapping
multi-year windows serving as the temporal resolution for community
detection"
artifact D_time_windows : entities
internal structure: episode
embedment: time
features:
- id: f_window_id
value structure: atomic
value type: categorical
description: "Window identifier"
- id: f_year_range
value structure: vector
value type: temporal
description: "Start and end year of the window"
description: "Bounded multi-year intervals over which co-authorship
networks and communities are computed"
transform T_extract_authors :
intent: define-unit
manner: "extract"
input: D_papers
output: D_authors
actor: machine
description: "Extract unique disambiguated authors as first-class
analysis units"
artifact D_authors : entities
internal structure: elementary
embedment: set
features:
- id: f_total_papers
value structure: atomic
value type: numeric
description: "Total number of papers authored"
- id: f_career_span
value structure: vector
value type: temporal
description: "First and last publication year"
description: "Individual researchers, disambiguated via DBLP identifiers"
transform T_build_networks :
intent: define-unit
manner: "aggregate co-authorship into per-window network snapshots"
input: D_papers, D_authors, D_time_windows
output: D_networks
actor: machine
description: "Construct one weighted co-authorship network per time
window: nodes are authors active in the window, edges are weighted by
number of jointly authored papers"
artifact D_networks : entities
internal structure: formation
embedment: time
features:
- id: f_coauthor_graph
value structure: relational configuration
value type: {reference, numeric}
representation form: "weighted undirected co-authorship graph"
description: "Author nodes with co-authorship-count edge weights for
this window"
description: "Temporal sequence of co-authorship network snapshots, one
per time window"
Phase B: Per-Window Community Detection (Iterative Calibration)
artifact S_community_params : specification
origin: given
representation form: "parameter settings"
description: "Community-detection algorithm choice and resolution
parameter (e.g. Louvain modularity resolution) applied uniformly across
all window networks"
loop L_community_detection:
purpose: "Calibrate community-detection resolution so that communities
are neither over-fragmented nor overly coarse, and remain interpretable
across the whole time span"
until: "Modularity, size distribution, and visual interpretability of
communities are satisfactory across the majority of time windows"
body:
transform T_detect_communities :
intent: define-unit
manner: "graph community detection (modularity optimisation, e.g.
Louvain), applied independently per window"
input: D_networks, S_community_params
output: D_communities, F_community_label
actor: machine
description: "Partition each window's co-authorship network into
communities of densely collaborating authors"
artifact D_communities : entities
internal structure: group/cluster
embedment: {set, time}
features:
- id: f_window_id
value structure: atomic
value type: reference
description: "Time window this community instance belongs to"
- id: f_size
value structure: atomic
value type: numeric
description: "Number of member authors"
description: "Community instances: groups of authors detected as
densely collaborating within one specific time window"
artifact F_community_label : feature(D_authors)
value structure: vector
value type: categorical
description: "Per-window community-assignment sequence for each
author across all time windows in which they were active"
transform T_compute_quality :
intent: characterise
manner: "compute-statistics (modularity, size distribution)"
input: D_communities, D_networks
output: F_quality
actor: machine
description: "Compute per-window modularity score, community count,
mean/variance of community size, and singleton-author fraction"
artifact F_quality : feature(D_networks)
value structure: vector
value type: numeric
description: "Per-window community-detection quality metrics"
transform T_visualise_communities :
intent: visualise
manner: "small-multiples node-link / hybrid NodeTrix-style views per
window"
input: D_networks, D_communities, F_community_label
output: V_communities
actor: machine
description: "Display each window's network with communities
colour-coded; densest communities optionally shown as matrices
(NodeTrix-style) to reveal internal collaboration structure"
artifact V_communities : visualisation(D_networks, D_communities,
F_community_label)
layout: "small multiples, one panel per time window"
form: "node-link diagrams with colour-coded community membership;
NodeTrix-style hybrid matrix insets for dense communities"
encoding: "node colour: community label; node size: author
publication count; matrix cell: intra-community co-authorship
count"
description: "Per-window overview supporting visual judgment of
community coherence and granularity"
transform T_assess_communities :
intent: assess
manner: "evaluate-clustering-quality"
input: V_communities, F_quality
output: K_community_quality
actor: human
description: "Judge whether modularity, size distribution, and
visual coherence of communities are acceptable across windows"
artifact K_community_quality : knowledge(D_communities)
representation form: "quality judgment"
description: "Assessment of whether current resolution parameter
yields interpretable, appropriately granular communities"
if K_community_quality indicates refinement needed:
then:
transform T_adjust_community_params :
intent: generate-knowledge
manner: "adjust resolution parameter based on assessment"
input: K_community_quality, S_community_params
output: S_community_params_r
actor: human
description: "Revise resolution or algorithm choice to correct
over-fragmentation or excessive coarseness"
artifact S_community_params_r : specification
representation form: "parameter settings"
description: "Updated community-detection configuration"
assign:
S_community_params := S_community_params_r
else:
exit loop L_community_detection
end loop L_community_detection
Phase C: Cross-Window Lineage Tracking (Iterative Calibration)
transform T_compute_overlaps :
intent: characterise
manner: "define-relations (similarity) — Jaccard overlap of member sets"
input: D_communities
output: F_overlap
actor: machine
description: "Compute pairwise membership-overlap similarity between
every pair of community instances in temporally adjacent windows"
artifact F_overlap : feature(D_communities)
value structure: relational configuration
value type: numeric
representation form: "directed overlap graph (Jaccard similarity) between
community instances of temporally adjacent windows"
description: "Basis for linking community instances into persistent
lineages"
artifact S_matching_params : specification
origin: given
representation form: "parameter settings"
description: "Overlap threshold above which two community instances in
adjacent windows are linked as continuous, and rules for classifying
one-to-many / many-to-one links as split / merge"
loop L_lineage_tracking:
purpose: "Calibrate the overlap threshold so that resulting community
lineages and their merge/split/birth/dissolution events are
structurally plausible"
until: "The evolution diagram shows neither excessive fragmentation
(spurious births/dissolutions) nor implausible over-merging"
body:
transform T_match_lineages :
intent: define-unit
manner: "link community instances above overlap threshold into
lineages; classify each linkage as continuation, merge, split,
birth, or dissolution"
input: D_communities, F_overlap, S_matching_params
output: D_lineages, F_transition_events
actor: machine
description: "Track community identity across windows, producing
persistent lineages and typed transition events between
consecutive windows"
artifact D_lineages : entities
internal structure: sequence
embedment: set
features:
- id: f_first_window
value structure: atomic
value type: reference
description: "Window in which the lineage first appears"
- id: f_last_window
value structure: atomic
value type: reference
description: "Window in which the lineage last appears (or
dissolves)"
description: "Ordered sequences of community instances across time
windows, each sequence representing one persistent community"
artifact F_transition_events : feature(D_lineages)
value structure: vector
value type: categorical
description: "Per-consecutive-window-pair transition type along each
lineage: continuation, merge, split, birth, or dissolution"
transform T_arrange_evolution :
intent: contextualise
manner: "column-band arrangement (StratomeX-style) plus alluvial
flow layout (EventThread-style)"
input: D_lineages, D_communities, F_overlap, F_transition_events
output: A_evolution
actor: machine
description: "Arrange community instances as columns per time window
with connecting bands sized by membership overlap, and as an
alluvial diagram highlighting branch/merge/dissolution points"
artifact A_evolution : arrangement(D_lineages)
context: D_time_windows
principle: "horizontal: time windows as columns; vertical: stacked
community-instance blocks sized by member count; bands between
adjacent columns sized by overlap; alluvial flow shows lineage
continuity"
description: "Temporal arrangement exposing continuity, merges,
splits, births, and dissolutions of communities"
transform T_visualise_evolution :
intent: visualise
manner: "column-band matrix + alluvial diagram"
input: A_evolution
output: V_evolution
actor: machine
description: "Render the community-evolution diagram with
colour-coded lineages and highlighted transition events"
artifact V_evolution : visualisation(A_evolution)
layout: "sequence of window columns with connecting overlap bands;
alluvial flow overlay"
form: "stacked blocks, ribbon bands, branch/merge glyphs"
encoding: "block height: community size; band width: overlap
strength; block colour: lineage identity; glyph: transition type
(merge/split/birth/dissolution)"
description: "Primary view for inspecting how communities persist,
combine, fragment, or disappear over the 35-year span"
transform T_assess_lineages :
intent: assess
manner: "evaluate structural plausibility of lineages and events"
input: V_evolution, F_transition_events
output: K_lineage_quality
actor: human
description: "Judge whether the overlap threshold produces
believable lineages, avoiding spurious fragmentation or
over-merging"
artifact K_lineage_quality : knowledge(D_lineages)
representation form: "quality judgment"
description: "Assessment of whether current matching threshold
yields plausible lineage structure and transition events"
if K_lineage_quality indicates refinement needed:
then:
transform T_adjust_matching_params :
intent: generate-knowledge
manner: "adjust overlap threshold based on assessment"
input: K_lineage_quality, S_matching_params
output: S_matching_params_r
actor: human
description: "Revise the overlap threshold to correct
fragmentation or over-merging"
artifact S_matching_params_r : specification
representation form: "parameter settings"
description: "Updated lineage-matching configuration"
assign:
S_matching_params := S_matching_params_r
else:
exit loop L_lineage_tracking
end loop L_lineage_tracking
Phase D: Core Stability And Leadership
transform T_compute_core :
intent: characterise
manner: "compute-statistics (per-author presence frequency; centrality)"
input: D_lineages, D_communities, D_networks, F_community_label
output: F_core_members, F_leaders
actor: machine
description: "For each lineage, compute each author's presence frequency
across the lineage's windows to identify a stable core; compute
within-community degree/betweenness centrality combined with
publication and citation counts to identify leading researchers per
window"
artifact F_core_members : feature(D_lineages)
value structure: list
value type: reference
description: "Authors present in a majority of the lineage's time
windows, forming its stable core"
artifact F_leaders : feature(D_communities)
value structure: list
value type: reference
description: "Most central / most cited authors within each community
instance"
transform T_visualise_stability :
intent: visualise
manner: "author x time-window presence heatmap per lineage"
input: F_core_members, F_leaders, D_lineages
output: V_stability
actor: machine
description: "Display, per lineage, which authors were present in which
windows, with core members and leaders highlighted"
artifact V_stability : visualisation(F_core_members, F_leaders, D_lineages)
layout: "matrix per lineage: rows = authors, columns = time windows"
form: "coloured cells with leader markers"
encoding: "cell colour: membership presence; marker: leader status;
row ordering: total presence count (core members at top)"
description: "Reveals which lineages have a persistent core of leading
researchers versus high membership turnover"
transform T_abstract_stability :
intent: abstract
manner: "perception-and-interpretation"
input: V_stability, F_transition_events
output: P_stability_patterns
actor: human
description: "Identify lineages with strong stable cores versus high
turnover, and relate core/leader changes to transition events"
artifact P_stability_patterns : pattern(D_lineages)
representation form: "descriptions of stability and leadership patterns"
description: "Characterisation of each lineage's core stability and
leadership continuity or change"
Phase E: Research Foci Via Topic Modelling (Iterative)
transform T_aggregate_text :
intent: characterise
manner: "aggregate"
input: D_communities, D_papers
output: F_text_corpus
actor: machine
description: "Aggregate titles, abstracts, and keywords of papers
authored by each community instance's members within its window"
artifact F_text_corpus : feature(D_communities)
value structure: atomic
value type: text
description: "Concatenated title/abstract/keyword text for each community
instance's papers"
artifact S_topic_params : specification
origin: given
representation form: "parameter settings"
description: "Initial topic-modelling configuration (e.g. number of NMF
topics, term weighting)"
loop L_topic_modeling:
purpose: "Fit and refine a topic model producing interpretable,
distinctive research-focus labels for community instances"
until: "Topics are coherent, distinctive, and interpretable as named
research foci across community instances"
body:
transform T_fit_topics :
intent: build-model
manner: "fit-topic-model (NMF)"
input: F_text_corpus, S_topic_params
output: M_topic_model, F_topic_weights
actor: machine
description: "Fit a topic model over community-instance corpora and
compute each instance's weight distribution across topics"
artifact M_topic_model : model(F_text_corpus)
model type: "topic model"
representation form: "term-topic and community-topic weight
matrices"
description: "Latent research-theme structure underlying community
instances' publications"
artifact F_topic_weights : feature(D_communities)
value structure: vector
value type: numeric
description: "Per-community-instance topic weight distribution"
transform T_visualise_topics :
intent: visualise
manner: "term-topic matrix + per-lineage topic-weight timeline"
input: M_topic_model, F_topic_weights, D_lineages
output: V_topics
actor: machine
description: "Display characteristic terms per topic and each
lineage's topic-weight evolution over its lifespan"
artifact V_topics : visualisation(M_topic_model, F_topic_weights)
layout: "term-topic matrix; per-lineage stacked/line chart over time"
form: "coloured cells (term weight); coloured area/line chart"
encoding: "cell colour: term-topic weight; line/area colour: topic
identity; height: topic weight within the lineage's window"
description: "Reveals dominant research foci per community instance
and how a lineage's focus shifts over time"
transform T_abstract_foci :
intent: abstract
manner: "name-patterns"
input: V_topics
output: P_research_foci
actor: human
description: "Assign interpretable research-focus labels to topics
(e.g. 'text/NLP visualization', 'immersive analytics')"
artifact P_research_foci : pattern(D_communities, M_topic_model)
representation form: "named research-focus labels per topic and per
community instance/lineage"
description: "Human-interpretable characterisation of each
community's dominant research themes and their evolution"
transform T_assess_topics :
intent: assess
manner: "evaluate topic coherence and interpretability"
input: V_topics, P_research_foci
output: K_topic_quality
actor: human
description: "Judge whether topics are distinct and interpretable
as research foci"
artifact K_topic_quality : knowledge(M_topic_model)
representation form: "quality judgment"
description: "Assessment of topic coherence, distinctiveness, and
interpretability"
if K_topic_quality indicates refinement needed:
then:
transform T_adjust_topic_params :
intent: generate-knowledge
manner: "adjust number of topics or term weighting"
input: K_topic_quality, S_topic_params
output: S_topic_params_r
actor: human
description: "Revise topic-model configuration"
artifact S_topic_params_r : specification
representation form: "parameter settings"
description: "Updated topic-modelling configuration"
assign:
S_topic_params := S_topic_params_r
else:
exit loop L_topic_modeling
end loop L_topic_modeling
Phase F: Individual-Level Mobility And Cross-Community Overlap
transform T_derive_trajectories :
intent: characterise
manner: "reconstruct per-author lineage-membership sequences"
input: D_authors, F_community_label, D_lineages
output: F_author_trajectories
actor: machine
description: "Reconstruct each author's career-long sequence of lineage
memberships, capturing sequential moves between communities and
simultaneous membership in more than one"
artifact F_author_trajectories : feature(D_authors)
value structure: vector
value type: {reference, temporal}
description: "Per-author ordered sequence of (time window, lineage)
membership pairs across their career"
transform T_arrange_trajectories :
intent: contextualise
manner: "relative-time-alignment against lineage timelines"
input: F_author_trajectories, D_lineages
output: A_trajectories
actor: machine
description: "Position each author's trajectory against the shared
lineage timeline for cross-community mobility comparison"
artifact A_trajectories : arrangement(D_authors)
context: D_lineages
principle: "horizontal: time; vertical: lineage identity; author
trajectory drawn as a path across lineage rows"
description: "Arrangement exposing which authors move between, or
simultaneously belong to, multiple communities"
transform T_visualise_trajectories :
intent: visualise
manner: "trajectory lines over lineage timeline"
input: A_trajectories
output: V_trajectories
actor: machine
description: "Display author trajectories as paths across the lineage
timeline, highlighting bridging and multi-community authors"
artifact V_trajectories : visualisation(A_trajectories)
layout: "lineage rows along vertical axis; time along horizontal axis"
form: "coloured trajectory lines/paths, one per selected author or
author group"
encoding: "line colour: author identity or role (bridge/core/peripheral);
vertical jumps: community changes"
description: "Reveals which researchers bridge multiple communities and
how cross-community membership evolves"
transform T_abstract_mobility :
intent: abstract
manner: "perception-and-interpretation"
input: V_trajectories
output: P_mobility_patterns
actor: human
description: "Identify bridging authors, simultaneous multi-community
membership, and directional flows of researchers between communities"
artifact P_mobility_patterns : pattern(D_authors, D_lineages)
representation form: "descriptions of mobility and overlap patterns"
description: "Characterisation of how individual researchers move
between, or belong simultaneously to, multiple communities"
Phase G: Integrated Interpretation
loop L_interpretation:
purpose: "Integrate evolution, stability, research-focus, and mobility
views to interpret why communities merge, split, or dissolve, revising
earlier configuration choices if the picture remains unclear"
until: "The analyst has developed a sufficient holistic understanding
of community evolution and its drivers"
body:
transform T_explore_integrated :
intent: abstract
manner: "cross-view comparison"
input: V_evolution, V_stability, V_topics, V_trajectories
output: P_integrated_findings
actor: human
description: "Interpret merge/split/dissolution events in light of
co-occurring research-focus shifts, core/leader turnover, and
researcher mobility"
artifact P_integrated_findings : pattern(D_lineages)
representation form: "causal interpretations of transition events"
description: "Explanations linking specific merge/split/dissolution
events to concurrent topical shifts, leadership changes, or
researcher migration"
transform T_assess_completeness :
intent: assess
manner: "judge sufficiency of holistic understanding"
input: P_integrated_findings
output: K_completeness
actor: human
description: "Judge whether all major transition events have been
satisfactorily interpreted"
artifact K_completeness : knowledge(P_integrated_findings)
representation form: "quality judgment"
description: "Assessment of interpretive completeness"
if K_completeness indicates further investigation needed:
then:
transform T_refine_focus :
intent: generate-knowledge
manner: "decide which earlier configuration to revisit (window
scheme, matching threshold, or topic granularity)"
input: K_completeness, S_window_config, S_matching_params
output: S_window_config_r
actor: human
description: "Formulate a revised window or matching
configuration to resolve ambiguous transitions"
artifact S_window_config_r : specification
representation form: "parameter settings"
description: "Revised window scheme guiding a further pass
through Phases A-G"
assign:
S_window_config := S_window_config_r
else:
exit loop L_interpretation
end loop L_interpretation
Phase H: Knowledge Synthesis
transform T_synthesise :
intent: generate-knowledge
manner: "formulate-statements"
input: P_integrated_findings, P_mobility_patterns, P_research_foci,
P_stability_patterns, F_transition_events
output: K_findings
actor: human
description: "Synthesise findings on the number and character of
communities, their core stability and leadership, research-focus
evolution, cross-community overlap, and the timing and drivers of
merges, splits, and dissolutions"
artifact K_findings : knowledge(P_integrated_findings, P_research_foci)
representation form: "statements and explanations"
description: "Documented understanding of the intellectual structure of
the IEEE VIS community: number of distinct communities, degree of core
stability and leadership continuity per community, characteristic and
evolving research foci, patterns of membership overlap and researcher
mobility across communities, and identified merge/split/dissolution
events with plausible drivers"