C3
Designed by Claude Sonnet 5. ATWL specification + example + the 54-workflow library, pre-formalised in ATWL. ↓ download raw .atwl
Workflow header & template
workflow vastopolis-outbreak-source-and-transmission-analysis
template: define-unit →
loop(characterise → visualise → assess →
generate-knowledge → define-unit) →
contextualise → characterise → contextualise →
visualise → abstract →
loop(define-unit → define-unit → visualise → assess) →
generate-knowledge →
loop(generate-knowledge → characterise → contextualise →
visualise → abstract → assess → generate-knowledge) →
generate-knowledge
description: "Public-health investigation of a flu-like outbreak in
Vastopolis: extract validated illness reports from geolocated
microblogs, visualise their spatio-temporal spread across the city's
13 zones, localise a fine-grained outbreak origin via spatio-temporal
clustering, and iteratively test person-to-person, airborne,
waterborne, and point-source transmission hypotheses against weather,
hydrography, road-network, and text evidence to guide resource
deployment"
Input
artifact D_microblogs : entities
origin: given
internal structure: elementary
embedment: {set, space, time}
features:
- id: f_text
value structure: atomic
value type: text
description: "Message text content"
description: "Geolocated, timestamped microblog messages posted by
residents over the outbreak period"
artifact D_zones : entities
origin: given
internal structure: region
embedment: space
features:
- id: f_population
value structure: atomic
value type: numeric
description: "Resident population of the zone"
description: "13 administrative city zones providing spatial context
and population denominators"
artifact D_water_bodies : entities
origin: given
internal structure: region
embedment: space
features:
- id: f_water_type
value structure: atomic
value type: categorical
description: "Water body type (river, lake, reservoir)"
description: "Water bodies within the metropolitan area"
artifact D_road_network : entities
origin: given
internal structure: formation
embedment: space
features:
- id: f_road_type
value structure: atomic
value type: categorical
description: "Road classification (highway, arterial, local)"
description: "Highway/road network providing a connectivity structure
for person-to-person diffusion analysis"
artifact D_landmarks : entities
origin: given
internal structure: elementary
embedment: space
features:
- id: f_category
value structure: atomic
value type: categorical
description: "Landmark category (hospital, market, venue, other)"
- id: f_name
value structure: atomic
value type: categorical
description: "Landmark name"
description: "Hospitals and other notable landmarks, used both as map
context and as candidate point-source locations"
artifact D_weather : entities
origin: given
internal structure: elementary
embedment: time
features:
- id: f_wind_speed
value structure: atomic
value type: numeric
description: "Daily wind speed"
- id: f_wind_direction
value structure: atomic
value type: numeric
description: "Daily prevailing wind direction (degrees)"
description: "Daily city-wide weather observations over the outbreak
period"
Phase 1: Extract And Validate Illness Reports
artifact S_extraction_criteria : specification
origin: given
representation form: "keyword list and classifier threshold"
description: "Initial symptom-keyword list and confidence threshold for
flagging microblog messages as flu-like illness reports"
transform T_extract_reports :
intent: define-unit
manner: "keyword/symptom-based text classification"
input: D_microblogs, S_extraction_criteria
output: D_illness_reports
actor: hybrid
description: "Flag microblog messages plausibly reporting flu-like
symptoms and extract them as illness-report entities"
artifact D_illness_reports : entities
internal structure: elementary
embedment: {set, space, time}
features:
- id: f_keywords
value structure: list
value type: categorical
description: "Matched symptom keywords"
- id: f_confidence
value structure: atomic
value type: numeric
description: "Classifier confidence that the message reports
genuine illness"
description: "Geolocated, timestamped candidate illness reports derived
from the microblog stream"
loop L_extraction_refinement:
purpose: "Refine symptom-keyword/classifier criteria so that extracted
reports neither miss genuine cases nor include irrelevant chatter"
until: "The analyst judges the report set to be a sufficiently accurate
and complete representation of flu-like illness reports"
body:
transform T_summarise_reports :
intent: characterise
manner: "compute daily report counts and a stratified sample of
flagged and excluded messages"
input: D_illness_reports, D_microblogs
output: F_report_sample
actor: machine
description: "Prepare daily counts and a sample of borderline
classifications for visual inspection"
artifact F_report_sample : feature(D_illness_reports)
value structure: vector
value type: {numeric, text}
description: "Daily report counts and sampled flagged/excluded
message texts with matched keywords highlighted"
transform T_visualise_sample :
intent: visualise
manner: "map and chronological list of sampled messages"
input: F_report_sample, D_illness_reports
output: V_report_sample
actor: machine
description: "Display sampled messages on the map and in a
chronological list, with matched keywords highlighted"
artifact V_report_sample : visualisation(D_illness_reports,
F_report_sample)
layout: "linked map and chronological message list"
form: "point markers on map; text list with highlighted keywords"
encoding: "marker position from message coordinates; marker colour
from classifier confidence; list highlighting from matched
keyword terms"
description: "Interface supporting inspection of extraction quality
in geographic and textual context"
transform T_assess_extraction :
intent: assess
manner: "evaluate completeness and precision of the extracted
report set against domain knowledge of symptom language"
input: V_report_sample
output: K_extraction_quality
actor: human
description: "Judge whether current criteria adequately separate
genuine illness reports from noise"
artifact K_extraction_quality : knowledge(D_illness_reports)
representation form: "quality judgment"
description: "Assessment of extraction precision/recall and
whether criteria adjustment is needed"
if K_extraction_quality indicates refinement needed:
then:
transform T_revise_criteria :
intent: generate-knowledge
manner: "adjust keyword list, threshold, or exclusion terms"
input: K_extraction_quality, S_extraction_criteria
output: S_extraction_criteria_r
actor: human
description: "Revise extraction criteria based on observed
errors"
artifact S_extraction_criteria_r : specification
representation form: "keyword list and classifier threshold"
description: "Updated extraction criteria"
transform T_reextract_reports :
intent: define-unit
manner: "keyword/symptom-based text classification, re-applied"
input: D_microblogs, S_extraction_criteria_r
output: D_illness_reports_r
actor: hybrid
description: "Re-extract illness reports under revised
criteria"
artifact D_illness_reports_r : entities
internal structure: elementary
embedment: {set, space, time}
features:
- id: f_keywords
value structure: list
value type: categorical
description: "Matched symptom keywords"
- id: f_confidence
value structure: atomic
value type: numeric
description: "Classifier confidence"
description: "Revised illness-report set"
assign:
S_extraction_criteria := S_extraction_criteria_r
D_illness_reports := D_illness_reports_r
else:
exit loop L_extraction_refinement
end loop L_extraction_refinement
Phase 2: Spread Overview And Origin Localisation
transform T_assign_zone :
intent: contextualise
manner: "map-based, point-in-polygon assignment"
input: D_illness_reports, D_zones
output: A_reports_zone
actor: machine
description: "Assign each illness report to its containing city zone"
artifact A_reports_zone : arrangement(D_illness_reports)
context: D_zones
principle: "point-in-polygon assignment to zone polygons"
description: "Zone membership of every illness report"
transform T_compute_daily_incidence :
intent: characterise
manner: "aggregate per-zone, per-day counts and normalise by
population"
input: D_illness_reports, A_reports_zone, D_zones
output: F_daily_incidence
actor: machine
description: "Compute a population-normalised daily incidence rate per
zone"
artifact F_daily_incidence : feature(D_zones)
value structure: matrix
value type: numeric
representation form: "time series per zone"
description: "Daily, population-normalised illness-report incidence
per zone over the outbreak period"
transform T_arrange_spread :
intent: contextualise
manner: "map-based arrangement with daily temporal sequencing"
input: D_zones, F_daily_incidence, D_illness_reports
output: A_spread
actor: machine
description: "Arrange zones geographically and sequence them by day to
support a small-multiples spread overview"
artifact A_spread : arrangement(D_illness_reports)
context: D_zones
principle: "geographic zone positions crossed with daily temporal
sequencing"
description: "Spatio-temporal arrangement of illness reports and
zone-level incidence"
transform T_visualise_spread :
intent: visualise
manner: "small-multiples choropleth map sequence with point overlay"
input: A_spread, F_daily_incidence, D_illness_reports
output: V_spread_overview
actor: machine
description: "Display one map panel per day showing zone incidence and
individual reports"
artifact V_spread_overview : visualisation(A_spread, F_daily_incidence,
D_illness_reports)
layout: "chronologically ordered sequence of small map panels"
form: "choropleth zone polygons with overlaid point markers"
encoding: "zone fill intensity from normalised daily incidence; point
position from report coordinates; point colour/size from symptom
confidence"
description: "Overview enabling visual tracing of the outbreak's spatial
and temporal progression"
transform T_read_spread :
intent: abstract
manner: "perception-and-interpretation of spatial and temporal
progression"
input: V_spread_overview
output: P_spread_pattern
actor: human
description: "Identify the general spread trajectory and the earliest
affected zone(s)/day(s) as candidates for the outbreak origin"
artifact P_spread_pattern : pattern(D_illness_reports, F_daily_incidence)
representation form: "described spread trajectory"
description: "General direction/shape of spread (e.g. radiating
outward, corridor-following) and candidate origin zone/day"
artifact S_origin_clustering : specification
origin: given
representation form: "parameter settings"
description: "Initial spatial radius, temporal window, and minimum
point count for density-based clustering of the earliest reports"
loop L_origin_localisation:
purpose: "Isolate a compact, finer-than-zone spatio-temporal cluster
among the earliest reports that plausibly marks the outbreak's point
of origin"
until: "A stable, spatially compact, temporally coherent origin cluster
has been identified and is plausible given nearby landmarks"
body:
transform T_select_early_reports :
intent: define-unit
manner: "filter to the earliest days indicated by P_spread_pattern"
input: D_illness_reports, P_spread_pattern
output: D_early_reports
actor: human
description: "Restrict analysis to reports from the earliest phase
of the outbreak"
artifact D_early_reports : entities
internal structure: elementary
embedment: {set, space, time}
description: "Illness reports from the earliest outbreak days"
transform T_cluster_origin :
intent: define-unit
manner: "density-based spatio-temporal clustering"
input: D_early_reports, S_origin_clustering
output: D_origin_clusters, F_origin_labels
actor: machine
description: "Group early reports concentrated in space and time
into candidate origin clusters"
artifact D_origin_clusters : entities
internal structure: group/cluster
embedment: {space, time}
features:
- id: f_cluster_size
value structure: atomic
value type: numeric
description: "Number of reports in the cluster"
description: "Candidate compact origin clusters among early
reports"
artifact F_origin_labels : feature(D_early_reports)
value structure: atomic
value type: categorical
description: "Origin-cluster membership or noise designation"
transform T_visualise_origin :
intent: visualise
manner: "detailed local map with landmark and road overlay"
input: D_origin_clusters, F_origin_labels, D_landmarks,
D_road_network
output: V_origin_map
actor: machine
description: "Show candidate origin clusters against landmarks,
hospitals, and roads for plausibility checking"
artifact V_origin_map : visualisation(D_origin_clusters,
F_origin_labels, D_landmarks)
layout: "detailed local map"
form: "coloured cluster points; landmark/hospital icons; road
lines"
encoding: "point colour from cluster membership; icon shape from
landmark category; line style from road type"
description: "Local map supporting assessment of cluster
coherence and plausibility"
transform T_assess_origin :
intent: assess
manner: "evaluate cluster compactness, coherence, and plausibility"
input: V_origin_map, D_origin_clusters
output: K_origin_quality
actor: human
description: "Judge whether a candidate cluster is a satisfactory
origin, or whether clustering parameters need adjustment"
artifact K_origin_quality : knowledge(D_origin_clusters)
representation form: "quality judgment"
description: "Assessment of origin-cluster compactness, coherence,
and plausibility"
if K_origin_quality indicates satisfactory origin cluster:
then:
exit loop L_origin_localisation
else:
transform T_adjust_origin_params :
intent: generate-knowledge
manner: "adjust spatial radius, temporal window, or minimum
point count"
input: K_origin_quality, S_origin_clustering
output: S_origin_clustering_r
actor: human
description: "Revise clustering parameters based on
assessment"
artifact S_origin_clustering_r : specification
representation form: "parameter settings"
description: "Updated clustering parameters"
assign:
S_origin_clustering := S_origin_clustering_r
end loop L_origin_localisation
transform T_finalise_origin :
intent: generate-knowledge
manner: "formulate-statements"
input: D_origin_clusters, K_origin_quality, D_landmarks
output: K_origin
actor: human
description: "State the confirmed outbreak origin location and time,
noting any co-located landmark or facility"
artifact K_origin : knowledge(D_origin_clusters)
representation form: "statements"
description: "Confirmed origin location, onset time, and any
co-located landmark relevant to the point-source hypothesis"
Phase 3: Transmission-Mode Hypothesis Testing
artifact S_candidate_hypotheses : specification
origin: given
representation form: "ordered list of hypothesis types"
description: "The four candidate transmission modes to examine:
person-to-person, airborne, waterborne, point-source/other"
artifact K_evidence_log : knowledge(D_illness_reports)
representation form: "accumulated hypothesis assessments"
description: "Initially empty; accumulates the evidence for/against
each candidate transmission-mode hypothesis across iterations"
loop L_transmission_analysis:
purpose: "Iteratively test alternative transmission-mode hypotheses
against the observed spread pattern, weather, hydrography, road
network, and text evidence until the evidence for the most plausible
mode(s) is judged sufficiently strong"
until: "All relevant hypotheses have been evaluated and the evidence
log supports one or more transmission modes with sufficient
confidence"
body:
transform T_formulate_hypothesis :
intent: generate-knowledge
manner: "select the next untested or inconclusive candidate
transmission mode and specify the contextual variables and
evidence computation needed to test it"
input: S_candidate_hypotheses, K_evidence_log, K_origin
output: S_hypothesis
actor: human
description: "Choose which transmission mode to test next and how"
artifact S_hypothesis : specification
representation form: "hypothesis type and evidence-computation
specification"
description: "Current transmission-mode hypothesis and the
contextual data/method needed to test it"
transform T_compute_hypothesis_evidence :
intent: characterise
manner: "compute hypothesis-specific evidence: spatial contiguity
and road-network proximity for person-to-person; lagged
correlation between wind direction/speed and directional case
spread for airborne; distance-to-water-body and downstream
clustering for waterborne; shared-venue/landmark text mining
among early cases for point-source"
input: D_illness_reports, A_reports_zone, D_zones, D_weather,
D_water_bodies, D_road_network, D_landmarks, S_hypothesis
output: F_hypothesis_evidence
actor: machine
description: "Compute the evidence variables relevant to the
current hypothesis"
artifact F_hypothesis_evidence : feature(D_illness_reports)
value structure: vector
value type: numeric
description: "Per-report or per-zone evidence values specific to
the current hypothesis (e.g. contiguity metric, lagged wind
correlation, water-distance, venue co-mention count)"
transform T_arrange_hypothesis_view :
intent: contextualise
manner: "overlay hypothesis-relevant contextual layer with the
spread map and timeline"
input: F_hypothesis_evidence, A_spread, D_water_bodies,
D_road_network, D_weather, D_landmarks
output: A_hypothesis
actor: machine
description: "Combine the case-spread arrangement with the
contextual layer (wind vectors, water bodies, roads, or venues)
relevant to the current hypothesis"
artifact A_hypothesis : arrangement(D_illness_reports)
context: S_hypothesis
principle: "spread map and timeline overlaid with the
hypothesis-relevant contextual layer (wind field, hydrography,
road network, or venue markers)"
description: "Hypothesis-specific spatio-temporal arrangement for
visual comparison"
transform T_visualise_hypothesis :
intent: visualise
manner: "coordinated map overlay and correlation/time-series plot"
input: A_hypothesis, F_hypothesis_evidence
output: V_hypothesis
actor: machine
description: "Display the spread pattern against the contextual
layer and any derived correlation/time-series evidence"
artifact V_hypothesis : visualisation(A_hypothesis,
F_hypothesis_evidence)
layout: "map panel with contextual overlay, linked to a
correlation or time-series panel"
form: "map overlay (vectors/polygons/lines/markers as relevant);
scatter or line chart for correlation/lag evidence"
encoding: "overlay symbol/colour from contextual layer type; chart
axes from hypothesis evidence values"
description: "Coordinated view supporting visual judgment of
alignment between spread pattern and candidate factor"
transform T_interpret_hypothesis :
intent: abstract
manner: "perception-and-interpretation of spatial alignment and
correlation strength"
input: V_hypothesis
output: P_hypothesis_pattern
actor: human
description: "Interpret whether the spread pattern visually aligns
with, or correlates with, the candidate factor"
artifact P_hypothesis_pattern : pattern(D_illness_reports,
F_hypothesis_evidence)
representation form: "described alignment/correlation evidence"
description: "Observed degree and direction of alignment between
the spread pattern and the candidate transmission factor"
transform T_assess_hypothesis :
intent: assess
manner: "judge whether evidence supports, contradicts, or is
inconclusive for the hypothesis"
input: P_hypothesis_pattern, V_hypothesis
output: K_hypothesis_assessment
actor: human
description: "Evaluative judgment on the current hypothesis"
artifact K_hypothesis_assessment : knowledge(P_hypothesis_pattern)
representation form: "quality judgment"
description: "Support/contradiction/inconclusive verdict for the
current transmission-mode hypothesis, with rationale"
transform T_log_evidence :
intent: generate-knowledge
manner: "append the current assessment to the accumulated evidence
log"
input: K_hypothesis_assessment, K_evidence_log
output: K_evidence_log_r
actor: human
description: "Update the running record of tested hypotheses and
their evidentiary support"
artifact K_evidence_log_r : knowledge(D_illness_reports)
representation form: "accumulated hypothesis assessments"
description: "Evidence log extended with the current hypothesis's
assessment"
assign:
K_evidence_log := K_evidence_log_r
if K_evidence_log indicates sufficient evidence has been gathered
for one or more transmission modes and no untested plausible
hypotheses remain:
then:
exit loop L_transmission_analysis
else:
transform T_select_next_hypothesis :
intent: generate-knowledge
manner: "choose the next candidate hypothesis to test, or
refine the current one, based on inconclusive or contradicted
evidence"
input: K_evidence_log_r, S_candidate_hypotheses
output: S_candidate_hypotheses_r
actor: human
description: "Update the remaining hypothesis agenda"
artifact S_candidate_hypotheses_r : specification
representation form: "revised ordered list of remaining
hypotheses"
description: "Updated hypothesis agenda for the next
iteration"
assign:
S_candidate_hypotheses := S_candidate_hypotheses_r
end loop L_transmission_analysis
Phase 4: Synthesis
transform T_synthesise :
intent: generate-knowledge
manner: "formulate-statements"
input: K_origin, P_spread_pattern, K_evidence_log
output: K_findings
actor: human
description: "Integrate the localised origin, characterised spread
pattern, and accumulated transmission-mode evidence into an
actionable outbreak characterisation"
artifact K_findings : knowledge(K_origin, K_evidence_log)
representation form: "statements and recommendations"
description: "Final characterisation of the outbreak: confirmed origin
location and time; most plausible transmission mode(s) with
supporting evidence and confidence; and recommended emergency
resource deployment (e.g. contact tracing/quarantine, air-quality
intervention, water-supply investigation, or facility closure)"