{
  "file": "F28-canvas-extensions.md",
  "bullet": "Start (`F28.backend-start`).",
  "ids": [
    "F28.backend-start"
  ],
  "line": 537,
  "script": "control-agent-server api POST /api/canvas-extensions/installed/qa-backend/backend/start --json \"{\\\"revision\\\": \\\"$BHEAD\\\"}\" \\\n  --expect 200 --check state eq ready --check pid exists --check port exists --check detail eq null \\\n  --save F28.backend-start/start\nBPID=$(control-agent-server api GET /api/canvas-extensions/installed/qa-backend/backend --check state eq ready --field pid)\nBPORT=$(control-agent-server api GET /api/canvas-extensions/installed/qa-backend/backend --field port)\ntest \"$(curl -fsS \"http://127.0.0.1:$BPORT/health\")\" = ok\ncurl -fsS \"http://127.0.0.1:$BPORT/qa-echo\" | grep -F \"\\\"data_dir\\\": \\\"$BK/data/qa-backend\\\"\"\ntest \"$(tr '\\0' '\\n' < \"/proc/$BPID/environ\")\" = \"HOME=$BK/data/qa-backend/home\"\ntest \"$(readlink \"/proc/$BPID/cwd\")\" = \"$(cd \"$INST/qa-backend\" && pwd -P)\"\ntest \"$(ps -o pgid= -p \"$BPID\" | tr -d ' ')\" = \"$BPID\"\ntest \"$(pgrep -f \"$BK/artifacts/qa-backend/\")\" = \"$BPID\"\ntest -d \"$BK/data/qa-backend/home\"\ncontrol-agent-server api POST /api/canvas-extensions/installed/qa-backend/backend/start --json \"{\\\"revision\\\": \\\"$BHEAD\\\"}\" \\\n  --expect 200 --check state eq ready --check pid eq \"$BPID\"\ncontrol-agent-server api POST /api/canvas-extensions/installed/qa-backend/backend/start --json '{\"revision\": \"qa-other\"}' \\\n  --expect 409 --check detail eq 'a different backend revision is already running'\ncontrol-agent-server api POST /api/canvas-extensions/install --json \"{\\\"source\\\": \\\"$FX\\\", \\\"force\\\": true}\" \\\n  --expect 409 --check detail contains 'Stop running Canvas App backends' --save F28.backend-start/force-blocked\ncontrol-agent-server api DELETE /api/canvas-extensions/installed/qa-backend/backend/data \\\n  --expect 409 --check detail eq 'stop the backend before deleting its data'\ncontrol-agent-server api GET /api/canvas-extensions/installed/qa-canvas --check installed_at eq \"$AT0\"\nkill -0 \"$BPID\"\n",
  "exit_code": 0,
  "elapsed_ms": 9264,
  "failed_line": null,
  "failed_command": null,
  "stdout": "{\n  \"ok\": true,\n  \"status\": 200,\n  \"request\": {\n    \"method\": \"POST\",\n    \"path\": \"/api/canvas-extensions/installed/qa-backend/backend/start\",\n    \"query\": [],\n    \"auth\": \"header\",\n    \"body\": {\n      \"revision\": \"f3946ddff93a691d5cf27c3d02095311b16a572c\"\n    },\n    \"files\": []\n  },\n  \"response\": {\n    \"status\": 200,\n    \"headers\": {\n      \"content-length\": \"193\",\n      \"content-type\": \"application/json\"\n    },\n    \"body\": {\n      \"name\": \"qa-backend\",\n      \"state\": \"ready\",\n      \"revision\": \"f3946ddff93a691d5cf27c3d02095311b16a572c\",\n      \"prepared_revision\": \"f3946ddff93a691d5cf27c3d02095311b16a572c\",\n      \"pid\": 39570,\n      \"port\": 34091,\n      \"detail\": null\n    },\n    \"truncated\": false\n  },\n  \"elapsed_ms\": 732,\n  \"checks\": [\n    {\n      \"check\": \"state eq ready\",\n      \"ok\": true,\n      \"actual\": \"ready\"\n    },\n    {\n      \"check\": \"pid exists\",\n      \"ok\": true,\n      \"actual\": \"39570\"\n    },\n    {\n      \"check\": \"port exists\",\n      \"ok\": true,\n      \"actual\": \"34091\"\n    },\n    {\n      \"check\": \"detail eq null\",\n      \"ok\": true,\n      \"actual\": \"null\"\n    }\n  ],\n  \"saved\": \"/workspace/verification-artifacts/runs/20261013-024207-5ac2-map-f28/evidence/F28.backend-start/start.json\"\n}\n{\"app\": \"qa-backend\", \"method\": \"GET\", \"path\": \"/qa-echo\", \"query\": {}, \"body\": \"\", \"data_dir\": \"/workspace/verification-artifacts/runs/20261013-024207-5ac2-map-f28/home/.openhands/canvas-extensions/backends/data/qa-backend\", \"cookie_forwarded\": false}\n{\n  \"ok\": true,\n  \"status\": 200,\n  \"request\": {\n    \"method\": \"POST\",\n    \"path\": \"/api/canvas-extensions/installed/qa-backend/backend/start\",\n    \"query\": [],\n    \"auth\": \"header\",\n    \"body\": {\n      \"revision\": \"f3946ddff93a691d5cf27c3d02095311b16a572c\"\n    },\n    \"files\": []\n  },\n  \"response\": {\n    \"status\": 200,\n    \"headers\": {\n      \"content-length\": \"193\",\n      \"content-type\": \"application/json\"\n    },\n    \"body\": {\n      \"name\": \"qa-backend\",\n      \"state\": \"ready\",\n      \"revision\": \"f3946ddff93a691d5cf27c3d02095311b16a572c\",\n      \"prepared_revision\": \"f3946ddff93a691d5cf27c3d02095311b16a572c\",\n      \"pid\": 39570,\n      \"port\": 34091,\n      \"detail\": null\n    },\n    \"truncated\": false\n  },\n  \"elapsed_ms\": 147,\n  \"checks\": [\n    {\n      \"check\": \"state eq ready\",\n      \"ok\": true,\n      \"actual\": \"ready\"\n    },\n    {\n      \"check\": \"pid eq 39570\",\n      \"ok\": true,\n      \"actual\": \"39570\"\n    }\n  ]\n}\n{\n  \"ok\": true,\n  \"status\": 409,\n  \"request\": {\n    \"method\": \"POST\",\n    \"path\": \"/api/canvas-extensions/installed/qa-backend/backend/start\",\n    \"query\": [],\n    \"auth\": \"header\",\n    \"body\": {\n      \"revision\": \"qa-other\"\n    },\n    \"files\": []\n  },\n  \"response\": {\n    \"status\": 409,\n    \"headers\": {\n      \"content-length\": \"60\",\n      \"content-type\": \"application/json\"\n    },\n    \"body\": {\n      \"detail\": \"a different backend revision is already running\"\n    },\n    \"truncated\": false\n  },\n  \"elapsed_ms\": 193,\n  \"checks\": [\n    {\n      \"check\": \"detail eq a different backend revision is already running\",\n      \"ok\": true,\n      \"actual\": \"a different backend revision is already running\"\n    }\n  ]\n}\n{\n  \"ok\": true,\n  \"status\": 409,\n  \"request\": {\n    \"method\": \"POST\",\n    \"path\": \"/api/canvas-extensions/install\",\n    \"query\": [],\n    \"auth\": \"header\",\n    \"body\": {\n      \"source\": \"/workspace/verification-artifacts/runs/20261013-024207-5ac2-map-f28/fixtures/canvas/qa-canvas\",\n      \"force\": true\n    },\n    \"files\": []\n  },\n  \"response\": {\n    \"status\": 409,\n    \"headers\": {\n      \"content-length\": \"69\",\n      \"content-type\": \"application/json\"\n    },\n    \"body\": {\n      \"detail\": \"Stop running Canvas App backends before a forced install\"\n    },\n    \"truncated\": false\n  },\n  \"elapsed_ms\": 196,\n  \"checks\": [\n    {\n      \"check\": \"detail contains Stop running Canvas App backends\",\n      \"ok\": true,\n      \"actual\": \"Stop running Canvas App backends before a forced install\"\n    }\n  ],\n  \"saved\": \"/workspace/verification-artifacts/runs/20261013-024207-5ac2-map-f28/evidence/F28.backend-start/force-blocked.json\"\n}\n{\n  \"ok\": true,\n  \"status\": 409,\n  \"request\": {\n    \"method\": \"DELETE\",\n    \"path\": \"/api/canvas-extensions/installed/qa-backend/backend/data\",\n    \"query\": [],\n    \"auth\": \"header\",\n    \"body\": null,\n    \"files\": []\n  },\n  \"response\": {\n    \"status\": 409,\n    \"headers\": {\n      \"content-length\": \"54\",\n      \"content-type\": \"application/json\"\n    },\n    \"body\": {\n      \"detail\": \"stop the backend before deleting its data\"\n    },\n    \"truncated\": false\n  },\n  \"elapsed_ms\": 636,\n  \"checks\": [\n    {\n      \"check\": \"detail eq stop the backend before deleting its data\",\n      \"ok\": true,\n      \"actual\": \"stop the backend before deleting its data\"\n    }\n  ]\n}\n{\n  \"ok\": true,\n  \"status\": 200,\n  \"request\": {\n    \"method\": \"GET\",\n    \"path\": \"/api/canvas-extensions/installed/qa-canvas\",\n    \"query\": [],\n    \"auth\": \"header\",\n    \"body\": null,\n    \"files\": []\n  },\n  \"response\": {\n    \"status\": 200,\n    \"headers\": {\n      \"content-length\": \"718\",\n      \"content-type\": \"application/json\"\n    },\n    \"body\": {\n      \"name\": \"qa-canvas\",\n      \"version\": \"0.1.0\",\n      \"description\": \"QA fixture Canvas app\",\n      \"enabled\": false,\n      \"source\": \"/workspace/verification-artifacts/runs/20261013-024207-5ac2-map-f28/fixtures/canvas/qa-canvas\",\n      \"requested_ref\": null,\n      \"resolved_ref\": null,\n      \"repo_path\": null,\n      \"installed_at\": \"2026-10-13T02:42:21.953802+00:00\",\n      \"install_path\": \"/workspace/verification-artifacts/runs/20261013-024207-5ac2-map-f28/home/.openhands/canvas-extensions/installed/qa-canvas\",\n      \"manifest\": {\n        \"schema_version\": 1,\n        \"name\": \"qa-canvas\",\n        \"display_name\": \"QA qa-canvas\",\n        \"version\": \"0.1.0\",\n        \"description\": \"QA fixture Canvas app\",\n        \"entrypoint\": \"dist/index.js\",\n        \"contributes\": {\n          \"pages\": [\n            {\n              \"id\": \"main\",\n              \"title\": \"QA qa-canvas\",\n              \"path\": \"/qa-canvas\"\n            }\n          ]\n        },\n        \"icon\": \"assets/icon.svg\"\n      }\n    },\n    \"truncated\": false\n  },\n  \"elapsed_ms\": 163,\n  \"checks\": [\n    {\n      \"check\": \"installed_at eq 2026-10-13T02:42:21.953802+00:00\",\n      \"ok\": true,\n      \"actual\": \"2026-10-13T02:42:21.953802+00:00\"\n    }\n  ]\n}\n",
  "stderr": ""
}
