C7
Designed by Claude Sonnet 5. Fresh ATWL redesign from the model's own C4 prose design (continuing that chat), explicitly not a translation. ↓ download raw .atwl
Workflow header & template
workflow vis-coauthorship-community-evolution
template: define-unit (extract authors) →
define-unit (network construction: windows & anchor) →
loop(define-unit (community-detection) → contextualise (projection) →
visualise → assess) →
characterise (cross-time overlap) → define-unit (trace threads) →
contextualise (alluvial) → visualise → abstract (detect events) →
characterise (author role metrics) → define-unit (classify roles) →
loop(contextualise (drill-down layouts) → visualise → assess) →
characterise (text encoding) →
loop(build-model (topic model) → characterise (topic profiles) →
visualise → abstract (interpret) → assess) →
characterise (aggregate community topic profiles) →
visualise (topic evolution) →
characterise (period overlap matrix) → visualise (overlap matrix) →
generate-knowledge
description: "Human-in-the-loop visual analytics workflow for identifying
communities of collaborating VIS researchers, tracing their evolution
(stability, drift, merges, splits, dissolution), characterising core
leadership, and linking communities to their evolving research foci."
Input
artifact D_papers : entities
origin: given
internal structure: elementary
embedment: {set, time}
features:
- 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: categorical
description: "Author/venue keywords"
- id: f_authors
value structure: list
value type: reference
description: "Disambiguated author identifiers"
- id: f_citations
value structure: list
value type: reference
description: "References to other papers"
description: "3596 IEEE VIS (Vis/InfoVis/VAST/SciVis) papers, 1990-2024"
artifact K_prior_domain_knowledge : knowledge(D_papers)
origin: given
representation form: "informal domain expertise"
description: "Analyst's prior knowledge of known VIS research groups,
leading researchers, institutional moves, and historical events, used
throughout to validate detected communities, threads, and topics"
Step 1: Extract Author Entities
transform T_extract_authors :
intent: define-unit
manner: "extract distinct entities (disambiguated authors)"
input: D_papers
output: D_authors
actor: machine
description: "Extract the set of distinct disambiguated authors referenced
across the paper corpus"
artifact D_authors : entities
internal structure: elementary
embedment: {set, time}
features:
- id: f_active_years
value structure: list
value type: temporal
description: "Years in which the author published at IEEE VIS"
description: "Disambiguated VIS authors, 1990-2024"
Step 2: Construct Network Snapshots And Full-Period Anchor Network
artifact S_windowing : specification
origin: given
representation form: "parameter settings"
description: "Window length and stride for overlapping time windows
(e.g., 5-year windows advancing by 2 years)"
transform T_build_windows :
intent: define-unit
manner: "time-partitioning with overlapping windows; aggregate
co-authorship edges per window"
input: D_papers, D_authors, S_windowing
output: D_networks
actor: machine
description: "Partition the publication timeline into overlapping windows
and build one weighted co-authorship network snapshot per window"
artifact D_networks : entities
internal structure: formation
embedment: time
features:
- id: f_edge_weight
value structure: atomic
value type: numeric
description: "Number of co-authored papers between two authors within
the window"
- id: f_window_span
value structure: atomic
value type: temporal
description: "Time span covered by the window"
description: "Co-authorship network snapshots, one per overlapping time
window"
transform T_build_anchor :
intent: define-unit
manner: "aggregate co-authorship edges across the full period"
input: D_papers, D_authors
output: D_network_full
actor: machine
description: "Build a single full-period co-authorship network to serve
as a stable long-run reference structure"
artifact D_network_full : entities
internal structure: formation
features:
- id: f_edge_weight
value structure: atomic
value type: numeric
description: "Number of co-authored papers between two authors across
the full 1990-2024 period"
description: "Full-period reference co-authorship network (single entity)"
Step 3: Community-Detection Resolution Loop
artifact S_community_params : specification
origin: given
representation form: "method choice and parameter settings"
description: "Initial community-detection algorithm (e.g., Leiden) and
resolution parameter, applied identically to anchor and windowed
networks"
loop L_community_detection:
purpose: "Detect communities on the anchor network and on each windowed
snapshot at a resolution that yields analytically meaningful,
interpretable community structure"
until: "Community counts and sizes are neither over-fragmented nor overly
coarse, and communities are visually cohesive and consistent with
known VIS research groups"
body:
transform T_detect_anchor_communities :
intent: define-unit
manner: "cluster-by-similarity (community detection on full-period
network)"
input: D_network_full, S_community_params
output: D_anchor_communities, F_anchor_membership
actor: machine
description: "Detect long-run reference communities on the full-period
network"
artifact D_anchor_communities : entities
internal structure: group/cluster
embedment: set
description: "Long-term reference communities detected on the
full-period network"
artifact F_anchor_membership : feature(D_authors)
value structure: atomic
value type: categorical
description: "Anchor community assignment for each author"
transform T_detect_window_communities :
intent: define-unit
manner: "cluster-by-similarity (community detection per window)"
input: D_networks, S_community_params
output: D_window_communities, F_community_members
actor: machine
description: "Detect communities independently within each windowed
network snapshot"
artifact D_window_communities : entities
internal structure: group/cluster
embedment: {set, time}
description: "Communities detected within each time-window network
snapshot"
artifact F_community_members : feature(D_window_communities)
value structure: list
value type: reference
description: "Author members belonging to each community instance"
transform T_contextualise_projection :
intent: contextualise
manner: "projection-based (embed community-window instances by member
similarity)"
input: D_window_communities, F_community_members
output: D_projection_space, A_projection_communities
actor: machine
description: "Compute a 2D projection space in which community-window
instances close in membership/time appear near each other, and
arrange instances within it"
artifact D_projection_space : entities
internal structure: elementary
features:
- id: f_dimensions
value structure: atomic
value type: numeric
description: "Number of projection dimensions (2)"
description: "Computed 2D projection space for community-window
instances"
artifact A_projection_communities : arrangement(D_window_communities)
context: D_projection_space
principle: "similarity-preserving projection based on member overlap"
description: "Positions of community-window instances in projection
space"
transform T_vis_overview :
intent: visualise
manner: "2D projection with temporal trails"
input: A_projection_communities, D_anchor_communities, F_anchor_membership
output: V_community_states
actor: machine
description: "Show community-window instances in projection space,
coloured by anchor community, to assess granularity and cohesion"
artifact V_community_states : visualisation(A_projection_communities,
F_anchor_membership)
layout: "2D projection"
form: "coloured points with temporal trail lines"
encoding: "position from A_projection_communities; colour from
F_anchor_membership; trails connect same-authorship-dominant
instances across adjacent windows"
description: "Overview for judging whether detected communities are
cohesive, distinct, and stable across time"
transform T_assess_resolution :
intent: assess
manner: "evaluate community granularity and cohesion"
input: V_community_states, D_window_communities, D_anchor_communities,
K_prior_domain_knowledge
output: K_resolution_quality
actor: human
description: "Judge whether the current resolution parameter yields
interpretable, stable communities consistent with known VIS
research groups"
artifact K_resolution_quality : knowledge(D_window_communities,
D_anchor_communities)
representation form: "quality judgment"
description: "Judgment of whether community granularity is adequate
or requires adjustment"
if K_resolution_quality indicates refinement needed:
then:
transform T_refine_resolution :
intent: generate-knowledge
manner: "formulate revised community-detection specification"
input: K_resolution_quality, S_community_params
output: S_community_params_r
actor: human
description: "Decide on a revised resolution parameter or
algorithm variant"
artifact S_community_params_r : specification
representation form: "method choice and parameter settings"
description: "Revised community-detection configuration"
assign:
S_community_params := S_community_params_r
else:
exit loop L_community_detection
end loop L_community_detection
Step 4: Cross-Time Matching And Community Threads
transform T_characterise_overlap :
intent: characterise
manner: "define-relations (membership overlap between temporally adjacent
community instances)"
input: D_window_communities, F_community_members
output: F_community_overlap
actor: machine
description: "Compute Jaccard-style member overlap between every pair of
community instances in temporally adjacent windows"
artifact F_community_overlap : feature(D_window_communities)
value structure: relational configuration
value type: numeric
representation form: "weighted directed graph linking community instances
in adjacent time windows by member-overlap weight"
description: "Overlap-based linkage used to trace community continuity"
transform T_trace_threads :
intent: define-unit
manner: "trace continuity chains across time (merge-groups via overlap
linkage)"
input: D_window_communities, F_community_overlap
output: D_community_threads
actor: hybrid
description: "Chain community-window instances into long-run trajectories
wherever member overlap is strong; propose thread identities for
analyst review"
artifact D_community_threads : entities
internal structure: sequence
embedment: set
features:
- id: f_thread_span
value structure: atomic
value type: temporal
description: "First and last window of the thread"
- id: f_thread_size_trend
value structure: vector
value type: numeric
description: "Member count per window along the thread"
description: "Long-run community trajectories chained from per-window
community instances"
Step 5: Visualise Evolution And Detect Structural Events
transform T_contextualise_alluvial :
intent: contextualise
manner: "flow-based layout (alluvial ordering by time and thread)"
input: D_community_threads, D_window_communities
output: A_alluvial
actor: machine
description: "Order community instances along a temporal flow layout
grouped by thread"
artifact A_alluvial : arrangement(D_window_communities)
context: D_community_threads
principle: "temporal flow ordering; vertical position by thread membership,
ribbon width by community size"
description: "Layout underlying an alluvial/stream diagram of community
evolution"
transform T_vis_alluvial :
intent: visualise
manner: "alluvial/stream diagram"
input: A_alluvial, F_community_overlap
output: V_alluvial
actor: machine
description: "Display community size and flow of membership across time,
exposing persistence, merges, splits, emergence, and dissolution"
artifact V_alluvial : visualisation(A_alluvial, F_community_overlap)
layout: "alluvial/stream diagram"
form: "flow ribbons with width encoding community size"
encoding: "horizontal axis: time windows; ribbons: F_community_overlap
linkage strength between adjacent-window communities"
description: "Primary overview for answering how many communities exist
and how they merge, split, or dissolve over time"
transform T_detect_events :
intent: abstract
manner: "perception-and-interpretation (identify merge/split/emergence/
dissolution events)"
input: V_alluvial, F_community_overlap, D_community_threads,
K_prior_domain_knowledge
output: P_evolution_events
actor: human
description: "Visually identify and label points where threads merge,
split, newly emerge, or dissolve, cross-checked against known VIS
community history"
artifact P_evolution_events : pattern(D_community_threads)
representation form: "labelled structural events (merge, split, emergence,
dissolution) with time windows and involved thread IDs"
description: "Identified structural transition events in the community
evolution"
Step 6: Core Stability And Leadership Characterisation
transform T_characterise_author_roles :
intent: characterise
manner: "compute tenure, centrality, and cross-membership per author"
input: D_authors, D_community_threads, D_networks, F_community_members
output: F_author_role_metrics
actor: machine
description: "For each author and each thread they belong to, compute
tenure (fraction of thread windows present), average network centrality
within the community, and count of distinct threads/communities joined"
artifact F_author_role_metrics : feature(D_authors)
value structure: vector
value type: numeric
description: "Per-author tenure, centrality, and cross-membership metrics"
transform T_classify_roles :
intent: define-unit
manner: "cluster-by-similarity / rule-based classification (core,
peripheral, boundary-spanning)"
input: D_authors, F_author_role_metrics
output: D_author_roles, F_role_label
actor: hybrid
description: "Classify authors into core (high tenure, high centrality),
peripheral (short tenure, low centrality), or boundary-spanning
(member of multiple communities) role categories"
artifact D_author_roles : entities
internal structure: group/cluster
embedment: set
description: "Groups of authors sharing similar role profiles"
artifact F_role_label : feature(D_authors)
value structure: atomic
value type: categorical
description: "Assigned role category per author"
Step 7: Structural Drill-Down And Correction Loop
loop L_structure_inspection:
purpose: "Inspect the internal structure and leadership of selected
community threads to validate thread linkage and role classification"
until: "The analyst has examined a representative sample of threads and
periods and is satisfied that thread continuity and role labels are
consistent with domain knowledge"
body:
transform T_select_instance :
intent: define-unit
manner: "filter (analyst selects a thread and time window of
interest)"
input: D_community_threads, V_alluvial
output: D_selected_window_community
actor: human
description: "Select a single community-window instance for detailed
inspection"
artifact D_selected_window_community : entities
internal structure: group/cluster
embedment: set
description: "Single community instance selected for detailed
inspection"
transform T_contextualise_nodetrix :
intent: contextualise
manner: "hybrid matrix/node-link layout (dense core as matrix,
bridging ties as node-link)"
input: D_selected_window_community, D_networks, F_role_label
output: A_nodetrix
actor: machine
description: "Arrange the selected community's dense collaboration
core as an adjacency matrix while rendering bridging ties to other
communities as node-link edges"
artifact A_nodetrix : arrangement(D_selected_window_community)
context: D_networks
principle: "NodeTrix-style layout: densely connected core as matrix,
sparser bridging ties as node-link edges"
description: "Hybrid layout exposing core/leader structure and
boundary-spanning ties"
transform T_vis_nodetrix :
intent: visualise
manner: "node-link + matrix hybrid diagram"
input: A_nodetrix, F_role_label, F_author_role_metrics
output: V_nodetrix
actor: machine
description: "Display the selected community's internal structure,
coloured by role classification"
artifact V_nodetrix : visualisation(A_nodetrix, F_role_label)
layout: "hybrid matrix/node-link"
form: "adjacency matrix cells for the core, node-link edges for
bridging ties"
encoding: "matrix/edge presence from A_nodetrix; node colour from
F_role_label"
description: "Detailed view of a single community's core and
boundary-spanning structure"
transform T_contextualise_timeline :
intent: contextualise
manner: "relative time alignment (one track per author)"
input: D_authors, D_community_threads, F_community_members, D_networks
output: A_author_timeline
actor: machine
description: "Arrange authors as parallel tracks positioned along
the shared time axis defined by the network windows, coloured
segments indicating which thread the author belongs to at each
window"
artifact A_author_timeline : arrangement(D_authors)
context: D_networks
principle: "one horizontal track per author positioned along time
windows"
description: "Per-author community-membership timeline arrangement"
transform T_vis_timeline :
intent: visualise
manner: "scarf-plot / aligned timeline diagram"
input: A_author_timeline, F_role_label
output: V_author_timeline
actor: machine
description: "Show each author's community membership over time,
revealing loyal core members versus movers"
artifact V_author_timeline : visualisation(A_author_timeline, F_role_label)
layout: "aligned per-author timelines"
form: "coloured segments per time window"
encoding: "track position: author; colour: community/thread
membership per window; opacity: role from F_role_label"
description: "Author-level view of membership stability and drift"
transform T_assess_structure :
intent: assess
manner: "judge consistency of thread linkage and role labels with
domain knowledge"
input: V_nodetrix, V_author_timeline, P_evolution_events,
K_prior_domain_knowledge
output: K_structure_assessment
actor: human
description: "Decide whether the selected thread's continuity or role
labels need manual correction"
artifact K_structure_assessment : knowledge(D_community_threads,
F_role_label)
representation form: "quality judgment with diagnostic notes"
description: "Judgment on whether thread linkage or role
classification requires correction for the inspected instance"
if K_structure_assessment indicates correction needed:
then:
transform T_correct_threads :
intent: define-unit
manner: "manual correction of thread linkage"
input: D_community_threads, K_structure_assessment,
F_community_overlap
output: D_community_threads_r
actor: human
description: "Manually relink, split, or merge thread segments
based on domain knowledge"
artifact D_community_threads_r : entities
internal structure: sequence
embedment: set
description: "Corrected community threads"
transform T_correct_roles :
intent: define-unit
manner: "manual correction of role classification"
input: D_author_roles, F_role_label, K_structure_assessment
output: D_author_roles_r, F_role_label_r
actor: human
description: "Manually adjust role labels found inconsistent with
domain knowledge"
artifact D_author_roles_r : entities
internal structure: group/cluster
embedment: set
description: "Corrected author role groups"
artifact F_role_label_r : feature(D_authors)
value structure: atomic
value type: categorical
description: "Corrected role labels"
assign:
D_community_threads := D_community_threads_r
D_author_roles := D_author_roles_r
F_role_label := F_role_label_r
else:
# No correction needed for this instance; analyst continues
# inspecting further threads/periods, or stops when satisfied.
assign:
D_community_threads := D_community_threads
end loop L_structure_inspection
Step 8: Research-Focus Extraction Via Topic Modelling
transform T_characterise_text :
intent: characterise
manner: "encode (text feature extraction from title/abstract/keywords)"
input: D_papers
output: F_text_features
actor: machine
description: "Encode each paper's title, abstract, and keywords as a
numeric text representation"
artifact F_text_features : feature(D_papers)
value structure: vector
value type: numeric
representation form: "TF-IDF or embedding vector per paper"
description: "Numeric text representation of each paper"
artifact S_topic_params : specification
origin: given
representation form: "parameter settings"
description: "Initial number of topics and NMF configuration"
loop L_topic_modelling:
purpose: "Fit and refine a topic model whose topics are interpretable as
recognisable VIS research foci"
until: "Topics are coherent, mutually distinct, and readily nameable by
the analyst"
body:
transform T_fit_topics :
intent: build-model
manner: "fit-topic-model (NMF)"
input: F_text_features, S_topic_params
output: M_topic_model
actor: machine
description: "Fit a non-negative matrix factorisation topic model
over the paper corpus"
artifact M_topic_model : model(F_text_features)
model type: "topic model"
representation form: "non-negative matrix factorisation (W,H)"
description: "Topic model over the VIS paper corpus"
transform T_compute_paper_topics :
intent: characterise
manner: "project (compute per-paper topic-mixture from model)"
input: D_papers, M_topic_model
output: F_paper_topic_mixture
actor: machine
description: "Compute each paper's topic-mixture weights"
artifact F_paper_topic_mixture : feature(D_papers)
value structure: vector
value type: numeric
description: "Topic-mixture weights per paper"
transform T_vis_topics :
intent: visualise
manner: "ranked term lists / topic-word matrix"
input: M_topic_model, F_paper_topic_mixture
output: V_topics
actor: machine
description: "Display top terms and representative papers per topic"
artifact V_topics : visualisation(M_topic_model, F_paper_topic_mixture)
layout: "topic-word matrix with representative-paper lists"
form: "ranked term lists, bar charts"
encoding: "topic ranked by weight from M_topic_model; representative
papers ranked by F_paper_topic_mixture"
description: "View for judging topic coherence and interpretability"
transform T_interpret_topics :
intent: abstract
manner: "name-patterns (assign labels to topics)"
input: V_topics
output: P_topics
actor: human
description: "Interpret and name topics based on top terms and
representative papers"
artifact P_topics : pattern(M_topic_model)
representation form: "named topic descriptions (label + representative
terms/papers)"
description: "Interpreted research-focus topics"
transform T_assess_topics :
intent: assess
manner: "judge topic coherence and distinctiveness"
input: V_topics, P_topics
output: K_topic_quality
actor: human
description: "Decide whether the topic model needs refinement (merge,
split, or change topic count)"
artifact K_topic_quality : knowledge(M_topic_model, P_topics)
representation form: "quality judgment"
description: "Judgment on topic coherence and whether refinement is
needed"
if K_topic_quality indicates refinement needed:
then:
transform T_refine_topic_params :
intent: generate-knowledge
manner: "formulate revised topic-model specification"
input: K_topic_quality, S_topic_params
output: S_topic_params_r
actor: human
description: "Decide on a revised topic count or model
configuration"
artifact S_topic_params_r : specification
representation form: "parameter settings"
description: "Revised topic-model configuration"
assign:
S_topic_params := S_topic_params_r
else:
exit loop L_topic_modelling
end loop L_topic_modelling
Step 9: Community Research-Focus Profiles And Their Evolution
transform T_aggregate_community_topics :
intent: characterise
manner: "aggregate (average paper topic-mixtures per community instance)"
input: D_window_communities, F_community_members, F_paper_topic_mixture
output: F_community_topic_profile
actor: machine
description: "Aggregate the topic-mixtures of papers authored within each
community instance into a single topic profile"
artifact F_community_topic_profile : feature(D_window_communities)
value structure: vector
value type: numeric
description: "Aggregated topic-mixture profile per community instance"
transform T_contextualise_topic_matrix :
intent: contextualise
manner: "grid-based (community threads x time windows)"
input: D_community_threads, D_networks
output: A_topic_matrix
actor: machine
description: "Arrange community threads and time windows into a matrix
grid for small-multiples display of topic evolution"
artifact A_topic_matrix : arrangement(D_community_threads)
context: D_networks
principle: "rows = community threads; columns = time windows"
description: "Grid layout for topic-evolution small multiples"
transform T_vis_topic_evolution :
intent: visualise
manner: "matrix/small-multiples plot of topic profiles"
input: A_topic_matrix, F_community_topic_profile, P_topics
output: V_topic_evolution
actor: machine
description: "Show each community thread's topic profile per time window
as small multiples, labelled with named topics"
artifact V_topic_evolution : visualisation(A_topic_matrix,
F_community_topic_profile, P_topics)
layout: "matrix grid (threads x windows)"
form: "small-multiple stacked bar/area charts"
encoding: "cell position from A_topic_matrix; bar segments from
F_community_topic_profile; segment labels from P_topics"
description: "Primary view for answering what each community's research
foci are and how they evolve"
Step 10: Cross-Community Membership Overlap
transform T_characterise_period_overlap :
intent: characterise
manner: "define-relations (pairwise membership overlap within the same
time window)"
input: D_window_communities, F_community_members
output: F_period_overlap_matrix
actor: machine
description: "Compute pairwise Jaccard overlap among communities
coexisting within the same time window"
artifact F_period_overlap_matrix : feature(D_window_communities)
value structure: matrix
value type: numeric
representation form: "pairwise overlap matrix among co-existing
communities per window"
description: "Within-period membership overlap between communities"
transform T_vis_overlap_matrix :
intent: visualise
manner: "matrix-plot"
input: F_period_overlap_matrix
output: V_overlap_matrix
actor: machine
description: "Display the within-period community overlap matrix,
faceted by time window"
artifact V_overlap_matrix : visualisation(F_period_overlap_matrix)
layout: "matrix grid, one facet per time window"
form: "coloured matrix cells"
encoding: "cell colour from F_period_overlap_matrix overlap value"
description: "View for identifying converging, diverging, or
near-duplicate communities within a period"
transform T_assess_overlap :
intent: assess
manner: "identify candidate merges or eroding distinctiveness"
input: V_overlap_matrix, K_prior_domain_knowledge
output: K_overlap_assessment
actor: human
description: "Flag community pairs with persistently high overlap as
candidates for merger or loss of distinct identity"
artifact K_overlap_assessment : knowledge(F_period_overlap_matrix)
representation form: "quality judgment with flagged pairs"
description: "Judgment identifying community pairs at risk of merging or
losing distinctiveness"
Step 11: Synthesise Findings
transform T_synthesise :
intent: generate-knowledge
manner: "formulate-statements"
input: P_evolution_events, F_author_role_metrics, F_role_label, P_topics,
V_topic_evolution, K_overlap_assessment, K_structure_assessment
output: K_findings
actor: human
description: "Synthesise the analyst's answers regarding the number and
stability of communities, their core leadership, their research foci
and evolution, cross-community membership overlap, and merge/split/
dissolution events"
artifact K_findings : knowledge(D_community_threads, P_topics)
representation form: "statements and insights"
description: "Consolidated findings on the intellectual structure and
evolution of the IEEE VIS collaboration community"