{
 "design_id": "D04",
 "units": [
  {"unit": "U1",
   "human_action": {"present": true, "basis": "implied", "quote": "Check (visual): density/#components/giant-component-size over time, plus force-directed layout of a few sample windows - sanity check before detection."},
   "machine_action": {"present": true, "basis": "implied", "quote": "Build a paper-author table"},
   "control_acts": [
    {"type": "JUDGE", "object": "density/#components/giant-component-size over time, plus force-directed layout of a few sample windows",
     "basis": "implied",
     "quote": "Check (visual): density/#components/giant-component-size over time, plus force-directed layout of a few sample windows - sanity check before detection.",
     "evidence_stated": true, "evidence_quote": "density/#components/giant-component-size over time, plus force-directed layout of a few sample windows",
     "criterion_stated": false, "criterion_quote": ""}
   ],
   "output": {"named": true, "quote": "Build a paper-author table"}},
  {"unit": "U2",
   "human_action": {"present": true, "basis": "implied", "quote": "Check (visual): resolution profile (γ vs. #communities/modularity); node-link/matrix view colored by community; cross-tab heatmap community x sub-conference as a domain-knowledge sanity check."},
   "machine_action": {"present": true, "basis": "implied", "quote": "Run multiple seeds -> consensus clustering to get robust partitions"},
   "control_acts": [
    {"type": "SET", "object": "resolution parameter γ", "basis": "implied",
     "quote": "expose resolution parameter γ interactively",
     "evidence_stated": null, "evidence_quote": "", "criterion_stated": null, "criterion_quote": ""},
    {"type": "JUDGE", "object": "resolution profile (γ vs. #communities/modularity); node-link/matrix view colored by community; cross-tab heatmap community x sub-conference",
     "basis": "implied",
     "quote": "Check (visual): resolution profile (γ vs. #communities/modularity); node-link/matrix view colored by community; cross-tab heatmap community x sub-conference as a domain-knowledge sanity check.",
     "evidence_stated": true, "evidence_quote": "resolution profile (γ vs. #communities/modularity); node-link/matrix view colored by community; cross-tab heatmap community x sub-conference",
     "criterion_stated": false, "criterion_quote": ""}
   ],
   "output": {"named": false, "quote": ""}},
  {"unit": "U3",
   "human_action": {"present": true, "basis": "explicit", "quote": "Analyst annotates events using domain knowledge (e.g., the 2013 unification of InfoVis/VAST/SciVis into one VIS proceedings is a plausible structural break to check against)."},
   "machine_action": {"present": true, "basis": "implied", "quote": "Classify transitions with standard rules: birth, death, continuation, growth/shrink, merge (n->1), split (1->n)."},
   "control_acts": [
    {"type": "JUDGE", "object": "alluvial/storyline diagram (node size = community size, ribbon width = shared members)",
     "basis": "implied",
     "quote": "Check (visual): alluvial/storyline diagram (node size = community size, ribbon width = shared members) - the primary artefact for answering \"how many communities, do they merge/split/dissolve, when\".",
     "evidence_stated": true, "evidence_quote": "alluvial/storyline diagram (node size = community size, ribbon width = shared members)",
     "criterion_stated": true, "criterion_quote": "the primary artefact for answering \"how many communities, do they merge/split/dissolve, when\""},
    {"type": "ANNOTATE", "object": "events", "basis": "explicit",
     "quote": "Analyst annotates events using domain knowledge (e.g., the 2013 unification of InfoVis/VAST/SciVis into one VIS proceedings is a plausible structural break to check against).",
     "evidence_stated": null, "evidence_quote": "", "criterion_stated": null, "criterion_quote": ""}
   ],
   "output": {"named": false, "quote": ""}},
  {"unit": "U4",
   "human_action": {"present": true, "basis": "implied", "quote": "Check (visual): heatmap (authors x windows, sorted by persistence), small multiples across lineages; ranked leader table."},
   "machine_action": {"present": true, "basis": "implied", "quote": "Per lineage, build an author x window presence matrix."},
   "control_acts": [
    {"type": "JUDGE", "object": "heatmap (authors x windows, sorted by persistence), small multiples across lineages; ranked leader table",
     "basis": "implied",
     "quote": "Check (visual): heatmap (authors x windows, sorted by persistence), small multiples across lineages; ranked leader table.",
     "evidence_stated": true, "evidence_quote": "heatmap (authors x windows, sorted by persistence), small multiples across lineages; ranked leader table",
     "criterion_stated": false, "criterion_quote": ""}
   ],
   "output": {"named": true, "quote": "build an author x window presence matrix"}},
  {"unit": "U5",
   "human_action": {"present": true, "basis": "implied", "quote": "Check (visual): aggregated meta-network (animated/slider over time); UpSet plot of author-set memberships across lineages."},
   "machine_action": {"present": true, "basis": "implied", "quote": "Per window, compute each author's participation coefficient across communities (bridges vs. loyal members)."},
   "control_acts": [
    {"type": "JUDGE", "object": "aggregated meta-network (animated/slider over time); UpSet plot of author-set memberships across lineages",
     "basis": "implied",
     "quote": "Check (visual): aggregated meta-network (animated/slider over time); UpSet plot of author-set memberships across lineages.",
     "evidence_stated": true, "evidence_quote": "aggregated meta-network (animated/slider over time); UpSet plot of author-set memberships across lineages",
     "criterion_stated": false, "criterion_quote": ""}
   ],
   "output": {"named": false, "quote": ""}},
  {"unit": "U6",
   "human_action": {"present": true, "basis": "implied", "quote": "Check (visual): word clouds/top-term lists attached to storyline nodes; ThemeRiver of topic proportions per lineage; UMAP projection of community-window topic vectors colored by lineage (reveals topical convergence before merges / divergence before splits)."},
   "machine_action": {"present": true, "basis": "implied", "quote": "TF-IDF top terms or topic model (LDA/BERTopic) on title+abstract+keywords."},
   "control_acts": [
    {"type": "JUDGE", "object": "word clouds/top-term lists; ThemeRiver; UMAP projection of community-window topic vectors colored by lineage",
     "basis": "implied",
     "quote": "Check (visual): word clouds/top-term lists attached to storyline nodes; ThemeRiver of topic proportions per lineage; UMAP projection of community-window topic vectors colored by lineage (reveals topical convergence before merges / divergence before splits).",
     "evidence_stated": true, "evidence_quote": "word clouds/top-term lists attached to storyline nodes; ThemeRiver of topic proportions per lineage; UMAP projection of community-window topic vectors colored by lineage",
     "criterion_stated": true, "criterion_quote": "(reveals topical convergence before merges / divergence before splits)"}
   ],
   "output": {"named": false, "quote": ""}},
  {"unit": "U7",
   "human_action": {"present": true, "basis": "implied", "quote": "Selecting a lineage or window highlights consistently across all views"},
   "machine_action": {"present": true, "basis": "implied", "quote": "hovering a node shows top authors, keywords, and papers"},
   "control_acts": [
    {"type": "SELECT", "object": "lineage or window", "basis": "implied",
     "quote": "Selecting a lineage or window highlights consistently across all views",
     "evidence_stated": null, "evidence_quote": "", "criterion_stated": null, "criterion_quote": ""}
   ],
   "output": {"named": false, "quote": ""}},
  {"unit": "U8",
   "human_action": {"present": true, "basis": "implied", "quote": "Compare detected leaders/topics against known VIS researchers/subfields; check alignment with sub-conference labels and known historical events (e.g., conference restructuring)."},
   "machine_action": {"present": true, "basis": "implied", "quote": "run sensitivity analysis (small multiples of storylines under varied parameters) to confirm robustness of major lineages."},
   "control_acts": [
    {"type": "JUDGE", "object": "detected leaders/topics against known VIS researchers/subfields", "basis": "implied",
     "quote": "Compare detected leaders/topics against known VIS researchers/subfields",
     "evidence_stated": true, "evidence_quote": "detected leaders/topics against known VIS researchers/subfields",
     "criterion_stated": false, "criterion_quote": ""},
    {"type": "JUDGE", "object": "alignment with sub-conference labels and known historical events", "basis": "implied",
     "quote": "check alignment with sub-conference labels and known historical events (e.g., conference restructuring).",
     "evidence_stated": true, "evidence_quote": "alignment with sub-conference labels and known historical events",
     "criterion_stated": false, "criterion_quote": ""}
   ],
   "output": {"named": false, "quote": ""}}
 ],
 "loops": [
  {"id": "L1", "units": ["U1","U2","U3","U8"],
   "cue_quote": "If misaligned, revisit window size, γ, or matching threshold; run sensitivity analysis (small multiples of storylines under varied parameters) to confirm robustness of major lineages.",
   "redefines": ["PARAMETERS_CRITERIA"],
   "redefines_basis": "explicit",
   "trigger_stated": true, "trigger_quote": "If misaligned",
   "exit_stated": false, "exit_quote": "",
   "decided_by": "unstated"}
 ],
 "parameters": [
  {"id": "P1", "name": "time window size", "unit": "U1", "tuned": true,
   "initial_value_stated": true, "range_or_rule_stated": false, "set_by": "unstated",
   "quote": "Construct overlapping sliding time windows (e.g., 5-year windows, 1-year step)",
   "detail_quote": "5-year windows, 1-year step"},
  {"id": "P2", "name": "window step", "unit": "U1", "tuned": true,
   "initial_value_stated": true, "range_or_rule_stated": false, "set_by": "unstated",
   "quote": "Construct overlapping sliding time windows (e.g., 5-year windows, 1-year step)",
   "detail_quote": "1-year step"},
  {"id": "P3", "name": "edge weight", "unit": "U1", "tuned": false,
   "initial_value_stated": false, "range_or_rule_stated": true, "set_by": "unstated",
   "quote": "Edge weight = co-authored papers in the window (optionally fractional-count normalised for author-list length).",
   "detail_quote": "optionally fractional-count normalised for author-list length"},
  {"id": "P4", "name": "resolution parameter γ", "unit": "U2", "tuned": true,
   "initial_value_stated": false, "range_or_rule_stated": false, "set_by": "H",
   "quote": "expose resolution parameter γ interactively", "detail_quote": ""},
  {"id": "P5", "name": "matching threshold", "unit": "U8", "tuned": true,
   "initial_value_stated": false, "range_or_rule_stated": false, "set_by": "unstated",
   "quote": "revisit window size, γ, or matching threshold", "detail_quote": ""}
 ],
 "branches": [
  {"id": "B1", "unit": "U2", "type": "HYPOTHESES_COMPARED", "outcomes_stated": true,
   "quote": "Use Leiden with the CPM objective (not plain modularity - the field's size grows ~10x from 1990-2024, so modularity's resolution limit would bias detection toward large late-period, small early-period communities)."},
  {"id": "B2", "unit": "U6", "type": "HYPOTHESES_COMPARED", "outcomes_stated": false,
   "quote": "TF-IDF top terms or topic model (LDA/BERTopic) on title+abstract+keywords."},
  {"id": "B3", "unit": "U8", "type": "FALLBACK", "outcomes_stated": true,
   "quote": "If misaligned, revisit window size, γ, or matching threshold; run sensitivity analysis (small multiples of storylines under varied parameters) to confirm robustness of major lineages."}
 ],
 "global_statements": [
  {"criterion": "C3", "scope": "ALL_UNITS", "quote": "the workflow is designed as an iterative, human-in-the-loop visual analytics pipeline", "concrete": false},
  {"criterion": "C1", "scope": "ALL_UNITS", "quote": "every algorithmic stage produces an intermediate artefact that is inspected visually before the next stage runs", "concrete": true},
  {"criterion": "C3", "scope": "ALL_UNITS", "quote": "parameters can be revised based on domain knowledge", "concrete": false}
 ],
 "uncertain": [
  {"unit": "U3", "item": "Assign persistent lineage IDs to tracked communities.", "reason": "Verb 'assign' is not on the human or machine verb lists; actor not clearly determinable."},
  {"unit": "U6", "item": "Track topic profile along each lineage.", "reason": "Verb 'track' is ambiguous and no agent is named."},
  {"unit": "U3", "item": "Classify transitions with standard rules", "reason": "Possible parameter ('rule set') but unclear if this is tunable or merely a fixed classification scheme; excluded from parameters list on doubt."},
  {"unit": "U7", "item": "Linked views with brushing", "reason": "Describes interaction capability rather than a stated human action in a sentence; borderline for human_action coding."}
 ]
}
