{
 "format": "topoforge",
 "version": 1,
 "name": "Process: a GNU release, uploaded as a triplet (Flowchart)",
 "settings": {
  "grid": 20,
  "snap": true,
  "showGrid": true,
  "guides": true,
  "netLabels": true,
  "ifLabels": true,
  "minimap": true,
  "defaultRoute": "orthogonal"
 },
 "pages": [
  {
   "id": "page-process-gnu-upload",
   "name": "Process: a GNU release, uploaded as a triplet (Flowchart)",
   "layers": [
    {
     "id": "words",
     "name": "Words: titles and notes",
     "visible": true,
     "locked": false
    },
    {
     "id": "abstract",
     "name": "Abstract: people and ideas",
     "visible": true,
     "locked": false
    },
    {
     "id": "operational",
     "name": "Operational: projects, parts and paths",
     "visible": true,
     "locked": false
    },
    {
     "id": "physical",
     "name": "Physical: hosts and screens",
     "visible": true,
     "locked": false
    },
    {
     "id": "flow",
     "name": "Flow: how it works, step by step",
     "visible": true,
     "locked": false
    }
   ],
   "activeLayer": "operational",
   "nodes": [
    {
     "id": "process-gnu-upload-title",
     "type": "text",
     "x": 0,
     "y": -170,
     "w": 1400,
     "h": 130,
     "text": "How a GNU maintainer publishes a release: three files, two signatures, one robot.\nRead as Flowchart: start, step, decision, input/output, end. The same process as a file in BPMN \u00b7 BPMN+: on corwin.cloud's home page, under the drawing.\nDrawn 2026-11-01 from the GNU Maintainers guide, section 12.6.4, FTP Upload Directive File (gnu.org/prep/maintain).\nMade by: The process is the GNU Project's; drawn by Corwin, a GNU volunteer.",
     "layer": "words",
     "parent": null,
     "props": {},
     "data": {
      "tf_ref": "process-gnu-upload-title"
     },
     "style": {}
    },
    {
     "id": "process-gnu-upload-lane-maint",
     "type": "zone",
     "x": 0,
     "y": 0,
     "w": 1820,
     "h": 150,
     "text": "The maintainer",
     "layer": "flow",
     "parent": null,
     "props": {},
     "data": {
      "tf_ref": "process-gnu-upload-lane-maint",
      "element": "lane",
      "read as": "group (a flowchart has no lanes)",
      "notation": "Flowchart",
      "notations from": "topology's www/js/topology-core.js",
      "as BPMN": "zone",
      "as BPMN+": "zone",
      "as Flowchart": "zone"
     },
     "style": {}
    },
    {
     "id": "process-gnu-upload-lane-robot",
     "type": "zone",
     "x": 0,
     "y": 170,
     "w": 1820,
     "h": 260,
     "text": "GNU's upload server (ftp-upload.gnu.org)",
     "layer": "flow",
     "parent": null,
     "props": {},
     "data": {
      "tf_ref": "process-gnu-upload-lane-robot",
      "element": "lane",
      "read as": "group (a flowchart has no lanes)",
      "notation": "Flowchart",
      "notations from": "topology's www/js/topology-core.js",
      "as BPMN": "zone",
      "as BPMN+": "zone",
      "as Flowchart": "zone"
     },
     "style": {}
    },
    {
     "id": "process-gnu-upload-lane-ftp",
     "type": "zone",
     "x": 0,
     "y": 450,
     "w": 1820,
     "h": 150,
     "text": "ftp.gnu.org and its mirrors",
     "layer": "flow",
     "parent": null,
     "props": {},
     "data": {
      "tf_ref": "process-gnu-upload-lane-ftp",
      "element": "lane",
      "read as": "group (a flowchart has no lanes)",
      "notation": "Flowchart",
      "notations from": "topology's www/js/topology-core.js",
      "as BPMN": "zone",
      "as BPMN+": "zone",
      "as Flowchart": "zone"
     },
     "style": {}
    },
    {
     "id": "process-gnu-upload-ready",
     "type": "ellipse",
     "x": 235,
     "y": 40,
     "w": 160,
     "h": 80,
     "text": "A release is\nready: foo-1.0.tar.gz",
     "layer": "flow",
     "parent": "process-gnu-upload-lane-maint",
     "props": {},
     "data": {
      "tf_ref": "process-gnu-upload-ready",
      "element": "event",
      "read as": "start",
      "notation": "Flowchart",
      "notations from": "topology's www/js/topology-core.js",
      "as BPMN": "ellipse",
      "as BPMN+": "ellipse",
      "as Flowchart": "ellipse"
     },
     "style": {}
    },
    {
     "id": "process-gnu-upload-sig",
     "type": "rect",
     "x": 460,
     "y": 40,
     "w": 170,
     "h": 90,
     "text": "Sign it, detached:\nfoo-1.0.tar.gz.sig",
     "layer": "flow",
     "parent": "process-gnu-upload-lane-maint",
     "props": {},
     "data": {
      "tf_ref": "process-gnu-upload-sig",
      "element": "task",
      "act": "describe",
      "read as": "step",
      "notation": "Flowchart",
      "notations from": "topology's www/js/topology-core.js",
      "as BPMN": "rounded",
      "as BPMN+": "rect",
      "as Flowchart": "rect"
     },
     "style": {}
    },
    {
     "id": "process-gnu-upload-dir",
     "type": "parallelogram",
     "x": 690,
     "y": 40,
     "w": 170,
     "h": 90,
     "text": "The directive:\nversion: 1.2\ndirectory: foo\nfilename: foo-1.0.tar.gz",
     "layer": "flow",
     "parent": "process-gnu-upload-lane-maint",
     "props": {},
     "data": {
      "tf_ref": "process-gnu-upload-dir",
      "element": "data",
      "read as": "io",
      "notation": "Flowchart",
      "notations from": "topology's www/js/topology-core.js",
      "as BPMN": "parallelogram",
      "as BPMN+": "parallelogram",
      "as Flowchart": "parallelogram"
     },
     "style": {}
    },
    {
     "id": "process-gnu-upload-clear",
     "type": "rect",
     "x": 920,
     "y": 40,
     "w": 170,
     "h": 90,
     "text": "Clearsign it:\nfoo-1.0.tar.gz\n.directive.asc",
     "layer": "flow",
     "parent": "process-gnu-upload-lane-maint",
     "props": {},
     "data": {
      "tf_ref": "process-gnu-upload-clear",
      "element": "task",
      "act": "propose",
      "read as": "step",
      "notation": "Flowchart",
      "notations from": "topology's www/js/topology-core.js",
      "as BPMN": "rounded",
      "as BPMN+": "hexagon",
      "as Flowchart": "rect"
     },
     "style": {}
    },
    {
     "id": "process-gnu-upload-up",
     "type": "rect",
     "x": 1150,
     "y": 40,
     "w": 170,
     "h": 90,
     "text": "Upload the three\nby anonymous FTP\nto /incoming/ftp",
     "layer": "flow",
     "parent": "process-gnu-upload-lane-maint",
     "props": {},
     "data": {
      "tf_ref": "process-gnu-upload-up",
      "element": "task",
      "act": "go",
      "read as": "step",
      "notation": "Flowchart",
      "notations from": "topology's www/js/topology-core.js",
      "as BPMN": "rounded",
      "as BPMN+": "user",
      "as Flowchart": "rect"
     },
     "style": {}
    },
    {
     "id": "process-gnu-upload-auth",
     "type": "diamond",
     "x": 1150,
     "y": 210,
     "w": 170,
     "h": 120,
     "text": "Do both signatures\nverify against a\nregistered key?",
     "layer": "flow",
     "parent": "process-gnu-upload-lane-robot",
     "props": {},
     "data": {
      "tf_ref": "process-gnu-upload-auth",
      "element": "gateway",
      "read as": "decision",
      "notation": "Flowchart",
      "notations from": "topology's www/js/topology-core.js",
      "as BPMN": "diamond",
      "as BPMN+": "diamond",
      "as Flowchart": "diamond"
     },
     "style": {}
    },
    {
     "id": "process-gnu-upload-no",
     "type": "ellipse",
     "x": 1385,
     "y": 320,
     "w": 160,
     "h": 80,
     "text": "Not published: register\nthe key with the\nadministrators",
     "layer": "flow",
     "parent": "process-gnu-upload-lane-robot",
     "props": {},
     "data": {
      "tf_ref": "process-gnu-upload-no",
      "element": "event (end)",
      "read as": "end",
      "notation": "Flowchart",
      "notations from": "topology's www/js/topology-core.js",
      "as BPMN": "ellipse",
      "as BPMN+": "ellipse",
      "as Flowchart": "ellipse"
     },
     "style": {}
    },
    {
     "id": "process-gnu-upload-place",
     "type": "rect",
     "x": 1380,
     "y": 210,
     "w": 170,
     "h": 90,
     "text": "Place the file and\nits .sig in gnu/foo/",
     "layer": "flow",
     "parent": "process-gnu-upload-lane-robot",
     "props": {},
     "data": {
      "tf_ref": "process-gnu-upload-place",
      "element": "task",
      "act": "effect",
      "read as": "step",
      "notation": "Flowchart",
      "notations from": "topology's www/js/topology-core.js",
      "as BPMN": "rounded",
      "as BPMN+": "triangle",
      "as Flowchart": "rect"
     },
     "style": {}
    },
    {
     "id": "process-gnu-upload-out",
     "type": "parallelogram",
     "x": 1380,
     "y": 490,
     "w": 170,
     "h": 90,
     "text": "ftp.gnu.org/gnu/foo/\nfoo-1.0.tar.gz\nand .sig",
     "layer": "flow",
     "parent": "process-gnu-upload-lane-ftp",
     "props": {},
     "data": {
      "tf_ref": "process-gnu-upload-out",
      "element": "data",
      "read as": "io",
      "notation": "Flowchart",
      "notations from": "topology's www/js/topology-core.js",
      "as BPMN": "parallelogram",
      "as BPMN+": "parallelogram",
      "as Flowchart": "parallelogram"
     },
     "style": {}
    },
    {
     "id": "process-gnu-upload-mirrors",
     "type": "ellipse",
     "x": 1615,
     "y": 490,
     "w": 160,
     "h": 80,
     "text": "Available from\nftp.gnu.org and\nthe mirrors",
     "layer": "flow",
     "parent": "process-gnu-upload-lane-ftp",
     "props": {},
     "data": {
      "tf_ref": "process-gnu-upload-mirrors",
      "element": "event (end)",
      "read as": "end",
      "notation": "Flowchart",
      "notations from": "topology's www/js/topology-core.js",
      "as BPMN": "ellipse",
      "as BPMN+": "ellipse",
      "as Flowchart": "ellipse"
     },
     "style": {}
    }
   ],
   "links": [
    {
     "id": "process-gnu-upload-l1",
     "a": {
      "id": "process-gnu-upload-ready",
      "port": null
     },
     "b": {
      "id": "process-gnu-upload-sig",
      "port": null
     },
     "route": "orthogonal",
     "text": "",
     "layer": "flow",
     "arrows": "end",
     "props": {},
     "style": {},
     "data": {
      "tf_ref": "process-gnu-upload-l1"
     }
    },
    {
     "id": "process-gnu-upload-l2",
     "a": {
      "id": "process-gnu-upload-sig",
      "port": null
     },
     "b": {
      "id": "process-gnu-upload-dir",
      "port": null
     },
     "route": "orthogonal",
     "text": "",
     "layer": "flow",
     "arrows": "end",
     "props": {},
     "style": {},
     "data": {
      "tf_ref": "process-gnu-upload-l2"
     }
    },
    {
     "id": "process-gnu-upload-l3",
     "a": {
      "id": "process-gnu-upload-dir",
      "port": null
     },
     "b": {
      "id": "process-gnu-upload-clear",
      "port": null
     },
     "route": "orthogonal",
     "text": "",
     "layer": "flow",
     "arrows": "end",
     "props": {},
     "style": {},
     "data": {
      "tf_ref": "process-gnu-upload-l3"
     }
    },
    {
     "id": "process-gnu-upload-l4",
     "a": {
      "id": "process-gnu-upload-clear",
      "port": null
     },
     "b": {
      "id": "process-gnu-upload-up",
      "port": null
     },
     "route": "orthogonal",
     "text": "",
     "layer": "flow",
     "arrows": "end",
     "props": {},
     "style": {},
     "data": {
      "tf_ref": "process-gnu-upload-l4"
     }
    },
    {
     "id": "process-gnu-upload-l5",
     "a": {
      "id": "process-gnu-upload-up",
      "port": null
     },
     "b": {
      "id": "process-gnu-upload-auth",
      "port": null
     },
     "route": "orthogonal",
     "text": "the triplet",
     "layer": "flow",
     "arrows": "end",
     "props": {},
     "style": {},
     "data": {
      "tf_ref": "process-gnu-upload-l5"
     }
    },
    {
     "id": "process-gnu-upload-l6",
     "a": {
      "id": "process-gnu-upload-auth",
      "port": null
     },
     "b": {
      "id": "process-gnu-upload-no",
      "port": null
     },
     "route": "orthogonal",
     "text": "no",
     "layer": "flow",
     "arrows": "end",
     "props": {},
     "style": {},
     "data": {
      "tf_ref": "process-gnu-upload-l6"
     }
    },
    {
     "id": "process-gnu-upload-l7",
     "a": {
      "id": "process-gnu-upload-auth",
      "port": null
     },
     "b": {
      "id": "process-gnu-upload-place",
      "port": null
     },
     "route": "orthogonal",
     "text": "yes",
     "layer": "flow",
     "arrows": "end",
     "props": {},
     "style": {},
     "data": {
      "tf_ref": "process-gnu-upload-l7"
     }
    },
    {
     "id": "process-gnu-upload-l8",
     "a": {
      "id": "process-gnu-upload-place",
      "port": null
     },
     "b": {
      "id": "process-gnu-upload-out",
      "port": null
     },
     "route": "orthogonal",
     "text": "",
     "layer": "flow",
     "arrows": "end",
     "props": {},
     "style": {},
     "data": {
      "tf_ref": "process-gnu-upload-l8"
     }
    },
    {
     "id": "process-gnu-upload-l9",
     "a": {
      "id": "process-gnu-upload-out",
      "port": null
     },
     "b": {
      "id": "process-gnu-upload-mirrors",
      "port": null
     },
     "route": "orthogonal",
     "text": "",
     "layer": "flow",
     "arrows": "end",
     "props": {},
     "style": {},
     "data": {
      "tf_ref": "process-gnu-upload-l9"
     }
    }
   ]
  }
 ],
 "cur": 0
}