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"