{
  "rfc": "0002-linear-gpu-ui",
  "title": "Linear GPU then UI measure",
  "version": "1",
  "chain": "linear",
  "never_exit": true,
  "ride": "BGF",
  "ground": "BGS",
  "wbs": { "value": 1, "name": "Web BGS" },
  "wbf": { "value": 0, "name": "Web BGF" },
  "sdf_between": { "role": "Host↔SPV↔GPU boundary" },
  "push_constants_schema": {
    "seed": "u32",
    "step": "u32",
    "wbf": "i32",
    "wbs": "i32",
    "radius": "f32",
    "max_steps": "u32",
    "handoff_field": "i32",
    "handoff_free": "u32"
  },
  "steps": [
    {
      "i": 0,
      "kind": "SPV",
      "plug": "raymarch",
      "socket": "gpu.compute",
      "push": { "seed": 7, "radius": 0.55, "max_steps": 64 },
      "end": "SDF_OUT"
    },
    {
      "i": 1,
      "kind": "SDF_OUT",
      "next": 2
    },
    {
      "i": 2,
      "kind": "SPV",
      "plug": "measure",
      "socket": "ui.stage",
      "push": { "seed": 7 },
      "end": "SDF_OUT"
    },
    {
      "i": 3,
      "kind": "SDF_OUT",
      "next": 0,
      "note": "loop GPU→UI forever · never exit"
    }
  ]
}
