{
  "title": "From local record to a downloaded handover",
  "subtitle": "Five software components. Each link names the information it carries.",
  "height": 1005,
  "width": 1000,
  "nodes": [
    {
      "id": "A",
      "kind": "source",
      "title": "Local static server",
      "body": "Serves the app at one stable local origin.",
      "x": 70,
      "y": 40,
      "origin": "human"
    },
    {
      "id": "B",
      "kind": "idea",
      "title": "Staff UI",
      "body": "Six fields; unresolved items appear first.",
      "x": 70,
      "y": 390,
      "origin": "human"
    },
    {
      "id": "C",
      "kind": "dataset",
      "title": "IndexedDB",
      "body": "Records stay in this browser’s storage.",
      "x": 678,
      "y": 390,
      "origin": "human"
    },
    {
      "id": "D",
      "kind": "idea",
      "title": "Exporter",
      "body": "Creates explicit JSON and CSV exports.",
      "x": 70,
      "y": 740,
      "origin": "human"
    },
    {
      "id": "E",
      "kind": "source",
      "title": "Local downloads",
      "body": "Downloaded files; in-app restore is out of scope.",
      "x": 678,
      "y": 740,
      "origin": "human"
    }
  ],
  "edges": [
    {
      "id": "A-B",
      "from": "A",
      "to": "B",
      "relation": "feeds-input",
      "annotation": "Static HTML, CSS and JavaScript",
      "labelX": 196,
      "labelY": 319,
      "channel": "flow",
      "fromPort": "out",
      "toPort": "in",
      "fromSide": "bottom",
      "toSide": "top",
      "canonicalLabel": null
    },
    {
      "id": "B-C",
      "from": "B",
      "to": "C",
      "relation": "feeds-input",
      "annotation": "Handover record and receipt state",
      "labelX": 500,
      "labelY": 494,
      "channel": "flow",
      "fromPort": "out",
      "toPort": "in",
      "canonicalLabel": null
    },
    {
      "id": "B-D",
      "from": "B",
      "to": "D",
      "relation": "feeds-input",
      "annotation": "Selected records for export",
      "labelX": 196,
      "labelY": 669,
      "channel": "flow",
      "fromPort": "out",
      "toPort": "in",
      "fromSide": "bottom",
      "toSide": "top",
      "canonicalLabel": null
    },
    {
      "id": "D-E",
      "from": "D",
      "to": "E",
      "relation": "transforms",
      "annotation": "Explicit JSON / CSV download",
      "labelX": 500,
      "labelY": 844,
      "channel": "flow",
      "fromPort": "out",
      "toPort": "in",
      "canonicalLabel": null
    }
  ],
  "provenance": {
    "authorship": "The API-authored Mermaid node names and topology are unchanged. Card roles, short context summaries, relation types, payload labels and presentation positions were authored later for the cookbook.",
    "canonical": {
      "path": "flow.mmd",
      "sha256": "8779d15ace234d3095daa91b9decf944390e4a26c92c0fdcd9fe289fa90c803d"
    },
    "context": {
      "path": "review-notes.md",
      "sha256": "beff0f19c1a237deee932be49e39bdc67794dc906c97255b523f00a6c78d0c1b"
    },
    "liveInvestigationNodeCount": 3,
    "separatePresentationDiagram": true
  }
}
