{
 "what": "The gallery's specimen: generated by site/gallery.py from release v0.1.0's vocabulary.",
 "packs": [
  "security"
 ],
 "storyboard": {
  "slug": "the-specimen",
  "title": "The specimen",
  "subtitle": "Every kind, setting and prop of this release, drawn by it.",
  "status": "built",
  "by": "site/gallery.py, generated",
  "rule": "Generated from the release's vocabulary; nothing here is a quote except the brief's line on the evidence panel.",
  "scenes": [
   {
    "kind": "cover",
    "title": "The specimen",
    "subtitle": "Every kind, setting and prop of this release, drawn by it.",
    "cast": [
     {
      "who": "ines",
      "pose": "wave",
      "mood": "happy"
     },
     {
      "who": "oto",
      "pose": "point",
      "mood": "excited"
     },
     {
      "who": "unit",
      "pose": "wave",
      "mood": "happy"
     }
    ],
    "note": "Generated by site/gallery.py from the vocabulary in this release's formats.js."
   },
   {
    "kind": "scene",
    "setting": "none",
    "caption": "setting: none",
    "cast": [
     {
      "who": "ines",
      "x": 0.3,
      "pose": "stand",
      "mood": "calm",
      "says": "\"setting\": \"none\"",
      "max": 20
     },
     {
      "who": "oto",
      "x": 0.72,
      "pose": "think",
      "mood": "thinking",
      "flip": true
     }
    ],
    "note": "The none background.",
    "source": "storyboard.js, setting()"
   },
   {
    "kind": "scene",
    "setting": "office",
    "caption": "setting: office",
    "cast": [
     {
      "who": "ines",
      "x": 0.3,
      "pose": "stand",
      "mood": "calm",
      "says": "\"setting\": \"office\"",
      "max": 20
     },
     {
      "who": "oto",
      "x": 0.72,
      "pose": "think",
      "mood": "thinking",
      "flip": true
     }
    ],
    "note": "The office background.",
    "source": "storyboard.js, setting()"
   },
   {
    "kind": "scene",
    "setting": "interview",
    "caption": "setting: interview",
    "cast": [
     {
      "who": "ines",
      "x": 0.3,
      "pose": "stand",
      "mood": "calm",
      "says": "\"setting\": \"interview\"",
      "max": 20
     },
     {
      "who": "oto",
      "x": 0.72,
      "pose": "think",
      "mood": "thinking",
      "flip": true
     }
    ],
    "note": "The interview background.",
    "source": "storyboard.js, setting()"
   },
   {
    "kind": "scene",
    "setting": "street",
    "caption": "setting: street",
    "cast": [
     {
      "who": "ines",
      "x": 0.3,
      "pose": "stand",
      "mood": "calm",
      "says": "\"setting\": \"street\"",
      "max": 20
     },
     {
      "who": "oto",
      "x": 0.72,
      "pose": "think",
      "mood": "thinking",
      "flip": true
     }
    ],
    "note": "The street background.",
    "source": "storyboard.js, setting()"
   },
   {
    "kind": "scene",
    "setting": "night",
    "caption": "setting: night",
    "cast": [
     {
      "who": "ines",
      "x": 0.3,
      "pose": "stand",
      "mood": "calm",
      "says": "\"setting\": \"night\"",
      "max": 20
     },
     {
      "who": "oto",
      "x": 0.72,
      "pose": "think",
      "mood": "thinking",
      "flip": true
     }
    ],
    "note": "The night background.",
    "source": "storyboard.js, setting()"
   },
   {
    "kind": "scene",
    "setting": "classroom",
    "caption": "setting: classroom",
    "cast": [
     {
      "who": "ines",
      "x": 0.3,
      "pose": "stand",
      "mood": "calm",
      "says": "\"setting\": \"classroom\"",
      "max": 20
     },
     {
      "who": "oto",
      "x": 0.72,
      "pose": "think",
      "mood": "thinking",
      "flip": true
     }
    ],
    "note": "The classroom background.",
    "source": "storyboard.js, setting()"
   },
   {
    "kind": "scene",
    "setting": "none",
    "caption": "core props: laptop, desk, book, board, phone, sign",
    "props": [
     {
      "kind": "laptop",
      "x": 0.1,
      "scale": 1.4
     },
     {
      "kind": "desk",
      "x": 0.26,
      "y": 700
     },
     {
      "kind": "book",
      "x": 0.42,
      "label": "v0.1.0",
      "y": 700,
      "scale": 1.3
     },
     {
      "kind": "board",
      "x": 0.58,
      "lines": [
       "drawn from",
       "data"
      ],
      "y": 860,
      "scale": 0.7
     },
     {
      "kind": "phone",
      "x": 0.74,
      "scale": 1.6
     },
     {
      "kind": "sign",
      "x": 0.9,
      "label": "a sign",
      "y": 640
     }
    ],
    "cast": [],
    "note": "Each prop is drawn from (x, y, scale) and its own fields; see the format page.",
    "source": "core props"
   },
   {
    "kind": "scene",
    "setting": "none",
    "caption": "the security pack: key, vault, qr, envelope, record, server",
    "props": [
     {
      "kind": "key",
      "x": 0.1,
      "label": "a key",
      "y": 620
     },
     {
      "kind": "vault",
      "x": 0.26,
      "label": "vault",
      "size": 0.55
     },
     {
      "kind": "qr",
      "x": 0.42,
      "text": "https://example.org",
      "size": 0.8,
      "y": 760
     },
     {
      "kind": "envelope",
      "x": 0.58,
      "label": "sealed",
      "y": 640
     },
     {
      "kind": "record",
      "x": 0.74,
      "lines": [
       "a record",
       "signed"
      ],
      "stamp": "signed",
      "y": 860
     },
     {
      "kind": "server",
      "x": 0.9,
      "label": "a server",
      "y": 860
     }
    ],
    "cast": [],
    "note": "Each prop is drawn from (x, y, scale) and its own fields; see the format page.",
    "source": "the security pack"
   },
   {
    "kind": "scene",
    "setting": "none",
    "caption": "the security pack: arrow, mark, calendar, terminal, phoneqr, padlock",
    "props": [
     {
      "kind": "arrow",
      "x": 0.04,
      "to": 0.16,
      "label": "an arrow",
      "y": 520
     },
     {
      "kind": "mark",
      "x": 0.26,
      "ok": true,
      "y": 620
     },
     {
      "kind": "calendar",
      "x": 0.42,
      "label": "20 Oct",
      "y": 640
     },
     {
      "kind": "terminal",
      "x": 0.58,
      "lines": [
       "$ sgit status",
       "clean"
      ],
      "y": 860
     },
     {
      "kind": "phoneqr",
      "x": 0.74,
      "text": "https://example.org",
      "y": 760
     },
     {
      "kind": "padlock",
      "x": 0.9,
      "open": false,
      "y": 640
     }
    ],
    "cast": [],
    "note": "Each prop is drawn from (x, y, scale) and its own fields; see the format page.",
    "source": "the security pack"
   },
   {
    "kind": "evidence",
    "setting": "none",
    "caption": "evidence: a quote",
    "cast": [
     {
      "who": "ines",
      "x": 0.2,
      "pose": "point",
      "mood": "determined"
     }
    ],
    "evidence": {
     "quote": "Every version is immutable. I think that's important.",
     "source": "the brief, 20 October 2026"
    },
    "note": "evidence.quote and evidence.source.",
    "source": "the brief"
   },
   {
    "kind": "evidence",
    "setting": "none",
    "caption": "evidence: bars",
    "cast": [
     {
      "who": "unit",
      "x": 0.2,
      "pose": "think",
      "mood": "thinking"
     }
    ],
    "evidence": {
     "title": "This release, kilobytes by file",
     "bars": [
      {
       "label": "storyboard.js",
       "value": 68,
       "shown": "68 KB"
      },
      {
       "label": "fonts",
       "value": 84,
       "shown": "84 KB"
      },
      {
       "label": "rough.js",
       "value": 28,
       "shown": "28 KB"
      },
      {
       "label": "the rest",
       "value": 54,
       "shown": "54 KB",
       "colour": "#7c3aed"
      }
     ]
    },
    "note": "evidence.bars: label, value, shown, colour.",
    "source": "this release's manifest.json, rounded"
   },
   {
    "kind": "spectrum",
    "setting": "none",
    "caption": "spectrum",
    "stops": [
     {
      "label": "patch",
      "note": "a fix",
      "colour": "#bbf7d0"
     },
     {
      "label": "minor",
      "note": "something new",
      "colour": "#fde68a"
     },
     {
      "label": "major",
      "note": "a break, from the last good release",
      "colour": "#fecaca"
     }
    ],
    "cast": [
     {
      "who": "oto",
      "x": 0.5,
      "pose": "shrug",
      "mood": "confused"
     }
    ],
    "note": "stops: label, note, colour, badge.",
    "source": "docs/versioning"
   },
   {
    "kind": "map",
    "caption": "map (a Wardley map, axis wardley)",
    "map": {
     "axis": "wardley",
     "nodes": [
      {
       "id": "reader",
       "label": "a reader",
       "x": 0.55,
       "y": 0.0,
       "anchor": true
      },
      {
       "id": "panel",
       "label": "a panel",
       "x": 0.42,
       "y": 0.22
      },
      {
       "id": "kit",
       "label": "the kit",
       "x": 0.5,
       "y": 0.5,
       "highlight": true
      },
      {
       "id": "rough",
       "label": "Rough.js",
       "x": 0.72,
       "y": 0.72
      },
      {
       "id": "svg",
       "label": "SVG",
       "x": 0.92,
       "y": 0.92
      }
     ],
     "links": [
      [
       "reader",
       "panel"
      ],
      [
       "panel",
       "kit"
      ],
      [
       "kit",
       "rough"
      ],
      [
       "rough",
       "svg"
      ]
     ],
     "moves": [
      {
       "from": "kit",
       "to": 0.7,
       "label": "an API"
      }
     ]
    },
    "note": "map: axis, nodes (x evolution, y visibility), links, moves.",
    "source": "storyboard.js, drawMap()"
   },
   {
    "kind": "graph",
    "caption": "graph",
    "graph": {
     "nodes": [
      {
       "id": "json",
       "label": "storyboard.json",
       "x": 0.1,
       "y": 0.2
      },
      {
       "id": "kit",
       "label": "storyboard.js",
       "x": 0.45,
       "y": 0.2
      },
      {
       "id": "panel",
       "label": "a panel",
       "x": 0.85,
       "y": 0.2
      },
      {
       "id": "formats",
       "label": "formats.js",
       "x": 0.3,
       "y": 0.75
      },
      {
       "id": "md",
       "label": "index.md",
       "x": 0.6,
       "y": 0.75
      },
      {
       "id": "graph",
       "label": "graph.json",
       "x": 0.9,
       "y": 0.75
      }
     ],
     "edges": [
      {
       "from": "json",
       "to": "kit",
       "label": "drawn by"
      },
      {
       "from": "kit",
       "to": "panel"
      },
      {
       "from": "json",
       "to": "formats",
       "label": "read by"
      },
      {
       "from": "formats",
       "to": "md"
      },
      {
       "from": "formats",
       "to": "graph"
      }
     ],
     "groups": [
      {
       "id": "g1",
       "label": "in the browser",
       "nodes": [
        "kit",
        "panel"
       ]
      }
     ],
     "path": [
      "json",
      "kit",
      "panel"
     ]
    },
    "note": "graph: nodes, edges, groups, path; style 'detective' for the cork board.",
    "source": "storyboard.js, drawGraph()"
   },
   {
    "kind": "graph",
    "caption": "graph, style detective",
    "graph": {
     "style": "detective",
     "nodes": [
      {
       "id": "a",
       "label": "a byte moved",
       "x": 0.15,
       "y": 0.2,
       "colour": "#fecaca"
      },
      {
       "id": "b",
       "label": "release check",
       "x": 0.5,
       "y": 0.15
      },
      {
       "id": "c",
       "label": "the hook",
       "x": 0.85,
       "y": 0.3
      },
      {
       "id": "d",
       "label": "the agent",
       "x": 0.35,
       "y": 0.75,
       "kind": "person"
      },
      {
       "id": "e",
       "label": "v0.1.1",
       "x": 0.75,
       "y": 0.75
      }
     ],
     "edges": [
      {
       "from": "a",
       "to": "b",
       "label": "caught by"
      },
      {
       "from": "d",
       "to": "c",
       "label": "stopped by"
      },
      {
       "from": "d",
       "to": "e",
       "label": "cuts"
      }
     ],
     "path": [
      "d",
      "e"
     ]
    },
    "note": "The whodunit board.",
    "source": "storyboard.js, drawGraph()"
   },
   {
    "kind": "punchline",
    "setting": "none",
    "punchline": "Same data, same seed, same panel.",
    "cast": [
     {
      "who": "ines",
      "x": 0.15,
      "pose": "arms-up",
      "mood": "excited"
     },
     {
      "who": "unit",
      "x": 0.85,
      "pose": "wave",
      "mood": "happy",
      "flip": true
     }
    ],
    "note": "punchline: the big line, underlined.",
    "source": "storyboard.js, drawScene()"
   }
  ]
 },
 "cast": {
  "what": "The specimen cast: three fictional characters that exist only to show the drawing. Not a storyboard's cast.",
  "characters": [
   {
    "id": "ines",
    "name": "Ines",
    "kind": "human",
    "pronouns": "they/them",
    "role": "the specimen: a person with glasses and a lanyard-free shirt",
    "stands_for": "nobody; a test figure",
    "personality": "patient",
    "wants": "to be drawn the same way twice",
    "fears": "an unseeded random",
    "line": "Same seed, same me.",
    "look": {
     "skin": "#c68642",
     "hair": "long",
     "hairColour": "#2b1d14",
     "shirt": "#0f766e",
     "trousers": "#1f2937",
     "accessory": "glasses",
     "height": 1.0
    }
   },
   {
    "id": "oto",
    "name": "Oto",
    "kind": "human",
    "pronouns": "they/them",
    "role": "the second specimen: headphones and a beanie",
    "stands_for": "nobody; a test figure",
    "personality": "curious",
    "wants": "every pose",
    "fears": "a pose the kit does not know",
    "line": "Which way do I face?",
    "look": {
     "skin": "#f1c27d",
     "hair": "beanie",
     "hatColour": "#b91c1c",
     "hairColour": "#111827",
     "shirt": "#7c3aed",
     "trousers": "#334155",
     "accessory": "headphones",
     "accentColour": "#f59e0b",
     "height": 0.96
    }
   },
   {
    "id": "unit",
    "name": "Unit",
    "kind": "agent",
    "pronouns": "it/its",
    "role": "the specimen agent",
    "stands_for": "nobody; a test figure",
    "personality": "literal",
    "wants": "valid JSON",
    "fears": "an unknown kind",
    "line": "Validated.",
    "look": {
     "colour": "#1d4ed8"
    }
   }
  ]
 }
}
