{
  "version": 1,
  "language": "en",
  "title": "Memory read before update",
  "description": "Vision V encodes the observation as z_t. Controller C reads z_t and recurrent memory h_t to select a_t. The environment uses a_t for execution. Memory M uses a_t, z_t and h_t to calculate h_(t+1). These two operations can occur in parallel. Controller C does not read the predicted next visual code directly.",
  "caption": "In the classic V–M–C design, the controller reads current visual code z_t and memory h_t to select a_t. The recurrent memory then updates from z_t and a_t. The controller does not directly receive the memory model's next-code prediction. Author-created explanatory diagram. Playback time is illustrative and is not measured runtime.",
  "alt": "V–M–C flow: visual code and recurrent memory select actions, and memory updates occur independently of environment execution.",
  "sources": [
    {
      "path": "content/blog/2026-06-09_world-models-for-embodied-ai/post.md",
      "description": "Article mechanism and retained citations"
    },
    "https://worldmodels.github.io/"
  ],
  "limitations": [
    "This playback is an example. Playback duration is not measured runtime.",
    "Environment execution and memory update use the same action. Their positions are not a mandatory hardware schedule.",
    "The recurrent cache is different from a prediction of the next visual code."
  ],
  "targets": {
    "observation": {
      "id": "mechanism-observation",
      "kind": "node",
      "label": "Observation"
    },
    "vision": {
      "id": "mechanism-vision",
      "kind": "node",
      "label": "Vision V"
    },
    "controller": {
      "id": "mechanism-controller",
      "kind": "node",
      "label": "Controller C"
    },
    "environment": {
      "id": "mechanism-environment",
      "kind": "node",
      "label": "Environment"
    },
    "cache": {
      "id": "mechanism-cache",
      "kind": "node",
      "label": "Memory now"
    },
    "memory": {
      "id": "mechanism-memory",
      "kind": "node",
      "label": "Memory M"
    },
    "nextCache": {
      "id": "mechanism-nextCache",
      "kind": "node",
      "label": "Memory next"
    },
    "encode": {
      "id": "mechanism-encode",
      "kind": "edge",
      "label": "encode observation"
    },
    "latentRead": {
      "id": "mechanism-latentRead",
      "kind": "edge",
      "label": "read visual code"
    },
    "cacheRead": {
      "id": "mechanism-cacheRead",
      "kind": "edge",
      "label": "read memory"
    },
    "actionExecute": {
      "id": "mechanism-actionExecute",
      "kind": "edge",
      "label": "do action"
    },
    "latentUpdate": {
      "id": "mechanism-latentUpdate",
      "kind": "edge",
      "label": "supply visual code"
    },
    "actionUpdate": {
      "id": "mechanism-actionUpdate",
      "kind": "edge",
      "label": "supply action"
    },
    "cacheUpdate": {
      "id": "mechanism-cacheUpdate",
      "kind": "edge",
      "label": "supply current memory"
    },
    "memoryNext": {
      "id": "mechanism-memoryNext",
      "kind": "edge",
      "label": "store next memory"
    },
    "nextObservation": {
      "id": "mechanism-nextObservation",
      "kind": "edge",
      "label": "read observations"
    },
    "carryCache": {
      "id": "mechanism-carryCache",
      "kind": "edge",
      "label": "use next memory"
    }
  },
  "stateLabels": {
    "stage": "Stage",
    "artifact": "Artifact"
  },
  "scenarios": [
    {
      "id": "process",
      "title": "One observation/action/memory step",
      "description": "This trace separates the controller's memory read from the recurrent update.",
      "initial": {
        "stage": "Ready",
        "artifact": "Inputs available"
      },
      "unselected": [],
      "steps": [
        {
          "title": "Observation and memory inputs",
          "description": "The system reads o_t and the recurrent memory h_t.",
          "duration": 3000,
          "active": [
            "observation",
            "cache"
          ],
          "paths": [],
          "state": {
            "stage": "Observation and memory inputs",
            "artifact": "o_t and h_t available"
          }
        },
        {
          "title": "Observation encoding",
          "description": "Vision V encodes the observation as z_t.",
          "duration": 3000,
          "active": [
            "vision"
          ],
          "paths": [
            "encode"
          ],
          "state": {
            "stage": "Observation encoding",
            "artifact": "Visual code z_t"
          }
        },
        {
          "title": "Action selection",
          "description": "Controller C selects a_t from z_t and h_t.",
          "duration": 3000,
          "active": [
            "controller"
          ],
          "paths": [
            "latentRead",
            "cacheRead"
          ],
          "state": {
            "stage": "Action selection",
            "artifact": "a_t selected from [z_t, h_t]"
          }
        },
        {
          "title": "Execution and memory update",
          "description": "The environment and Memory M use the same a_t. Their operations can occur in parallel.",
          "duration": 3000,
          "active": [
            "environment",
            "memory"
          ],
          "paths": [
            "actionExecute",
            "latentUpdate",
            "actionUpdate",
            "cacheUpdate"
          ],
          "state": {
            "stage": "Execution and memory update",
            "artifact": "The environment and memory model use the same a_t."
          }
        },
        {
          "title": "Next recurrent memory",
          "description": "Memory M stores h_(t+1) for the next timestep.",
          "duration": 3000,
          "active": [
            "nextCache"
          ],
          "paths": [
            "memoryNext"
          ],
          "state": {
            "stage": "Next recurrent memory",
            "artifact": "h_(t+1) available for the next timestep"
          }
        },
        {
          "title": "New observation and memory",
          "description": "The next step receives a new observation and h_(t+1). Next-action selection is not part of this step.",
          "duration": 3000,
          "active": [
            "observation",
            "cache"
          ],
          "paths": [
            "nextObservation",
            "carryCache"
          ],
          "state": {
            "stage": "New observation and memory",
            "artifact": "New observation and h_(t+1). No next action in this step"
          }
        }
      ]
    }
  ]
}
