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 vastopolis-outbreak-origin-and-mechanism
template: define-unit (extract illness reports) →
loop(characterise → define-unit → visualise → assess) →
characterise (zone membership) → define-unit (zone-day units) → characterise (aggregate, normalise) →
define-unit (group into days) → characterise (day profile) → define-unit (cluster-by-similarity) →
contextualise (calendar) → visualise → abstract → generate-knowledge (onset) →
loop(define-unit (spatio-temporal place clustering) → define-unit (derive-places) →
characterise → visualise → abstract → assess) → generate-knowledge (origin) →
define-unit (cluster zones by incidence profile) → visualise → abstract → generate-knowledge (spread pattern) →
loop(characterise (wind cross-impact) → visualise → abstract → assess) →
generate-knowledge (airborne hypothesis) →
characterise (social relations) → visualise → abstract →
generate-knowledge (person-to-person & waterborne hypotheses) →
assess (compare hypotheses) → generate-knowledge (synthesis)
description: "Investigative visual analytics workflow to identify the spatio-temporal
origin of the Vastopolis flu outbreak and to determine its most plausible transmission
mechanism (person-to-person, airborne, waterborne, or other) from geolocated microblog
text, map context, zone population, and wind data."
Given (Exogenous) Artifacts
artifact D_messages : entities
origin: given
internal structure: elementary
embedment: {set, time, space}
features:
- id: text
value structure: atomic
value type: text
description: "Free-form message content"
description: "Geolocated microblog messages posted from mobile devices over
several days, each with timestamp, GPS coordinates, and text"
artifact D_zones : entities
origin: given
internal structure: region
embedment: space
features:
- id: population
value structure: atomic
value type: numeric
description: "Resident population of the zone"
description: "13 city zones with known boundaries and population statistics"
artifact D_weather : entities
origin: given
internal structure: elementary
embedment: time
features:
- id: wind_speed
value structure: atomic
value type: numeric
description: "Daily wind speed"
- id: wind_direction
value structure: atomic
value type: numeric
description: "Daily wind direction (degrees)"
description: "Daily citywide weather observations"
artifact D_road_network : entities
origin: given
internal structure: formation
description: "Single network entity representing highways and transit routes
across the metropolitan area"
artifact D_water_bodies : entities
origin: given
internal structure: region
embedment: space
features:
- id: water_type
value structure: atomic
value type: categorical
description: "Reservoir, river, lake, treatment facility, etc."
description: "Water bodies and related infrastructure shown on the city map"
artifact D_landmarks : entities
origin: given
internal structure: elementary
embedment: space
features:
- id: landmark_type
value structure: atomic
value type: categorical
description: "Hospital, stadium, park, venue, etc."
description: "Named landmarks and hospitals on the city map"
artifact D_calendar : entities
origin: given
internal structure: elementary
embedment: time
features:
- id: weekday
value structure: atomic
value type: categorical
description: "Day of week"
description: "Calendar days spanning the observation period"
artifact K_mechanism_criteria : knowledge
origin: given
representation form: "diagnostic checklist"
description: "Domain public-health knowledge describing the expected
spatial/temporal/contextual signatures of person-to-person, airborne,
waterborne, and other transmission mechanisms"
artifact S_symptom_lexicon : specification
origin: given
representation form: "lexicon / rules"
description: "Initial keyword and pattern lexicon for flu-like symptoms,
severity indicators (hospitalisation, death), and illness-relevance"
# ============================================================================
# PHASE 1: EXTRACT AND VALIDATE ILLNESS-REPORT EVENTS FROM TEXT
# cf. Jigsaw (Stasko, Görg & Liu 2008) — entity extraction with human correction
# ============================================================================
assign:
S_lexicon_current := S_symptom_lexicon
loop L_extraction:
purpose: "Extract illness-report events from raw microblog text and validate
extraction quality against manual sample review"
until: "Sampled extracted reports are judged accurate (low false positive/
negative rate) and severity coding is consistent"
body:
transform T_extract_symptom_features :
intent: characterise
manner: "extract (symptom and severity indicators from text via lexicon/NLP)"
input: D_messages, S_lexicon_current
output: F_symptom_features
actor: hybrid
description: "Detect symptom mentions, severity level, and illness-relevance
flag for each message"
artifact F_symptom_features : feature(D_messages)
value structure: vector
value type: {categorical, ordinal}
description: "Symptom-term matches, inferred severity level, and
illness-relevance flag per message"
transform T_filter_illness :
intent: define-unit
manner: "filter"
input: D_messages, F_symptom_features
output: D_illness_reports
actor: machine
description: "Retain only messages flagged as illness-relevant, carrying
forward symptom type, severity, and original text"
artifact D_illness_reports : entities
internal structure: elementary
embedment: {set, time, space}
features:
- id: symptom_type
value structure: atomic
value type: categorical
description: "Type of symptom mentioned"
- id: severity
value structure: atomic
value type: ordinal
description: "Severity level (mild / severe / death-associated)"
- id: text
value structure: atomic
value type: text
description: "Original message text, retained for drill-down"
description: "Geolocated, time-stamped illness-report events extracted
from microblog text"
transform T_vis_sample :
intent: visualise
manner: "sampled-record review"
input: D_illness_reports
output: V_sample_reports
actor: machine
layout: "record list linked to a small map inset"
form: "text list with location/time annotations"
encoding: "list rows from D_illness_reports; map marker from spatial
component; colour from severity"
description: "Sample of extracted reports for manual inspection"
transform T_assess_extraction :
intent: assess
manner: "judge extraction precision/recall via manual sample review"
input: V_sample_reports
output: K_extraction_quality
actor: human
artifact K_extraction_quality : knowledge(D_illness_reports)
representation form: "quality judgment"
description: "Judgment of whether extracted reports correctly capture
illness-relevance and severity, and whether the lexicon needs revision"
if K_extraction_quality indicates refinement needed:
then:
transform T_refine_lexicon :
intent: generate-knowledge
manner: "revise extraction lexicon/rules"
input: K_extraction_quality, S_lexicon_current
output: S_lexicon_r
actor: human
artifact S_lexicon_r : specification
representation form: "lexicon / rules"
description: "Revised symptom/severity lexicon addressing observed
false positives/negatives"
assign:
S_lexicon_current := S_lexicon_r
else:
exit loop L_extraction
end loop L_extraction
Phase 2: Spatial Join And Zone-Day Aggregation
transform T_zone_membership :
intent: characterise
manner: "define-relations (spatial containment / point-in-polygon join)"
input: D_illness_reports, D_zones
output: F_zone_membership
actor: machine
description: "Determine which of the 13 zones contains each illness report"
artifact F_zone_membership : feature(D_illness_reports)
value structure: atomic
value type: reference
description: "Zone identifier containing each report"
transform T_define_zone_days :
intent: define-unit
manner: "group-by-entity and time-partitioning"
input: D_illness_reports, F_zone_membership
output: D_zone_days
actor: machine
description: "Group illness reports into zone x day units"
artifact D_zone_days : entities
internal structure: episode
embedment: {space, time}
features:
- id: zone_id
value structure: atomic
value type: reference
description: "Zone identifier"
- id: day
value structure: atomic
value type: temporal
description: "Calendar day"
description: "Zone-day units aggregating illness reports"
transform T_aggregate_counts :
intent: characterise
manner: "aggregate (count and severity-weighted count)"
input: D_zone_days, D_illness_reports
output: F_zone_day_counts
actor: machine
artifact F_zone_day_counts : feature(D_zone_days)
value structure: vector
value type: numeric
description: "Raw report count and severity-weighted count per zone-day"
transform T_normalise_incidence :
intent: characterise
manner: "normalise by population (per-capita incidence)"
input: F_zone_day_counts, D_zones
output: F_zone_day_incidence
actor: machine
artifact F_zone_day_incidence : feature(D_zone_days)
value structure: atomic
value type: numeric
description: "Population-normalised incidence rate for the zone-day,
comparable across zones of different size"
# ============================================================================
# PHASE 3: TEMPORAL ONSET DETECTION
# cf. Cluster and Calendar Based Visualization (van Wijk & van Selow 1999)
# ============================================================================
transform T_define_days :
intent: define-unit
manner: "group-by-entity (all zones per calendar day)"
input: D_zone_days
output: D_days
actor: machine
artifact D_days : entities
internal structure: group/cluster
embedment: time
features:
- id: date
value structure: atomic
value type: temporal
description: "Calendar date"
description: "Daily units grouping all 13 zone-day entities for that day"
transform T_day_profile :
intent: characterise
manner: "aggregate (assemble per-zone incidence vector)"
input: D_days, F_zone_day_incidence
output: F_day_profile
actor: machine
artifact F_day_profile : feature(D_days)
value structure: vector
value type: numeric
representation form: "13-element vector of per-zone incidence"
description: "Spatial incidence profile for each day"
transform T_cluster_days :
intent: define-unit
manner: "cluster-by-similarity (day-profile shape vs. pre-outbreak baseline)"
input: D_days, F_day_profile
output: D_day_clusters, F_day_cluster_label
actor: machine
artifact D_day_clusters : entities
internal structure: group/cluster
embedment: set
description: "Groups of days with similar profile shape (baseline vs. anomalous)"
artifact F_day_cluster_label : feature(D_days)
value structure: atomic
value type: categorical
description: "Cluster membership per day"
transform T_contextualise_calendar :
intent: contextualise
manner: "calendar-based"
input: D_days, D_calendar
output: A_days_calendar
actor: machine
artifact A_days_calendar : arrangement(D_days)
context: D_calendar
principle: "calendar(year, month, weekday)"
description: "Calendar-cell placement of each day"
transform T_vis_calendar :
intent: visualise
manner: "coloured-marks"
input: A_days_calendar, F_day_cluster_label, F_day_profile
output: V_calendar
actor: machine
layout: "calendar grid"
form: "coloured marks with linked per-zone profile glyphs"
encoding: "position from A_days_calendar; colour from F_day_cluster_label;
glyph shape from F_day_profile"
transform T_abstract_onset :
intent: abstract
manner: "perception-and-interpretation"
input: V_calendar
output: P_onset
actor: human
description: "Identify the day(s) that break from baseline and the zone(s)
first showing elevated incidence"
artifact P_onset : pattern(D_days, D_zone_days)
representation form: "textual description"
description: "Onset date(s) and earliest-affected zone(s)"
transform T_knowledge_onset :
intent: generate-knowledge
manner: "formulate-statements"
input: P_onset
output: K_onset
actor: human
artifact K_onset : knowledge(D_days, D_zone_days)
representation form: "statements"
description: "Outbreak onset date and earliest-affected zone(s)"
# ============================================================================
# PHASE 4: SPATIO-TEMPORAL PLACE EXTRACTION (CANDIDATE ORIGIN)
# cf. From Movement Tracks through Events to Places (Andrienko et al. 2011)
# ============================================================================
artifact S_place_cluster_params : specification
origin: given
representation form: "parameter settings"
description: "Initial spatial/temporal distance thresholds for density-based
clustering of illness reports"
assign:
S_place_params_current := S_place_cluster_params
loop L_origin_clustering:
purpose: "Identify candidate outbreak-origin place(s) via spatio-temporal
density clustering of illness reports"
until: "Resulting place clusters are spatially coherent, temporally tight,
and interpretable against map landmarks and water bodies"
body:
transform T_cluster_reports :
intent: define-unit
manner: "cluster-by-similarity (spatio-temporal density clustering)"
input: D_illness_reports, S_place_params_current
output: D_report_clusters, F_report_cluster_label
actor: machine
artifact D_report_clusters : entities
internal structure: group/cluster
embedment: set
description: "Density-based clusters of illness reports close in both
space and time; unclustered reports treated as noise"
artifact F_report_cluster_label : feature(D_illness_reports)
value structure: atomic
value type: categorical
description: "Cluster (or noise) membership per report"
transform T_derive_places :
intent: define-unit
manner: "derive-places (spatial hull aggregation of clusters)"
input: D_report_clusters
output: D_places
actor: machine
artifact D_places : entities
internal structure: region
embedment: space
features:
- id: onset_time
value structure: atomic
value type: temporal
description: "Time of earliest report in the place cluster"
description: "Candidate significant places delineated from report clusters"
transform T_place_timeseries :
intent: characterise
manner: "aggregate (per-place daily incidence time series)"
input: D_places, D_report_clusters
output: F_place_timeseries
actor: machine
artifact F_place_timeseries : feature(D_places)
value structure: vector
value type: numeric
representation form: "daily incidence counts time series"
description: "Time series of report counts for each candidate place"
transform T_vis_places :
intent: visualise
manner: "map overlay with linked timelines"
input: D_places, F_place_timeseries, D_landmarks, D_water_bodies, D_road_network
output: V_places_map
actor: machine
layout: "geographic map with road network, landmarks, and water bodies overlaid"
form: "cluster hulls coloured by onset time; point/line map layers; linked
small-multiple incidence curves per place"
encoding: "hull position/extent from D_places; colour from onset_time;
curve shape from F_place_timeseries"
transform T_abstract_origin :
intent: abstract
manner: "perception-and-interpretation"
input: V_places_map
output: P_origin_candidate
actor: human
description: "Identify the earliest/most severe place and its associated
landmark type (venue, water source, transit hub, etc.)"
artifact P_origin_candidate : pattern(D_places)
representation form: "textual description"
description: "Candidate origin place and its physical character"
transform T_assess_places :
intent: assess
manner: "judge cluster coherence and interpretability"
input: V_places_map, P_origin_candidate
output: K_place_quality
actor: human
artifact K_place_quality : knowledge(D_places)
representation form: "quality judgment"
description: "Judgment of whether clustering parameters yield coherent,
interpretable place clusters"
if K_place_quality indicates refinement needed:
then:
transform T_refine_place_params :
intent: generate-knowledge
manner: "revise clustering parameters"
input: K_place_quality, S_place_params_current
output: S_place_params_r
actor: human
artifact S_place_params_r : specification
representation form: "parameter settings"
description: "Revised spatial/temporal distance thresholds"
assign:
S_place_params_current := S_place_params_r
else:
exit loop L_origin_clustering
end loop L_origin_clustering
transform T_knowledge_origin :
intent: generate-knowledge
manner: "formulate-statements"
input: P_origin_candidate
output: K_origin
actor: human
artifact K_origin : knowledge(D_places, P_origin_candidate)
representation form: "statements"
description: "Identified candidate outbreak origin place and its character
(e.g., water source, public venue, transit hub)"
# ============================================================================
# PHASE 5: ZONE-LEVEL SPREAD PATTERN
# cf. A Visual Analytics Framework for Spatio-Temporal Analysis and Modelling
# (Andrienko & Andrienko, 2013)
# ============================================================================
transform T_cluster_zones :
intent: define-unit
manner: "cluster-by-similarity (zone incidence-profile similarity)"
input: D_zones, F_zone_day_incidence
output: D_zone_groups, F_zone_group_label
actor: machine
artifact D_zone_groups : entities
internal structure: group/cluster
embedment: set
description: "Groups of zones with similar temporal incidence profiles"
artifact F_zone_group_label : feature(D_zones)
value structure: atomic
value type: categorical
description: "Zone-group membership"
transform T_vis_zone_spread :
intent: visualise
manner: "map overlay with linked time series"
input: D_zones, F_zone_group_label, F_zone_day_incidence, D_road_network
output: V_zone_spread
actor: machine
layout: "geographic map of zones with road network overlaid; linked aligned
time-series small multiples per zone"
form: "choropleth coloured by group membership; line network; small-multiple
line charts"
encoding: "zone fill colour from F_zone_group_label; line-chart shape from
F_zone_day_incidence"
transform T_abstract_spread :
intent: abstract
manner: "perception-and-interpretation"
input: V_zone_spread, K_origin
output: P_spread_pattern
actor: human
description: "Relate zone grouping and timing lag to the road/transit network
and to the candidate origin place: contiguous road-following diffusion vs.
disconnected shared-cause pattern"
artifact P_spread_pattern : pattern(D_zone_groups, D_zones)
representation form: "textual description"
description: "Characterisation of how incidence spreads across zones relative
to road connectivity and the candidate origin"
transform T_knowledge_spread :
intent: generate-knowledge
manner: "formulate-statements"
input: P_spread_pattern
output: K_spread_pattern
actor: human
artifact K_spread_pattern : knowledge(D_zone_groups)
representation form: "statements"
description: "Conclusions about the geographic diffusion pattern of the outbreak"
# ============================================================================
# PHASE 6: WIND CROSS-IMPACT ANALYSIS (AIRBORNE HYPOTHESIS)
# cf. Detecting Stable Cross-Impact Patterns in Bivariate Time Series
# (Andrienko et al., 2026)
# ============================================================================
artifact S_crossimpact_params : specification
origin: given
representation form: "parameter settings"
description: "Initial window length, lag range, and tolerance for cross-impact
detection between wind and zone incidence series"
assign:
S_crossimpact_current := S_crossimpact_params
loop L_crossimpact:
purpose: "Test whether zone incidence changes follow wind direction/timing
consistent with airborne dispersal from the candidate origin"
until: "Cross-impact pattern is stable and clearly interpretable across a
reasonable parameter range"
body:
transform T_characterise_crossimpact :
intent: characterise
manner: "define-relations (time-lagged, direction-aware cross-impact)"
input: D_weather, F_zone_day_incidence, D_zones, K_origin, S_crossimpact_current
output: F_crossimpact_matrix
actor: machine
description: "Compute lagged association between daily wind vector (relative
to candidate origin bearing) and each zone's incidence series"
artifact F_crossimpact_matrix : feature(D_zones)
value structure: matrix
value type: numeric
representation form: "time x lag cross-impact score matrix (Ikat-style)"
description: "Per-zone matrix of lagged association strength between wind
and incidence"
transform T_vis_crossimpact :
intent: visualise
manner: "matrix-plot"
input: F_crossimpact_matrix, D_weather, F_zone_day_incidence
output: V_crossimpact
actor: machine
layout: "time-by-lag Ikat matrix per zone, linked to raw wind and incidence series"
form: "coloured matrix cells with drill-down line charts"
encoding: "cell colour from F_crossimpact_matrix; linked charts from raw series"
transform T_abstract_crossimpact :
intent: abstract
manner: "find-salient-groups"
input: V_crossimpact
output: P_wind_pattern
actor: human
description: "Identify zones/lags with stable, plausible-incubation-consistent
positive impact aligned with downwind direction"
artifact P_wind_pattern : pattern(F_crossimpact_matrix)
representation form: "textual description"
description: "Zones and lags showing a stable wind-direction-consistent
impact pattern, if any"
transform T_assess_crossimpact :
intent: assess
manner: "judge stability and plausibility of detected impact pattern"
input: V_crossimpact, P_wind_pattern
output: K_crossimpact_quality
actor: human
artifact K_crossimpact_quality : knowledge(F_crossimpact_matrix)
representation form: "quality judgment"
description: "Judgment of whether the detected pattern is robust or an
artefact of window/lag/tolerance settings"
if K_crossimpact_quality indicates refinement needed:
then:
transform T_refine_crossimpact_params :
intent: generate-knowledge
manner: "revise window/lag/tolerance settings"
input: K_crossimpact_quality, S_crossimpact_current
output: S_crossimpact_r
actor: human
artifact S_crossimpact_r : specification
representation form: "parameter settings"
description: "Revised cross-impact window length, lag range, tolerance"
assign:
S_crossimpact_current := S_crossimpact_r
else:
exit loop L_crossimpact
end loop L_crossimpact
transform T_knowledge_airborne :
intent: generate-knowledge
manner: "formulate-statements"
input: P_wind_pattern
output: K_airborne_hypothesis
actor: human
artifact K_airborne_hypothesis : knowledge(F_crossimpact_matrix)
representation form: "statements"
description: "Assessment of support for airborne/wind-driven transmission
from the candidate origin"
# ============================================================================
# PHASE 7: PERSON-TO-PERSON AND WATERBORNE MECHANISM CHECKS
# cf. Jigsaw (Stasko, Görg & Liu 2008) — relation extraction from text
# ============================================================================
transform T_social_relations :
intent: characterise
manner: "extract (social/co-location mentions and shared-venue references)"
input: D_illness_reports
output: F_social_relations
actor: hybrid
description: "Detect mentions of shared households, workplaces, schools,
transit lines, or events across reports"
artifact F_social_relations : feature(D_illness_reports)
value structure: relational configuration
value type: {text, reference}
representation form: "co-occurrence network of reports linked via shared
persons, venues, or transit references"
description: "Contact/co-location network derived from message text"
transform T_vis_mechanism :
intent: visualise
manner: "map overlay linked to relation network"
input: D_places, D_zones, F_zone_group_label, D_water_bodies, D_road_network,
F_social_relations
output: V_mechanism_overlay
actor: machine
layout: "geographic map overlay of origin place, zone groups, water bodies,
and road network, linked to a social co-occurrence network diagram"
form: "map layers plus node-link diagram"
encoding: "map layers from D_places/D_zones/D_water_bodies/D_road_network;
node-link diagram from F_social_relations"
transform T_abstract_mechanism_signatures :
intent: abstract
manner: "perception-and-interpretation"
input: V_mechanism_overlay, K_mechanism_criteria
output: P_mechanism_signatures
actor: human
description: "Check spread pattern against road/transit-following contact
chains versus alignment with water-body/service-area boundaries, using the
domain diagnostic checklist"
artifact P_mechanism_signatures : pattern(V_mechanism_overlay)
representation form: "textual description"
description: "Degree to which observed spread matches person-to-person
(contact-chain/road-following) versus waterborne (water-source/service-area)
signatures"
transform T_knowledge_person_to_person :
intent: generate-knowledge
manner: "formulate-statements"
input: P_mechanism_signatures, K_mechanism_criteria
output: K_person_to_person_hypothesis
actor: human
artifact K_person_to_person_hypothesis : knowledge(F_social_relations)
representation form: "statements"
description: "Assessment of support for person-to-person transmission"
transform T_knowledge_waterborne :
intent: generate-knowledge
manner: "formulate-statements"
input: P_mechanism_signatures, K_mechanism_criteria
output: K_waterborne_hypothesis
actor: human
artifact K_waterborne_hypothesis : knowledge(D_water_bodies, D_places)
representation form: "statements"
description: "Assessment of support for waterborne transmission"
Phase 8: Synthesis
transform T_assess_hypotheses :
intent: assess
manner: "compare hypotheses against diagnostic criteria and evidence strength"
input: K_origin, K_spread_pattern, K_airborne_hypothesis,
K_person_to_person_hypothesis, K_waterborne_hypothesis,
K_mechanism_criteria
output: K_hypothesis_assessment
actor: human
artifact K_hypothesis_assessment : knowledge(K_origin, K_spread_pattern)
representation form: "comparative judgment"
description: "Ranking of transmission-mechanism hypotheses by evidentiary
support; flags whether conclusion is well-supported or inconclusive"
if K_hypothesis_assessment indicates inconclusive:
then:
transform T_recommend_further_data :
intent: generate-knowledge
manner: "derive-rules"
input: K_hypothesis_assessment
output: K_further_investigation
actor: human
artifact K_further_investigation : knowledge(K_hypothesis_assessment)
representation form: "recommendations"
description: "Recommended additional data collection or targeted
investigation to resolve ambiguity (e.g., water-testing, contact tracing)"
else:
transform T_final_synthesis :
intent: generate-knowledge
manner: "write-summary"
input: K_hypothesis_assessment, K_onset
output: K_final_report
actor: human
artifact K_final_report : knowledge(K_hypothesis_assessment, K_onset)
representation form: "statements and recommendations"
description: "Final conclusions on outbreak origin, spread pattern, and
most-supported transmission mechanism, with recommended emergency
management actions"