{
  "design_id": "D04",
  "units": [
    {
      "unit": "U1",
      "human_action": {
        "present": true,
        "basis": "implied",
        "quote": "Check (visual): density/#components/giant-component-size over time"
      },
      "machine_action": {
        "present": true,
        "basis": "implied",
        "quote": "Build a paper-author table"
      },
      "control_acts": [
        {
          "type": "JUDGE",
          "object": "density, components, and giant-component size over time",
          "basis": "implied",
          "quote": "density/#components/giant-component-size over time",
          "evidence_stated": true,
          "evidence_quote": "density/#components/giant-component-size over time",
          "criterion_stated": false,
          "criterion_quote": ""
        },
        {
          "type": "JUDGE",
          "object": "force-directed layout of sample windows",
          "basis": "implied",
          "quote": "force-directed layout of a few sample windows",
          "evidence_stated": true,
          "evidence_quote": "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)"
      },
      "machine_action": {
        "present": true,
        "basis": "implied",
        "quote": "Run multiple seeds"
      },
      "control_acts": [
        {
          "type": "JUDGE",
          "object": "resolution profile",
          "basis": "implied",
          "quote": "resolution profile (γ vs. #communities/modularity)",
          "evidence_stated": true,
          "evidence_quote": "resolution profile (γ vs. #communities/modularity)",
          "criterion_stated": false,
          "criterion_quote": ""
        },
        {
          "type": "JUDGE",
          "object": "node-link or matrix view colored by community",
          "basis": "implied",
          "quote": "node-link/matrix view colored by community",
          "evidence_stated": true,
          "evidence_quote": "node-link/matrix view colored by community",
          "criterion_stated": false,
          "criterion_quote": ""
        },
        {
          "type": "JUDGE",
          "object": "cross-tab heatmap of community by sub-conference",
          "basis": "implied",
          "quote": "cross-tab heatmap community x sub-conference as a domain-knowledge sanity check",
          "evidence_stated": true,
          "evidence_quote": "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"
      },
      "machine_action": {
        "present": true,
        "basis": "implied",
        "quote": "Classify transitions with standard rules"
      },
      "control_acts": [
        {
          "type": "JUDGE",
          "object": "alluvial/storyline diagram",
          "basis": "implied",
          "quote": "alluvial/storyline diagram (node size = community size, ribbon width = shared members)",
          "evidence_stated": true,
          "evidence_quote": "alluvial/storyline diagram (node size = community size, ribbon width = shared members)",
          "criterion_stated": true,
          "criterion_quote": "for answering \"how many communities, do they merge/split/dissolve, when\""
        },
        {
          "type": "ANNOTATE",
          "object": "events",
          "basis": "explicit",
          "quote": "Analyst annotates events using domain knowledge",
          "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)"
      },
      "machine_action": {
        "present": true,
        "basis": "implied",
        "quote": "build an author x window presence matrix"
      },
      "control_acts": [
        {
          "type": "JUDGE",
          "object": "heatmap of authors by windows",
          "basis": "implied",
          "quote": "heatmap (authors x windows, sorted by persistence)",
          "evidence_stated": true,
          "evidence_quote": "heatmap (authors x windows, sorted by persistence)",
          "criterion_stated": false,
          "criterion_quote": ""
        },
        {
          "type": "JUDGE",
          "object": "small multiples across lineages",
          "basis": "implied",
          "quote": "small multiples across lineages",
          "evidence_stated": true,
          "evidence_quote": "small multiples across lineages",
          "criterion_stated": false,
          "criterion_quote": ""
        },
        {
          "type": "JUDGE",
          "object": "ranked leader table",
          "basis": "implied",
          "quote": "ranked leader table",
          "evidence_stated": true,
          "evidence_quote": "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)"
      },
      "machine_action": {
        "present": true,
        "basis": "implied",
        "quote": "compute each author's participation coefficient across communities"
      },
      "control_acts": [
        {
          "type": "JUDGE",
          "object": "aggregated meta-network",
          "basis": "implied",
          "quote": "aggregated meta-network (animated/slider over time)",
          "evidence_stated": true,
          "evidence_quote": "aggregated meta-network (animated/slider over time)",
          "criterion_stated": false,
          "criterion_quote": ""
        },
        {
          "type": "JUDGE",
          "object": "UpSet plot of author-set memberships",
          "basis": "implied",
          "quote": "UpSet plot of author-set memberships across lineages",
          "evidence_stated": true,
          "evidence_quote": "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"
      },
      "machine_action": {
        "present": false,
        "basis": "none",
        "quote": ""
      },
      "control_acts": [
        {
          "type": "JUDGE",
          "object": "word clouds and top-term lists",
          "basis": "implied",
          "quote": "word clouds/top-term lists attached to storyline nodes",
          "evidence_stated": true,
          "evidence_quote": "word clouds/top-term lists attached to storyline nodes",
          "criterion_stated": false,
          "criterion_quote": ""
        },
        {
          "type": "JUDGE",
          "object": "ThemeRiver of topic proportions",
          "basis": "implied",
          "quote": "ThemeRiver of topic proportions per lineage",
          "evidence_stated": true,
          "evidence_quote": "ThemeRiver of topic proportions per lineage",
          "criterion_stated": false,
          "criterion_quote": ""
        },
        {
          "type": "JUDGE",
          "object": "UMAP projection of community-window topic vectors",
          "basis": "implied",
          "quote": "UMAP projection of community-window topic vectors colored by lineage",
          "evidence_stated": true,
          "evidence_quote": "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"
      },
      "machine_action": {
        "present": true,
        "basis": "implied",
        "quote": "hovering a node shows top authors, keywords, and papers"
      },
      "control_acts": [
        {
          "type": "SELECT",
          "object": "a lineage or window",
          "basis": "implied",
          "quote": "Selecting a lineage or window",
          "evidence_stated": null,
          "evidence_quote": "",
          "criterion_stated": null,
          "criterion_quote": ""
        }
      ],
      "output": {
        "named": false,
        "quote": ""
      }
    },
    {
      "unit": "U8",
      "human_action": {
        "present": true,
        "basis": "implied",
        "quote": "check alignment with sub-conference labels and known historical events"
      },
      "machine_action": {
        "present": true,
        "basis": "implied",
        "quote": "run sensitivity analysis"
      },
      "control_acts": [
        {
          "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",
          "evidence_stated": true,
          "evidence_quote": "sub-conference labels and known historical events",
          "criterion_stated": true,
          "criterion_quote": "alignment with sub-conference labels and known historical events"
        }
      ],
      "output": {
        "named": false,
        "quote": ""
      }
    }
  ],
  "loops": [
    {
      "id": "L1",
      "units": [
        "U8"
      ],
      "cue_quote": "revisit window size, γ, or matching threshold; run sensitivity analysis (small multiples of storylines under varied parameters)",
      "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": "5-year windows",
      "unit": "U1",
      "tuned": false,
      "initial_value_stated": true,
      "range_or_rule_stated": false,
      "set_by": "unstated",
      "quote": "5-year windows",
      "detail_quote": "5-year windows"
    },
    {
      "id": "P2",
      "name": "1-year step",
      "unit": "U1",
      "tuned": false,
      "initial_value_stated": true,
      "range_or_rule_stated": false,
      "set_by": "unstated",
      "quote": "1-year step",
      "detail_quote": "1-year step"
    },
    {
      "id": "P3",
      "name": "resolution parameter γ",
      "unit": "U2",
      "tuned": false,
      "initial_value_stated": false,
      "range_or_rule_stated": false,
      "set_by": "unstated",
      "quote": "expose resolution parameter γ interactively",
      "detail_quote": ""
    },
    {
      "id": "P4",
      "name": "standard rules",
      "unit": "U3",
      "tuned": false,
      "initial_value_stated": true,
      "range_or_rule_stated": true,
      "set_by": "unstated",
      "quote": "Classify transitions with standard rules: birth, death, continuation, growth/shrink, merge (n->1), split (1->n)",
      "detail_quote": "birth, death, continuation, growth/shrink, merge (n->1), split (1->n)"
    },
    {
      "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; run sensitivity analysis (small multiples of storylines under varied parameters)",
      "detail_quote": ""
    }
  ],
  "branches": [
    {
      "id": "B1",
      "unit": "U8",
      "type": "FALLBACK",
      "outcomes_stated": true,
      "quote": "If misaligned, revisit window size, γ, or matching threshold; run sensitivity analysis"
    }
  ],
  "global_statements": [
    {
      "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": "C2",
      "scope": "ALL_UNITS",
      "quote": "parameters can be revised based on domain knowledge",
      "concrete": true
    },
    {
      "criterion": "C3",
      "scope": "ALL_UNITS",
      "quote": "the workflow is designed as an iterative, human-in-the-loop visual analytics pipeline",
      "concrete": false
    },
    {
      "criterion": "C6",
      "scope": "ALL_UNITS",
      "quote": "every algorithmic stage produces an intermediate artefact",
      "concrete": true
    }
  ],
  "uncertain": []
}
