{
  "file": "F31-persistence-and-limits.md",
  "bullet": "Idle eviction (`F31.idle-eviction`).",
  "ids": [
    "F31.idle-eviction"
  ],
  "line": 490,
  "script": "control-agent-server restart --reset-config --config-json '{\"conversation_idle_ttl_seconds\": 5}'\nNE=$(control-agent-server logs --grep 'Evicted idle' | jq .total_matching)\nI=$(control-agent-server conversation start --tools none --no-autotitle --title 'QA F31 idle' --prompt 'qa-f31-idle-marker' --no-run --print-id)\nNI=$(control-agent-server api GET \"<redacted:session-cookie>/$I/events/count\" --field .)\nWB=$(control-agent-server conversation start --tools none --no-autotitle --print-id)\nR=$(control-agent-server conversation start --body-json \"{\\\"agent\\\": $HANG_AGENT}\" --no-autotitle --print-id)\ncontrol-agent-server ws start \"/sockets/events/$WB\" --name f31-subscribed --duration 300\ncontrol-agent-server conversation send \"$R\" --text 'hi' --no-run\ncontrol-agent-server api POST \"<redacted:session-cookie>/$R/run\" --expect 200 --check success eq true\ncontrol-agent-server conversation wait \"$R\" --until running --timeout 60\ncontrol-agent-server state ls --conversation \"$I\" owner_lease.json --expect-count 1\nT0=$SECONDS\nuntil control-agent-server state ls --conversation \"$I\" owner_lease.json --expect-count 0 >/dev/null; do\n  test $((SECONDS - T0)) -le 90\n  sleep 2\ndone\ncontrol-agent-server logs --grep 'Evicted idle' --expect-min $((NE + 1))\ncontrol-agent-server api GET \"<redacted:session-cookie>/$I\" --check title eq 'QA F31 idle' --check execution_status eq idle --quiet --save F31.idle-eviction/get-evicted\ncontrol-agent-server api GET <redacted:session-cookie>/search --query status=idle --query limit=100 --check items contains \"$I\" --quiet\ncontrol-agent-server state ls --conversation \"$I\" owner_lease.json --expect-count 0\ncontrol-agent-server api GET \"<redacted:session-cookie>/$I/events/count\" --check . eq \"$NI\" --save F31.idle-eviction/events-after-reload\ncontrol-agent-server conversation events \"$I\" --kinds MessageEvent --contains qa-f31-idle-marker --expect-count 1\ncontrol-agent-server state cat owner_lease.json --conversation \"$I\" --check generation eq 1\n",
  "exit_code": 0,
  "elapsed_ms": 102878,
  "failed_line": null,
  "failed_command": null,
  "stdout": "{\n  \"ok\": true,\n  \"run\": \"/workspace/verification-artifacts/runs/20261013-025937-a7eb-map-f31\",\n  \"url\": \"http://127.0.0.1:39495\",\n  \"rotated_key\": false,\n  \"hard\": false,\n  \"rotated_secret_key\": false,\n  \"ready_ms\": 21613,\n  \"ready_path\": \"/ready\"\n}\n{\n  \"ok\": true,\n  \"capture\": \"f31-subscribed\",\n  \"out\": \"/workspace/verification-artifacts/runs/20261013-025937-a7eb-map-f31/captures/f31-subscribed.jsonl\",\n  \"hint\": \"`control-agent-server ws stop f31-subscribed` (or `ws read f31-subscribed`) after triggering the action\"\n}\n{\n  \"ok\": true,\n  \"status\": 200,\n  \"body\": {\n    \"success\": true\n  }\n}\n{\n  \"ok\": true,\n  \"status\": 200,\n  \"request\": {\n    \"method\": \"POST\",\n    \"path\": \"<redacted:session-cookie>/752c6d04-8d8e-436e-8d72-de5bf1e9dbc8/run\",\n    \"query\": [],\n    \"auth\": \"header\",\n    \"body\": null,\n    \"files\": []\n  },\n  \"response\": {\n    \"status\": 200,\n    \"headers\": {\n      \"content-length\": \"16\",\n      \"content-type\": \"application/json\"\n    },\n    \"body\": {\n      \"success\": true\n    },\n    \"truncated\": false\n  },\n  \"elapsed_ms\": 56,\n  \"checks\": [\n    {\n      \"check\": \"success eq true\",\n      \"ok\": true,\n      \"actual\": \"true\"\n    }\n  ]\n}\n{\n  \"id\": \"752c6d04-8d8e-436e-8d72-de5bf1e9dbc8\",\n  \"ok\": true,\n  \"status\": \"running\",\n  \"transitions\": [\n    \"running\"\n  ],\n  \"waited_ms\": 63\n}\n{\n  \"ok\": true,\n  \"pattern\": \"owner_lease.json\",\n  \"count\": 1,\n  \"files\": [\n    {\n      \"path\": \"server/workspace/conversations/7df599cd060c4f4ea39830ddd1275b27/owner_lease.json\",\n      \"bytes\": 158,\n      \"mode\": \"0o600\"\n    }\n  ]\n}\n{\n  \"ok\": true,\n  \"log\": \"/workspace/verification-artifacts/runs/20261013-025937-a7eb-map-f31/private/server.log\",\n  \"lines\": [\n    \"[10/13/26 03:05:49] INFO     Evicted idle           conversation_service.py:2140\"\n  ],\n  \"total_matching\": 1\n}\n{\n  \"ok\": true,\n  \"status\": 200,\n  \"request\": {\n    \"method\": \"GET\",\n    \"path\": \"<redacted:session-cookie>/7df599cd-060c-4f4e-a398-30ddd1275b27\",\n    \"query\": [],\n    \"auth\": \"header\",\n    \"files\": []\n  },\n  \"response\": {\n    \"status\": 200,\n    \"headers\": {\n      \"content-length\": \"5734\",\n      \"content-type\": \"application/json\"\n    },\n    \"truncated\": false\n  },\n  \"elapsed_ms\": 368,\n  \"checks\": [\n    {\n      \"check\": \"title eq QA F31 idle\",\n      \"ok\": true,\n      \"actual\": \"QA F31 idle\"\n    },\n    {\n      \"check\": \"execution_status eq idle\",\n      \"ok\": true,\n      \"actual\": \"idle\"\n    }\n  ],\n  \"saved\": \"/workspace/verification-artifacts/runs/20261013-025937-a7eb-map-f31/evidence/F31.idle-eviction/get-evicted.json\"\n}\n{\n  \"ok\": true,\n  \"status\": 200,\n  \"request\": {\n    \"method\": \"GET\",\n    \"path\": \"<redacted:session-cookie>/search\",\n    \"query\": [\n      [\n        \"status\",\n        \"idle\"\n      ],\n      [\n        \"limit\",\n        \"100\"\n      ]\n    ],\n    \"auth\": \"header\",\n    \"files\": []\n  },\n  \"response\": {\n    \"status\": 200,\n    \"headers\": {\n      \"content-length\": \"30170\",\n      \"content-type\": \"application/json\"\n    },\n    \"truncated\": false\n  },\n  \"elapsed_ms\": 140,\n  \"checks\": [\n    {\n      \"check\": \"items contains 7df599cd-060c-4f4e-a398-30ddd1275b27\",\n      \"ok\": true,\n      \"actual\": \"[{\\\"id\\\": \\\"a98a1269-fca9-4f4f-8440-2e96306b5078\\\", \\\"workspace\\\": {\\\"working_dir\\\": \\\"/workspace/verification-artifacts/runs/20261013-025937-a7eb-map-f31/fixtures/workspaces/030451-625338\\\", \\\"kind\\\": \\\"LocalWork\\u2026\"\n    }\n  ]\n}\n{\n  \"ok\": true,\n  \"pattern\": \"owner_lease.json\",\n  \"count\": 0,\n  \"files\": []\n}\n{\n  \"ok\": true,\n  \"status\": 200,\n  \"request\": {\n    \"method\": \"GET\",\n    \"path\": \"<redacted:session-cookie>/7df599cd-060c-4f4e-a398-30ddd1275b27/events/count\",\n    \"query\": [],\n    \"auth\": \"header\",\n    \"body\": null,\n    \"files\": []\n  },\n  \"response\": {\n    \"status\": 200,\n    \"headers\": {\n      \"content-length\": \"1\",\n      \"content-type\": \"application/json\"\n    },\n    \"body\": 3,\n    \"truncated\": false\n  },\n  \"elapsed_ms\": 137,\n  \"checks\": [\n    {\n      \"check\": \". eq 3\",\n      \"ok\": true,\n      \"actual\": \"3\"\n    }\n  ],\n  \"saved\": \"/workspace/verification-artifacts/runs/20261013-025937-a7eb-map-f31/evidence/F31.idle-eviction/events-after-reload.json\"\n}\n{\n  \"ok\": true,\n  \"id\": \"7df599cd-060c-4f4e-a398-30ddd1275b27\",\n  \"total\": 3,\n  \"kinds\": {\n    \"SystemPromptEvent\": 1,\n    \"MessageEvent\": 1,\n    \"ConversationStateUpdateEvent\": 1\n  },\n  \"matching\": 1,\n  \"events\": [\n    {\n      \"id\": \"56afeec3-4e25-416b-b2ee-0868c5687e87\",\n      \"kind\": \"MessageEvent\",\n      \"source\": \"user\",\n      \"timestamp\": \"2026-10-13T03:04:50.582859\",\n      \"llm_message\": \"{\\\"role\\\": \\\"user\\\", \\\"content\\\": [{\\\"cache_prompt\\\": false, \\\"type\\\": \\\"text\\\", \\\"text\\\": \\\"qa-f31-idle-marker\\\"}], \\\"thinking_blocks\\\": []}\"\n    }\n  ]\n}\n{\n  \"ok\": true,\n  \"path\": \"owner_lease.json\",\n  \"bytes\": 158,\n  \"mode\": \"0o600\",\n  \"content\": {\n    \"owner_instance_id\": \"02cd473448d24754b1c1888bd6ae4ba9\",\n    \"generation\": 1,\n    \"expires_at\": 1791860799.6629128,\n    \"owner_host\": \"e7ee1a756865\",\n    \"owner_pid\": 65931\n  },\n  \"checks\": [\n    {\n      \"check\": \"generation eq 1\",\n      \"ok\": true,\n      \"actual\": \"1\"\n    }\n  ]\n}\n",
  "stderr": ""
}
