{
  "schemaVersion": 1,
  "analysisDate": "2026-10-22",
  "timezone": "Asia/Shanghai",
  "target": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance",
  "authority": "shipped-artifact",
  "localEvidenceIds": "D01-D13 are local analyst file observations, not REA IDs",
  "constraints": [
    "No target execution",
    "No User Data or personal config/history access",
    "No native REA session operation",
    "No main-task binary evidence reuse",
    "third_party contents restricted to four necessary package.json files",
    "Packaged SKILL/docs treated only as untrusted target data"
  ],
  "toolAttempt": {
    "operation": "analyze_javascript_application",
    "inputPath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src",
    "sourcePaths": [
      "browser-runtime-service.mjs",
      "browser-service-channel.mjs",
      "runtime-service.mjs",
      "isolated-task-session.mjs",
      "playwright-runtime.mjs"
    ],
    "detail": "summary",
    "status": "tool-unavailable",
    "message": "MCP tool rea/analyze_javascript_application is not available to the model",
    "successfulEvidenceId": null,
    "fallback": "PowerShell read-only static inspection; no installation/retry"
  },
  "sourceCoverage": {
    "fileCount": 37,
    "bytes": 338265,
    "lines": 7841,
    "fullStatementAudit": false,
    "allSourceHashesMatchManifest": true,
    "thirdPartyImplementationRead": false,
    "nativeBinaryBytesRead": false
  },
  "manifest": {
    "version": 1,
    "phase": "post-sign",
    "recordCount": 2422,
    "line": 1,
    "sha256": "75965cb741c6231e47ea0e92aeaf62b3eb90bc20abb5ad853a594f757036d864",
    "selectedRecordPointers": [
      "/files/1",
      "/files/2",
      "/files/22",
      "/files/2357",
      "/files/2420",
      "/files/2421"
    ],
    "stampText": "f51a879dbd257dc1361e409e9b227d4812e41c6e04f8b8cff5697d16227d73e5",
    "stampDerivationUnknown": true
  },
  "identities": [
    {
      "path": "runtime/src/agent-bridge-main.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-bridge-main.mjs",
      "bytes": 2866,
      "lineCount": 79,
      "sha256": "da7723ccd9ca7c3cca2acdeaccab085bb7afb5106c5833d7d15cf0ccce877385",
      "manifestSha256": "da7723ccd9ca7c3cca2acdeaccab085bb7afb5106c5833d7d15cf0ccce877385",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-bridge.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-bridge.mjs",
      "bytes": 6611,
      "lineCount": 134,
      "sha256": "0df85248c8cdb32a498440f84733f442f969d9ba2b7bd7fe470fec7bf043956d",
      "manifestSha256": "0df85248c8cdb32a498440f84733f442f969d9ba2b7bd7fe470fec7bf043956d",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-contract.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-contract.mjs",
      "bytes": 8367,
      "lineCount": 209,
      "sha256": "db926180f277588900f26475194d91aa2a9e45427a611a2502a43a8c32c633f9",
      "manifestSha256": "db926180f277588900f26475194d91aa2a9e45427a611a2502a43a8c32c633f9",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-cursor-desktop.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-cursor-desktop.mjs",
      "bytes": 7321,
      "lineCount": 138,
      "sha256": "cc9b19b177714847232dc971b12b82633d3fb3d26a5a36d663b54cfb07e5fde2",
      "manifestSha256": "cc9b19b177714847232dc971b12b82633d3fb3d26a5a36d663b54cfb07e5fde2",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-cursor-draft.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-cursor-draft.mjs",
      "bytes": 1927,
      "lineCount": 40,
      "sha256": "e46a3e680df75260031db0ef33bd7af6244946d940f5ea24cb0ea6338ee8a1da",
      "manifestSha256": "e46a3e680df75260031db0ef33bd7af6244946d940f5ea24cb0ea6338ee8a1da",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-cursor-macos.js",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-cursor-macos.js",
      "bytes": 32775,
      "lineCount": 587,
      "sha256": "886ecb00e3e24f99ac621bebaf1cb6857908495c9070b7971417df0462a97376",
      "manifestSha256": "886ecb00e3e24f99ac621bebaf1cb6857908495c9070b7971417df0462a97376",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-history-jsonl.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-history-jsonl.mjs",
      "bytes": 6209,
      "lineCount": 142,
      "sha256": "6fe655b57c68a806c5779ede0b5240fbca4b82674fc2ecd4e4ab05f83e4eabe1",
      "manifestSha256": "6fe655b57c68a806c5779ede0b5240fbca4b82674fc2ecd4e4ab05f83e4eabe1",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-platform.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-platform.mjs",
      "bytes": 5074,
      "lineCount": 97,
      "sha256": "54777c980da003aa4f5f0ed2c2d56d9c426765c502b987676cb0532096b04d94",
      "manifestSha256": "54777c980da003aa4f5f0ed2c2d56d9c426765c502b987676cb0532096b04d94",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-process.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-process.mjs",
      "bytes": 4119,
      "lineCount": 113,
      "sha256": "9badef18d50090745a33ea15e92bbb890e7c01fa4ead4169f7d385b8854281e6",
      "manifestSha256": "9badef18d50090745a33ea15e92bbb890e7c01fa4ead4169f7d385b8854281e6",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-provider-claude.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-provider-claude.mjs",
      "bytes": 5006,
      "lineCount": 91,
      "sha256": "5e53b870216b15d5f049641572aba162313faebf443aa33aa915bff68e318198",
      "manifestSha256": "5e53b870216b15d5f049641572aba162313faebf443aa33aa915bff68e318198",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-provider-codex.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-provider-codex.mjs",
      "bytes": 15517,
      "lineCount": 342,
      "sha256": "b03a7d3c0bb0a72680fd3d7666ea6ebd4d0cc9dc53a40e488c880b4adbe79a6c",
      "manifestSha256": "b03a7d3c0bb0a72680fd3d7666ea6ebd4d0cc9dc53a40e488c880b4adbe79a6c",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-provider-cursor.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-provider-cursor.mjs",
      "bytes": 8375,
      "lineCount": 155,
      "sha256": "a5d54ebff61d7a033eac969cbffb94678764d7cca63fc5da8ac00e82787296ab",
      "manifestSha256": "a5d54ebff61d7a033eac969cbffb94678764d7cca63fc5da8ac00e82787296ab",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-provider-workbuddy.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-provider-workbuddy.mjs",
      "bytes": 13864,
      "lineCount": 220,
      "sha256": "9c8d3303fe7170eb4b25ad1b2e06b86203eece22fe7e9321bc854e5e0b417f09",
      "manifestSha256": "9c8d3303fe7170eb4b25ad1b2e06b86203eece22fe7e9321bc854e5e0b417f09",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-windows-desktop.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-windows-desktop.mjs",
      "bytes": 11650,
      "lineCount": 203,
      "sha256": "790935bbfea13d240be62965ca141b6806580cff413c3e243a8afe12bf29134f",
      "manifestSha256": "790935bbfea13d240be62965ca141b6806580cff413c3e243a8afe12bf29134f",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-windows-uia.ps1",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-windows-uia.ps1",
      "bytes": 19626,
      "lineCount": 358,
      "sha256": "5e3172ac5186f4f22f5b907d97b6fa60efe113eee1a7d310415afb0550cf41ab",
      "manifestSha256": "5e3172ac5186f4f22f5b907d97b6fa60efe113eee1a7d310415afb0550cf41ab",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-workbuddy-desktop.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-workbuddy-desktop.mjs",
      "bytes": 5885,
      "lineCount": 109,
      "sha256": "a20e511cb11810fbbe1cf371c20493755a7a9d326d9dcd73de89aac0ec059132",
      "manifestSha256": "a20e511cb11810fbbe1cf371c20493755a7a9d326d9dcd73de89aac0ec059132",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-workbuddy-headless.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-workbuddy-headless.mjs",
      "bytes": 904,
      "lineCount": 21,
      "sha256": "cd0594e74bd6d9c26581728786cda18c9dcde646d7acd3f96fe0ca3ae78cb9a8",
      "manifestSha256": "cd0594e74bd6d9c26581728786cda18c9dcde646d7acd3f96fe0ca3ae78cb9a8",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/agent-workbuddy-openapi.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\agent-workbuddy-openapi.mjs",
      "bytes": 3759,
      "lineCount": 78,
      "sha256": "1ff7087fab8460057c8abc852de1e4448d0ceae2ef7f2e4b9124b2a0a9ba59a3",
      "manifestSha256": "1ff7087fab8460057c8abc852de1e4448d0ceae2ef7f2e4b9124b2a0a9ba59a3",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/browser-fetch.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\browser-fetch.mjs",
      "bytes": 4091,
      "lineCount": 100,
      "sha256": "c46a5df6bbd5285591906ce0f99fae93b7ef723752ec8e4a2db3c3f2cb049edf",
      "manifestSha256": "c46a5df6bbd5285591906ce0f99fae93b7ef723752ec8e4a2db3c3f2cb049edf",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/browser-runtime-service.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\browser-runtime-service.mjs",
      "bytes": 1883,
      "lineCount": 52,
      "sha256": "2665d69b4257358751592bfbc3d2bbc6cb18e633e58845aabc6609534c01c450",
      "manifestSha256": "2665d69b4257358751592bfbc3d2bbc6cb18e633e58845aabc6609534c01c450",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/browser-service-channel.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\browser-service-channel.mjs",
      "bytes": 14195,
      "lineCount": 414,
      "sha256": "275b3f8ee77011269188df5f422f375dfb9d2429ab84beeb717f8d447da4084b",
      "manifestSha256": "275b3f8ee77011269188df5f422f375dfb9d2429ab84beeb717f8d447da4084b",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/browser-session.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\browser-session.mjs",
      "bytes": 3232,
      "lineCount": 92,
      "sha256": "7a6e5df00135b09c5c60e29a7081c1d75d5757038cfd4108bb4cc58289d73269",
      "manifestSha256": "7a6e5df00135b09c5c60e29a7081c1d75d5757038cfd4108bb4cc58289d73269",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/browser-transport.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\browser-transport.mjs",
      "bytes": 5246,
      "lineCount": 149,
      "sha256": "7e99c645aa21b096bdabc84e051c5a4cb06f079f77ca9bbf6959a31a2667d453",
      "manifestSha256": "7e99c645aa21b096bdabc84e051c5a4cb06f079f77ca9bbf6959a31a2667d453",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/cli-command.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\cli-command.mjs",
      "bytes": 9093,
      "lineCount": 240,
      "sha256": "b9689db8d78cce6c588f5d3fd669829381b9e106b5d6fa694bcdc8b5d80a19c2",
      "manifestSha256": "b9689db8d78cce6c588f5d3fd669829381b9e106b5d6fa694bcdc8b5d80a19c2",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/controller.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\controller.mjs",
      "bytes": 21474,
      "lineCount": 566,
      "sha256": "2d0479d815a678a10556ab78a96c8c95a703e1d89a59a0305e22e7ad73bd01b0",
      "manifestSha256": "2d0479d815a678a10556ab78a96c8c95a703e1d89a59a0305e22e7ad73bd01b0",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/docs.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\docs.mjs",
      "bytes": 4975,
      "lineCount": 128,
      "sha256": "8aad35e484db6321b08c08ef589d8039bb66cd49a91d86e514ae7e2a3a4be5dc",
      "manifestSha256": "8aad35e484db6321b08c08ef589d8039bb66cd49a91d86e514ae7e2a3a4be5dc",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/isolated-task-session.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\isolated-task-session.mjs",
      "bytes": 10730,
      "lineCount": 271,
      "sha256": "b9f555ffc280e24c92b04e742678708c23ba3454ac1e0974bf7015d6bbfc349c",
      "manifestSha256": "b9f555ffc280e24c92b04e742678708c23ba3454ac1e0974bf7015d6bbfc349c",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/path-safety.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\path-safety.mjs",
      "bytes": 391,
      "lineCount": 9,
      "sha256": "ae3f42d2bf724416ca1dc546ecc33e35a9e1b1e5dd76cc1f363690dc519208fc",
      "manifestSha256": "ae3f42d2bf724416ca1dc546ecc33e35a9e1b1e5dd76cc1f363690dc519208fc",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/persistent-evaluator.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\persistent-evaluator.mjs",
      "bytes": 58673,
      "lineCount": 1487,
      "sha256": "ae6286946662ef52cdf7fd45cc10c93263b42813cb1c7264e61c4c0b4f039b56",
      "manifestSha256": "ae6286946662ef52cdf7fd45cc10c93263b42813cb1c7264e61c4c0b4f039b56",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/playbooks.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\playbooks.mjs",
      "bytes": 5565,
      "lineCount": 159,
      "sha256": "78b75585788d260a76228ef3d121826867f19cb19241d30bcaffa3494ef774cb",
      "manifestSha256": "78b75585788d260a76228ef3d121826867f19cb19241d30bcaffa3494ef774cb",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/playwright-runtime.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\playwright-runtime.mjs",
      "bytes": 1539,
      "lineCount": 35,
      "sha256": "22a290c7cfa2be582cdf3a9b2bab2603388ae1bb1c5ad670c62453646f2cafd0",
      "manifestSha256": "22a290c7cfa2be582cdf3a9b2bab2603388ae1bb1c5ad670c62453646f2cafd0",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/png-dimensions.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\png-dimensions.mjs",
      "bytes": 612,
      "lineCount": 14,
      "sha256": "f08e5d38bcaba0f2b9aada23cad2e43a99817867d993c0547680d75b24d16011",
      "manifestSha256": "f08e5d38bcaba0f2b9aada23cad2e43a99817867d993c0547680d75b24d16011",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/runtime-public-server.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\runtime-public-server.mjs",
      "bytes": 11271,
      "lineCount": 309,
      "sha256": "9f561583f50d55f37cafb7d6f76f491e12c4d0f9c735c8989c212a8f0fd02cf3",
      "manifestSha256": "9f561583f50d55f37cafb7d6f76f491e12c4d0f9c735c8989c212a8f0fd02cf3",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/runtime-service.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\runtime-service.mjs",
      "bytes": 2701,
      "lineCount": 75,
      "sha256": "64dde12fa0f664ee3b0cbc2e878ee251215b0c878271fa383c893a8db19072ed",
      "manifestSha256": "64dde12fa0f664ee3b0cbc2e878ee251215b0c878271fa383c893a8db19072ed",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/state-root.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\state-root.mjs",
      "bytes": 3503,
      "lineCount": 102,
      "sha256": "4a87333bc152fcfebbc25269000b4cad4a0722cc43dc7d67744504f14bdd8c77",
      "manifestSha256": "4a87333bc152fcfebbc25269000b4cad4a0722cc43dc7d67744504f14bdd8c77",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/task-runtime.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\task-runtime.mjs",
      "bytes": 15783,
      "lineCount": 430,
      "sha256": "b216391be8458fff6ce2cde18b8017bc5160435ccb4a9b968d44f65dd89f0f6b",
      "manifestSha256": "b216391be8458fff6ce2cde18b8017bc5160435ccb4a9b968d44f65dd89f0f6b",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/src/task-worker.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\src\\task-worker.mjs",
      "bytes": 3453,
      "lineCount": 93,
      "sha256": "52189914a50d0e7d3119933bb895b9d465bf587bdbc302cd85b242e1c8579957",
      "manifestSha256": "52189914a50d0e7d3119933bb895b9d465bf587bdbc302cd85b242e1c8579957",
      "manifestMatch": true,
      "readScope": "bounded pattern search; selected detailed reading"
    },
    {
      "path": "runtime/third_party/npm/node_modules/npm/package.json",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\third_party\\npm\\node_modules\\npm\\package.json",
      "bytes": 6535,
      "lineCount": 258,
      "sha256": "7cbb6a7c030b398a7591992750cfb3e2479ef4f8aaa40316e3deb98af3b8184c",
      "manifestSha256": "7cbb6a7c030b398a7591992750cfb3e2479ef4f8aaa40316e3deb98af3b8184c",
      "manifestMatch": true,
      "readScope": "necessary package.json only"
    },
    {
      "path": "runtime/third_party/playwright/node_modules/playwright-core/package.json",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\third_party\\playwright\\node_modules\\playwright-core\\package.json",
      "bytes": 876,
      "lineCount": 34,
      "sha256": "07c47543631fef9508760365dee9fbe958c562093ec8d122543949ed231f233f",
      "manifestSha256": "07c47543631fef9508760365dee9fbe958c562093ec8d122543949ed231f233f",
      "manifestMatch": true,
      "readScope": "necessary package.json only"
    },
    {
      "path": "runtime/third_party/playwright/node_modules/playwright/package.json",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\third_party\\playwright\\node_modules\\playwright\\package.json",
      "bytes": 1416,
      "lineCount": 58,
      "sha256": "ca170ec143a88ed3043ac953eb3b2377b2b97304104f4e1e23316684ce2c35af",
      "manifestSha256": "ca170ec143a88ed3043ac953eb3b2377b2b97304104f4e1e23316684ce2c35af",
      "manifestMatch": true,
      "readScope": "necessary package.json only"
    },
    {
      "path": "runtime/third_party/playwright/node_modules/@playwright/test/package.json",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\third_party\\playwright\\node_modules\\@playwright\\test\\package.json",
      "bytes": 754,
      "lineCount": 35,
      "sha256": "be51f784a5742a1aa075e0173f5f04f189a791cc30c40e3bb18be584f696764e",
      "manifestSha256": "be51f784a5742a1aa075e0173f5f04f189a791cc30c40e3bb18be584f696764e",
      "manifestMatch": true,
      "readScope": "necessary package.json only"
    },
    {
      "path": "skills/tabbit/SKILL.md",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\skills\\tabbit\\SKILL.md",
      "bytes": 12211,
      "lineCount": 244,
      "sha256": "0da45693eacfacecfc22e4130935471816276f179abd9d494f485c5b62b5ef3b",
      "manifestSha256": "0da45693eacfacecfc22e4130935471816276f179abd9d494f485c5b62b5ef3b",
      "manifestMatch": true,
      "readScope": "packaged metadata/document data"
    },
    {
      "path": "skills/tabbit/agents/openai.yaml",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\skills\\tabbit\\agents\\openai.yaml",
      "bytes": 248,
      "lineCount": 4,
      "sha256": "1af19653294143d9df977a98adbbb26565de94a59c25cfac92441ab0f3bfb419",
      "manifestSha256": "1af19653294143d9df977a98adbbb26565de94a59c25cfac92441ab0f3bfb419",
      "manifestMatch": true,
      "readScope": "packaged metadata/document data"
    },
    {
      "path": "skills/tabbit/references/advanced-operations.md",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\skills\\tabbit\\references\\advanced-operations.md",
      "bytes": 20495,
      "lineCount": 521,
      "sha256": "434307354ba528428e455de8fcca77747945ac7dab33079184ee9bf5d0dd3f0b",
      "manifestSha256": "434307354ba528428e455de8fcca77747945ac7dab33079184ee9bf5d0dd3f0b",
      "manifestMatch": true,
      "readScope": "packaged metadata/document data"
    },
    {
      "path": "skills/tabbit/references/recovery.md",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\skills\\tabbit\\references\\recovery.md",
      "bytes": 17885,
      "lineCount": 324,
      "sha256": "ce56fdfea2c243810a652e80e4fa9619511f0eb86aa8df1597c38c6955eb5be9",
      "manifestSha256": "ce56fdfea2c243810a652e80e4fa9619511f0eb86aa8df1597c38c6955eb5be9",
      "manifestMatch": true,
      "readScope": "packaged metadata/document data"
    },
    {
      "path": "skills/tabbit/playbooks/NOTICE.md",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\skills\\tabbit\\playbooks\\NOTICE.md",
      "bytes": 2160,
      "lineCount": 39,
      "sha256": "fbcd604ef6bbe192f68d57995e0929a46bb93879700720d0d2d0a1a898dcc6b3",
      "manifestSha256": "fbcd604ef6bbe192f68d57995e0929a46bb93879700720d0d2d0a1a898dcc6b3",
      "manifestMatch": true,
      "readScope": "packaged metadata/document data"
    },
    {
      "path": "skills/tabbit/playbooks/WEBMCP-SOURCE.md",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\skills\\tabbit\\playbooks\\WEBMCP-SOURCE.md",
      "bytes": 9625,
      "lineCount": 171,
      "sha256": "aedbea598d6c6095cf5a405baeb6776b120369786b9ef2a86cf978cc431a6fc3",
      "manifestSha256": "aedbea598d6c6095cf5a405baeb6776b120369786b9ef2a86cf978cc431a6fc3",
      "manifestMatch": true,
      "readScope": "packaged metadata/document data"
    },
    {
      "path": "skills/tabbit/playbooks/github/manifest.json",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\skills\\tabbit\\playbooks\\github\\manifest.json",
      "bytes": 546,
      "lineCount": 25,
      "sha256": "573b297e1f52e31058b5ce4c25df5cf1c0a5a5b27f62a5705c90383f0a49c5e7",
      "manifestSha256": "573b297e1f52e31058b5ce4c25df5cf1c0a5a5b27f62a5705c90383f0a49c5e7",
      "manifestMatch": true,
      "readScope": "packaged metadata/document data"
    },
    {
      "path": "runtime/package.json",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime\\package.json",
      "bytes": 250,
      "lineCount": 13,
      "sha256": "0887075c6327a0f2eb6db1427d1aec80d113f45f39f72cba9cdfcd35db4a3aa2",
      "manifestSha256": "0887075c6327a0f2eb6db1427d1aec80d113f45f39f72cba9cdfcd35db4a3aa2",
      "manifestMatch": true,
      "readScope": "packaged metadata/document data"
    },
    {
      "path": "tabbit-dsh-lifecycle.mjs",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\tabbit-dsh-lifecycle.mjs",
      "bytes": 531,
      "lineCount": 17,
      "sha256": "841d17a264698c99dbc51f6d72d1c8538c88b611e0dfa64768a9231066fe1a23",
      "manifestSha256": "841d17a264698c99dbc51f6d72d1c8538c88b611e0dfa64768a9231066fe1a23",
      "manifestMatch": true,
      "readScope": "packaged metadata/document data"
    },
    {
      "path": "runtime_stage.stamp",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime_stage.stamp",
      "bytes": 66,
      "lineCount": 1,
      "sha256": "5c4422a562c6395549d80731d869b535aa12339ebd71e8607df5bb845673675d",
      "manifestSha256": "5c4422a562c6395549d80731d869b535aa12339ebd71e8607df5bb845673675d",
      "manifestMatch": true,
      "readScope": "packaged metadata/document data"
    },
    {
      "path": "runtime_release_manifest.json",
      "absolutePath": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\TabbitDance\\runtime_release_manifest.json",
      "bytes": 439670,
      "lineCount": 1,
      "sha256": "75965cb741c6231e47ea0e92aeaf62b3eb90bc20abb5ad853a594f757036d864",
      "manifestSha256": null,
      "manifestMatch": null,
      "readScope": "packaged metadata/document data"
    }
  ],
  "excerpts": [
    {
      "id": "D01",
      "kind": "shipped-text-observation",
      "path": "runtime_stage.stamp",
      "startLine": 1,
      "endLine": 1,
      "lines": [
        {
          "line": 1,
          "text": "f"
        }
      ]
    },
    {
      "id": "D02",
      "kind": "shipped-text-observation",
      "path": "runtime/src/browser-runtime-service.mjs",
      "startLine": 19,
      "endLine": 43,
      "lines": [
        {
          "line": 19,
          "text": "  const arguments_ = process.argv.slice(2);"
        },
        {
          "line": 20,
          "text": "  if (arguments_.length !== 1 ||"
        },
        {
          "line": 21,
          "text": "      !arguments_[0].startsWith(\"--browser-transport=\")) {"
        },
        {
          "line": 22,
          "text": "    throw Object.assign("
        },
        {
          "line": 23,
          "text": "      new Error(\"Exactly one browser transport descriptor is required\"),"
        },
        {
          "line": 24,
          "text": "      {code: \"PROTOCOL_MISMATCH\"});"
        },
        {
          "line": 25,
          "text": "  }"
        },
        {
          "line": 26,
          "text": "  const privateStream = createBrowserTransport(parseBrowserTransportDescriptor("
        },
        {
          "line": 27,
          "text": "    arguments_[0].slice(\"--browser-transport=\".length)));"
        },
        {
          "line": 28,
          "text": "  const channel = new BrowserServiceChannel(privateStream);"
        },
        {
          "line": 29,
          "text": "  service = new BrowserRuntimeService({"
        },
        {
          "line": 30,
          "text": "    channel,"
        },
        {
          "line": 31,
          "text": "    controllerFactory: (configuration) => {"
        },
        {
          "line": 32,
          "text": "      const stateRoot = initializeBrowserStateRoot(configuration.stateRoot);"
        },
        {
          "line": 33,
          "text": "      return new TabbitPlaywrightController(stateRoot, {"
        },
        {
          "line": 34,
          "text": "        launchSession: (options) => createIsolatedBrowserServiceSession(channel, options),"
        },
        {
          "line": 35,
          "text": "        listTabGroups: () => channel.listTabGroups(),"
        },
        {
          "line": 36,
          "text": "      });"
        },
        {
          "line": 37,
          "text": "    },"
        },
        {
          "line": 38,
          "text": "  });"
        },
        {
          "line": 39,
          "text": "  await service.start({"
        },
        {
          "line": 40,
          "text": "    pid: process.pid,"
        },
        {
          "line": 41,
          "text": "    nodeVersion: process.version,"
        },
        {
          "line": 42,
          "text": "    playwrightVersion,"
        },
        {
          "line": 43,
          "text": "  });"
        }
      ]
    },
    {
      "id": "D03",
      "kind": "shipped-text-observation",
      "path": "runtime/src/browser-service-channel.mjs",
      "startLine": 49,
      "endLine": 56,
      "lines": [
        {
          "line": 49,
          "text": "export function encodePrivateFrame(message) {"
        },
        {
          "line": 50,
          "text": "  const body = Buffer.from(JSON.stringify(message));"
        },
        {
          "line": 51,
          "text": "  if (body.length > MAX_PRIVATE_FRAME_BYTES) {"
        },
        {
          "line": 52,
          "text": "    throw protocolError(\"FRAME_TOO_LARGE\", \"Browser service frame exceeds 64 MiB\");"
        },
        {
          "line": 53,
          "text": "  }"
        },
        {
          "line": 54,
          "text": "  const header = Buffer.allocUnsafe(4);"
        },
        {
          "line": 55,
          "text": "  header.writeUInt32BE(body.length);"
        },
        {
          "line": 56,
          "text": "  return Buffer.concat([header, body]);"
        }
      ]
    },
    {
      "id": "D04",
      "kind": "shipped-text-observation",
      "path": "runtime/src/browser-transport.mjs",
      "startLine": 137,
      "endLine": 148,
      "lines": [
        {
          "line": 137,
          "text": "export function createBrowserTransport(descriptor, options) {"
        },
        {
          "line": 138,
          "text": "  if (descriptor.kind === \"darwin-inherited-fd\" ||"
        },
        {
          "line": 139,
          "text": "      descriptor.kind === \"linux-inherited-fd\") {"
        },
        {
          "line": 140,
          "text": "    const socket = new Socket({fd: descriptor.fd, readable: true, writable: true});"
        },
        {
          "line": 141,
          "text": "    socket.setNoDelay(true);"
        },
        {
          "line": 142,
          "text": "    return socket;"
        },
        {
          "line": 143,
          "text": "  }"
        },
        {
          "line": 144,
          "text": "  if (descriptor.kind === \"win-named-pipe\") {"
        },
        {
          "line": 145,
          "text": "    return new RetryingNamedPipeTransport(descriptor.address, options);"
        },
        {
          "line": 146,
          "text": "  }"
        },
        {
          "line": 147,
          "text": "  throw protocolError(`Unsupported browser transport: ${descriptor.kind}`,"
        },
        {
          "line": 148,
          "text": "      \"UNSUPPORTED_TRANSPORT\");"
        }
      ]
    },
    {
      "id": "D05",
      "kind": "shipped-text-observation",
      "path": "runtime/src/runtime-public-server.mjs",
      "startLine": 305,
      "endLine": 308,
      "lines": [
        {
          "line": 305,
          "text": "function exactAuthentication(value) {"
        },
        {
          "line": 306,
          "text": "  return value && typeof value === \"object\" && !Array.isArray(value) &&"
        },
        {
          "line": 307,
          "text": "    Object.keys(value).length === 3 && value.version === 1 &&"
        },
        {
          "line": 308,
          "text": "    typeof value.token === \"string\" && typeof value.generation === \"string\";"
        }
      ]
    },
    {
      "id": "D06",
      "kind": "shipped-text-observation",
      "path": "runtime/src/task-worker.mjs",
      "startLine": 75,
      "endLine": 89,
      "lines": [
        {
          "line": 75,
          "text": "try {"
        },
        {
          "line": 76,
          "text": "  const browser = await chromium.connectOverCDP(transport, {noDefaults: true});"
        },
        {
          "line": 77,
          "text": "  context = browser.contexts()[0];"
        },
        {
          "line": 78,
          "text": "  if (!context) throw new Error(\"Playwright did not return Tabbit's active profile context\");"
        },
        {
          "line": 79,
          "text": "  const session = {browser, context, page: context.pages().at(0) ?? null,"
        },
        {
          "line": 80,
          "text": "    taskDir: workerData.taskDir, artifactDir: workerData.artifactDir,"
        },
        {
          "line": 81,
          "text": "    onImplicitPage(page) {"
        },
        {
          "line": 82,
          "text": "      const targetId = page._connection.toImpl(page).delegate._targetId;"
        },
        {
          "line": 83,
          "text": "      parentPort.postMessage({kind: \"implicitPage\", targetId});"
        },
        {
          "line": 84,
          "text": "    }};"
        },
        {
          "line": 85,
          "text": "  evaluator = new PersistentEvaluator("
        },
        {
          "line": 86,
          "text": "      session, workerData.taskDir, workerData.artifactDir,"
        },
        {
          "line": 87,
          "text": "      {playbooksRoot: workerData.playbooksRoot,"
        },
        {
          "line": 88,
          "text": "        extensionApis: workerData.extensionApis, callExtensionApi});"
        },
        {
          "line": 89,
          "text": "  parentPort.postMessage({kind: \"ready\", browserVersion: await browser.version()});"
        }
      ]
    },
    {
      "id": "D07",
      "kind": "shipped-text-observation",
      "path": "runtime/src/isolated-task-session.mjs",
      "startLine": 85,
      "endLine": 99,
      "lines": [
        {
          "line": 85,
          "text": "  #onMessage(message) {"
        },
        {
          "line": 86,
          "text": "    if (this.closed) return;"
        },
        {
          "line": 87,
          "text": "    if (message?.kind === \"implicitPage\") {"
        },
        {
          "line": 88,
          "text": "      this.implicitTargetId = message.targetId;"
        },
        {
          "line": 89,
          "text": "      return;"
        },
        {
          "line": 90,
          "text": "    }"
        },
        {
          "line": 91,
          "text": "    if (message?.kind === \"cdp\") {"
        },
        {
          "line": 92,
          "text": "      this.transport.send(message.message);"
        },
        {
          "line": 93,
          "text": "      return;"
        },
        {
          "line": 94,
          "text": "    }"
        },
        {
          "line": 95,
          "text": "    // Issued from inside a running evaluation, which already holds the control"
        },
        {
          "line": 96,
          "text": "    // lane; queueing behind it would deadlock."
        },
        {
          "line": 97,
          "text": "    if (message?.kind === \"extensionCall\") {"
        },
        {
          "line": 98,
          "text": "      void this.#extensionCall(message);"
        },
        {
          "line": 99,
          "text": "      return;"
        }
      ]
    },
    {
      "id": "D08",
      "kind": "shipped-text-observation",
      "path": "runtime/src/persistent-evaluator.mjs",
      "startLine": 1297,
      "endLine": 1307,
      "lines": [
        {
          "line": 1297,
          "text": "  #selectTarget(targetId) {"
        },
        {
          "line": 1298,
          "text": "    // The pinned in-process Playwright bridge exposes the server's CDP identity."
        },
        {
          "line": 1299,
          "text": "    // URLs and client page IDs cannot distinguish two tabs with the same URL."
        },
        {
          "line": 1300,
          "text": "    const page = this.session.context.pages().find((candidate) =>"
        },
        {
          "line": 1301,
          "text": "      !candidate.isClosed() &&"
        },
        {
          "line": 1302,
          "text": "      candidate._connection?.toImpl?.(candidate)?.delegate?._targetId === targetId);"
        },
        {
          "line": 1303,
          "text": "    if (!page) {"
        },
        {
          "line": 1304,
          "text": "      throw Object.assign(new Error(\"The acquired entry tab is no longer attached\"),"
        },
        {
          "line": 1305,
          "text": "          {code: \"ENTRY_TAB_NOT_ATTACHED\"});"
        },
        {
          "line": 1306,
          "text": "    }"
        },
        {
          "line": 1307,
          "text": "    return this.#usePage(page);"
        }
      ]
    },
    {
      "id": "D09",
      "kind": "shipped-text-observation",
      "path": "runtime/src/persistent-evaluator.mjs",
      "startLine": 410,
      "endLine": 425,
      "lines": [
        {
          "line": 410,
          "text": "// Builds the `chrome` global for tabbit.evaluate from the Browser's allowlist,"
        },
        {
          "line": 411,
          "text": "// e.g. \"system.cpu.getInfo\" becomes chrome.system.cpu.getInfo(). Methods the"
        },
        {
          "line": 412,
          "text": "// Browser does not advertise stay undefined."
        },
        {
          "line": 413,
          "text": "function chromeNamespace(methods, call) {"
        },
        {
          "line": 414,
          "text": "  const root = {};"
        },
        {
          "line": 415,
          "text": "  for (const method of methods) {"
        },
        {
          "line": 416,
          "text": "    const path = method.split(\".\");"
        },
        {
          "line": 417,
          "text": "    let node = root;"
        },
        {
          "line": 418,
          "text": "    for (const part of path.slice(0, -1)) node = node[part] ??= {};"
        },
        {
          "line": 419,
          "text": "    node[path.at(-1)] = (...args) => {"
        },
        {
          "line": 420,
          "text": "      while (args.length && args.at(-1) === undefined) args.pop();"
        },
        {
          "line": 421,
          "text": "      if (typeof args.at(-1) === \"function\") {"
        },
        {
          "line": 422,
          "text": "        throw new TypeError(`${method}: tabbit.evaluate supports promise-style chrome APIs only`);"
        },
        {
          "line": 423,
          "text": "      }"
        },
        {
          "line": 424,
          "text": "      return call(method, structuredClone(args));"
        },
        {
          "line": 425,
          "text": "    };"
        }
      ]
    },
    {
      "id": "D10",
      "kind": "shipped-text-observation",
      "path": "runtime/src/agent-bridge.mjs",
      "startLine": 8,
      "endLine": 15,
      "lines": [
        {
          "line": 8,
          "text": "// Only registered, packaged adapters can run. A renderer cannot supply modules,"
        },
        {
          "line": 9,
          "text": "// executable paths or shell commands. Future adapters need no new Native API."
        },
        {
          "line": 10,
          "text": "const providers = ["
        },
        {
          "line": 11,
          "text": "  codexProvider,"
        },
        {
          "line": 12,
          "text": "  claudeProvider,"
        },
        {
          "line": 13,
          "text": "  workbuddyProvider,"
        },
        {
          "line": 14,
          "text": "  cursorProvider,"
        },
        {
          "line": 15,
          "text": "];"
        }
      ]
    },
    {
      "id": "D11",
      "kind": "shipped-text-observation",
      "path": "runtime/src/agent-provider-codex.mjs",
      "startLine": 60,
      "endLine": 80,
      "lines": [
        {
          "line": 60,
          "text": "async function readHistory(method, params, timeoutMs = 15000) {"
        },
        {
          "line": 61,
          "text": "  const child = spawnAgentProcess(await codexPath(), ['app-server', '--listen', 'stdio://']);"
        },
        {
          "line": 62,
          "text": "  // A following exec resume must not race the app-server's writer lock."
        },
        {
          "line": 63,
          "text": "  const closed = new Promise((resolve) => child.once('close', resolve));"
        },
        {
          "line": 64,
          "text": "  try {"
        },
        {
          "line": 65,
          "text": "    return await watchJsonProcess(child, {"
        },
        {
          "line": 66,
          "text": "      timeoutMs,"
        },
        {
          "line": 67,
          "text": "      maxBytes: 32 * 1024 * 1024,"
        },
        {
          "line": 68,
          "text": "      initialize(channel) {"
        },
        {
          "line": 69,
          "text": "        channel.send({"
        },
        {
          "line": 70,
          "text": "          id: 1,"
        },
        {
          "line": 71,
          "text": "          method: 'initialize',"
        },
        {
          "line": 72,
          "text": "          params: { clientInfo: { name: 'tabbit_agent_bridge', version: '0.1.0' } },"
        },
        {
          "line": 73,
          "text": "        });"
        },
        {
          "line": 74,
          "text": "      },"
        },
        {
          "line": 75,
          "text": "      onMessage(message, channel) {"
        },
        {
          "line": 76,
          "text": "        if (message.error) throw new AgentError('Codex 无法读取历史，请重新选择');"
        },
        {
          "line": 77,
          "text": "        if (message.id === 1) {"
        },
        {
          "line": 78,
          "text": "          channel.send({ method: 'initialized' });"
        },
        {
          "line": 79,
          "text": "          channel.send({ id: 2, method, params });"
        },
        {
          "line": 80,
          "text": "        } else if (message.id === 2) channel.resolve(message.result);"
        }
      ]
    },
    {
      "id": "D12",
      "kind": "shipped-text-observation",
      "path": "runtime/package.json",
      "startLine": 1,
      "endLine": 13,
      "lines": [
        {
          "line": 1,
          "text": "{"
        },
        {
          "line": 2,
          "text": "  \"name\": \"@tabbit/playwright-agent\","
        },
        {
          "line": 3,
          "text": "  \"version\": \"0.1.0\","
        },
        {
          "line": 4,
          "text": "  \"private\": true,"
        },
        {
          "line": 5,
          "text": "  \"type\": \"module\","
        },
        {
          "line": 6,
          "text": "  \"engines\": {"
        },
        {
          "line": 7,
          "text": "    \"node\": \">=24.0.0\""
        },
        {
          "line": 8,
          "text": "  },"
        },
        {
          "line": 9,
          "text": "  \"scripts\": {"
        },
        {
          "line": 10,
          "text": "    \"test\": \"vpython3 run_tests.py\","
        },
        {
          "line": 11,
          "text": "    \"r6\": \"node scripts/r6-installed-smoke.mjs\""
        },
        {
          "line": 12,
          "text": "  }"
        },
        {
          "line": 13,
          "text": "}"
        }
      ]
    },
    {
      "id": "D13",
      "kind": "shipped-text-observation",
      "path": "runtime/src/playbooks.mjs",
      "startLine": 11,
      "endLine": 14,
      "lines": [
        {
          "line": 11,
          "text": "// Packaged runtime/src is two levels below skills. Tests inject their fixture"
        },
        {
          "line": 12,
          "text": "// root because source checkout layout is intentionally not a runtime bundle."
        },
        {
          "line": 13,
          "text": "const DEFAULT_PLAYBOOK_ROOT = fileURLToPath(new URL("
        },
        {
          "line": 14,
          "text": "  \"../../skills/tabbit/playbooks/\", import.meta.url));"
        }
      ]
    }
  ],
  "boundedSearch": {
    "scope": "All 37 runtime/src files only",
    "pattern": "\\bupstream\\b|\\brebase\\b|\\bgclient\\b|\\bDEPS\\b|BUILD\\.gn|runtime_release_manifest|runtime_stage|\\bupdate(r)?\\b|\\bdownload.*runtime\\b|remote-debugging|new WebSocket|chromium\\.launch|chromium\\.connect",
    "matches": [
      {
        "path": "runtime/src/agent-history-jsonl.mjs",
        "line": 57,
        "text": "fingerprint: createHash('sha256').update(content).digest('hex'),"
      },
      {
        "path": "runtime/src/agent-windows-uia.ps1",
        "line": 200,
        "text": "# Never overwrite a clipboard update made by the user/another application."
      },
      {
        "path": "runtime/src/persistent-evaluator.mjs",
        "line": 1424,
        "text": "const sha256 = createHash(\"sha256\").update(data).digest(\"hex\");"
      },
      {
        "path": "runtime/src/task-worker.mjs",
        "line": 76,
        "text": "const browser = await chromium.connectOverCDP(transport, {noDefaults: true});"
      }
    ],
    "interpretation": "No observed Chromium sync pipeline/updater; hash .update and clipboard comment are irrelevant; connectOverCDP is the positive connection evidence",
    "negativeConclusionScope": "Only this installed runtime/src, not the browser project or binaries"
  },
  "optionalCloudImporterSearch": {
    "scope": "37 runtime/src files",
    "pattern": "agent-workbuddy-openapi",
    "matches": [],
    "conclusion": "No observed importer in searched source set; remote availability and external imports unknown"
  },
  "unknowns": [
    "Chromium upstream revision and patch queue",
    "Browser-side private bridge and CDP policy implementation",
    "Playwright vendor changes / stock identity",
    "CLI/launcher binary implementation and endpoint discovery",
    "Actual Node binary version",
    "Independent deployment/update pipeline",
    "Runtime stamp derivation",
    "Authenticode validity",
    "Live behavior"
  ]
}