{
  "schemaVersion": 1,
  "lessonId": "operations-04",
  "contentHash": "e4af015be92bf0b2b6ccb5343222cd5de15b9dbdef7fbc0df0a5e892c717717c",
  "rendererHash": "a1bd5b648f4731ae5d5f0a24811c2540d1a0a132149ce589d17c4113509cbedf",
  "kind": "executed",
  "generatedAt": "2026-10-20T10:47:09.407572+00:00",
  "provenance": "recorded_cpu_computation",
  "environment": {
    "backend": "cpu",
    "deviceCount": 1,
    "jax": "0.9.2",
    "numpy": "2.4.4",
    "matplotlib": "3.10.8"
  },
  "stdout": "first / second content IDs: 810b956e3376228ff3c1f03f469feb3ab26653b488ba51271e82277672590b80 aed1378a7842598237e59c5d189b13d486068b6284d9c1ca3d4e865866ba6990\nfailed gate kept selection: True rollback restored first: True\n",
  "data": {
    "kind": "bar",
    "labels": [
      "activate A",
      "publish B",
      "activate B",
      "reject candidate",
      "rollback"
    ],
    "xlabel": "executed local operation",
    "ylabel": "selected artifact code: 1=A, 2=B",
    "series": [
      {
        "label": "observed active pointer",
        "y": [
          1,
          1,
          2,
          2,
          1
        ]
      }
    ]
  },
  "diagram": {
    "title": "Rejected candidates do not become active",
    "prediction": "Should a rejected candidate change the active artifact pointer?",
    "reading": "Candidate B can exist while A remains active. Only the passing branch permits activation under the policy; failure keeps A selected. Letters identify artifacts, not scores. Preserve compatible processor and configuration identities with the selected model.",
    "alt": "Candidate B can exist while A remains active. Only the passing branch permits activation under the policy; failure keeps A selected. Letters identify artifacts, not scores. Preserve compatible processor and configuration identities with the selected model.",
    "scope": "Architecture and dataflow mechanism diagram.",
    "height": 6.3,
    "panel": {
      "kind": "graph",
      "nodes": [
        {
          "id": "candidate",
          "x": 5,
          "y": 1,
          "label": "Candidate B published",
          "tone": "data",
          "w": 5,
          "h": 0.85
        },
        {
          "id": "gate",
          "x": 5,
          "y": 2.8,
          "label": "Evaluate immutable B + config",
          "tone": "state",
          "w": 6,
          "h": 0.85
        },
        {
          "id": "pass",
          "x": 2.7,
          "y": 4.8,
          "label": "Gate passes",
          "tone": "result",
          "w": 3.5,
          "h": 0.85
        },
        {
          "id": "fail",
          "x": 7.3,
          "y": 4.8,
          "label": "Gate fails",
          "tone": "warning",
          "w": 3.5,
          "h": 0.85
        },
        {
          "id": "activeb",
          "x": 2.7,
          "y": 6.8,
          "label": "Activate qualified B",
          "tone": "result",
          "w": 4,
          "h": 0.85
        },
        {
          "id": "activea",
          "x": 7.3,
          "y": 6.8,
          "label": "Keep active A",
          "tone": "fixed",
          "w": 4,
          "h": 0.85
        }
      ],
      "edges": [
        {
          "from": "candidate",
          "to": "gate"
        },
        {
          "from": "gate",
          "to": "pass"
        },
        {
          "from": "gate",
          "to": "fail"
        },
        {
          "from": "pass",
          "to": "activeb"
        },
        {
          "from": "fail",
          "to": "activea"
        }
      ],
      "height": 8,
      "width": 10
    }
  }
}
