VAST · Claude Sonnet 5 · C7

Vastopolis outbreak investigation — C7 · fresh redesign

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"