{
  "schema_version": 1,
  "verification_contract": "pi-sdk-behavior-v2",
  "sdk_versions": {
    "@earendil-works/pi-agent-core": "1.2.0",
    "@earendil-works/pi-ai": "1.2.0",
    "@earendil-works/pi-coding-agent": "1.2.0",
    "@earendil-works/pi-tui": "1.2.0"
  },
  "platform": "win32",
  "model_inference": "the import-web happy path uses the SDK's deterministic in-memory faux provider; no network/paid inference and no main agent loop",
  "unhandled_errors": 0,
  "extension_load_errors": 0,
  "cases": [
    {
      "name": "extension_load",
      "command": "npm run smoke:pi",
      "exit_code": 0,
      "passed": true,
      "evidence": "{\"type\":\"extension_ui_request\",\"id\":\"45c84da9-35a6-4b11-9006-934c49a45f02\",\"method\":\"setWidget\",\"widgetKey\":\"pi-skill-playbook\"}\n{\"id\":\"inventory\",\"type\":\"response\",\"command\":\"get_commands\",\"success\":true,\"data\":{\"commands\":[{\"name\":\"playbook:list\",\"description\":\"Playbook: list available playbooks.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:start\",\"description\":\"Playbook: start a playbook run.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:resume\",\"description\":\"Playbook: resume an active playbook run.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:status\",\"description\":\"Playbook: show playbook run status.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:done\",\"description\":\"Playbook: complete the current step.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:choose\",\"description\":\"Playbook: choose a step outcome.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:cancel\",\"description\":\"Playbook: cancel an active playbook run.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:history\",\"description\":\"Playbook: browse completed playbook runs.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:rundiff\",\"description\":\"Playbook: compare recent completed playbook runs.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:start\",\"description\":\"Playbook: start recording an explicit skill flow.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:mark\",\"description\":\"Playbook: mark explicit skill usage in the active recording.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:branch\",\"description\":\"Playbook: record a branch outcome label.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:stop\",\"description\":\"Playbook: stop recording and save a playbook draft.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:status\",\"description\":\"Playbook: show active recording status.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record\",\"description\":\"Playbook: record an explicit skill flow into a draft.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:import-web\",\"description\":\"Playbook: import an external web workflow into a validated draft.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"skill:smoke-skill\",\"description\":\"Offline skill used by the Pi SDK behavior smoke\",\"source\":\"skill\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\.agents\\\\skills\\\\smoke-skill\\\\SKILL.md\",\"source\":\"auto\",\"scope\":\"user\",\"origin\":\"top-level\",\"baseDir\":\"<isolated-checkout>\\\\.agents\"}}]}}\n",
      "assertions": [
        {
          "id": "extension_registered",
          "expected": "Actual Pi registers playbook:list, playbook:history, playbook:import-web",
          "observed": "{\"success\":true,\"commands\":[\"playbook:list\",\"playbook:start\",\"playbook:resume\",\"playbook:status\",\"playbook:done\",\"playbook:choose\",\"playbook:cancel\",\"playbook:history\",\"playbook:rundiff\",\"playbook:record:start\",\"playbook:record:mark\",\"playbook:record:branch\",\"playbook:record:stop\",\"playbook:record:status\",\"playbook:record\",\"playbook:import-web\",\"skill:smoke-skill\"]}",
          "passed": true
        },
        {
          "id": "no_agent_turn",
          "expected": "The actual Pi extension command completes without starting the main agent loop",
          "observed": "[]",
          "passed": true
        }
      ]
    },
    {
      "name": "happy_path",
      "command": "npm run smoke:pi",
      "exit_code": 0,
      "passed": true,
      "evidence": "\"description\":\"Playbook: complete the current step.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:choose\",\"description\":\"Playbook: choose a step outcome.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:cancel\",\"description\":\"Playbook: cancel an active playbook run.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:history\",\"description\":\"Playbook: browse completed playbook runs.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:rundiff\",\"description\":\"Playbook: compare recent completed playbook runs.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:start\",\"description\":\"Playbook: start recording an explicit skill flow.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:mark\",\"description\":\"Playbook: mark explicit skill usage in the active recording.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:branch\",\"description\":\"Playbook: record a branch outcome label.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:stop\",\"description\":\"Playbook: stop recording and save a playbook draft.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:status\",\"description\":\"Playbook: show active recording status.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record\",\"description\":\"Playbook: record an explicit skill flow into a draft.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:import-web\",\"description\":\"Playbook: import an external web workflow into a validated draft.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"skill:smoke-skill\",\"description\":\"Offline skill used by the Pi SDK behavior smoke\",\"source\":\"skill\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\.agents\\\\skills\\\\smoke-skill\\\\SKILL.md\",\"source\":\"auto\",\"scope\":\"user\",\"origin\":\"top-level\",\"baseDir\":\"<isolated-checkout>\\\\.agents\"}}]}}\n{\"id\":\"model-selection\",\"type\":\"response\",\"command\":\"set_model\",\"success\":true,\"data\":{\"id\":\"offline-model\",\"name\":\"Pi Skill Playbook offline smoke model\",\"api\":\"faux:1792101237028:tbsul30rgtd\",\"provider\":\"pi-skill-playbook-smoke\",\"baseUrl\":\"http://localhost:0\",\"reasoning\":false,\"input\":[\"text\",\"image\"],\"cost\":{\"input\":0,\"output\":0,\"cacheRead\":0,\"cacheWrite\":0},\"contextWindow\":128000,\"maxTokens\":16384}}\n{\"type\":\"extension_ui_request\",\"id\":\"200ecc8c-8a2e-4b34-9ad9-3a2f9dd461aa\",\"method\":\"confirm\",\"title\":\"Send model-assisted draft request?\",\"message\":\"The following prompt will be sent to the active Pi model:\\n\\nYou are drafting a Pi Skill Playbook YAML definition from external workflow articles.\\nReturn ONLY one fenced ```yaml block containing a valid playbook object.\\nUse version: 1, lower-kebab-case ids, one primarySkill per step, and explicit transitions.\\nPrefer discovered Agent Skill names when they fit. Do not invent skills that are not listed.\\nUse playbook id 'offline-playbook' unless the content strongly suggests another id.\\nDiscovered Agent Skills: smoke-skill\\nSource 1: Offline source (http://127.0.0.1:50123/source)\\nOffline source A local fixture for the playbook SDK smoke.\\nRequired YAML shape:\\nversion: 1\\nid: example-id\\nname: Example Name\\nentry: first-step\\nskills:\\n  skill-name:\\n    role: entry\\nsteps:\\n  first-step:\\n    primarySkill: skill-name\\n    commandHint: \\\"/skill:skill-name\\\"\\n    doneWhen:\\n      - criterion\\n    transitions:\\n      - outcome: complete\\n        to: complete\"}\n{\"type\":\"extension_ui_request\",\"id\":\"6fcdd34a-058c-4a31-826f-25b7cb61773b\",\"method\":\"notify\",\"message\":\"Target: <isolated-checkout>\\\\.pi\\\\playbooks\\\\offline-playbook.yml\\n\\nversion: 1\\nid: offline-playbook\\nname: Offline Playbook\\nentry: first-step\\nskills:\\n  smoke-skill:\\n    role: entry\\nsteps:\\n  first-step:\\n    primarySkill: smoke-skill\\n    commandHint: /skill:smoke-skill\\n    doneWhen:\\n      - The local source is represented.\\n    transitions:\\n      - outcome: complete\\n        to: complete\\nsources:\\n  - url: http://127.0.0.1:50123/source\\n    title: Offline source\\n    accessedAt: 2026-10-15T21:53:57.061Z\",\"notifyType\":\"info\"}\n{\"type\":\"extension_ui_request\",\"id\":\"5be676dd-684c-437a-931c-767b71a78d92\",\"method\":\"confirm\",\"title\":\"Save Imported web playbook draft?\",\"message\":\"Write offline-playbook.yml to .pi/playbooks/ after validation.\"}\n{\"type\":\"extension_ui_request\",\"id\":\"0edaebef-fadd-4306-80ec-c24576386bf0\",\"method\":\"notify\",\"message\":\"Saved playbook draft to <isolated-checkout>\\\\.pi\\\\playbooks\\\\offline-playbook.yml.\",\"notifyType\":\"info\"}\n{\"type\":\"extension_ui_request\",\"id\":\"999424b8-acef-4e03-9711-722ea551e288\",\"method\":\"notify\",\"message\":\"Imported playbook draft 'offline-playbook' from 1 source URL(s).\",\"notifyType\":\"info\"}\n{\"id\":\"playbook-smoke\",\"type\":\"response\",\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}}\n\n[Evidence tail; all bounded output was checked before truncation; 7135 characters total]",
      "assertions": [
        {
          "id": "feature_response",
          "expected": "The actual extension command returns handled and emits a info notification containing \"Imported playbook draft 'offline-playbook' from 1 source URL(s).\"",
          "observed": "{\"response\":{\"id\":\"playbook-smoke\",\"type\":\"response\",\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}},\"notification\":{\"type\":\"extension_ui_request\",\"id\":\"999424b8-acef-4e03-9711-722ea551e288\",\"method\":\"notify\",\"message\":\"Imported playbook draft 'offline-playbook' from 1 source URL(s).\",\"notifyType\":\"info\"}}",
          "passed": true
        },
        {
          "id": "offline_model_draft_saved",
          "expected": "The SDK's faux provider response becomes a saved, skill-mapped playbook with source trace from one local HTTP fixture",
          "observed": "{\"valid\":true,\"sourceRequestCount\":1,\"id\":\"offline-playbook\",\"primarySkill\":\"smoke-skill\",\"sourceUrl\":\"http://127.0.0.1:50123/source\"}",
          "passed": true
        },
        {
          "id": "no_agent_turn",
          "expected": "The actual Pi extension command completes without starting the main agent loop",
          "observed": "[]",
          "passed": true
        }
      ]
    },
    {
      "name": "error_path",
      "command": "npm run smoke:pi",
      "exit_code": 0,
      "passed": true,
      "evidence": "{\"type\":\"extension_ui_request\",\"id\":\"272fcb5a-ae76-4b37-8ce1-ce303e9fa082\",\"method\":\"setWidget\",\"widgetKey\":\"pi-skill-playbook\"}\n{\"id\":\"inventory\",\"type\":\"response\",\"command\":\"get_commands\",\"success\":true,\"data\":{\"commands\":[{\"name\":\"playbook:list\",\"description\":\"Playbook: list available playbooks.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:start\",\"description\":\"Playbook: start a playbook run.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:resume\",\"description\":\"Playbook: resume an active playbook run.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:status\",\"description\":\"Playbook: show playbook run status.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:done\",\"description\":\"Playbook: complete the current step.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:choose\",\"description\":\"Playbook: choose a step outcome.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:cancel\",\"description\":\"Playbook: cancel an active playbook run.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:history\",\"description\":\"Playbook: browse completed playbook runs.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:rundiff\",\"description\":\"Playbook: compare recent completed playbook runs.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:start\",\"description\":\"Playbook: start recording an explicit skill flow.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:mark\",\"description\":\"Playbook: mark explicit skill usage in the active recording.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:branch\",\"description\":\"Playbook: record a branch outcome label.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:stop\",\"description\":\"Playbook: stop recording and save a playbook draft.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:status\",\"description\":\"Playbook: show active recording status.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record\",\"description\":\"Playbook: record an explicit skill flow into a draft.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:import-web\",\"description\":\"Playbook: import an external web workflow into a validated draft.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"skill:smoke-skill\",\"description\":\"Offline skill used by the Pi SDK behavior smoke\",\"source\":\"skill\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\.agents\\\\skills\\\\smoke-skill\\\\SKILL.md\",\"source\":\"auto\",\"scope\":\"user\",\"origin\":\"top-level\",\"baseDir\":\"<isolated-checkout>\\\\.agents\"}}]}}\n{\"type\":\"extension_ui_request\",\"id\":\"5eebfd9c-d967-4d3a-847e-7dddf48c1a36\",\"method\":\"input\",\"title\":\"Web import search query\",\"placeholder\":\"Describe the workflow to import\"}\n{\"type\":\"extension_ui_request\",\"id\":\"b4e5b8cd-972e-43ae-9c32-9bceeb3e91a2\",\"method\":\"notify\",\"message\":\"A search query or at least one --url is required.\\nUsage:\\n/playbook:import-web [<query>] [--url <url> ...] [--id <playbook-id>]\\n\\nHappy path: run without args in the Pi TUI to enter a query, pick search results, confirm model drafting, then save.\",\"notifyType\":\"error\"}\n{\"id\":\"playbook-smoke\",\"type\":\"response\",\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}}\n",
      "assertions": [
        {
          "id": "handled_error",
          "expected": "The actual extension command returns handled and emits a error notification containing \"A search query or at least one --url is required.\"",
          "observed": "{\"response\":{\"id\":\"playbook-smoke\",\"type\":\"response\",\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}},\"notification\":{\"type\":\"extension_ui_request\",\"id\":\"b4e5b8cd-972e-43ae-9c32-9bceeb3e91a2\",\"method\":\"notify\",\"message\":\"A search query or at least one --url is required.\\nUsage:\\n/playbook:import-web [<query>] [--url <url> ...] [--id <playbook-id>]\\n\\nHappy path: run without args in the Pi TUI to enter a query, pick search results, confirm model drafting, then save.\",\"notifyType\":\"error\"}}",
          "passed": true
        },
        {
          "id": "no_agent_turn",
          "expected": "The actual Pi extension command completes without starting the main agent loop",
          "observed": "[]",
          "passed": true
        }
      ]
    },
    {
      "name": "reload_cleanup",
      "command": "npm run smoke:pi",
      "exit_code": 0,
      "passed": true,
      "evidence": "{\"type\":\"extension_ui_request\",\"id\":\"daba992e-1987-4ed7-b491-dfc899e246aa\",\"method\":\"setWidget\",\"widgetKey\":\"pi-skill-playbook\"}\n{\"id\":\"inventory\",\"type\":\"response\",\"command\":\"get_commands\",\"success\":true,\"data\":{\"commands\":[{\"name\":\"playbook:list\",\"description\":\"Playbook: list available playbooks.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:start\",\"description\":\"Playbook: start a playbook run.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:resume\",\"description\":\"Playbook: resume an active playbook run.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:status\",\"description\":\"Playbook: show playbook run status.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:done\",\"description\":\"Playbook: complete the current step.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:choose\",\"description\":\"Playbook: choose a step outcome.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:cancel\",\"description\":\"Playbook: cancel an active playbook run.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:history\",\"description\":\"Playbook: browse completed playbook runs.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:rundiff\",\"description\":\"Playbook: compare recent completed playbook runs.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:start\",\"description\":\"Playbook: start recording an explicit skill flow.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:mark\",\"description\":\"Playbook: mark explicit skill usage in the active recording.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:branch\",\"description\":\"Playbook: record a branch outcome label.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:stop\",\"description\":\"Playbook: stop recording and save a playbook draft.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record:status\",\"description\":\"Playbook: show active recording status.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:record\",\"description\":\"Playbook: record an explicit skill flow into a draft.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"playbook:import-web\",\"description\":\"Playbook: import an external web workflow into a validated draft.\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\extensions\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"skill:smoke-skill\",\"description\":\"Offline skill used by the Pi SDK behavior smoke\",\"source\":\"skill\",\"sourceInfo\":{\"path\":\"<isolated-checkout>\\\\.agents\\\\skills\\\\smoke-skill\\\\SKILL.md\",\"source\":\"auto\",\"scope\":\"user\",\"origin\":\"top-level\",\"baseDir\":\"<isolated-checkout>\\\\.agents\"}}]}}\n{\"type\":\"extension_ui_request\",\"id\":\"ac5d975f-d2ec-4671-86b6-264026fa2454\",\"method\":\"notify\",\"message\":\"Completed playbook runs (1):\\nhost-run — host-playbook — 2026-06-01T01:00:00.000Z — complete\\n\\nCompleted: host-playbook\\nRun: host-run\\nFinished: 2026-06-01T01:00:00.000Z\\nFinal outcome: complete\\nHistory:\\n  2026-06-01T01:00:00.000Z done → complete (complete)\",\"notifyType\":\"info\"}\n{\"id\":\"playbook-smoke\",\"type\":\"response\",\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}}\n",
      "assertions": [
        {
          "id": "reloaded_extension_registered",
          "expected": "A second actual Pi process registers the playbook extension commands",
          "observed": "{\"success\":true,\"commands\":[\"playbook:list\",\"playbook:start\",\"playbook:resume\",\"playbook:status\",\"playbook:done\",\"playbook:choose\",\"playbook:cancel\",\"playbook:history\",\"playbook:rundiff\",\"playbook:record:start\",\"playbook:record:mark\",\"playbook:record:branch\",\"playbook:record:stop\",\"playbook:record:status\",\"playbook:record\",\"playbook:import-web\",\"skill:smoke-skill\"]}",
          "passed": true
        },
        {
          "id": "reloaded_feature_response",
          "expected": "The actual extension command returns handled and emits a info notification containing \"Completed: host-playbook\"",
          "observed": "{\"response\":{\"id\":\"playbook-smoke\",\"type\":\"response\",\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}},\"notification\":{\"type\":\"extension_ui_request\",\"id\":\"ac5d975f-d2ec-4671-86b6-264026fa2454\",\"method\":\"notify\",\"message\":\"Completed playbook runs (1):\\nhost-run — host-playbook — 2026-06-01T01:00:00.000Z — complete\\n\\nCompleted: host-playbook\\nRun: host-run\\nFinished: 2026-06-01T01:00:00.000Z\\nFinal outcome: complete\\nHistory:\\n  2026-06-01T01:00:00.000Z done → complete (complete)\",\"notifyType\":\"info\"}}",
          "passed": true
        },
        {
          "id": "clean_shutdown",
          "expected": "The second actual Pi process exits zero without unhandled, load, or shutdown errors",
          "observed": "{\"exit_code\":0,\"process_exited\":true,\"unhandled_error\":false,\"extension_load_error\":false}",
          "passed": true
        },
        {
          "id": "no_agent_turn",
          "expected": "The actual Pi extension command completes without starting the main agent loop",
          "observed": "[]",
          "passed": true
        }
      ]
    },
    {
      "name": "host_shell",
      "command": "npm run smoke:pi",
      "exit_code": 0,
      "passed": true,
      "evidence": "1.2.0\n",
      "assertions": [
        {
          "id": "native_shell_boundary",
          "expected": "The native host shell launches the locally pinned Pi CLI and returns exactly 1.2.0",
          "observed": "{\"exit_code\":0,\"process_exited\":true,\"stdout\":\"1.2.0\",\"stderr\":\"\",\"expectedVersion\":\"1.2.0\"}",
          "passed": true
        }
      ]
    }
  ]
}
