{
  "version": 1,
  "language": "en",
  "title": "Permission checks before robot motion",
  "description": "A robot-use agent makes a request. Permission checks give permission for local execution or give a rejection. Compare the recovery loop with the rejected-request scenario. The recovery loop uses fresh observations. The rejected request never moves the robot.",
  "caption": "The author made this runtime synthesis. Requests with permission run locally and supply checked outcomes. Rejected requests stop before motion. Requests A/B and outcomes are constructed examples, not robot measurements or a full safety architecture. Playback time is not control latency.",
  "alt": "Robot-use flow does permission checks before local execution and supplies verified outcomes, and rejected requests stop before motion.",
  "targets": {
    "observe": {
      "id": "flow-observe",
      "kind": "node",
      "label": "Read state"
    },
    "propose": {
      "id": "flow-propose",
      "kind": "node",
      "label": "Make a proposal"
    },
    "authorize": {
      "id": "flow-authorize",
      "kind": "node",
      "label": "Permission"
    },
    "verify": {
      "id": "flow-verify",
      "kind": "node",
      "label": "Verify the outcome"
    },
    "execute": {
      "id": "flow-execute",
      "kind": "node",
      "label": "Local execution"
    },
    "blocked": {
      "id": "flow-blocked",
      "kind": "node",
      "label": "Do not execute"
    },
    "observation": {
      "id": "flow-observation",
      "kind": "edge",
      "label": "observation"
    },
    "request": {
      "id": "flow-request",
      "kind": "edge",
      "label": "request"
    },
    "allowed": {
      "id": "flow-allowed",
      "kind": "edge",
      "label": "yes"
    },
    "denied": {
      "id": "flow-denied",
      "kind": "edge",
      "label": "no"
    },
    "evidence": {
      "id": "flow-evidence",
      "kind": "edge",
      "label": "Supply the result"
    },
    "refresh": {
      "id": "flow-refresh",
      "kind": "edge",
      "label": "New observation"
    }
  },
  "stateLabels": {
    "cycle": "Runtime cycle",
    "proposal": "Tool request",
    "authorization": "Authorization",
    "executions": "Executed requests",
    "evidence": "Observed outcome",
    "result": "Task status"
  },
  "sources": [
    {
      "file": "/Users/jiwenbo/Documents/GitHub/blog/content/blog/2026-09-08_robot-use-agents/post.md",
      "sha256": "d54b1e5d9fae4c28d77ca81899abf5ae42bbdf6dc70f067b20681e427851ebf6"
    }
  ],
  "limitations": [
    "Request identities and outcomes are examples, not measured robot trials.",
    "No physical robot is controlled. Playback time is not control latency.",
    "Local protection is necessary with the gate."
  ],
  "scenarios": [
    {
      "id": "reobserve-success",
      "title": "Recovery and success example",
      "description": "The example has two permitted requests. Examine fresh evidence between attempts.",
      "initial": {
        "cycle": "0",
        "proposal": "No proposal",
        "authorization": "No permission check",
        "executions": "0",
        "evidence": "No outcome observation",
        "result": "Execution is not started."
      },
      "unselected": [
        "blocked",
        "denied"
      ],
      "steps": [
        {
          "title": "Read the current scene",
          "description": "The current context receives images and robot state. The outcomes are examples, not measured trials.",
          "active": [
            "observe"
          ],
          "paths": [],
          "state": {
            "cycle": "1",
            "proposal": "No proposal",
            "authorization": "No permission check",
            "executions": "0",
            "evidence": "Initial scene",
            "result": "Planning"
          },
          "duration": 3000
        },
        {
          "title": "Make a tool request",
          "description": "The planner selects a typed tool. Its proposal alone cannot command the motors.",
          "active": [
            "propose"
          ],
          "paths": [
            "observation"
          ],
          "state": {
            "cycle": "1",
            "proposal": "Request A",
            "authorization": "No permission check",
            "executions": "0",
            "evidence": "Initial scene",
            "result": "Before permission decision"
          },
          "duration": 3000
        },
        {
          "title": "Give permission for request A",
          "description": "Request A has permission in this example. Fast local protection is necessary while it runs.",
          "active": [
            "authorize"
          ],
          "paths": [
            "request"
          ],
          "state": {
            "cycle": "1",
            "proposal": "Request A",
            "authorization": "Permitted",
            "executions": "0",
            "evidence": "Initial scene",
            "result": "Available for dispatch"
          },
          "duration": 3000
        },
        {
          "title": "Send the request for local execution",
          "description": "Only a request with permission is sent to the skill and local controller. One completed dispatch is shown. The animation does not show fast servo loops at their real rates.",
          "active": [
            "execute"
          ],
          "paths": [
            "allowed"
          ],
          "state": {
            "cycle": "1",
            "proposal": "Request A",
            "authorization": "Permitted",
            "executions": "1",
            "evidence": "Before result verification",
            "result": "Before evidence is received"
          },
          "duration": 3000
        },
        {
          "title": "Verify the outcome",
          "description": "The command is completed, but this example gives no evidence of task success. Execution alone cannot prove task completion.",
          "active": [
            "verify"
          ],
          "paths": [
            "evidence"
          ],
          "state": {
            "cycle": "1",
            "proposal": "Request A",
            "authorization": "Permitted",
            "executions": "1",
            "evidence": "The task is not completed.",
            "result": "New observation necessary"
          },
          "duration": 3000
        },
        {
          "title": "Read state again before a new plan",
          "description": "Fresh observations update context and change the next plan or request. Policy weights do not change.",
          "active": [
            "observe"
          ],
          "paths": [
            "refresh"
          ],
          "state": {
            "cycle": "2",
            "proposal": "End of request A",
            "authorization": "Next request: no permission check",
            "executions": "1",
            "evidence": "Updated scene",
            "result": "Replanning"
          },
          "duration": 3000
        },
        {
          "title": "Make request B",
          "description": "The next tool request uses the updated scene. A separate permission check is necessary for this request.",
          "active": [
            "propose"
          ],
          "paths": [
            "observation"
          ],
          "state": {
            "cycle": "2",
            "proposal": "Request B",
            "authorization": "No permission check",
            "executions": "1",
            "evidence": "Updated scene",
            "result": "Before permission decision"
          },
          "duration": 3000
        },
        {
          "title": "Give permission for request B",
          "description": "Permission checks occur again. Permission for A does not give permission for B.",
          "active": [
            "authorize"
          ],
          "paths": [
            "request"
          ],
          "state": {
            "cycle": "2",
            "proposal": "Request B",
            "authorization": "Permitted",
            "executions": "1",
            "evidence": "Updated scene",
            "result": "Available for dispatch"
          },
          "duration": 3000
        },
        {
          "title": "Execute request B locally",
          "description": "The second request with permission is sent for local execution. Completion alone does not establish the goal.",
          "active": [
            "execute"
          ],
          "paths": [
            "allowed"
          ],
          "state": {
            "cycle": "2",
            "proposal": "Request B",
            "authorization": "Permitted",
            "executions": "2",
            "evidence": "Before result verification",
            "result": "Before evidence is received"
          },
          "duration": 3000
        },
        {
          "title": "Verify and stop at the result",
          "description": "In this example, the new result shows that the task is completed. Playback keeps the result and does not start the loop again.",
          "active": [
            "verify"
          ],
          "paths": [
            "evidence"
          ],
          "state": {
            "cycle": "2",
            "proposal": "Request B",
            "authorization": "Permitted",
            "executions": "2",
            "evidence": "The task is completed in this example.",
            "result": "Verified success"
          },
          "duration": 3000
        }
      ]
    },
    {
      "id": "denied",
      "title": "Rejection: no dispatch",
      "description": "In this separate alternative, permission checks reject the first request.",
      "initial": {
        "cycle": "0",
        "proposal": "No proposal",
        "authorization": "No permission check",
        "executions": "0",
        "evidence": "No outcome observation",
        "result": "Execution is not started."
      },
      "unselected": [
        "execute",
        "verify",
        "allowed",
        "evidence",
        "refresh"
      ],
      "steps": [
        {
          "title": "Read the current scene",
          "description": "The current context receives images and robot state. The outcomes are examples, not measured trials.",
          "active": [
            "observe"
          ],
          "paths": [],
          "state": {
            "cycle": "1",
            "proposal": "No proposal",
            "authorization": "No permission check",
            "executions": "0",
            "evidence": "Initial scene",
            "result": "Planning"
          },
          "duration": 3000
        },
        {
          "title": "Make a tool request",
          "description": "The planner selects a typed tool. Its proposal alone cannot command the motors.",
          "active": [
            "propose"
          ],
          "paths": [
            "observation"
          ],
          "state": {
            "cycle": "1",
            "proposal": "Request A",
            "authorization": "No permission check",
            "executions": "0",
            "evidence": "Initial scene",
            "result": "Before permission decision"
          },
          "duration": 3000
        },
        {
          "title": "Reject the request.",
          "description": "In this separate scenario, the permission check rejects request A. The request is not sent for local execution.",
          "active": [
            "authorize"
          ],
          "paths": [
            "request"
          ],
          "state": {
            "cycle": "1",
            "proposal": "Request A",
            "authorization": "Request rejection",
            "executions": "0",
            "evidence": "Initial scene",
            "result": "Dispatch: not permitted"
          },
          "duration": 3000
        },
        {
          "title": "Supply the rejection without motion",
          "description": "No request is sent for local execution. This trace stops at the rejection. Subsequent recovery would make its own observations and permission checks necessary.",
          "active": [
            "blocked"
          ],
          "paths": [
            "denied"
          ],
          "state": {
            "cycle": "1",
            "proposal": "Request A",
            "authorization": "Request rejection",
            "executions": "0",
            "evidence": "No execution result",
            "result": "The request stops without dispatch."
          },
          "duration": 3000
        }
      ]
    }
  ]
}
