diff --git a/README.md b/README.md index d13996f..aa73880 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # Radar -Radar is a local-first defensive web security workbench. It launches a dedicated browser profile, captures HTTP/S and WebSocket traffic through Electron's DevTools protocol plus a local MITM proxy, lets you replay requests through a controlled repeater, and runs bounded payload testing from explicit markers. Work in Manual-First mode when you want direct operator control, or switch to AI-First mode to let a scoped agent drive the app while you watch. +Radar is a local-first defensive web security workbench. It launches a dedicated browser profile, attaches Playwright to that visible managed Chrome session, captures HTTP/S and WebSocket traffic through Chrome's DevTools protocol plus a local MITM proxy, lets you replay requests through a controlled repeater, and runs bounded payload testing from explicit markers. Work in Manual-First mode when you want direct operator control, or switch to AI-First mode to let a scoped agent drive the same browser and evidence surfaces while you watch. ## MVP Surface - Sidebar workspace with dedicated HTTP(S), WebSocket, Intercept, Repeater, Automate, Findings, Workflows, Plugins, Advanced, Sitemap, Scope, and SSL tabs. -- Radar Browser launcher using a supported local Chrome, Edge, Brave, or Chromium binary with a Radar-owned profile and Radar proxy wiring. +- Radar Browser toolbar using a supported local Chrome, Edge, Brave, or Chromium binary with a Radar-owned profile, address/back/forward/reload controls, Radar proxy wiring, and a persistent Playwright-over-CDP automation session. - Persistent local projects and sessions for separating clients, retests, captures, targets, stable workspace-scoped identity profiles and activations, project notes, saved views, findings, workflows, plugins, SSL events, WebSocket frames, AI-First run history, and local AI run memory. - HTTP/S capture history with method/type filters, a scoped traffic query language, saved filters, tags and comments, bulk tag/delete/export, request/response detail search fallback, selectable copyable details, multi-select, right-click request actions, TLS metadata, and source attribution (browser / proxy / repeater). - WebSocket analyzer with handshake, sent, received, error, and close frames; the same scoped query language; direction filters; frame detail copy; and proxy-backed passthrough so controlled Chrome can load WebSocket apps. @@ -26,7 +26,7 @@ Radar is a local-first defensive web security workbench. It launches a dedicated - SSL/cert event log for visibility into trusted vs. blocked endpoints. - Manual-First / AI-First mode toggle: keep direct operator control, or hand a saved-scope goal to an autonomous run console with selectable local history, a persistent Mission Graph, and pause, resume, and stop controls. - Command-palette AI with per-view skills, provider adapters, context preview, selectable HTTP/S and WebSocket packets, prepare-only outputs, and session audit trail. -- AI-First autonomous runs with a full observation console, run profile presets, revision-checked Mission Graph patches, risk-tiered capability leases with durable action receipts, cumulative checkpointed budgets, durable pause/resume, operator steering and failure recovery, resolved-evidence graph/finding gates, review-first Repeater/Workflow drafts, and project-scoped run memory for tested hypotheses, dismissed leads, and retest notes. +- AI-First autonomous runs with a Browser Assessment profile, Playwright accessibility/element inspection and actionability-aware click/fill/form tools, scoped request routing during browser actions, a full observation console, revision-checked Mission Graph patches, risk-tiered capability leases with durable action receipts, cumulative checkpointed budgets, durable pause/resume, operator steering and failure recovery, resolved-evidence graph/finding gates, review-first Repeater/Workflow drafts, and project-scoped run memory for tested hypotheses, dismissed leads, and retest notes. - Switchable Bureau, Vellum, and Specter themes with high-contrast text selection for request/response inspection. - Seeded **Radar Demo Project** for screenshots, manual QA, onboarding, and walkthroughs, with synthetic captures, WebSocket frames, findings, workflows, plugins, Advanced signals, and AI run history. @@ -37,6 +37,7 @@ Radar is a local-first defensive web security workbench. It launches a dedicated - Tailwind CSS v4 with CSS-variable themes and shadcn-style UI primitives (`cn`, `cva`, `src/components/ui/`). - SQLite local store (`radar-local.sqlite`) with an explicit migration ledger for projects, sessions, identity metadata and activations, evidence, workflows, plugins, AI run history, and project-scoped run memory. - mockttp for the local MITM proxy, CA generation, HTTP/S passthrough capture, and WebSocket passthrough/frame events. +- Playwright Core for persistent control of the operator-visible managed Chrome session through its loopback CDP endpoint; Radar uses the installed browser and does not download a second Chromium build. - System browser discovery for Chrome, Edge, Brave, and Chromium. ## Run @@ -139,7 +140,7 @@ The engagement boundary. Newline-delimited origins filter HTTP/S captures and We ![Radar SSL / Proxy view](docs/screens/radar-04-ssl.png) -Crypto and proxy interception. The summary strip shows current proxy URL, generated CA path, and active browser profile. Below: **Engage Proxy** / **Disengage** / **Forge CA** controls plus a printout of HTTP proxy address, CA cert path, SPKI fingerprint, Chrome CDP endpoint, and selected browser binary. The lower panes hold the certificate event log, local-only proxy profile notes for Radar Browser / external browser / CLI / mobile-device setup, and a TLS detail pane for the currently selected capture. +Crypto and proxy interception. The summary strip shows current proxy URL, generated CA path, and active browser profile. Below: **Engage Proxy** / **Disengage** / **Forge CA** controls plus a printout of HTTP proxy address, CA cert path, SPKI fingerprint, Chrome CDP endpoint, Playwright connection/page count, and selected browser binary. The lower panes hold the certificate event log, local-only proxy profile notes for Radar Browser / external browser / CLI / mobile-device setup, and a TLS detail pane for the currently selected capture. ### Projects And Sessions @@ -157,7 +158,7 @@ Use **Handoff package** in that panel when you need a narrower deliverable than Manual-First is the default. The HTTP(S), WebSocket, Intercept, Repeater, Automate, Findings, Workflows, Plugins, Advanced, Sitemap, Scope, and SSL views remain the primary controls, and the AI command palette stays prepare-only: it can summarize, draft, and suggest, but the operator clicks navigation, intercept, replay, Automate execution, workflow definition changes, plugin approval, import/replay use, finding review, and export controls. -AI-First adds a goal prompt, profile picker, budget chips, saved **Run History** selector, Mission Graph, and observation console above the existing views. Profiles include Passive Map, Auth Review, API Hardening, Header/Cookie Review, Advanced API Review, and Report From Evidence; each profile constrains allowed tools and budgets for steps, replay, workflow requests, capture sample, timeout, and raw-context policy. Selecting a saved run swaps the graph, transcript, findings, status, and controls to that run. **Pause** stores a durable checkpoint; **Resume** continues from it while keeping elapsed time, tool steps, replay sends, and workflow requests cumulative instead of resetting the profile budget. +AI-First adds a goal prompt, profile picker, budget chips, saved **Run History** selector, Mission Graph, and observation console above the existing views. Profiles include Browser Assessment, Passive Map, Auth Review, API Hardening, Header/Cookie Review, Advanced API Review, and Report From Evidence. Browser Assessment is the default live-site path: it can inspect and operate the visible page, capture resulting traffic, and use tightly budgeted replay or saved workflow verification after the required capability grants. Every profile constrains tools and budgets for steps, replay, workflow requests, capture sample, timeout, and raw-context policy. Selecting a saved run swaps the graph, transcript, findings, status, and controls to that run. **Pause** stores a durable checkpoint; **Resume** continues from it while keeping elapsed time, tool steps, replay sends, and workflow requests cumulative instead of resetting the profile budget. Each run owns a versioned Mission Graph persisted locally with its objectives, falsifiable hypotheses, bounded experiments, evidence-backed claims, host/endpoint/identity/state/control coverage cells, and operator questions. The planner advances it through bounded patches against an exact base revision instead of replacing the graph. Stale revisions, dangling objective/hypothesis links, invalid statuses, and unresolved local evidence references fail closed. A supported hypothesis, supported or verified claim, or covered cell must cite evidence that resolves in Radar's current local evidence catalog. @@ -173,11 +174,11 @@ Identity Lab profiles have stable workspace-scoped IDs and operator-authored rol The renderer and `getIdentityLabContext` receive only identity metadata, health, activation IDs, and attributed counts. Cookie and storage values remain in the Electron main process and the dedicated browser profile; sending raw values to AI still requires Radar's existing raw-context opt-in. Legacy named auth-state snapshots remain historical comparison artifacts: they are not dedicated isolation and are not auto-imported as Identity Lab profiles. -A persistent CDP Network observer on managed Chrome records request-time run, navigation, action, identity, and activation lineage when available; sequence and experiment fields are reserved for later producers. Later response/body updates retain original request-time attribution. Proxy-only traffic intentionally does not inherit managed-browser identity or action context. Radar's causal-link contract reports explicit `exact`, `correlated`, `inferred`, or `unmatched` confidence with a reason; the current Identity Lab ledger shows requests observed under explicit action contexts and retains unmatched captures without claiming temporal proximity proves causation. C10 does not yet persist DOM snapshots or execute active differential tests. +A persistent CDP Network observer on managed Chrome records request-time run, navigation, action, identity, and activation lineage when available; sequence and experiment fields are reserved for later producers. Later response/body updates retain original request-time attribution. Proxy-only traffic intentionally does not inherit managed-browser identity or action context. Radar's causal-link contract reports explicit `exact`, `correlated`, `inferred`, or `unmatched` confidence with a reason; the current Identity Lab ledger shows requests observed under explicit action contexts and retains unmatched captures without claiming temporal proximity proves causation. AI-First persists bounded page text, accessibility summaries, and action results in the run transcript; it does not persist a full DOM or screenshot stream. Identity Lab's role × tenant × resource matrix uses operator-authored labels and includes only captures with both a known identity ID and activation ID. A 2xx response is an observation, not authorization proof. The one-dimension comparison uses already-recorded requests only, offers a second capture only when identity is the sole changing dimension, compares recorded response metadata/shape, and sends no traffic. -A run can move the visible workbench through Scope, HTTP(S), WebSocket, Intercept, Repeater, Automate, Workflows, Plugins, Advanced, Sitemap, and SSL, launch or inspect the browser, sample captures, summarize local sitemap/findings/Advanced/workflow/note/saved-view/run-memory context, prepare traffic queries into the visible filter bar, read queued intercept items, load visible intercept edit drafts, load Repeater and Workflow drafts for review, prepare visible Automate payload/rule controls, analyze existing Automate results, read approved plugin inventory, and write quality-gated draft findings. AI-prepared Repeater and Workflow work stays visible and requires the existing operator Save/Run/Transmit controls. A failed or policy-blocked tool pauses the run for operator direction. Radar can re-execute an operator-requested retry only for safe, idempotent tools; it never automatically retries mutating browser, authentication-state, replay, or workflow actions. Before any AI finding persists, every cited reference must resolve in the current local evidence catalog, with network evidence still constrained by saved Scope. Local run memory can be confirmed or dismissed from transcript proposals, or created manually in the Run Memory panel. Intercept forwarding, dropping, Automate session execution, plugin install/approval/execution, Advanced import/replay actions, finding review, and export remain Manual-First operator actions. +A run can move the visible workbench through Scope, HTTP(S), WebSocket, Intercept, Repeater, Automate, Workflows, Plugins, Advanced, Sitemap, and SSL; launch or navigate the visible managed browser; read page text and accessibility structure; discover stable page-specific selectors; click, fill, and submit through Playwright; wait for network idle; then inspect causally attributed captures. Scoped AI browser actions temporarily abort out-of-scope HTTP/S requests, and submit-capable controls must use the separately leased form tool. The run can also summarize local sitemap/findings/Advanced/workflow/note/saved-view/run-memory context, prepare traffic queries into the visible filter bar, read queued intercept items, load visible intercept edit drafts, load Repeater and Workflow drafts for review, prepare visible Automate payload/rule controls, analyze existing Automate results, read approved plugin inventory, and write quality-gated draft findings. AI-prepared Repeater and Workflow work stays visible and requires the existing operator Save/Run/Transmit controls. A failed or policy-blocked tool pauses the run for operator direction. Radar can re-execute an operator-requested retry only for safe, idempotent tools; it never automatically retries mutating browser, authentication-state, replay, or workflow actions. Before any AI finding persists, every cited reference must resolve in the current local evidence catalog, with network evidence still constrained by saved Scope. Local run memory can be confirmed or dismissed from transcript proposals, or created manually in the Run Memory panel. Intercept forwarding, dropping, Automate session execution, plugin install/approval/execution, Advanced import/replay actions, finding review, and export remain Manual-First operator actions. ### AI — Command Palette @@ -220,7 +221,7 @@ Add project origins in the Scope view (or use "Trust Origin" in Repeater) to bri Radar has two HTTPS/WebSocket interception paths: -- **Radar Browser mode** — **Open Browser** launches a supported local Chrome, Edge, Brave, or Chromium binary with a dedicated Radar profile, remote debugging on `127.0.0.1:9223`, and the Radar proxy attached. Radar's CA fingerprint is supplied as a launch-scoped certificate exception so HTTPS works without touching the system trust store. +- **Radar Browser mode** — **Open Browser** launches a supported local Chrome, Edge, Brave, or Chromium binary with a dedicated Radar profile, remote debugging on `127.0.0.1:9223`, the Radar proxy attached, and Playwright connected to the same visible window. Radar's CA fingerprint is supplied as a launch-scoped certificate exception so HTTPS works without touching the system trust store. - **External browser proxy** — engage the proxy from the SSL view, point your browser at `http://127.0.0.1:8088`, then manually trust the generated `radar-ca.pem` shown in the UI. The SSL view also stores workspace-local notes for Radar Browser, external browser, CLI tools, and mobile/device proxy setup so client-specific proxy instructions stay with the active workspace. @@ -254,6 +255,7 @@ See [docs/REGRESSION_SUITE_SPEC.md](docs/REGRESSION_SUITE_SPEC.md) for the full ``` electron/ main.ts Main-process: CDP capture, HTTP/WebSocket proxy, browser launcher, IPC handlers + playwrightBrowser.ts Persistent Playwright-over-CDP controller for managed Chrome preload.ts Exposes the typed `window.radar` API to the renderer screenshot.ts Headless screenshot runner for README assets ai/ Provider adapters, context builder, connect presets, audit trail diff --git a/artifacts/regression/html/index.html b/artifacts/regression/html/index.html new file mode 100644 index 0000000..cbef7c0 --- /dev/null +++ b/artifacts/regression/html/index.html @@ -0,0 +1,90 @@ + + + + + + + + + Playwright Test Report + + + + +
+ + + \ No newline at end of file diff --git a/artifacts/regression/results.json b/artifacts/regression/results.json new file mode 100644 index 0000000..2ed0954 --- /dev/null +++ b/artifacts/regression/results.json @@ -0,0 +1,7951 @@ +{ + "config": { + "argv": [ + "/Users/thomaswhidden/.nvm/versions/node/v22.22.0/bin/node", + "/Users/thomaswhidden/Documents/Radar/node_modules/@playwright/test/cli.js", + "test" + ], + "configFile": "/Users/thomaswhidden/Documents/Radar/playwright.config.ts", + "rootDir": "/Users/thomaswhidden/Documents/Radar/tests/regression", + "failOnFlakyTests": false, + "forbidOnly": false, + "fullyParallel": true, + "globalSetup": null, + "globalTeardown": null, + "globalTimeout": 0, + "grep": {}, + "grepInvert": null, + "maxFailures": 0, + "metadata": { + "actualWorkers": 6 + }, + "preserveOutput": "always", + "projects": [ + { + "outputDir": "/Users/thomaswhidden/Documents/Radar/artifacts/regression/results", + "repeatEach": 1, + "retries": 0, + "metadata": { + "actualWorkers": 6 + }, + "id": "", + "name": "", + "testDir": "/Users/thomaswhidden/Documents/Radar/tests/regression", + "testIgnore": [], + "testMatch": [ + "**/*.@(spec|test).?(c|m)[jt]s?(x)" + ], + "timeout": 45000 + } + ], + "quiet": false, + "reporter": [ + [ + "list", + null + ], + [ + "/Users/thomaswhidden/Documents/Radar/tests/regression/reporters/regression-reporter.ts", + null + ], + [ + "html", + { + "outputFolder": "/Users/thomaswhidden/Documents/Radar/artifacts/regression/html", + "open": "never" + } + ], + [ + "json", + { + "outputFile": "/Users/thomaswhidden/Documents/Radar/artifacts/regression/results.json" + } + ] + ], + "reportSlowTests": { + "max": 5, + "threshold": 300000 + }, + "shard": null, + "tags": [], + "updateSnapshots": "missing", + "updateSourceMethod": "patch", + "version": "1.61.1", + "workers": 6, + "webServer": null + }, + "suites": [ + { + "title": "active-workflows.spec.ts", + "file": "active-workflows.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "[REG-AUTO-006] @network pauses and resumes a real slow Automate session without duplicate sends", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "4967" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 9723, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:27.477Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "4967" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "10b3b631e846a3bd1d0c-6f85cd24b871d43d7709", + "file": "active-workflows.spec.ts", + "line": 21, + "column": 1 + }, + { + "title": "[REG-AUTO-007] @network stops only the selected Automate session while another completes", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "5029" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 8081, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:27.481Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "5029" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "10b3b631e846a3bd1d0c-5e7d7d94b3bdecefd4f9", + "file": "active-workflows.spec.ts", + "line": 35, + "column": 1 + }, + { + "title": "[REG-AUTO-008] @network retries only a failed Automate attempt after fixture recovery", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "5096" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 9598, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:27.448Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "5096" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "10b3b631e846a3bd1d0c-a1af87a1979da39979f1", + "file": "active-workflows.spec.ts", + "line": 54, + "column": 1 + }, + { + "title": "[REG-WF-006] @network @security runs one selected in-scope active workflow request through the normal contract", + "ok": true, + "tags": [ + "network", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "5064" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 8613, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:27.451Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "5064" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "10b3b631e846a3bd1d0c-b4b1045f517fbb4f73bd", + "file": "active-workflows.spec.ts", + "line": 66, + "column": 1 + }, + { + "title": "[REG-WF-007] @network @security blocks an active workflow with no selected capture", + "ok": true, + "tags": [ + "network", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "5019" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 36419, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:27.477Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "5019" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "10b3b631e846a3bd1d0c-1e98ce2e22c5c763de48", + "file": "active-workflows.spec.ts", + "line": 89, + "column": 1 + }, + { + "title": "[REG-RES-001] @network surfaces a bounded replay failure when the target lab disappears and remains usable", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "4966" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 6551, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:27.481Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "4966" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "10b3b631e846a3bd1d0c-9741519db71c297263a3", + "file": "active-workflows.spec.ts", + "line": 98, + "column": 1 + }, + { + "title": "[REG-SSL-003] @network captures real HTTPS fixture traffic through Radar's isolated MITM proxy", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1628" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 4749, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:34.062Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1628" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "10b3b631e846a3bd1d0c-9ae7912438a653012bc7", + "file": "active-workflows.spec.ts", + "line": 110, + "column": 1 + } + ] + }, + { + "title": "ai-runtime-extended.spec.ts", + "file": "ai-runtime-extended.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "[REG-AIF-003] @ai @security enforces visible tool, replay, workflow, capture-sample, and runtime budgets", + "ok": true, + "tags": [ + "ai", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1566" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 12078, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:35.598Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1566" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-67489e344d64fabe9e23", + "file": "ai-runtime-extended.spec.ts", + "line": 16, + "column": 1 + }, + { + "title": "[REG-AIF-004] @ai pauses a delayed planner and resumes the same durable run", + "ok": true, + "tags": [ + "ai" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1598" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 7846, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:36.095Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1598" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-0b258d8aaafac358a684", + "file": "ai-runtime-extended.spec.ts", + "line": 57, + "column": 1 + }, + { + "title": "[REG-AIF-005] @ai @security keeps a stopped delayed run terminal after its provider response arrives", + "ok": true, + "tags": [ + "ai", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2134" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 5660, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:37.081Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2134" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-80975768e5facd884ed5", + "file": "ai-runtime-extended.spec.ts", + "line": 71, + "column": 1 + }, + { + "title": "[REG-AIF-006] @ai records retry, retry-with-evidence, skip, and stop recovery choices", + "ok": true, + "tags": [ + "ai" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2123" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 14145, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:37.234Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2123" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-7b838a9d0fbc6c6f4575", + "file": "ai-runtime-extended.spec.ts", + "line": 83, + "column": 1 + }, + { + "title": "[REG-AIF-007] @ai creates a low-confidence reviewable finding draft from a failed recovery", + "ok": true, + "tags": [ + "ai" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1577" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 4966, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:38.826Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1577" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-cd168071eb72b97956ed", + "file": "ai-runtime-extended.spec.ts", + "line": 98, + "column": 1 + }, + { + "title": "[REG-AIF-009] @ai @persistence confirms, dismisses, searches, and restores project run memory", + "ok": true, + "tags": [ + "ai", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 7813, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:42.751Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-0375a9dfeaba24d6c5c0", + "file": "ai-runtime-extended.spec.ts", + "line": 108, + "column": 1 + }, + { + "title": "[REG-AIF-010] @ai @security rejects an invisible plugin mutation and creates no side effect", + "ok": true, + "tags": [ + "ai", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2084" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 5200, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:43.802Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2084" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-2f17a393faad3593fd66", + "file": "ai-runtime-extended.spec.ts", + "line": 143, + "column": 1 + }, + { + "title": "[REG-AIF-011] @ai steers a paused mission and grants then revokes an exact capability lease", + "ok": true, + "tags": [ + "ai" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2118" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 5841, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:43.950Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2118" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-6e842191c9935983da23", + "file": "ai-runtime-extended.spec.ts", + "line": 153, + "column": 1 + }, + { + "title": "[REG-AIF-012] @ai @persistence restores completed, stopped, and failed AI runs after restart", + "ok": true, + "tags": [ + "ai", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 7931, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:47.688Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-9bdf9c09bab9395a58e6", + "file": "ai-runtime-extended.spec.ts", + "line": 178, + "column": 1 + }, + { + "title": "[REG-FIND-009] @ai @security rejects malformed AI finding evidence before it enters the inbox", + "ok": true, + "tags": [ + "ai", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1638" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 5213, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:49.014Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1638" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-bef1696f03c594a9d8df", + "file": "ai-runtime-extended.spec.ts", + "line": 206, + "column": 1 + }, + { + "title": "[REG-INT-008] @ai @network @security prepares a visible intercept edit while leaving the request paused", + "ok": true, + "tags": [ + "ai", + "network", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1699" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 6343, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:49.802Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1699" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-8f2e3972e778e666a5b0", + "file": "ai-runtime-extended.spec.ts", + "line": 215, + "column": 1 + }, + { + "title": "[REG-PLUG-010] @ai @security reads plugin inventory but rejects a requested install mutation", + "ok": true, + "tags": [ + "ai", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1626" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 4663, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:50.578Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1626" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-1c137906d4b75221677d", + "file": "ai-runtime-extended.spec.ts", + "line": 233, + "column": 1 + }, + { + "title": "[REG-WF-010] @ai @security prepares a visible workflow draft without saving or running it", + "ok": true, + "tags": [ + "ai", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1608" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 4999, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:51.389Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1608" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-8315054d233c74dde8a5", + "file": "ai-runtime-extended.spec.ts", + "line": 244, + "column": 1 + }, + { + "title": "[REG-WF-011] @ai @network @security reuses the normal workflow contract after an exact capability grant", + "ok": true, + "tags": [ + "ai", + "network", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1567" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 9533, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:54.237Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1567" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-399294d2b0fb2906df75", + "file": "ai-runtime-extended.spec.ts", + "line": 254, + "column": 1 + }, + { + "title": "[REG-ID-007] @ai @security keeps identity-adjacent raw capture secrets opt-in", + "ok": true, + "tags": [ + "ai", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1596" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 3442, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:55.253Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1596" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "41eb5b82fd42714e0e16-8cfdc0adcf6b04841963", + "file": "ai-runtime-extended.spec.ts", + "line": 282, + "column": 1 + } + ] + }, + { + "title": "ai-workflows.spec.ts", + "file": "ai-workflows.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "[REG-AIM-001] @ai configures, probes, and persists the deterministic local provider", + "ok": true, + "tags": [ + "ai" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1578" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 2958, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:55.636Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1578" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "79892e11472070e892f4-52bce7a08ab02f531aff", + "file": "ai-workflows.spec.ts", + "line": 15, + "column": 1 + }, + { + "title": "[REG-AIM-002] @ai @security sends redacted scoped context by default", + "ok": true, + "tags": [ + "ai", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1650" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 3402, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:56.166Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1650" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "79892e11472070e892f4-d13f2301f101cdb2767c", + "file": "ai-workflows.spec.ts", + "line": 28, + "column": 1 + }, + { + "title": "[REG-AIM-003] @ai @security sends raw evidence only after explicit opt-in", + "ok": true, + "tags": [ + "ai", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1623" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 3426, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:56.404Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1623" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "79892e11472070e892f4-fbf78015c07dbe25d081", + "file": "ai-workflows.spec.ts", + "line": 44, + "column": 1 + }, + { + "title": "[REG-AIM-004] @ai runs summary, notes, checklist, TLS, and WebSocket analysis tasks", + "ok": true, + "tags": [ + "ai" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2113" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 4644, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:58.602Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2113" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "79892e11472070e892f4-f4817824de68dc9afe62", + "file": "ai-workflows.spec.ts", + "line": 58, + "column": 1 + }, + { + "title": "[REG-AIM-005] @ai @security applies a prepared Repeater draft without transmitting it", + "ok": true, + "tags": [ + "ai", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2184" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 3935, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:58.706Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2184" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "79892e11472070e892f4-cd5690fd36bc58101e89", + "file": "ai-workflows.spec.ts", + "line": 83, + "column": 1 + }, + { + "title": "[REG-AIM-006] @ai saves, runs, and deletes a local custom skill", + "ok": true, + "tags": [ + "ai" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2634" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 4589, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:59.577Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2634" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "79892e11472070e892f4-d219fecb3ad8dc65378b", + "file": "ai-workflows.spec.ts", + "line": 100, + "column": 1 + }, + { + "title": "[REG-AIM-007] @ai recovers from malformed, HTTP-error, and timeout provider responses", + "ok": true, + "tags": [ + "ai" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2118" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 4206, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:00:59.838Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2118" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "79892e11472070e892f4-30e3176f4b163ad60b15", + "file": "ai-workflows.spec.ts", + "line": 119, + "column": 1 + }, + { + "title": "[REG-AIM-008] @ai @security does not reuse a hidden session's packet selection", + "ok": true, + "tags": [ + "ai", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1651" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 3365, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:02.653Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1651" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "79892e11472070e892f4-e3a495fcbfe7e88e31f2", + "file": "ai-workflows.spec.ts", + "line": 139, + "column": 1 + }, + { + "title": "[REG-AIF-001] @ai @smoke completes a passive AI-First goal with a visible timeline", + "ok": true, + "tags": [ + "ai", + "smoke" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1700" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 5183, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:03.253Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1700" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "79892e11472070e892f4-4bb1d3e713ac9515268c", + "file": "ai-workflows.spec.ts", + "line": 153, + "column": 1 + }, + { + "title": "[REG-AIF-002] @ai @security policy-blocks an out-of-scope planner action", + "ok": true, + "tags": [ + "ai", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2696" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 5657, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:03.788Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2696" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "79892e11472070e892f4-a35a38412f438ed9a678", + "file": "ai-workflows.spec.ts", + "line": 167, + "column": 1 + }, + { + "title": "[REG-AIF-008] @ai @security rejects incomplete findings and accepts complete evidence contracts", + "ok": true, + "tags": [ + "ai", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3271" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 7838, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:03.930Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3271" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "79892e11472070e892f4-c297e9be47b8cbeb6ce2", + "file": "ai-workflows.spec.ts", + "line": 178, + "column": 1 + } + ] + }, + { + "title": "core-workflows.spec.ts", + "file": "core-workflows.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "[REG-APP-001] @smoke launches the production Electron shell with preload state", + "ok": true, + "tags": [ + "smoke" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3269" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 3573, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:04.058Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3269" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-c26a20b1df346ea2513f", + "file": "core-workflows.spec.ts", + "line": 3, + "column": 1 + }, + { + "title": "[REG-APP-003] @smoke loads the complete seeded walkthrough", + "ok": true, + "tags": [ + "smoke" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3231" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 4713, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:04.183Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3231" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-eba5651306e53bbba501", + "file": "core-workflows.spec.ts", + "line": 10, + "column": 1 + }, + { + "title": "[REG-APP-005] @core switches and persists every appearance theme", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1631" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 3321, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:06.033Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1631" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-e397ce39301751e68f98", + "file": "core-workflows.spec.ts", + "line": 21, + "column": 1 + }, + { + "title": "[REG-APP-006] @core opens and dismisses every primary overlay", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1620" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 3201, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:07.640Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1620" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-b41eb70e51d601258c24", + "file": "core-workflows.spec.ts", + "line": 34, + "column": 1 + }, + { + "title": "[REG-APP-007] @core toggles operating mode without creating an agent run", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1657" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 2927, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:08.453Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1657" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-ae59d6a44186623f0df8", + "file": "core-workflows.spec.ts", + "line": 57, + "column": 1 + }, + { + "title": "[REG-APP-008] @core creates and switches sessions through visible controls", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1688" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 3179, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:08.903Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1688" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-9fbc823597aff20c7d4f", + "file": "core-workflows.spec.ts", + "line": 65, + "column": 1 + }, + { + "title": "[REG-APP-009] @core opens global search with the platform shortcut and Escape", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2171" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 2519, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:09.362Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2171" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-3eba009c09f7b4415682", + "file": "core-workflows.spec.ts", + "line": 81, + "column": 1 + }, + { + "title": "[REG-PROJ-002] @core @persistence renames a session and keeps it selectable", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2172" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 3614, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:09.458Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2172" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-7a1b7eb70b05e7b10890", + "file": "core-workflows.spec.ts", + "line": 88, + "column": 1 + }, + { + "title": "[REG-PROJ-004] @core @persistence saves and restores a filtered Traffic view", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1684" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 3345, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:10.855Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1684" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-e911dd16b99463750732", + "file": "core-workflows.spec.ts", + "line": 97, + "column": 1 + }, + { + "title": "[REG-PROJ-008] @core @persistence refreshes stable demo records without duplicates", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1718" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 3229, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:11.389Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1718" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-1b1a637135aea052ef3e", + "file": "core-workflows.spec.ts", + "line": 114, + "column": 1 + }, + { + "title": "[REG-HTTP-003] @core combines method, type, sort, and query filters", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3215" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 4646, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:11.788Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3215" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-568c57bacfeb41d01a1e", + "file": "core-workflows.spec.ts", + "line": 123, + "column": 1 + }, + { + "title": "[REG-HTTP-004] @core saves and reapplies a Traffic filter", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3299" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 4876, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:11.889Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3299" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-c6d211b01779f46e6cc9", + "file": "core-workflows.spec.ts", + "line": 135, + "column": 1 + }, + { + "title": "[REG-HTTP-005] @core @persistence annotates evidence and exposes it to search", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3244" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 6104, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:12.092Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3244" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-8523a0d3f3a8c8ada133", + "file": "core-workflows.spec.ts", + "line": 146, + "column": 1 + }, + { + "title": "[REG-HTTP-008] @core inspects request, response, and TLS evidence", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3210" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 4683, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:13.084Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3210" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-e9c4551e5ea1cd412778", + "file": "core-workflows.spec.ts", + "line": 162, + "column": 1 + }, + { + "title": "[REG-HTTP-010] @core @security clears HTTP evidence without clearing WebSocket frames", + "ok": true, + "tags": [ + "core", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2644" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 4143, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:14.206Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2644" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-f767800a2fcce7f3dd8c", + "file": "core-workflows.spec.ts", + "line": 173, + "column": 1 + }, + { + "title": "[REG-WS-002] @core filters WebSocket evidence by direction and payload", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2224" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 3683, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:14.626Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2224" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-823a5d235d12d01a3baf", + "file": "core-workflows.spec.ts", + "line": 182, + "column": 1 + }, + { + "title": "[REG-WS-004] @core renders complete selected frame detail", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2280" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 3262, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:16.441Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2280" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-58106160f7c2db34f8a2", + "file": "core-workflows.spec.ts", + "line": 191, + "column": 1 + }, + { + "title": "[REG-WS-007] @core clears WebSocket frames without clearing HTTP evidence", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1690" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 3298, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:16.772Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1690" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8f2a80b4fd8649c3f507-da20c3be9a5fc6037128", + "file": "core-workflows.spec.ts", + "line": 200, + "column": 1 + } + ] + }, + { + "title": "database-resilience.spec.ts", + "file": "database-resilience.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "[REG-DATA-004] @persistence @security fails closed against a newer database without modifying it", + "ok": true, + "tags": [ + "persistence", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 1126, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:17.779Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "d223fc9de6652f2bb5a3-5b9a9c2eaa69ec4dccc2", + "file": "database-resilience.spec.ts", + "line": 20, + "column": 1 + }, + { + "title": "[REG-DATA-005] @persistence migrates a supported older database once and remains idempotent", + "ok": true, + "tags": [ + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 4687, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:18.209Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "d223fc9de6652f2bb5a3-bead84caefdb617dee97", + "file": "database-resilience.spec.ts", + "line": 41, + "column": 1 + } + ] + }, + { + "title": "domain-workflows.spec.ts", + "file": "domain-workflows.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "[REG-SCOPE-001] @security starts with local-development-only scope", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "4329" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 5045, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:18.321Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "4329" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-573fe7b41f67a2b22bb3", + "file": "domain-workflows.spec.ts", + "line": 3, + "column": 1 + }, + { + "title": "[REG-SCOPE-002] @security saves exact origins, hostnames, wildcards, and local", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "4234" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 5117, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:18.367Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "4234" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-d2c2bffc343de813cc99", + "file": "domain-workflows.spec.ts", + "line": 9, + "column": 1 + }, + { + "title": "[REG-SCOPE-003] @security ignores blank scope lines and normalizes duplicates", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "4254" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 5169, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:18.934Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "4254" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-04873e5de5e875a1dacb", + "file": "domain-workflows.spec.ts", + "line": 17, + "column": 1 + }, + { + "title": "[REG-SCOPE-006] @security trusts only the current Repeater draft origin without sending", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3731" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 5160, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:19.716Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3731" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-92c5883606d27dae3331", + "file": "domain-workflows.spec.ts", + "line": 26, + "column": 1 + }, + { + "title": "[REG-REP-002] @core @persistence creates, selects, pins, and closes Repeater tabs", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3177" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 4619, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:20.090Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3177" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-68f1c0cdd6a17af5470b", + "file": "domain-workflows.spec.ts", + "line": 35, + "column": 1 + }, + { + "title": "[REG-REP-003] @core selects an environment while preserving variable-authored drafts", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1772" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 3197, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:22.908Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1772" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-27bdf6032fb4571262a0", + "file": "domain-workflows.spec.ts", + "line": 47, + "column": 1 + }, + { + "title": "[REG-REP-006] @core @persistence reloads a saved collection draft", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2743" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 4211, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:23.374Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2743" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-2d11d049c51b1ee005dc", + "file": "domain-workflows.spec.ts", + "line": 55, + "column": 1 + }, + { + "title": "[REG-AUTO-001] @core inserts a named URL payload marker into the visible draft", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3282" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 4731, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:23.493Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3282" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-6fcd8c72d8534e3b1399", + "file": "domain-workflows.spec.ts", + "line": 64, + "column": 1 + }, + { + "title": "[REG-AUTO-005] @core renders seeded results, matches, and clusters", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3233" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 4705, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:24.114Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3233" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-5085ba8d66d5e7a5e96c", + "file": "domain-workflows.spec.ts", + "line": 74, + "column": 1 + }, + { + "title": "[REG-AUTO-009] @core promotes an Automate result into Repeater", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3201" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 4736, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:24.718Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3201" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-dc167d8ae9682176294f", + "file": "domain-workflows.spec.ts", + "line": 84, + "column": 1 + }, + { + "title": "[REG-FIND-001] @core combines finding queue filters", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3249" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 4716, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:24.887Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3249" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-77f23028ff4ed9868b26", + "file": "domain-workflows.spec.ts", + "line": 93, + "column": 1 + }, + { + "title": "[REG-FIND-002] @core creates evidence-backed findings from HTTP and WebSocket", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2140" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 3792, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:26.115Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2140" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-e3e91bafe193049a330d", + "file": "domain-workflows.spec.ts", + "line": 103, + "column": 1 + }, + { + "title": "[REG-FIND-004] @core @persistence saves edited finding fields", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1695" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 5147, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:27.592Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1695" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-1e6fd3e5cedfd0597ad0", + "file": "domain-workflows.spec.ts", + "line": 114, + "column": 1 + }, + { + "title": "[REG-FIND-008] @core deletes only the selected finding", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1747" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 3255, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:28.236Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1747" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-7fc2b163c7dfa5be5741", + "file": "domain-workflows.spec.ts", + "line": 130, + "column": 1 + }, + { + "title": "[REG-FILE-008] @files @security builds a redacted Markdown finding report", + "ok": true, + "tags": [ + "files", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1694" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 3205, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:28.827Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1694" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-178e30ab07b74ddfbe9b", + "file": "domain-workflows.spec.ts", + "line": 140, + "column": 1 + }, + { + "title": "[REG-WF-001] @core protects built-in workflows and exposes saved workflows", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2226" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 3808, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:29.461Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2226" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-6fed6c50b3bcb50c4f8d", + "file": "domain-workflows.spec.ts", + "line": 150, + "column": 1 + }, + { + "title": "[REG-WF-003] @core @security rejects malformed workflow definitions", + "ok": true, + "tags": [ + "core", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2780" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 4363, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:29.613Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2780" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-27081e0d97a590666105", + "file": "domain-workflows.spec.ts", + "line": 160, + "column": 1 + }, + { + "title": "[REG-WF-005] @core runs a passive workflow without changing captures", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2252" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 3905, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:29.917Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2252" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-176e7989fc4f4efaf0ca", + "file": "domain-workflows.spec.ts", + "line": 168, + "column": 1 + }, + { + "title": "[REG-WF-008] @core promotes a warning workflow result to a draft finding", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1696" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 3288, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:31.500Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1696" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-82925de7266fda3e081a", + "file": "domain-workflows.spec.ts", + "line": 179, + "column": 1 + }, + { + "title": "[REG-PLUG-001] @core displays seeded approved plugin permissions", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1696" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 3162, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:32.042Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1696" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-7483b9ab6171a05e9f39", + "file": "domain-workflows.spec.ts", + "line": 188, + "column": 1 + }, + { + "title": "[REG-PLUG-007] @core @security renders the approved demo panel", + "ok": true, + "tags": [ + "core", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1718" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 3204, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:32.751Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1718" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-e61ce3c9aa763a1f5ce2", + "file": "domain-workflows.spec.ts", + "line": 197, + "column": 1 + }, + { + "title": "[REG-ADV-001] @core renders seeded GraphQL operation analysis", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1707" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 3152, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:33.277Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1707" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-2caad0bae963d4b0e29c", + "file": "domain-workflows.spec.ts", + "line": 205, + "column": 1 + }, + { + "title": "[REG-ADV-005] @core inventories query, JSON, GraphQL, and WebSocket parameters", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2205" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 3624, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:33.831Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2205" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-5393ed2497b1b6b8edd5", + "file": "domain-workflows.spec.ts", + "line": 212, + "column": 1 + }, + { + "title": "[REG-ADV-006] @security masks local secret signals", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2758" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 4195, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:33.992Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2758" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-ba5a7a56e7c0bb9f2a52", + "file": "domain-workflows.spec.ts", + "line": 219, + "column": 1 + }, + { + "title": "[REG-ADV-008] @core @security prepares an Advanced workflow visibly without running it", + "ok": true, + "tags": [ + "core", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2693" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 4189, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:34.795Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2693" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-77bb3a67685078320896", + "file": "domain-workflows.spec.ts", + "line": 227, + "column": 1 + }, + { + "title": "[REG-MAP-001] @core builds a sitemap and endpoint inventory from captures", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2695" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 4142, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:35.211Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2695" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-efa49ddba5b844365f12", + "file": "domain-workflows.spec.ts", + "line": 235, + "column": 1 + }, + { + "title": "[REG-MAP-002] @core routes a sitemap endpoint into filtered Traffic", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2713" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 4219, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:35.963Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2713" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-6af9532ff935655df207", + "file": "domain-workflows.spec.ts", + "line": 243, + "column": 1 + }, + { + "title": "[REG-SSL-004] @core @persistence saves workspace-local proxy profile notes", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2711" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 4187, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:36.439Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2711" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b3a1588191f7e4ae1fa5-0c81bc2b1879556410c8", + "file": "domain-workflows.spec.ts", + "line": 251, + "column": 1 + } + ] + }, + { + "title": "extended-workflows.spec.ts", + "file": "extended-workflows.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "[REG-APP-010] @core keeps sidebar and footer telemetry aligned with visible evidence", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1682" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 3111, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:37.468Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1682" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-aca119bff2028a3a7830", + "file": "extended-workflows.spec.ts", + "line": 5, + "column": 1 + }, + { + "title": "[REG-PROJ-005] @core routes every populated global-search result kind", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1685" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 4473, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:38.198Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1685" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-5dd4eb5f5573afa14007", + "file": "extended-workflows.spec.ts", + "line": 14, + "column": 1 + }, + { + "title": "[REG-PROJ-007] @core rejects unsupported global-search filters without changing state", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1673" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 3223, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:39.004Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1673" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-473b4ef0631f4088676b", + "file": "extended-workflows.spec.ts", + "line": 31, + "column": 1 + }, + { + "title": "[REG-SCOPE-004] @security removing an origin hides its evidence everywhere without deleting it", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1626" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 3235, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:39.365Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1626" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-f0759421777a3b87c155", + "file": "extended-workflows.spec.ts", + "line": 41, + "column": 1 + }, + { + "title": "[REG-SCOPE-005] @security re-adding an origin reveals stored evidence without duplication", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1715" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 3624, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:40.196Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1715" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-61467a68af85f5f4f49f", + "file": "extended-workflows.spec.ts", + "line": 54, + "column": 1 + }, + { + "title": "[REG-HTTP-007] @files @security bulk-exports only selected scoped captures", + "ok": true, + "tags": [ + "files", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2694" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 4271, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:40.589Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2694" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-b615adff88f88cd3e30d", + "file": "extended-workflows.spec.ts", + "line": 66, + "column": 1 + }, + { + "title": "[REG-INT-006] @security rejects invalid intercept rules and preserves the last valid set", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2678" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 4175, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:40.640Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2678" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-e60525a3d14cc24a9741", + "file": "extended-workflows.spec.ts", + "line": 78, + "column": 1 + }, + { + "title": "[REG-REP-004] @security blocks a missing environment variable before transmission", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2321" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 4050, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:42.238Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2321" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-59b28b43fc1df433825b", + "file": "extended-workflows.spec.ts", + "line": 92, + "column": 1 + }, + { + "title": "[REG-REP-005] @network compares two real replay-history variants", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2813" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 4658, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:42.611Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2813" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-0a6a51f83b09787063f7", + "file": "extended-workflows.spec.ts", + "line": 105, + "column": 1 + }, + { + "title": "[REG-REP-009] @network represents status, redirect, slow, and connection-error outcomes", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2813" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 5036, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:42.678Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2813" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-85172659f0155404f6e2", + "file": "extended-workflows.spec.ts", + "line": 119, + "column": 1 + }, + { + "title": "[REG-AUTO-002] @core @persistence creates, updates, and reloads an inline payload set", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2217" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 3934, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:43.835Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2217" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-72d9b3cf5c2725a9bf9f", + "file": "extended-workflows.spec.ts", + "line": 132, + "column": 1 + }, + { + "title": "[REG-AUTO-003] @files @security stores a bounded wordlist reference without renderer file access", + "ok": true, + "tags": [ + "files", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2847" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 4334, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:44.828Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2847" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-efca7dbe2848c7325ced", + "file": "extended-workflows.spec.ts", + "line": 146, + "column": 1 + }, + { + "title": "[REG-AUTO-004] @security clamps excessive Automate execution limits", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2820" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 4258, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:44.869Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2820" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-ac9335e623d11fd44765", + "file": "extended-workflows.spec.ts", + "line": 158, + "column": 1 + }, + { + "title": "[REG-FIND-005] @core records retest notes and reviewed-to-resolved transitions", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1735" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 5002, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:46.300Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1735" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-6f50c1ed5e9acee2dca6", + "file": "extended-workflows.spec.ts", + "line": 170, + "column": 1 + }, + { + "title": "[REG-FIND-006] @core merges an explicitly selected duplicate suggestion", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1676" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 3401, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:47.281Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1676" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-0e2985903443303ef463", + "file": "extended-workflows.spec.ts", + "line": 184, + "column": 1 + }, + { + "title": "[REG-FIND-007] @security leaves findings unchanged when a duplicate suggestion is ignored", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2820" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 4540, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:47.730Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2820" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-2928d176f964500866cf", + "file": "extended-workflows.spec.ts", + "line": 201, + "column": 1 + }, + { + "title": "[REG-WF-004] @core @persistence records workflow revisions across edits", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2742" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 4456, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:47.785Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2742" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-d1a8d6b77b71e94ff250", + "file": "extended-workflows.spec.ts", + "line": 214, + "column": 1 + }, + { + "title": "[REG-WF-009] @core deletes a saved workflow while protecting a built-in", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2737" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 4354, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:49.134Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2737" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-c8895eeb25d3b7432fc9", + "file": "extended-workflows.spec.ts", + "line": 230, + "column": 1 + }, + { + "title": "[REG-SSL-002] @security generates an isolated CA with restricted file permissions", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2731" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 4164, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:49.179Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2731" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-4ed6c4dd73381d704d1d", + "file": "extended-workflows.spec.ts", + "line": 242, + "column": 1 + }, + { + "title": "[REG-RES-002] @core survives rapid view and session switching without stale selections", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1734" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 3619, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:50.695Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1734" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "2b277ee80cdcd60ac14e-9f0d280c37db08d3650f", + "file": "extended-workflows.spec.ts", + "line": 253, + "column": 1 + } + ] + }, + { + "title": "files-plugins.spec.ts", + "file": "files-plugins.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "[REG-FILE-001] @files @security previews every project bundle redaction profile", + "ok": true, + "tags": [ + "files", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1711" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 3405, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:51.319Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1711" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-7b67a0986389c0c56a8c", + "file": "files-plugins.spec.ts", + "line": 11, + "column": 1 + }, + { + "title": "[REG-FILE-002] @files @security exports a parseable redacted project bundle", + "ok": true, + "tags": [ + "files", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3259" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 4721, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:52.261Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3259" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-d3702754e30f70feeaf5", + "file": "files-plugins.spec.ts", + "line": 24, + "column": 1 + }, + { + "title": "[REG-FILE-003] @files @security previews conflicts and proposed scope without applying", + "ok": true, + "tags": [ + "files", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3196" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 4719, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:52.314Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3196" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-dfac90225e1cd80531dd", + "file": "files-plugins.spec.ts", + "line": 40, + "column": 1 + }, + { + "title": "[REG-FILE-004] @files @persistence applies a valid import into an independent project", + "ok": true, + "tags": [ + "files", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3247" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 5199, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:53.358Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3247" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-0fcba595530d6462435c", + "file": "files-plugins.spec.ts", + "line": 55, + "column": 1 + }, + { + "title": "[REG-FILE-005] @files @security rejects corrupt and unsupported-newer bundles", + "ok": true, + "tags": [ + "files", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3249" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 4807, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:53.499Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3249" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-0d3be91ebcddf2e546c8", + "file": "files-plugins.spec.ts", + "line": 77, + "column": 1 + }, + { + "title": "[REG-FILE-006] @files @security previews a default reviewed-finding handoff", + "ok": true, + "tags": [ + "files", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3265" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 4704, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:54.335Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3265" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-62747acb807dcaceaf34", + "file": "files-plugins.spec.ts", + "line": 98, + "column": 1 + }, + { + "title": "[REG-FILE-007] @files opts draft findings into the handoff preview", + "ok": true, + "tags": [ + "files" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2717" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 4192, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:54.731Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2717" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-00896dd9c54915d8445b", + "file": "files-plugins.spec.ts", + "line": 106, + "column": 1 + }, + { + "title": "[REG-PROJ-003] @core creates, edits, searches, opens, and selectively deletes a project note", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2229" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 3650, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:56.991Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2229" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-3e9e3ef20a90d9c10e69", + "file": "files-plugins.spec.ts", + "line": 115, + "column": 1 + }, + { + "title": "[REG-HTTP-006] @core bulk-tags and deletes only selected captures", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2289" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 4524, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:57.049Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2289" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-f9f38afdc79f025b9b70", + "file": "files-plugins.spec.ts", + "line": 139, + "column": 1 + }, + { + "title": "[REG-WS-003] @core @persistence preserves seeded WebSocket annotations", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2816" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 4274, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:58.314Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2816" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-a77861342c4b44afcc5b", + "file": "files-plugins.spec.ts", + "line": 153, + "column": 1 + }, + { + "title": "[REG-FIND-003] @core creates a draft from a selected finding template", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2775" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 4266, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:58.568Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2775" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-92df4956cd1dedaa1d2e", + "file": "files-plugins.spec.ts", + "line": 170, + "column": 1 + }, + { + "title": "[REG-FILE-009] @files @security includes raw report evidence only after explicit opt-in", + "ok": true, + "tags": [ + "files", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3289" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 4927, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:58.931Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3289" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-62f2d26e6016952210a7", + "file": "files-plugins.spec.ts", + "line": 185, + "column": 1 + }, + { + "title": "[REG-WF-002] @core inserts a supported workflow step into the visible graph", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3407" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 4437, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:01:59.047Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3407" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-d0262adf4a9d285456a5", + "file": "files-plugins.spec.ts", + "line": 195, + "column": 1 + }, + { + "title": "[REG-PLUG-002] @files @security previews a local plugin without installing it", + "ok": true, + "tags": [ + "files", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1653" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 3036, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:00.656Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1653" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-2f6ca957eccde46ac94e", + "file": "files-plugins.spec.ts", + "line": 204, + "column": 1 + }, + { + "title": "[REG-PLUG-003] @files @security reports invalid plugin sources without installing", + "ok": true, + "tags": [ + "files", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1661" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 3096, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:01.581Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1661" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-ab12767c5c524150f89c", + "file": "files-plugins.spec.ts", + "line": 212, + "column": 1 + }, + { + "title": "[REG-PLUG-004] @files installs a valid local plugin as pending", + "ok": true, + "tags": [ + "files" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2168" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 3530, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:02.596Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2168" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-eb764e1cf96e17843016", + "file": "files-plugins.spec.ts", + "line": 220, + "column": 1 + }, + { + "title": "[REG-PLUG-005] @files @security grants only requested plugin permissions", + "ok": true, + "tags": [ + "files", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3148" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 4565, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:02.843Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3148" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-b682d5079e1a56dd0db8", + "file": "files-plugins.spec.ts", + "line": 230, + "column": 1 + }, + { + "title": "[REG-PLUG-006] @core @persistence disables and blocks only the selected plugin", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3275" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 4862, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:03.491Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3275" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-05235c0f92729a2974be", + "file": "files-plugins.spec.ts", + "line": 241, + "column": 1 + }, + { + "title": "[REG-PLUG-008] @security audits allowed and denied bounded SDK actions", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3758" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 5571, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:03.704Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3758" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-53a52788da6261060625", + "file": "files-plugins.spec.ts", + "line": 250, + "column": 1 + }, + { + "title": "[REG-PLUG-009] @core removes only the selected plugin", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3718" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 5281, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:03.869Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3718" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-21b9be98b1d8b5b97c41", + "file": "files-plugins.spec.ts", + "line": 270, + "column": 1 + }, + { + "title": "[REG-ADV-004] @core summarizes observed auth-state behavior", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3157" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 4568, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:04.709Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3157" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-e5db69dd66312ea4893b", + "file": "files-plugins.spec.ts", + "line": 280, + "column": 1 + }, + { + "title": "[REG-ADV-007] @core links cache, CORS, host, and redirect signals to workflows", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2120" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 3560, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:06.131Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2120" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e1c1b90871c2bfcb8473-cb4ceae81171ebece78d", + "file": "files-plugins.spec.ts", + "line": 287, + "column": 1 + } + ] + }, + { + "title": "isolation.spec.ts", + "file": "isolation.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "[REG-APP-002] @core @security each worker receives isolated Radar data and service ports", + "ok": true, + "tags": [ + "core", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1622" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 1935, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:07.417Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1622" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8603831629f4016ade15-b78f3881dc81c4989ef6", + "file": "isolation.spec.ts", + "line": 4, + "column": 1 + } + ] + }, + { + "title": "network-workflows.spec.ts", + "file": "network-workflows.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "[REG-HTTP-001] @network @smoke captures real GET and POST traffic through Radar's proxy", + "ok": true, + "tags": [ + "network", + "smoke" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1694" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 5177, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:08.366Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1694" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "ce6f28e3161129651299-34b4ce0b201bd2532f6c", + "file": "network-workflows.spec.ts", + "line": 4, + "column": 1 + }, + { + "title": "[REG-HTTP-002] @network @security hides real out-of-scope traffic", + "ok": true, + "tags": [ + "network", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3350" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 6866, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:09.161Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3350" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "ce6f28e3161129651299-a74d54a3bc26a74fdeaa", + "file": "network-workflows.spec.ts", + "line": 27, + "column": 1 + }, + { + "title": "[REG-REP-001] @network @smoke sends an edited real request and renders its response", + "ok": true, + "tags": [ + "network", + "smoke" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3901" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 5348, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:09.289Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3901" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "ce6f28e3161129651299-c40f72d1430252bd2df2", + "file": "network-workflows.spec.ts", + "line": 48, + "column": 1 + }, + { + "title": "[REG-REP-007] @network obeys real burst count and bounded concurrency controls", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3917" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 5461, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:09.291Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3917" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "ce6f28e3161129651299-70aa2c5c15611f74b9fe", + "file": "network-workflows.spec.ts", + "line": 63, + "column": 1 + }, + { + "title": "[REG-REP-008] @network @security clamps burst values before transmission", + "ok": true, + "tags": [ + "network", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3840" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 5340, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:09.366Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3840" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "ce6f28e3161129651299-2937cedc6160b371e5f3", + "file": "network-workflows.spec.ts", + "line": 76, + "column": 1 + }, + { + "title": "[REG-INT-001] @network pauses a real scoped request before upstream", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3281" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 6908, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:09.704Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3281" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "ce6f28e3161129651299-cf8ad3f36ca064f285d5", + "file": "network-workflows.spec.ts", + "line": 91, + "column": 1 + }, + { + "title": "[REG-INT-002] @network edits and forwards a real paused request", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1717" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 4851, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:13.556Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1717" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "ce6f28e3161129651299-0b0a8f78c8e9cfd5bb0c", + "file": "network-workflows.spec.ts", + "line": 104, + "column": 1 + }, + { + "title": "[REG-INT-003] @network drops a real queued request without upstream delivery", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3138" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 6319, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:14.647Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3138" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "ce6f28e3161129651299-ab2b4a654d535a5ba74f", + "file": "network-workflows.spec.ts", + "line": 125, + "column": 1 + }, + { + "title": "[REG-INT-005] @core @persistence saves normalized intercept rules", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3115" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 4492, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:14.715Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3115" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "ce6f28e3161129651299-0540b216870f114e8695", + "file": "network-workflows.spec.ts", + "line": 138, + "column": 1 + }, + { + "title": "[REG-INT-007] @network applies real scoped match/replace transformations", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3175" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 4897, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:14.761Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3175" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "ce6f28e3161129651299-b56277d5332a1984d33d", + "file": "network-workflows.spec.ts", + "line": 148, + "column": 1 + }, + { + "title": "[REG-SSL-001] @network starts and stops the isolated proxy and releases its port", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2654" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 4207, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:16.036Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2654" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "ce6f28e3161129651299-353c9116d6d30704c6fb", + "file": "network-workflows.spec.ts", + "line": 165, + "column": 1 + } + ] + }, + { + "title": "operator-workflows.spec.ts", + "file": "operator-workflows.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "Manual-First operator workflows", + "file": "operator-workflows.spec.ts", + "line": 3, + "column": 6, + "specs": [ + { + "title": "[REG-HTTP-009] @smoke @core loads demo evidence, filters traffic, and clones a request to Repeater", + "ok": true, + "tags": [ + "smoke", + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2254" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 3761, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:16.626Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2254" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "9dbe1df481a89886ca1b-1b1a52937821a2cea964", + "file": "operator-workflows.spec.ts", + "line": 4, + "column": 3 + } + ] + }, + { + "title": "Workbench coverage", + "file": "operator-workflows.spec.ts", + "line": 20, + "column": 6, + "specs": [ + { + "title": "[REG-APP-004] @smoke @core renders every primary workbench view with demo state", + "ok": true, + "tags": [ + "smoke", + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1601" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 3592, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "steps": [ + { + "title": "open traffic", + "duration": 35 + }, + { + "title": "open websocket", + "duration": 49 + }, + { + "title": "open intercept", + "duration": 44 + }, + { + "title": "open repeater", + "duration": 54 + }, + { + "title": "open automate", + "duration": 44 + }, + { + "title": "open findings", + "duration": 50 + }, + { + "title": "open workflows", + "duration": 50 + }, + { + "title": "open plugins", + "duration": 45 + }, + { + "title": "open advanced", + "duration": 57 + }, + { + "title": "open sitemap", + "duration": 38 + }, + { + "title": "open scope", + "duration": 48 + }, + { + "title": "open ssl", + "duration": 34 + } + ], + "startTime": "2026-07-18T23:02:18.417Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1601" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "9dbe1df481a89886ca1b-fab3ea20aa366d8c8b0c", + "file": "operator-workflows.spec.ts", + "line": 21, + "column": 3 + } + ] + } + ] + }, + { + "title": "persistence-identity.spec.ts", + "file": "persistence-identity.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "[REG-PROJ-001] @core @persistence creates, renames, and restores an independent project", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 4485, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:19.220Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "3bbcf420b818c55b67cb-e94ebc3a14e8700b0c2a", + "file": "persistence-identity.spec.ts", + "line": 3, + "column": 1 + }, + { + "title": "[REG-DATA-001] @persistence restores representative project state after a real app restart", + "ok": true, + "tags": [ + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 5668, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:19.668Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "3bbcf420b818c55b67cb-16fd13ab9c5cf9f3b452", + "file": "persistence-identity.spec.ts", + "line": 32, + "column": 1 + }, + { + "title": "[REG-DATA-003] @persistence keeps session evidence isolated and recoverable", + "ok": true, + "tags": [ + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2154" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 3673, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:20.257Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2154" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "3bbcf420b818c55b67cb-dd5775215030476e7b83", + "file": "persistence-identity.spec.ts", + "line": 69, + "column": 1 + }, + { + "title": "[REG-DATA-002] @persistence @security keeps notes and evidence isolated between projects", + "ok": true, + "tags": [ + "persistence", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2720" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 4685, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:20.408Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2720" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "3bbcf420b818c55b67cb-4ccf3101fa6e2f07f2cd", + "file": "persistence-identity.spec.ts", + "line": 80, + "column": 1 + }, + { + "title": "[REG-ID-001] @core @persistence creates, edits, and archives a local identity", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2224" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 3960, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:20.983Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2224" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "3bbcf420b818c55b67cb-601b898165718d442dac", + "file": "persistence-identity.spec.ts", + "line": 106, + "column": 1 + }, + { + "title": "[REG-ID-002] @security blocks activation of an identity outside saved scope", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1690" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 3171, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:22.022Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1690" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "3bbcf420b818c55b67cb-107e67cd51bea789a647", + "file": "persistence-identity.spec.ts", + "line": 130, + "column": 1 + }, + { + "title": "[REG-ID-005] @core renders the Identity Lab matrix safety interpretation", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1685" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 3255, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:23.717Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1685" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "3bbcf420b818c55b67cb-a5f92d8a8270d7b5f1d6", + "file": "persistence-identity.spec.ts", + "line": 142, + "column": 1 + }, + { + "title": "[REG-ID-006] @core permits a one-dimension comparison only for eligible attributed recordings", + "ok": true, + "tags": [ + "core" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2189" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 3659, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:23.949Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2189" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "3bbcf420b818c55b67cb-1956c4ee04f23149924e", + "file": "persistence-identity.spec.ts", + "line": 150, + "column": 1 + } + ] + }, + { + "title": "platform-soak.spec.ts", + "file": "platform-soak.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "[REG-SSL-005] @platform launches the supported isolated browser through Radar to the local lab", + "ok": true, + "tags": [ + "platform" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3317" + }, + { + "type": "skip", + "description": "Set RADAR_REGRESSION_PLATFORM=1 on a host with a supported system browser.", + "location": { + "file": "/Users/thomaswhidden/Documents/Radar/tests/regression/platform-soak.spec.ts", + "line": 23, + "column": 8 + } + } + ], + "expectedStatus": "skipped", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "skipped", + "duration": 3609, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:24.960Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3317" + }, + { + "type": "skip", + "description": "Set RADAR_REGRESSION_PLATFORM=1 on a host with a supported system browser.", + "location": { + "file": "/Users/thomaswhidden/Documents/Radar/tests/regression/platform-soak.spec.ts", + "line": 23, + "column": 8 + } + } + ], + "attachments": [] + } + ], + "status": "skipped" + } + ], + "id": "9dc986ddface34b6b339-3c6e5af411a4e3c51748", + "file": "platform-soak.spec.ts", + "line": 22, + "column": 1 + }, + { + "title": "[REG-SSL-006] @platform @security detaches an active browser identity when the project changes", + "ok": true, + "tags": [ + "platform", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3777" + }, + { + "type": "skip", + "description": "Set RADAR_REGRESSION_PLATFORM=1 on a host with a supported system browser.", + "location": { + "file": "/Users/thomaswhidden/Documents/Radar/tests/regression/platform-soak.spec.ts", + "line": 34, + "column": 8 + } + } + ], + "expectedStatus": "skipped", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "skipped", + "duration": 4100, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:25.107Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3777" + }, + { + "type": "skip", + "description": "Set RADAR_REGRESSION_PLATFORM=1 on a host with a supported system browser.", + "location": { + "file": "/Users/thomaswhidden/Documents/Radar/tests/regression/platform-soak.spec.ts", + "line": 34, + "column": 8 + } + } + ], + "attachments": [] + } + ], + "status": "skipped" + } + ], + "id": "9dc986ddface34b6b339-f0b50235187172d2ba39", + "file": "platform-soak.spec.ts", + "line": 33, + "column": 1 + }, + { + "title": "[REG-SSL-007] @platform handles an occupied preferred debugging port and remains usable", + "ok": true, + "tags": [ + "platform" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3784" + }, + { + "type": "skip", + "description": "Set RADAR_REGRESSION_PLATFORM=1 on a host with a supported system browser.", + "location": { + "file": "/Users/thomaswhidden/Documents/Radar/tests/regression/platform-soak.spec.ts", + "line": 51, + "column": 8 + } + } + ], + "expectedStatus": "skipped", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "skipped", + "duration": 4101, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:25.207Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3784" + }, + { + "type": "skip", + "description": "Set RADAR_REGRESSION_PLATFORM=1 on a host with a supported system browser.", + "location": { + "file": "/Users/thomaswhidden/Documents/Radar/tests/regression/platform-soak.spec.ts", + "line": 51, + "column": 8 + } + } + ], + "attachments": [] + } + ], + "status": "skipped" + } + ], + "id": "9dc986ddface34b6b339-ef4f34b935c25fe24430", + "file": "platform-soak.spec.ts", + "line": 50, + "column": 1 + }, + { + "title": "[REG-ID-003] @platform @network activates a scoped dedicated identity and attributes its real captures", + "ok": true, + "tags": [ + "platform", + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3756" + }, + { + "type": "skip", + "description": "Set RADAR_REGRESSION_PLATFORM=1 on a host with a supported system browser.", + "location": { + "file": "/Users/thomaswhidden/Documents/Radar/tests/regression/platform-soak.spec.ts", + "line": 72, + "column": 8 + } + } + ], + "expectedStatus": "skipped", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "skipped", + "duration": 4068, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:25.349Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3756" + }, + { + "type": "skip", + "description": "Set RADAR_REGRESSION_PLATFORM=1 on a host with a supported system browser.", + "location": { + "file": "/Users/thomaswhidden/Documents/Radar/tests/regression/platform-soak.spec.ts", + "line": 72, + "column": 8 + } + } + ], + "attachments": [] + } + ], + "status": "skipped" + } + ], + "id": "9dc986ddface34b6b339-66005d904df4eaf8abac", + "file": "platform-soak.spec.ts", + "line": 71, + "column": 1 + }, + { + "title": "[REG-ID-004] @platform @network records healthy and failed dedicated identity verification semantics", + "ok": true, + "tags": [ + "platform", + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3121" + }, + { + "type": "skip", + "description": "Set RADAR_REGRESSION_PLATFORM=1 on a host with a supported system browser.", + "location": { + "file": "/Users/thomaswhidden/Documents/Radar/tests/regression/platform-soak.spec.ts", + "line": 82, + "column": 8 + } + } + ], + "expectedStatus": "skipped", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "skipped", + "duration": 3415, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:26.987Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3121" + }, + { + "type": "skip", + "description": "Set RADAR_REGRESSION_PLATFORM=1 on a host with a supported system browser.", + "location": { + "file": "/Users/thomaswhidden/Documents/Radar/tests/regression/platform-soak.spec.ts", + "line": 82, + "column": 8 + } + } + ], + "attachments": [] + } + ], + "status": "skipped" + } + ], + "id": "9dc986ddface34b6b339-a6871b6c5a0af69fa733", + "file": "platform-soak.spec.ts", + "line": 81, + "column": 1 + }, + { + "title": "[REG-RES-003] @soak repeats demo load, navigation, filtering, and project state checks fifty times", + "ok": true, + "tags": [ + "soak" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3235" + }, + { + "type": "skip", + "description": "Set RADAR_REGRESSION_SOAK=1 for scheduled longevity runs.", + "location": { + "file": "/Users/thomaswhidden/Documents/Radar/tests/regression/platform-soak.spec.ts", + "line": 93, + "column": 8 + } + } + ], + "expectedStatus": "skipped", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "skipped", + "duration": 3503, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:27.625Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3235" + }, + { + "type": "skip", + "description": "Set RADAR_REGRESSION_SOAK=1 for scheduled longevity runs.", + "location": { + "file": "/Users/thomaswhidden/Documents/Radar/tests/regression/platform-soak.spec.ts", + "line": 93, + "column": 8 + } + } + ], + "attachments": [] + } + ], + "status": "skipped" + } + ], + "id": "9dc986ddface34b6b339-72dcc0220acfc62e9683", + "file": "platform-soak.spec.ts", + "line": 92, + "column": 1 + }, + { + "title": "[REG-RES-004] @soak @network sustains a bounded high-volume capture and replay set", + "ok": true, + "tags": [ + "soak", + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3218" + }, + { + "type": "skip", + "description": "Set RADAR_REGRESSION_SOAK=1 for scheduled high-volume runs.", + "location": { + "file": "/Users/thomaswhidden/Documents/Radar/tests/regression/platform-soak.spec.ts", + "line": 110, + "column": 8 + } + } + ], + "expectedStatus": "skipped", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "skipped", + "duration": 3496, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:28.578Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3218" + }, + { + "type": "skip", + "description": "Set RADAR_REGRESSION_SOAK=1 for scheduled high-volume runs.", + "location": { + "file": "/Users/thomaswhidden/Documents/Radar/tests/regression/platform-soak.spec.ts", + "line": 110, + "column": 8 + } + } + ], + "attachments": [] + } + ], + "status": "skipped" + } + ], + "id": "9dc986ddface34b6b339-3ae9901f685ba4abc076", + "file": "platform-soak.spec.ts", + "line": 109, + "column": 1 + } + ] + }, + { + "title": "remaining-network.spec.ts", + "file": "remaining-network.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "[REG-PROJ-006] @network @security excludes a known out-of-scope capture from global search", + "ok": true, + "tags": [ + "network", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3752" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 5332, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:29.227Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3752" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "a7280964ff01bbe8ad65-d67aef673909dc2a5bee", + "file": "remaining-network.spec.ts", + "line": 10, + "column": 1 + }, + { + "title": "[REG-HTTP-011] @network safely captures redirects, query strings, JSON, form, empty, and truncated bodies", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "4352" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 7923, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:29.321Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "4352" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "a7280964ff01bbe8ad65-8ce1a2fbd87e7744adb3", + "file": "remaining-network.spec.ts", + "line": 26, + "column": 1 + }, + { + "title": "[REG-HTTP-012] @network @security keeps authorization and cookie fixture values out of search and default export", + "ok": true, + "tags": [ + "network", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "4240" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 7557, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:29.430Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "4240" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "a7280964ff01bbe8ad65-e7acfc89d8cca5ff2e2f", + "file": "remaining-network.spec.ts", + "line": 53, + "column": 1 + }, + { + "title": "[REG-WS-001] @network records a real proxied WebSocket handshake, text exchange, and close in order", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3657" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 7262, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:30.417Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3657" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "a7280964ff01bbe8ad65-44c548aa1e34251bd62b", + "file": "remaining-network.spec.ts", + "line": 84, + "column": 1 + }, + { + "title": "[REG-WS-005] @network replays a captured WebSocket frame to the real loopback lab", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3181" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 5029, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:31.142Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "3181" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "a7280964ff01bbe8ad65-79480b0cadb841753b0a", + "file": "remaining-network.spec.ts", + "line": 102, + "column": 1 + }, + { + "title": "[REG-WS-006] @security shows a bounded WebSocket replay error without disturbing HTTP evidence", + "ok": true, + "tags": [ + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2687" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 33958, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:32.088Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2687" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "a7280964ff01bbe8ad65-50b99988ea90e23f39af", + "file": "remaining-network.spec.ts", + "line": 118, + "column": 1 + }, + { + "title": "[REG-SCOPE-007] @ai @network @security policy-blocks out-of-scope AI navigation without a target send", + "ok": true, + "tags": [ + "ai", + "network", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1647" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 4590, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:34.567Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1647" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "a7280964ff01bbe8ad65-e62f18b8323e15590d10", + "file": "remaining-network.spec.ts", + "line": 129, + "column": 1 + }, + { + "title": "[REG-INT-004] @network resumes several intercepted requests exactly once", + "ok": true, + "tags": [ + "network" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1598" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 4681, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:36.180Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1598" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "a7280964ff01bbe8ad65-91a70a1a071b4018365f", + "file": "remaining-network.spec.ts", + "line": 140, + "column": 1 + }, + { + "title": "[REG-REP-010] @network @security strips hop-by-hop and proxy credentials before real replay", + "ok": true, + "tags": [ + "network", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2127" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 3557, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:37.001Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2127" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "a7280964ff01bbe8ad65-843387bd46980f300ab6", + "file": "remaining-network.spec.ts", + "line": 159, + "column": 1 + }, + { + "title": "[REG-ADV-002] @files @security previews OpenAPI and Postman drafts without transmitting", + "ok": true, + "tags": [ + "files", + "security" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2607" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 3917, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:37.255Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2607" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "a7280964ff01bbe8ad65-ccd36dd82b9b83782ef7", + "file": "remaining-network.spec.ts", + "line": 183, + "column": 1 + }, + { + "title": "[REG-ADV-003] @files saves an imported draft and loads it visibly without transmission", + "ok": true, + "tags": [ + "files" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2148" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 3593, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:37.693Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "2148" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "a7280964ff01bbe8ad65-7b7ea672f6ed73a7c8e2", + "file": "remaining-network.spec.ts", + "line": 205, + "column": 1 + }, + { + "title": "[REG-MAP-003] @core @persistence compares baseline and active sessions visibly", + "ok": true, + "tags": [ + "core", + "persistence" + ], + "tests": [ + { + "timeout": 45000, + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1600" + } + ], + "expectedStatus": "passed", + "projectId": "", + "projectName": "", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 3203, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-07-18T23:02:39.167Z", + "annotations": [ + { + "type": "radar-startup-ms", + "description": "1600" + } + ], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "a7280964ff01bbe8ad65-66a98ae9d77c49a32c25", + "file": "remaining-network.spec.ts", + "line": 223, + "column": 1 + } + ] + } + ], + "errors": [], + "stats": { + "startTime": "2026-07-18T23:00:26.968Z", + "duration": 159097.45899999997, + "expected": 157, + "skipped": 7, + "unexpected": 0, + "flaky": 0 + } +} \ No newline at end of file diff --git a/artifacts/regression/results/.last-run.json b/artifacts/regression/results/.last-run.json new file mode 100644 index 0000000..cbcc1fb --- /dev/null +++ b/artifacts/regression/results/.last-run.json @@ -0,0 +1,4 @@ +{ + "status": "passed", + "failedTests": [] +} \ No newline at end of file diff --git a/artifacts/regression/summary.json b/artifacts/regression/summary.json new file mode 100644 index 0000000..f2c0123 --- /dev/null +++ b/artifacts/regression/summary.json @@ -0,0 +1,2050 @@ +{ + "generatedAt": "2026-07-18T23:03:06.074Z", + "status": "passed", + "wallTimeMs": 159097.45899999997, + "workers": 6, + "counts": { + "passed": 157, + "failed": 0, + "flaky": 0, + "skipped": 7 + }, + "tests": [ + { + "id": "REG-AUTO-006", + "title": "[REG-AUTO-006] @network pauses and resumes a real slow Automate session without duplicate sends", + "outcome": "passed", + "durationMs": 9723, + "attempts": 1, + "startupMs": 4967, + "tags": [ + "@network" + ], + "file": "tests/regression/active-workflows.spec.ts" + }, + { + "id": "REG-AUTO-007", + "title": "[REG-AUTO-007] @network stops only the selected Automate session while another completes", + "outcome": "passed", + "durationMs": 8081, + "attempts": 1, + "startupMs": 5029, + "tags": [ + "@network" + ], + "file": "tests/regression/active-workflows.spec.ts" + }, + { + "id": "REG-AUTO-008", + "title": "[REG-AUTO-008] @network retries only a failed Automate attempt after fixture recovery", + "outcome": "passed", + "durationMs": 9598, + "attempts": 1, + "startupMs": 5096, + "tags": [ + "@network" + ], + "file": "tests/regression/active-workflows.spec.ts" + }, + { + "id": "REG-WF-006", + "title": "[REG-WF-006] @network @security runs one selected in-scope active workflow request through the normal contract", + "outcome": "passed", + "durationMs": 8613, + "attempts": 1, + "startupMs": 5064, + "tags": [ + "@network", + "@security" + ], + "file": "tests/regression/active-workflows.spec.ts" + }, + { + "id": "REG-WF-007", + "title": "[REG-WF-007] @network @security blocks an active workflow with no selected capture", + "outcome": "passed", + "durationMs": 36419, + "attempts": 1, + "startupMs": 5019, + "tags": [ + "@network", + "@security" + ], + "file": "tests/regression/active-workflows.spec.ts" + }, + { + "id": "REG-RES-001", + "title": "[REG-RES-001] @network surfaces a bounded replay failure when the target lab disappears and remains usable", + "outcome": "passed", + "durationMs": 6551, + "attempts": 1, + "startupMs": 4966, + "tags": [ + "@network" + ], + "file": "tests/regression/active-workflows.spec.ts" + }, + { + "id": "REG-SSL-003", + "title": "[REG-SSL-003] @network captures real HTTPS fixture traffic through Radar's isolated MITM proxy", + "outcome": "passed", + "durationMs": 4749, + "attempts": 1, + "startupMs": 1628, + "tags": [ + "@network" + ], + "file": "tests/regression/active-workflows.spec.ts" + }, + { + "id": "REG-AIF-003", + "title": "[REG-AIF-003] @ai @security enforces visible tool, replay, workflow, capture-sample, and runtime budgets", + "outcome": "passed", + "durationMs": 12078, + "attempts": 1, + "startupMs": 1566, + "tags": [ + "@ai", + "@security" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-AIF-004", + "title": "[REG-AIF-004] @ai pauses a delayed planner and resumes the same durable run", + "outcome": "passed", + "durationMs": 7846, + "attempts": 1, + "startupMs": 1598, + "tags": [ + "@ai" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-AIF-005", + "title": "[REG-AIF-005] @ai @security keeps a stopped delayed run terminal after its provider response arrives", + "outcome": "passed", + "durationMs": 5660, + "attempts": 1, + "startupMs": 2134, + "tags": [ + "@ai", + "@security" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-AIF-006", + "title": "[REG-AIF-006] @ai records retry, retry-with-evidence, skip, and stop recovery choices", + "outcome": "passed", + "durationMs": 14145, + "attempts": 1, + "startupMs": 2123, + "tags": [ + "@ai" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-AIF-007", + "title": "[REG-AIF-007] @ai creates a low-confidence reviewable finding draft from a failed recovery", + "outcome": "passed", + "durationMs": 4966, + "attempts": 1, + "startupMs": 1577, + "tags": [ + "@ai" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-AIF-009", + "title": "[REG-AIF-009] @ai @persistence confirms, dismisses, searches, and restores project run memory", + "outcome": "passed", + "durationMs": 7813, + "attempts": 1, + "tags": [ + "@ai", + "@persistence" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-AIF-010", + "title": "[REG-AIF-010] @ai @security rejects an invisible plugin mutation and creates no side effect", + "outcome": "passed", + "durationMs": 5200, + "attempts": 1, + "startupMs": 2084, + "tags": [ + "@ai", + "@security" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-AIF-011", + "title": "[REG-AIF-011] @ai steers a paused mission and grants then revokes an exact capability lease", + "outcome": "passed", + "durationMs": 5841, + "attempts": 1, + "startupMs": 2118, + "tags": [ + "@ai" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-AIF-012", + "title": "[REG-AIF-012] @ai @persistence restores completed, stopped, and failed AI runs after restart", + "outcome": "passed", + "durationMs": 7931, + "attempts": 1, + "tags": [ + "@ai", + "@persistence" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-FIND-009", + "title": "[REG-FIND-009] @ai @security rejects malformed AI finding evidence before it enters the inbox", + "outcome": "passed", + "durationMs": 5213, + "attempts": 1, + "startupMs": 1638, + "tags": [ + "@ai", + "@security" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-INT-008", + "title": "[REG-INT-008] @ai @network @security prepares a visible intercept edit while leaving the request paused", + "outcome": "passed", + "durationMs": 6343, + "attempts": 1, + "startupMs": 1699, + "tags": [ + "@ai", + "@network", + "@security" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-PLUG-010", + "title": "[REG-PLUG-010] @ai @security reads plugin inventory but rejects a requested install mutation", + "outcome": "passed", + "durationMs": 4663, + "attempts": 1, + "startupMs": 1626, + "tags": [ + "@ai", + "@security" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-WF-010", + "title": "[REG-WF-010] @ai @security prepares a visible workflow draft without saving or running it", + "outcome": "passed", + "durationMs": 4999, + "attempts": 1, + "startupMs": 1608, + "tags": [ + "@ai", + "@security" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-WF-011", + "title": "[REG-WF-011] @ai @network @security reuses the normal workflow contract after an exact capability grant", + "outcome": "passed", + "durationMs": 9533, + "attempts": 1, + "startupMs": 1567, + "tags": [ + "@ai", + "@network", + "@security" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-ID-007", + "title": "[REG-ID-007] @ai @security keeps identity-adjacent raw capture secrets opt-in", + "outcome": "passed", + "durationMs": 3442, + "attempts": 1, + "startupMs": 1596, + "tags": [ + "@ai", + "@security" + ], + "file": "tests/regression/ai-runtime-extended.spec.ts" + }, + { + "id": "REG-AIM-001", + "title": "[REG-AIM-001] @ai configures, probes, and persists the deterministic local provider", + "outcome": "passed", + "durationMs": 2958, + "attempts": 1, + "startupMs": 1578, + "tags": [ + "@ai" + ], + "file": "tests/regression/ai-workflows.spec.ts" + }, + { + "id": "REG-AIM-002", + "title": "[REG-AIM-002] @ai @security sends redacted scoped context by default", + "outcome": "passed", + "durationMs": 3402, + "attempts": 1, + "startupMs": 1650, + "tags": [ + "@ai", + "@security" + ], + "file": "tests/regression/ai-workflows.spec.ts" + }, + { + "id": "REG-AIM-003", + "title": "[REG-AIM-003] @ai @security sends raw evidence only after explicit opt-in", + "outcome": "passed", + "durationMs": 3426, + "attempts": 1, + "startupMs": 1623, + "tags": [ + "@ai", + "@security" + ], + "file": "tests/regression/ai-workflows.spec.ts" + }, + { + "id": "REG-AIM-004", + "title": "[REG-AIM-004] @ai runs summary, notes, checklist, TLS, and WebSocket analysis tasks", + "outcome": "passed", + "durationMs": 4644, + "attempts": 1, + "startupMs": 2113, + "tags": [ + "@ai" + ], + "file": "tests/regression/ai-workflows.spec.ts" + }, + { + "id": "REG-AIM-005", + "title": "[REG-AIM-005] @ai @security applies a prepared Repeater draft without transmitting it", + "outcome": "passed", + "durationMs": 3935, + "attempts": 1, + "startupMs": 2184, + "tags": [ + "@ai", + "@security" + ], + "file": "tests/regression/ai-workflows.spec.ts" + }, + { + "id": "REG-AIM-006", + "title": "[REG-AIM-006] @ai saves, runs, and deletes a local custom skill", + "outcome": "passed", + "durationMs": 4589, + "attempts": 1, + "startupMs": 2634, + "tags": [ + "@ai" + ], + "file": "tests/regression/ai-workflows.spec.ts" + }, + { + "id": "REG-AIM-007", + "title": "[REG-AIM-007] @ai recovers from malformed, HTTP-error, and timeout provider responses", + "outcome": "passed", + "durationMs": 4206, + "attempts": 1, + "startupMs": 2118, + "tags": [ + "@ai" + ], + "file": "tests/regression/ai-workflows.spec.ts" + }, + { + "id": "REG-AIM-008", + "title": "[REG-AIM-008] @ai @security does not reuse a hidden session's packet selection", + "outcome": "passed", + "durationMs": 3365, + "attempts": 1, + "startupMs": 1651, + "tags": [ + "@ai", + "@security" + ], + "file": "tests/regression/ai-workflows.spec.ts" + }, + { + "id": "REG-AIF-001", + "title": "[REG-AIF-001] @ai @smoke completes a passive AI-First goal with a visible timeline", + "outcome": "passed", + "durationMs": 5183, + "attempts": 1, + "startupMs": 1700, + "tags": [ + "@ai", + "@smoke" + ], + "file": "tests/regression/ai-workflows.spec.ts" + }, + { + "id": "REG-AIF-002", + "title": "[REG-AIF-002] @ai @security policy-blocks an out-of-scope planner action", + "outcome": "passed", + "durationMs": 5657, + "attempts": 1, + "startupMs": 2696, + "tags": [ + "@ai", + "@security" + ], + "file": "tests/regression/ai-workflows.spec.ts" + }, + { + "id": "REG-AIF-008", + "title": "[REG-AIF-008] @ai @security rejects incomplete findings and accepts complete evidence contracts", + "outcome": "passed", + "durationMs": 7838, + "attempts": 1, + "startupMs": 3271, + "tags": [ + "@ai", + "@security" + ], + "file": "tests/regression/ai-workflows.spec.ts" + }, + { + "id": "REG-APP-001", + "title": "[REG-APP-001] @smoke launches the production Electron shell with preload state", + "outcome": "passed", + "durationMs": 3573, + "attempts": 1, + "startupMs": 3269, + "tags": [ + "@smoke" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-APP-003", + "title": "[REG-APP-003] @smoke loads the complete seeded walkthrough", + "outcome": "passed", + "durationMs": 4713, + "attempts": 1, + "startupMs": 3231, + "tags": [ + "@smoke" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-APP-005", + "title": "[REG-APP-005] @core switches and persists every appearance theme", + "outcome": "passed", + "durationMs": 3321, + "attempts": 1, + "startupMs": 1631, + "tags": [ + "@core" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-APP-006", + "title": "[REG-APP-006] @core opens and dismisses every primary overlay", + "outcome": "passed", + "durationMs": 3201, + "attempts": 1, + "startupMs": 1620, + "tags": [ + "@core" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-APP-007", + "title": "[REG-APP-007] @core toggles operating mode without creating an agent run", + "outcome": "passed", + "durationMs": 2927, + "attempts": 1, + "startupMs": 1657, + "tags": [ + "@core" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-APP-008", + "title": "[REG-APP-008] @core creates and switches sessions through visible controls", + "outcome": "passed", + "durationMs": 3179, + "attempts": 1, + "startupMs": 1688, + "tags": [ + "@core" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-APP-009", + "title": "[REG-APP-009] @core opens global search with the platform shortcut and Escape", + "outcome": "passed", + "durationMs": 2519, + "attempts": 1, + "startupMs": 2171, + "tags": [ + "@core" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-PROJ-002", + "title": "[REG-PROJ-002] @core @persistence renames a session and keeps it selectable", + "outcome": "passed", + "durationMs": 3614, + "attempts": 1, + "startupMs": 2172, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-PROJ-004", + "title": "[REG-PROJ-004] @core @persistence saves and restores a filtered Traffic view", + "outcome": "passed", + "durationMs": 3345, + "attempts": 1, + "startupMs": 1684, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-PROJ-008", + "title": "[REG-PROJ-008] @core @persistence refreshes stable demo records without duplicates", + "outcome": "passed", + "durationMs": 3229, + "attempts": 1, + "startupMs": 1718, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-HTTP-003", + "title": "[REG-HTTP-003] @core combines method, type, sort, and query filters", + "outcome": "passed", + "durationMs": 4646, + "attempts": 1, + "startupMs": 3215, + "tags": [ + "@core" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-HTTP-004", + "title": "[REG-HTTP-004] @core saves and reapplies a Traffic filter", + "outcome": "passed", + "durationMs": 4876, + "attempts": 1, + "startupMs": 3299, + "tags": [ + "@core" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-HTTP-005", + "title": "[REG-HTTP-005] @core @persistence annotates evidence and exposes it to search", + "outcome": "passed", + "durationMs": 6104, + "attempts": 1, + "startupMs": 3244, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-HTTP-008", + "title": "[REG-HTTP-008] @core inspects request, response, and TLS evidence", + "outcome": "passed", + "durationMs": 4683, + "attempts": 1, + "startupMs": 3210, + "tags": [ + "@core" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-HTTP-010", + "title": "[REG-HTTP-010] @core @security clears HTTP evidence without clearing WebSocket frames", + "outcome": "passed", + "durationMs": 4143, + "attempts": 1, + "startupMs": 2644, + "tags": [ + "@core", + "@security" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-WS-002", + "title": "[REG-WS-002] @core filters WebSocket evidence by direction and payload", + "outcome": "passed", + "durationMs": 3683, + "attempts": 1, + "startupMs": 2224, + "tags": [ + "@core" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-WS-004", + "title": "[REG-WS-004] @core renders complete selected frame detail", + "outcome": "passed", + "durationMs": 3262, + "attempts": 1, + "startupMs": 2280, + "tags": [ + "@core" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-WS-007", + "title": "[REG-WS-007] @core clears WebSocket frames without clearing HTTP evidence", + "outcome": "passed", + "durationMs": 3298, + "attempts": 1, + "startupMs": 1690, + "tags": [ + "@core" + ], + "file": "tests/regression/core-workflows.spec.ts" + }, + { + "id": "REG-DATA-004", + "title": "[REG-DATA-004] @persistence @security fails closed against a newer database without modifying it", + "outcome": "passed", + "durationMs": 1126, + "attempts": 1, + "tags": [ + "@persistence", + "@security" + ], + "file": "tests/regression/database-resilience.spec.ts" + }, + { + "id": "REG-DATA-005", + "title": "[REG-DATA-005] @persistence migrates a supported older database once and remains idempotent", + "outcome": "passed", + "durationMs": 4687, + "attempts": 1, + "tags": [ + "@persistence" + ], + "file": "tests/regression/database-resilience.spec.ts" + }, + { + "id": "REG-SCOPE-001", + "title": "[REG-SCOPE-001] @security starts with local-development-only scope", + "outcome": "passed", + "durationMs": 5045, + "attempts": 1, + "startupMs": 4329, + "tags": [ + "@security" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-SCOPE-002", + "title": "[REG-SCOPE-002] @security saves exact origins, hostnames, wildcards, and local", + "outcome": "passed", + "durationMs": 5117, + "attempts": 1, + "startupMs": 4234, + "tags": [ + "@security" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-SCOPE-003", + "title": "[REG-SCOPE-003] @security ignores blank scope lines and normalizes duplicates", + "outcome": "passed", + "durationMs": 5169, + "attempts": 1, + "startupMs": 4254, + "tags": [ + "@security" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-SCOPE-006", + "title": "[REG-SCOPE-006] @security trusts only the current Repeater draft origin without sending", + "outcome": "passed", + "durationMs": 5160, + "attempts": 1, + "startupMs": 3731, + "tags": [ + "@security" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-REP-002", + "title": "[REG-REP-002] @core @persistence creates, selects, pins, and closes Repeater tabs", + "outcome": "passed", + "durationMs": 4619, + "attempts": 1, + "startupMs": 3177, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-REP-003", + "title": "[REG-REP-003] @core selects an environment while preserving variable-authored drafts", + "outcome": "passed", + "durationMs": 3197, + "attempts": 1, + "startupMs": 1772, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-REP-006", + "title": "[REG-REP-006] @core @persistence reloads a saved collection draft", + "outcome": "passed", + "durationMs": 4211, + "attempts": 1, + "startupMs": 2743, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-AUTO-001", + "title": "[REG-AUTO-001] @core inserts a named URL payload marker into the visible draft", + "outcome": "passed", + "durationMs": 4731, + "attempts": 1, + "startupMs": 3282, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-AUTO-005", + "title": "[REG-AUTO-005] @core renders seeded results, matches, and clusters", + "outcome": "passed", + "durationMs": 4705, + "attempts": 1, + "startupMs": 3233, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-AUTO-009", + "title": "[REG-AUTO-009] @core promotes an Automate result into Repeater", + "outcome": "passed", + "durationMs": 4736, + "attempts": 1, + "startupMs": 3201, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-FIND-001", + "title": "[REG-FIND-001] @core combines finding queue filters", + "outcome": "passed", + "durationMs": 4716, + "attempts": 1, + "startupMs": 3249, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-FIND-002", + "title": "[REG-FIND-002] @core creates evidence-backed findings from HTTP and WebSocket", + "outcome": "passed", + "durationMs": 3792, + "attempts": 1, + "startupMs": 2140, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-FIND-004", + "title": "[REG-FIND-004] @core @persistence saves edited finding fields", + "outcome": "passed", + "durationMs": 5147, + "attempts": 1, + "startupMs": 1695, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-FIND-008", + "title": "[REG-FIND-008] @core deletes only the selected finding", + "outcome": "passed", + "durationMs": 3255, + "attempts": 1, + "startupMs": 1747, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-FILE-008", + "title": "[REG-FILE-008] @files @security builds a redacted Markdown finding report", + "outcome": "passed", + "durationMs": 3205, + "attempts": 1, + "startupMs": 1694, + "tags": [ + "@files", + "@security" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-WF-001", + "title": "[REG-WF-001] @core protects built-in workflows and exposes saved workflows", + "outcome": "passed", + "durationMs": 3808, + "attempts": 1, + "startupMs": 2226, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-WF-003", + "title": "[REG-WF-003] @core @security rejects malformed workflow definitions", + "outcome": "passed", + "durationMs": 4363, + "attempts": 1, + "startupMs": 2780, + "tags": [ + "@core", + "@security" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-WF-005", + "title": "[REG-WF-005] @core runs a passive workflow without changing captures", + "outcome": "passed", + "durationMs": 3905, + "attempts": 1, + "startupMs": 2252, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-WF-008", + "title": "[REG-WF-008] @core promotes a warning workflow result to a draft finding", + "outcome": "passed", + "durationMs": 3288, + "attempts": 1, + "startupMs": 1696, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-PLUG-001", + "title": "[REG-PLUG-001] @core displays seeded approved plugin permissions", + "outcome": "passed", + "durationMs": 3162, + "attempts": 1, + "startupMs": 1696, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-PLUG-007", + "title": "[REG-PLUG-007] @core @security renders the approved demo panel", + "outcome": "passed", + "durationMs": 3204, + "attempts": 1, + "startupMs": 1718, + "tags": [ + "@core", + "@security" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-ADV-001", + "title": "[REG-ADV-001] @core renders seeded GraphQL operation analysis", + "outcome": "passed", + "durationMs": 3152, + "attempts": 1, + "startupMs": 1707, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-ADV-005", + "title": "[REG-ADV-005] @core inventories query, JSON, GraphQL, and WebSocket parameters", + "outcome": "passed", + "durationMs": 3624, + "attempts": 1, + "startupMs": 2205, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-ADV-006", + "title": "[REG-ADV-006] @security masks local secret signals", + "outcome": "passed", + "durationMs": 4195, + "attempts": 1, + "startupMs": 2758, + "tags": [ + "@security" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-ADV-008", + "title": "[REG-ADV-008] @core @security prepares an Advanced workflow visibly without running it", + "outcome": "passed", + "durationMs": 4189, + "attempts": 1, + "startupMs": 2693, + "tags": [ + "@core", + "@security" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-MAP-001", + "title": "[REG-MAP-001] @core builds a sitemap and endpoint inventory from captures", + "outcome": "passed", + "durationMs": 4142, + "attempts": 1, + "startupMs": 2695, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-MAP-002", + "title": "[REG-MAP-002] @core routes a sitemap endpoint into filtered Traffic", + "outcome": "passed", + "durationMs": 4219, + "attempts": 1, + "startupMs": 2713, + "tags": [ + "@core" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-SSL-004", + "title": "[REG-SSL-004] @core @persistence saves workspace-local proxy profile notes", + "outcome": "passed", + "durationMs": 4187, + "attempts": 1, + "startupMs": 2711, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/domain-workflows.spec.ts" + }, + { + "id": "REG-APP-010", + "title": "[REG-APP-010] @core keeps sidebar and footer telemetry aligned with visible evidence", + "outcome": "passed", + "durationMs": 3111, + "attempts": 1, + "startupMs": 1682, + "tags": [ + "@core" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-PROJ-005", + "title": "[REG-PROJ-005] @core routes every populated global-search result kind", + "outcome": "passed", + "durationMs": 4473, + "attempts": 1, + "startupMs": 1685, + "tags": [ + "@core" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-PROJ-007", + "title": "[REG-PROJ-007] @core rejects unsupported global-search filters without changing state", + "outcome": "passed", + "durationMs": 3223, + "attempts": 1, + "startupMs": 1673, + "tags": [ + "@core" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-SCOPE-004", + "title": "[REG-SCOPE-004] @security removing an origin hides its evidence everywhere without deleting it", + "outcome": "passed", + "durationMs": 3235, + "attempts": 1, + "startupMs": 1626, + "tags": [ + "@security" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-SCOPE-005", + "title": "[REG-SCOPE-005] @security re-adding an origin reveals stored evidence without duplication", + "outcome": "passed", + "durationMs": 3624, + "attempts": 1, + "startupMs": 1715, + "tags": [ + "@security" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-HTTP-007", + "title": "[REG-HTTP-007] @files @security bulk-exports only selected scoped captures", + "outcome": "passed", + "durationMs": 4271, + "attempts": 1, + "startupMs": 2694, + "tags": [ + "@files", + "@security" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-INT-006", + "title": "[REG-INT-006] @security rejects invalid intercept rules and preserves the last valid set", + "outcome": "passed", + "durationMs": 4175, + "attempts": 1, + "startupMs": 2678, + "tags": [ + "@security" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-REP-004", + "title": "[REG-REP-004] @security blocks a missing environment variable before transmission", + "outcome": "passed", + "durationMs": 4050, + "attempts": 1, + "startupMs": 2321, + "tags": [ + "@security" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-REP-005", + "title": "[REG-REP-005] @network compares two real replay-history variants", + "outcome": "passed", + "durationMs": 4658, + "attempts": 1, + "startupMs": 2813, + "tags": [ + "@network" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-REP-009", + "title": "[REG-REP-009] @network represents status, redirect, slow, and connection-error outcomes", + "outcome": "passed", + "durationMs": 5036, + "attempts": 1, + "startupMs": 2813, + "tags": [ + "@network" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-AUTO-002", + "title": "[REG-AUTO-002] @core @persistence creates, updates, and reloads an inline payload set", + "outcome": "passed", + "durationMs": 3934, + "attempts": 1, + "startupMs": 2217, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-AUTO-003", + "title": "[REG-AUTO-003] @files @security stores a bounded wordlist reference without renderer file access", + "outcome": "passed", + "durationMs": 4334, + "attempts": 1, + "startupMs": 2847, + "tags": [ + "@files", + "@security" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-AUTO-004", + "title": "[REG-AUTO-004] @security clamps excessive Automate execution limits", + "outcome": "passed", + "durationMs": 4258, + "attempts": 1, + "startupMs": 2820, + "tags": [ + "@security" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-FIND-005", + "title": "[REG-FIND-005] @core records retest notes and reviewed-to-resolved transitions", + "outcome": "passed", + "durationMs": 5002, + "attempts": 1, + "startupMs": 1735, + "tags": [ + "@core" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-FIND-006", + "title": "[REG-FIND-006] @core merges an explicitly selected duplicate suggestion", + "outcome": "passed", + "durationMs": 3401, + "attempts": 1, + "startupMs": 1676, + "tags": [ + "@core" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-FIND-007", + "title": "[REG-FIND-007] @security leaves findings unchanged when a duplicate suggestion is ignored", + "outcome": "passed", + "durationMs": 4540, + "attempts": 1, + "startupMs": 2820, + "tags": [ + "@security" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-WF-004", + "title": "[REG-WF-004] @core @persistence records workflow revisions across edits", + "outcome": "passed", + "durationMs": 4456, + "attempts": 1, + "startupMs": 2742, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-WF-009", + "title": "[REG-WF-009] @core deletes a saved workflow while protecting a built-in", + "outcome": "passed", + "durationMs": 4354, + "attempts": 1, + "startupMs": 2737, + "tags": [ + "@core" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-SSL-002", + "title": "[REG-SSL-002] @security generates an isolated CA with restricted file permissions", + "outcome": "passed", + "durationMs": 4164, + "attempts": 1, + "startupMs": 2731, + "tags": [ + "@security" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-RES-002", + "title": "[REG-RES-002] @core survives rapid view and session switching without stale selections", + "outcome": "passed", + "durationMs": 3619, + "attempts": 1, + "startupMs": 1734, + "tags": [ + "@core" + ], + "file": "tests/regression/extended-workflows.spec.ts" + }, + { + "id": "REG-FILE-001", + "title": "[REG-FILE-001] @files @security previews every project bundle redaction profile", + "outcome": "passed", + "durationMs": 3405, + "attempts": 1, + "startupMs": 1711, + "tags": [ + "@files", + "@security" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-FILE-002", + "title": "[REG-FILE-002] @files @security exports a parseable redacted project bundle", + "outcome": "passed", + "durationMs": 4721, + "attempts": 1, + "startupMs": 3259, + "tags": [ + "@files", + "@security" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-FILE-003", + "title": "[REG-FILE-003] @files @security previews conflicts and proposed scope without applying", + "outcome": "passed", + "durationMs": 4719, + "attempts": 1, + "startupMs": 3196, + "tags": [ + "@files", + "@security" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-FILE-004", + "title": "[REG-FILE-004] @files @persistence applies a valid import into an independent project", + "outcome": "passed", + "durationMs": 5199, + "attempts": 1, + "startupMs": 3247, + "tags": [ + "@files", + "@persistence" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-FILE-005", + "title": "[REG-FILE-005] @files @security rejects corrupt and unsupported-newer bundles", + "outcome": "passed", + "durationMs": 4807, + "attempts": 1, + "startupMs": 3249, + "tags": [ + "@files", + "@security" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-FILE-006", + "title": "[REG-FILE-006] @files @security previews a default reviewed-finding handoff", + "outcome": "passed", + "durationMs": 4704, + "attempts": 1, + "startupMs": 3265, + "tags": [ + "@files", + "@security" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-FILE-007", + "title": "[REG-FILE-007] @files opts draft findings into the handoff preview", + "outcome": "passed", + "durationMs": 4192, + "attempts": 1, + "startupMs": 2717, + "tags": [ + "@files" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-PROJ-003", + "title": "[REG-PROJ-003] @core creates, edits, searches, opens, and selectively deletes a project note", + "outcome": "passed", + "durationMs": 3650, + "attempts": 1, + "startupMs": 2229, + "tags": [ + "@core" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-HTTP-006", + "title": "[REG-HTTP-006] @core bulk-tags and deletes only selected captures", + "outcome": "passed", + "durationMs": 4524, + "attempts": 1, + "startupMs": 2289, + "tags": [ + "@core" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-WS-003", + "title": "[REG-WS-003] @core @persistence preserves seeded WebSocket annotations", + "outcome": "passed", + "durationMs": 4274, + "attempts": 1, + "startupMs": 2816, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-FIND-003", + "title": "[REG-FIND-003] @core creates a draft from a selected finding template", + "outcome": "passed", + "durationMs": 4266, + "attempts": 1, + "startupMs": 2775, + "tags": [ + "@core" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-FILE-009", + "title": "[REG-FILE-009] @files @security includes raw report evidence only after explicit opt-in", + "outcome": "passed", + "durationMs": 4927, + "attempts": 1, + "startupMs": 3289, + "tags": [ + "@files", + "@security" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-WF-002", + "title": "[REG-WF-002] @core inserts a supported workflow step into the visible graph", + "outcome": "passed", + "durationMs": 4437, + "attempts": 1, + "startupMs": 3407, + "tags": [ + "@core" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-PLUG-002", + "title": "[REG-PLUG-002] @files @security previews a local plugin without installing it", + "outcome": "passed", + "durationMs": 3036, + "attempts": 1, + "startupMs": 1653, + "tags": [ + "@files", + "@security" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-PLUG-003", + "title": "[REG-PLUG-003] @files @security reports invalid plugin sources without installing", + "outcome": "passed", + "durationMs": 3096, + "attempts": 1, + "startupMs": 1661, + "tags": [ + "@files", + "@security" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-PLUG-004", + "title": "[REG-PLUG-004] @files installs a valid local plugin as pending", + "outcome": "passed", + "durationMs": 3530, + "attempts": 1, + "startupMs": 2168, + "tags": [ + "@files" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-PLUG-005", + "title": "[REG-PLUG-005] @files @security grants only requested plugin permissions", + "outcome": "passed", + "durationMs": 4565, + "attempts": 1, + "startupMs": 3148, + "tags": [ + "@files", + "@security" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-PLUG-006", + "title": "[REG-PLUG-006] @core @persistence disables and blocks only the selected plugin", + "outcome": "passed", + "durationMs": 4862, + "attempts": 1, + "startupMs": 3275, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-PLUG-008", + "title": "[REG-PLUG-008] @security audits allowed and denied bounded SDK actions", + "outcome": "passed", + "durationMs": 5571, + "attempts": 1, + "startupMs": 3758, + "tags": [ + "@security" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-PLUG-009", + "title": "[REG-PLUG-009] @core removes only the selected plugin", + "outcome": "passed", + "durationMs": 5281, + "attempts": 1, + "startupMs": 3718, + "tags": [ + "@core" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-ADV-004", + "title": "[REG-ADV-004] @core summarizes observed auth-state behavior", + "outcome": "passed", + "durationMs": 4568, + "attempts": 1, + "startupMs": 3157, + "tags": [ + "@core" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-ADV-007", + "title": "[REG-ADV-007] @core links cache, CORS, host, and redirect signals to workflows", + "outcome": "passed", + "durationMs": 3560, + "attempts": 1, + "startupMs": 2120, + "tags": [ + "@core" + ], + "file": "tests/regression/files-plugins.spec.ts" + }, + { + "id": "REG-APP-002", + "title": "[REG-APP-002] @core @security each worker receives isolated Radar data and service ports", + "outcome": "passed", + "durationMs": 1935, + "attempts": 1, + "startupMs": 1622, + "tags": [ + "@core", + "@security" + ], + "file": "tests/regression/isolation.spec.ts" + }, + { + "id": "REG-HTTP-001", + "title": "[REG-HTTP-001] @network @smoke captures real GET and POST traffic through Radar's proxy", + "outcome": "passed", + "durationMs": 5177, + "attempts": 1, + "startupMs": 1694, + "tags": [ + "@network", + "@smoke" + ], + "file": "tests/regression/network-workflows.spec.ts" + }, + { + "id": "REG-HTTP-002", + "title": "[REG-HTTP-002] @network @security hides real out-of-scope traffic", + "outcome": "passed", + "durationMs": 6866, + "attempts": 1, + "startupMs": 3350, + "tags": [ + "@network", + "@security" + ], + "file": "tests/regression/network-workflows.spec.ts" + }, + { + "id": "REG-REP-001", + "title": "[REG-REP-001] @network @smoke sends an edited real request and renders its response", + "outcome": "passed", + "durationMs": 5348, + "attempts": 1, + "startupMs": 3901, + "tags": [ + "@network", + "@smoke" + ], + "file": "tests/regression/network-workflows.spec.ts" + }, + { + "id": "REG-REP-007", + "title": "[REG-REP-007] @network obeys real burst count and bounded concurrency controls", + "outcome": "passed", + "durationMs": 5461, + "attempts": 1, + "startupMs": 3917, + "tags": [ + "@network" + ], + "file": "tests/regression/network-workflows.spec.ts" + }, + { + "id": "REG-REP-008", + "title": "[REG-REP-008] @network @security clamps burst values before transmission", + "outcome": "passed", + "durationMs": 5340, + "attempts": 1, + "startupMs": 3840, + "tags": [ + "@network", + "@security" + ], + "file": "tests/regression/network-workflows.spec.ts" + }, + { + "id": "REG-INT-001", + "title": "[REG-INT-001] @network pauses a real scoped request before upstream", + "outcome": "passed", + "durationMs": 6908, + "attempts": 1, + "startupMs": 3281, + "tags": [ + "@network" + ], + "file": "tests/regression/network-workflows.spec.ts" + }, + { + "id": "REG-INT-002", + "title": "[REG-INT-002] @network edits and forwards a real paused request", + "outcome": "passed", + "durationMs": 4851, + "attempts": 1, + "startupMs": 1717, + "tags": [ + "@network" + ], + "file": "tests/regression/network-workflows.spec.ts" + }, + { + "id": "REG-INT-003", + "title": "[REG-INT-003] @network drops a real queued request without upstream delivery", + "outcome": "passed", + "durationMs": 6319, + "attempts": 1, + "startupMs": 3138, + "tags": [ + "@network" + ], + "file": "tests/regression/network-workflows.spec.ts" + }, + { + "id": "REG-INT-005", + "title": "[REG-INT-005] @core @persistence saves normalized intercept rules", + "outcome": "passed", + "durationMs": 4492, + "attempts": 1, + "startupMs": 3115, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/network-workflows.spec.ts" + }, + { + "id": "REG-INT-007", + "title": "[REG-INT-007] @network applies real scoped match/replace transformations", + "outcome": "passed", + "durationMs": 4897, + "attempts": 1, + "startupMs": 3175, + "tags": [ + "@network" + ], + "file": "tests/regression/network-workflows.spec.ts" + }, + { + "id": "REG-SSL-001", + "title": "[REG-SSL-001] @network starts and stops the isolated proxy and releases its port", + "outcome": "passed", + "durationMs": 4207, + "attempts": 1, + "startupMs": 2654, + "tags": [ + "@network" + ], + "file": "tests/regression/network-workflows.spec.ts" + }, + { + "id": "REG-HTTP-009", + "title": "[REG-HTTP-009] @smoke @core loads demo evidence, filters traffic, and clones a request to Repeater", + "outcome": "passed", + "durationMs": 3761, + "attempts": 1, + "startupMs": 2254, + "tags": [ + "@smoke", + "@core" + ], + "file": "tests/regression/operator-workflows.spec.ts" + }, + { + "id": "REG-APP-004", + "title": "[REG-APP-004] @smoke @core renders every primary workbench view with demo state", + "outcome": "passed", + "durationMs": 3592, + "attempts": 1, + "startupMs": 1601, + "tags": [ + "@smoke", + "@core" + ], + "file": "tests/regression/operator-workflows.spec.ts" + }, + { + "id": "REG-PROJ-001", + "title": "[REG-PROJ-001] @core @persistence creates, renames, and restores an independent project", + "outcome": "passed", + "durationMs": 4485, + "attempts": 1, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/persistence-identity.spec.ts" + }, + { + "id": "REG-DATA-001", + "title": "[REG-DATA-001] @persistence restores representative project state after a real app restart", + "outcome": "passed", + "durationMs": 5668, + "attempts": 1, + "tags": [ + "@persistence" + ], + "file": "tests/regression/persistence-identity.spec.ts" + }, + { + "id": "REG-DATA-003", + "title": "[REG-DATA-003] @persistence keeps session evidence isolated and recoverable", + "outcome": "passed", + "durationMs": 3673, + "attempts": 1, + "startupMs": 2154, + "tags": [ + "@persistence" + ], + "file": "tests/regression/persistence-identity.spec.ts" + }, + { + "id": "REG-DATA-002", + "title": "[REG-DATA-002] @persistence @security keeps notes and evidence isolated between projects", + "outcome": "passed", + "durationMs": 4685, + "attempts": 1, + "startupMs": 2720, + "tags": [ + "@persistence", + "@security" + ], + "file": "tests/regression/persistence-identity.spec.ts" + }, + { + "id": "REG-ID-001", + "title": "[REG-ID-001] @core @persistence creates, edits, and archives a local identity", + "outcome": "passed", + "durationMs": 3960, + "attempts": 1, + "startupMs": 2224, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/persistence-identity.spec.ts" + }, + { + "id": "REG-ID-002", + "title": "[REG-ID-002] @security blocks activation of an identity outside saved scope", + "outcome": "passed", + "durationMs": 3171, + "attempts": 1, + "startupMs": 1690, + "tags": [ + "@security" + ], + "file": "tests/regression/persistence-identity.spec.ts" + }, + { + "id": "REG-ID-005", + "title": "[REG-ID-005] @core renders the Identity Lab matrix safety interpretation", + "outcome": "passed", + "durationMs": 3255, + "attempts": 1, + "startupMs": 1685, + "tags": [ + "@core" + ], + "file": "tests/regression/persistence-identity.spec.ts" + }, + { + "id": "REG-ID-006", + "title": "[REG-ID-006] @core permits a one-dimension comparison only for eligible attributed recordings", + "outcome": "passed", + "durationMs": 3659, + "attempts": 1, + "startupMs": 2189, + "tags": [ + "@core" + ], + "file": "tests/regression/persistence-identity.spec.ts" + }, + { + "id": "REG-SSL-005", + "title": "[REG-SSL-005] @platform launches the supported isolated browser through Radar to the local lab", + "outcome": "skipped", + "durationMs": 3609, + "attempts": 1, + "startupMs": 3317, + "tags": [ + "@platform" + ], + "file": "tests/regression/platform-soak.spec.ts" + }, + { + "id": "REG-SSL-006", + "title": "[REG-SSL-006] @platform @security detaches an active browser identity when the project changes", + "outcome": "skipped", + "durationMs": 4100, + "attempts": 1, + "startupMs": 3777, + "tags": [ + "@platform", + "@security" + ], + "file": "tests/regression/platform-soak.spec.ts" + }, + { + "id": "REG-SSL-007", + "title": "[REG-SSL-007] @platform handles an occupied preferred debugging port and remains usable", + "outcome": "skipped", + "durationMs": 4101, + "attempts": 1, + "startupMs": 3784, + "tags": [ + "@platform" + ], + "file": "tests/regression/platform-soak.spec.ts" + }, + { + "id": "REG-ID-003", + "title": "[REG-ID-003] @platform @network activates a scoped dedicated identity and attributes its real captures", + "outcome": "skipped", + "durationMs": 4068, + "attempts": 1, + "startupMs": 3756, + "tags": [ + "@platform", + "@network" + ], + "file": "tests/regression/platform-soak.spec.ts" + }, + { + "id": "REG-ID-004", + "title": "[REG-ID-004] @platform @network records healthy and failed dedicated identity verification semantics", + "outcome": "skipped", + "durationMs": 3415, + "attempts": 1, + "startupMs": 3121, + "tags": [ + "@platform", + "@network" + ], + "file": "tests/regression/platform-soak.spec.ts" + }, + { + "id": "REG-RES-003", + "title": "[REG-RES-003] @soak repeats demo load, navigation, filtering, and project state checks fifty times", + "outcome": "skipped", + "durationMs": 3503, + "attempts": 1, + "startupMs": 3235, + "tags": [ + "@soak" + ], + "file": "tests/regression/platform-soak.spec.ts" + }, + { + "id": "REG-RES-004", + "title": "[REG-RES-004] @soak @network sustains a bounded high-volume capture and replay set", + "outcome": "skipped", + "durationMs": 3496, + "attempts": 1, + "startupMs": 3218, + "tags": [ + "@soak", + "@network" + ], + "file": "tests/regression/platform-soak.spec.ts" + }, + { + "id": "REG-PROJ-006", + "title": "[REG-PROJ-006] @network @security excludes a known out-of-scope capture from global search", + "outcome": "passed", + "durationMs": 5332, + "attempts": 1, + "startupMs": 3752, + "tags": [ + "@network", + "@security" + ], + "file": "tests/regression/remaining-network.spec.ts" + }, + { + "id": "REG-HTTP-011", + "title": "[REG-HTTP-011] @network safely captures redirects, query strings, JSON, form, empty, and truncated bodies", + "outcome": "passed", + "durationMs": 7923, + "attempts": 1, + "startupMs": 4352, + "tags": [ + "@network" + ], + "file": "tests/regression/remaining-network.spec.ts" + }, + { + "id": "REG-HTTP-012", + "title": "[REG-HTTP-012] @network @security keeps authorization and cookie fixture values out of search and default export", + "outcome": "passed", + "durationMs": 7557, + "attempts": 1, + "startupMs": 4240, + "tags": [ + "@network", + "@security" + ], + "file": "tests/regression/remaining-network.spec.ts" + }, + { + "id": "REG-WS-001", + "title": "[REG-WS-001] @network records a real proxied WebSocket handshake, text exchange, and close in order", + "outcome": "passed", + "durationMs": 7262, + "attempts": 1, + "startupMs": 3657, + "tags": [ + "@network" + ], + "file": "tests/regression/remaining-network.spec.ts" + }, + { + "id": "REG-WS-005", + "title": "[REG-WS-005] @network replays a captured WebSocket frame to the real loopback lab", + "outcome": "passed", + "durationMs": 5029, + "attempts": 1, + "startupMs": 3181, + "tags": [ + "@network" + ], + "file": "tests/regression/remaining-network.spec.ts" + }, + { + "id": "REG-WS-006", + "title": "[REG-WS-006] @security shows a bounded WebSocket replay error without disturbing HTTP evidence", + "outcome": "passed", + "durationMs": 33958, + "attempts": 1, + "startupMs": 2687, + "tags": [ + "@security" + ], + "file": "tests/regression/remaining-network.spec.ts" + }, + { + "id": "REG-SCOPE-007", + "title": "[REG-SCOPE-007] @ai @network @security policy-blocks out-of-scope AI navigation without a target send", + "outcome": "passed", + "durationMs": 4590, + "attempts": 1, + "startupMs": 1647, + "tags": [ + "@ai", + "@network", + "@security" + ], + "file": "tests/regression/remaining-network.spec.ts" + }, + { + "id": "REG-INT-004", + "title": "[REG-INT-004] @network resumes several intercepted requests exactly once", + "outcome": "passed", + "durationMs": 4681, + "attempts": 1, + "startupMs": 1598, + "tags": [ + "@network" + ], + "file": "tests/regression/remaining-network.spec.ts" + }, + { + "id": "REG-REP-010", + "title": "[REG-REP-010] @network @security strips hop-by-hop and proxy credentials before real replay", + "outcome": "passed", + "durationMs": 3557, + "attempts": 1, + "startupMs": 2127, + "tags": [ + "@network", + "@security" + ], + "file": "tests/regression/remaining-network.spec.ts" + }, + { + "id": "REG-ADV-002", + "title": "[REG-ADV-002] @files @security previews OpenAPI and Postman drafts without transmitting", + "outcome": "passed", + "durationMs": 3917, + "attempts": 1, + "startupMs": 2607, + "tags": [ + "@files", + "@security" + ], + "file": "tests/regression/remaining-network.spec.ts" + }, + { + "id": "REG-ADV-003", + "title": "[REG-ADV-003] @files saves an imported draft and loads it visibly without transmission", + "outcome": "passed", + "durationMs": 3593, + "attempts": 1, + "startupMs": 2148, + "tags": [ + "@files" + ], + "file": "tests/regression/remaining-network.spec.ts" + }, + { + "id": "REG-MAP-003", + "title": "[REG-MAP-003] @core @persistence compares baseline and active sessions visibly", + "outcome": "passed", + "durationMs": 3203, + "attempts": 1, + "startupMs": 1600, + "tags": [ + "@core", + "@persistence" + ], + "file": "tests/regression/remaining-network.spec.ts" + } + ] +} diff --git a/artifacts/regression/summary.md b/artifacts/regression/summary.md new file mode 100644 index 0000000..02a84df --- /dev/null +++ b/artifacts/regression/summary.md @@ -0,0 +1,121 @@ +# Radar Regression Report + +Generated: 2026-07-18T23:03:06.073Z +Overall result: **PASSED** +Workers: 6 +Wall time: 159.1s +Aggregate workflow time: 825.4s + +## Outcome + +| Passed | Failed | Flaky | Skipped | Selected | +| ---: | ---: | ---: | ---: | ---: | +| 157 | 0 | 0 | 7 | 164 | + +## Release Signals + +- No blocking workflow failures were detected. +- No flaky workflows were detected. +- 7 selected workflow(s) were skipped and remain explicit coverage gaps for this run. +- 4 workflow(s) exceeded 10 seconds; review the slowest-workflow table for startup, polling, or IPC latency. +- No security-tagged release blockers were detected. +- Catalog automation: 164/164 stable IDs (100.0%). +- This invocation selected 164/164 catalog IDs. + +## Results By Tag + +| Tag | Passed | Failed | Flaky | Skipped | Total | +| --- | ---: | ---: | ---: | ---: | ---: | +| @ai | 27 | 0 | 0 | 0 | 27 | +| @core | 65 | 0 | 0 | 0 | 65 | +| @files | 17 | 0 | 0 | 0 | 17 | +| @network | 29 | 0 | 0 | 3 | 32 | +| @persistence | 24 | 0 | 0 | 0 | 24 | +| @platform | 0 | 0 | 0 | 5 | 5 | +| @security | 58 | 0 | 0 | 1 | 59 | +| @smoke | 7 | 0 | 0 | 0 | 7 | +| @soak | 0 | 0 | 0 | 2 | 2 | + +## Results By Product Surface + +| Surface | Passed | Failed | Flaky | Skipped | Total | +| --- | ---: | ---: | ---: | ---: | ---: | +| Advanced Testing | 8 | 0 | 0 | 0 | 8 | +| AI Manual-First | 8 | 0 | 0 | 0 | 8 | +| AI-First | 12 | 0 | 0 | 0 | 12 | +| Application Shell | 10 | 0 | 0 | 0 | 10 | +| Automate | 9 | 0 | 0 | 0 | 9 | +| Data & Persistence | 5 | 0 | 0 | 0 | 5 | +| Files & Reports | 9 | 0 | 0 | 0 | 9 | +| Findings | 9 | 0 | 0 | 0 | 9 | +| HTTP/S Traffic | 12 | 0 | 0 | 0 | 12 | +| Identity Lab | 5 | 0 | 0 | 2 | 7 | +| Intercept | 8 | 0 | 0 | 0 | 8 | +| Plugins | 10 | 0 | 0 | 0 | 10 | +| Projects & Sessions | 8 | 0 | 0 | 0 | 8 | +| Repeater | 10 | 0 | 0 | 0 | 10 | +| Resilience | 2 | 0 | 0 | 2 | 4 | +| Scope | 7 | 0 | 0 | 0 | 7 | +| Sitemap | 3 | 0 | 0 | 0 | 3 | +| SSL & Proxy | 4 | 0 | 0 | 3 | 7 | +| WebSocket | 7 | 0 | 0 | 0 | 7 | +| Workflows | 11 | 0 | 0 | 0 | 11 | + +## Changes From Prior Local Report + +No newly failing selected IDs. + +No newly fixed selected IDs. + +## Security Release Blockers + +None. + +## Failures And Artifacts + +No failed workflows. + +## Slowest Workflows + +| Rank | Workflow | Outcome | Duration | Attempts | +| ---: | --- | --- | ---: | ---: | +| 1 | **REG-WF-007** [REG-WF-007] @network @security blocks an active workflow with no selected capture | passed | 36.4s | 1 | +| 2 | **REG-WS-006** [REG-WS-006] @security shows a bounded WebSocket replay error without disturbing HTTP evidence | passed | 34.0s | 1 | +| 3 | **REG-AIF-006** [REG-AIF-006] @ai records retry, retry-with-evidence, skip, and stop recovery choices | passed | 14.1s | 1 | +| 4 | **REG-AIF-003** [REG-AIF-003] @ai @security enforces visible tool, replay, workflow, capture-sample, and runtime budgets | passed | 12.1s | 1 | +| 5 | **REG-AUTO-006** [REG-AUTO-006] @network pauses and resumes a real slow Automate session without duplicate sends | passed | 9.7s | 1 | +| 6 | **REG-AUTO-008** [REG-AUTO-008] @network retries only a failed Automate attempt after fixture recovery | passed | 9.6s | 1 | +| 7 | **REG-WF-011** [REG-WF-011] @ai @network @security reuses the normal workflow contract after an exact capability grant | passed | 9.5s | 1 | +| 8 | **REG-WF-006** [REG-WF-006] @network @security runs one selected in-scope active workflow request through the normal contract | passed | 8.6s | 1 | +| 9 | **REG-AUTO-007** [REG-AUTO-007] @network stops only the selected Automate session while another completes | passed | 8.1s | 1 | +| 10 | **REG-AIF-012** [REG-AIF-012] @ai @persistence restores completed, stopped, and failed AI runs after restart | passed | 7.9s | 1 | + +## Application Startup Distribution + +Samples: 158 · min 1.6s · median 2.6s · p95 4.3s · max 5.1s. + +## Skipped Coverage Gaps + +- **REG-SSL-005** [REG-SSL-005] @platform launches the supported isolated browser through Radar to the local lab +- **REG-SSL-006** [REG-SSL-006] @platform @security detaches an active browser identity when the project changes +- **REG-SSL-007** [REG-SSL-007] @platform handles an occupied preferred debugging port and remains usable +- **REG-ID-003** [REG-ID-003] @platform @network activates a scoped dedicated identity and attributes its real captures +- **REG-ID-004** [REG-ID-004] @platform @network records healthy and failed dedicated identity verification semantics +- **REG-RES-003** [REG-RES-003] @soak repeats demo load, navigation, filtering, and project state checks fifty times +- **REG-RES-004** [REG-RES-004] @soak @network sustains a bounded high-volume capture and replay set + +## Catalog Coverage + +All 164 specified catalog cases have executable Playwright registrations. +No registered test IDs fall outside the specification. + +## Artifact Guide + +- [`html/index.html`](html/index.html): interactive report with steps and attachments. +- [`results.json`](results.json): complete Playwright machine-readable output. +- [`summary.json`](summary.json): compact status, tag, duration, and stable-ID data for CI ingestion. +- `results/`: retained screenshots, traces, videos, and error context for failures. + +## Tested Architecture + +Each test launches a real Electron main process and renderer with an isolated user-data directory, SQLite store, proxy port, browser-debug port, and cleanup lifecycle. Playwright workers therefore run separate Radar use cases concurrently without sharing project evidence or browser profiles. Suite-owned loopback HTTP/S, WebSocket, deterministic AI, and file fixtures exercise real IPC and persistence boundaries without transmitting to external targets. diff --git a/docs/USER_GUIDE.md b/docs/USER_GUIDE.md index a3a8088..bed9fe6 100644 --- a/docs/USER_GUIDE.md +++ b/docs/USER_GUIDE.md @@ -156,7 +156,7 @@ Persistent areas: - **Left sidebar**: Radar lockup, project/session controls, view navigation, and live per-view counts. - **Top banner**: active project workspace/session and UTC clock. -- **Header**: Radar identity, active project, Open Browser button, global Search, project Notes, live status pills, Projects, Appearance, and AI settings. +- **Header**: Radar identity, active project, managed-browser address/history controls, Playwright status, global Search, project Notes, live status pills, Projects, Appearance, and AI settings. - **Session selector**: quick session switching under the active project. - **Workspace panel**: the active tool surface. - **Footer ticker**: current view, HTTP/S capture count, WebSocket frame count, TLS event count, and proxy status. @@ -409,7 +409,7 @@ In Repeater, click **Trust Origin** to add the current request URL's origin to s ## Opening The Radar Browser -Click **Open Browser** in the header. +Enter a target in the header address bar and click **Open Browser**. After launch, the same toolbar provides **Back**, **Forward**, **Reload**, and **Navigate** without restarting Chrome. Radar looks for a supported local browser: @@ -425,10 +425,13 @@ When Radar launches the browser it: - Starts the local Radar proxy if needed. - Routes browser traffic through Radar's proxy. - Opens remote debugging on `127.0.0.1:9223`. +- Connects Playwright Core to that loopback endpoint and keeps it attached to the visible managed page. - Uses a launch-scoped certificate exception for Radar's generated proxy CA fingerprint. - Uses a mock keychain flag on macOS where supported to avoid prompting for your login keychain. -The SSL view shows the selected browser channel, binary path, profile path, proxy URL, and Chrome remote debugging endpoint. +The header shows a `pw ready` status when AI page control is available. The SSL view shows the selected browser channel, binary path, profile path, proxy URL, Chrome remote debugging endpoint, Playwright status, page count, and any connection error. + +Manual-First uses the same browser and proxy path as AI-First. You can operate the Chrome window directly or use Radar's address/history controls; captured traffic appears in the normal evidence views either way. ### Address Behavior @@ -1413,6 +1416,7 @@ Before starting, choose a run profile: | Profile | Use | | --- | --- | +| **Browser Assessment** | Default live-site path. Explore the visible page through Playwright, capture resulting traffic, and use tightly budgeted replay or saved workflow verification after capability approval. | | **Passive Map** | Read scoped evidence, sitemap, local context, and passive observations without replay or workflow execution. | | **Auth Review** | Inspect browser state, cookies, storage, and saved auth/session states. | | **API Hardening** | Review API captures and prepare Repeater, Automate, or Workflow drafts for manual approval. | @@ -1509,12 +1513,12 @@ When a run starts, Radar records a full observation transcript. The agent choose Available AI-First tools: - `showView` moves the visible workbench between HTTP(S), WebSocket, Intercept, Repeater, Automate, Findings, Workflows, Plugins, Advanced, Sitemap, Scope, and SSL. -- `getBrowserState` reads the launched browser state. -- `openBrowser` and `navigateBrowser` drive in-scope browser navigation. -- `waitForNetworkIdle` waits for captured HTTP/S traffic to settle after navigation. +- `getBrowserState` reads the launched browser and Playwright connection state. +- `openBrowser` launches managed Chrome; `navigateBrowser` changes the existing visible Playwright page without relaunching the profile. +- `waitForNetworkIdle` uses Playwright's page lifecycle to settle after navigation or interaction. - `getPageText` reads visible text from the active page. -- `getDomSummary` reads compact page text, links, buttons, and forms. -- `getClickableElements`, `clickElement`, `fillInput`, and `submitForm` inspect and operate page controls. +- `getDomSummary` reads compact page text, links, buttons, forms, and a bounded accessibility snapshot. +- `getClickableElements` returns visible controls with stable page-specific Playwright selectors. `clickElement`, `fillInput`, and `submitForm` use Playwright actionability checks; re-run element inspection after every page change. - `getCookies` and `getStorageState` inspect browser session state. - Legacy `saveAuthState`, `loadAuthState`, `listAuthStates`, and `compareAuthStates` calls fail closed. Use workspace-scoped Identity Lab profiles and recorded-evidence comparisons. - `getIdentityLabContext` reads metadata-only workspace identity context and attributed-evidence counts without returning session secrets. @@ -1543,6 +1547,8 @@ The existing views remain visible evidence panes, so you can watch the agent use AI-First runs are intentionally bounded: - Every browser or replay URL must be in Scope. +- During an AI click, fill, or form action, Playwright temporarily aborts any HTTP/S request outside saved Scope. Links and form actions with an out-of-scope destination are rejected before dispatch. +- Submit buttons cannot be sent through the generic click tool; the agent must use the separately leased form-submission tool so POST authority stays explicit. - An out-of-scope origin from a goal remains an unsaved Scope proposal until the operator clicks **Commit**; the operator must then click **Start Run** again. - Run budgets are visible before and during a run: tool steps, replay count, workflow requests, capture sample, timeout, and raw-context policy. Checkpoints preserve cumulative tool-step, replay-send, workflow-request, and elapsed-time usage across pause/resume and recovery; resuming never replenishes a budget. - The planner can advance the Mission Graph only through a bounded patch based on the current revision. Stale revisions, invalid entity links, and invalid operator mutations fail closed instead of replacing or partially updating the graph. @@ -1837,12 +1843,12 @@ For the unauthenticated access check, first select the HTTP/S capture you want t ### Run AI-First Autonomy -1. Switch the top shell toggle from **Manual-First** to **AI-First**. -2. Choose a run profile and confirm the visible budget chips. +1. Save every authorized origin in **11 Scope**, then switch the top shell toggle from **Manual-First** to **AI-First**. +2. Choose **Browser Assessment** for live exploration and bounded verification, then confirm the visible budget chips. 3. Enter a goal that includes the target, such as `hairetsu.com` or `https://staging.example.com`. 4. Click **Start Run**. If the origin is outside saved Scope, Radar only proposes it in **11 Scope** and does not start the run. 5. For a proposed origin, review the Scope editor, click **Commit**, then click **Start Run** again. -6. Watch the Mission Graph, Capability Leases, and observation console until the agent returns `finish` or pauses on a failed step, policy block, operator question, or lease proposal. +6. Watch the managed Chrome window, HTTP(S) captures, Mission Graph, Capability Leases, and observation console until the agent returns `finish` or pauses on a failed step, policy block, operator question, or lease proposal. 7. For a lease proposal, review the exact tuple and caps. Click **Grant** or **Deny**. Grant does not resume the run; click **Resume** separately to attempt the saved pending call once. 8. To steer the plan or authority yourself, click **Pause**, wait for the current tool to settle, then edit the Mission Graph or propose/grant/revoke bounded capability leases. Click **Resume** when both are ready; the same cumulative budgets continue from the saved checkpoint. 9. Use the offered recovery buttons for a paused failed step. Retry is available only when Radar can safely re-execute the tool without repeating a mutating browser, authentication-state, replay, or workflow action. diff --git a/docs/screens/radar-01-traffic.png b/docs/screens/radar-01-traffic.png index 6057c72..16ed505 100644 Binary files a/docs/screens/radar-01-traffic.png and b/docs/screens/radar-01-traffic.png differ diff --git a/docs/screens/radar-02-repeater.png b/docs/screens/radar-02-repeater.png index 2c44503..e4bb0e9 100644 Binary files a/docs/screens/radar-02-repeater.png and b/docs/screens/radar-02-repeater.png differ diff --git a/docs/screens/radar-03-scope.png b/docs/screens/radar-03-scope.png index 5607ea8..aa51c7a 100644 Binary files a/docs/screens/radar-03-scope.png and b/docs/screens/radar-03-scope.png differ diff --git a/docs/screens/radar-04-ssl.png b/docs/screens/radar-04-ssl.png index aead875..e610980 100644 Binary files a/docs/screens/radar-04-ssl.png and b/docs/screens/radar-04-ssl.png differ diff --git a/docs/screens/radar-05-ai-palette.png b/docs/screens/radar-05-ai-palette.png index a30369a..7975336 100644 Binary files a/docs/screens/radar-05-ai-palette.png and b/docs/screens/radar-05-ai-palette.png differ diff --git a/docs/screens/radar-06-request-menu.png b/docs/screens/radar-06-request-menu.png index f4946bb..1ccefa2 100644 Binary files a/docs/screens/radar-06-request-menu.png and b/docs/screens/radar-06-request-menu.png differ diff --git a/docs/screens/radar-07-automate.png b/docs/screens/radar-07-automate.png index 763970a..435e44e 100644 Binary files a/docs/screens/radar-07-automate.png and b/docs/screens/radar-07-automate.png differ diff --git a/docs/screens/radar-08-workflows.png b/docs/screens/radar-08-workflows.png index 670c108..8a7a83b 100644 Binary files a/docs/screens/radar-08-workflows.png and b/docs/screens/radar-08-workflows.png differ diff --git a/docs/screens/radar-09-advanced.png b/docs/screens/radar-09-advanced.png index 86951a9..24e27cd 100644 Binary files a/docs/screens/radar-09-advanced.png and b/docs/screens/radar-09-advanced.png differ diff --git a/electron/agent/planner.ts b/electron/agent/planner.ts index eb5019f..3f82cd8 100644 --- a/electron/agent/planner.ts +++ b/electron/agent/planner.ts @@ -30,6 +30,8 @@ When operator input is required, add an operator-question update. Radar will pau The capabilities field is the durable authority ledger. Browser navigation, auth-state mutation, form interaction, replay, and active workflows require a granted lease matching one exact origin/method/path/identity tuple. If no grant matches, include a minimal leaseRequest for the selected tool; this only creates a review draft and Radar pauses before execution. Never request destructive or DELETE authority. Do not repeat getCaptures just to reread the same capturedTraffic. Use getCaptures only when you need a fresh sample after navigation, clicking, form submission, or replay. If page/DOM tools fail because the Chrome debugging endpoint is unavailable, choose openBrowser with browserState.url or startUrl to reopen the controlled browser, then continue. +The managed Chrome surface is Playwright-backed. Use getDomSummary first for its accessibility snapshot, then getClickableElements for stable selectors. Re-inspect after each click, fill, submission, or navigation because selectors are page-specific. Prefer clickElement for links and ordinary controls, and submitForm for form submission. +After browser actions, use waitForNetworkIdle and then getCaptures so the next decision is grounded in the traffic caused by the visible action. For queued intercept traffic, use getInterceptQueue to inspect and prepareInterceptEdit to load visible draft edits. Never forward or drop intercepted traffic; those actions are operator-confirmed. For payload variation, use getAutomateContext and prepareAutomateDraft to load visible Automate controls. Never start, pause, stop, or retry an Automate run from AI-First. Use prepareReplayTab and prepareWorkflowDraft to create visible drafts for operator review. Do not run or save prepared work unless a policy and profile explicitly allow the execution tool. @@ -224,6 +226,7 @@ function compactToolResult(result: AgentDecisionContext["timeline"][number]["too data: { ...result.data, text: clip(result.data.text, 1600), + ariaSnapshot: clip(result.data.ariaSnapshot, 3000), links: result.data.links.slice(0, 30), buttons: result.data.buttons.slice(0, 30), forms: result.data.forms.slice(0, 10) diff --git a/electron/agent/runtime.ts b/electron/agent/runtime.ts index 317c81b..d88f7bc 100644 --- a/electron/agent/runtime.ts +++ b/electron/agent/runtime.ts @@ -114,6 +114,7 @@ type AgentRuntimeDeps = { url: string; title: string; text: string; + ariaSnapshot: string; links: Array<{ text: string; href: string }>; buttons: string[]; forms: Array<{ action: string; method: string; inputs: string[] }>; diff --git a/electron/agent/tools.test.ts b/electron/agent/tools.test.ts index d9e6e56..9396ebd 100644 --- a/electron/agent/tools.test.ts +++ b/electron/agent/tools.test.ts @@ -162,5 +162,8 @@ describe("agent tools", () => { expect(() => normalizeAgentToolCall({ tool: "openBrowser", input: { url: "hairetsu.com" } })).toThrow( "explicit http(s) URL" ); + expect(() => normalizeAgentToolCall({ tool: "clickElement", input: { selector: " " } })).toThrow( + "selector from getClickableElements" + ); }); }); diff --git a/electron/agent/tools.ts b/electron/agent/tools.ts index e79c0a9..ba18d70 100644 --- a/electron/agent/tools.ts +++ b/electron/agent/tools.ts @@ -50,13 +50,13 @@ export const AGENT_TOOL_REGISTRY: AgentToolDefinition[] = [ }, { name: "getDomSummary", - description: "Read compact links, buttons, forms, and text from the active page.", + description: "Read a Playwright accessibility snapshot plus compact links, buttons, forms, and text from the active page.", safety: "observe", schema: {} }, { name: "getClickableElements", - description: "List clickable page elements with selectors that can be used by clickElement.", + description: "List visible page controls with stable page-specific Playwright selectors for clickElement, fillInput, or submitForm.", safety: "observe", schema: {} }, @@ -344,6 +344,14 @@ function assertUrl(value: unknown) { return url; } +function assertSelector(value: unknown) { + const selector = String(value || "").trim().slice(0, 500); + if (!selector) { + throw new Error("Agent browser tools require a selector from getClickableElements."); + } + return selector; +} + export function toolSchemas() { return Object.fromEntries( AGENT_TOOL_REGISTRY.map((tool) => [ @@ -453,9 +461,9 @@ export function normalizeAgentToolCall(call: AgentToolCall): AgentToolCall { }; case "clickElement": case "submitForm": - return { tool: call.tool, input: { selector: String(input.selector || "").trim() } }; + return { tool: call.tool, input: { selector: assertSelector(input.selector) } }; case "fillInput": - return { tool: call.tool, input: { selector: String(input.selector || "").trim(), value: String(input.value || "") } }; + return { tool: call.tool, input: { selector: assertSelector(input.selector), value: String(input.value || "") } }; case "saveAuthState": case "loadAuthState": return { tool: call.tool, input: { name: String(input.name || "").trim().slice(0, 80) } }; diff --git a/electron/main.ts b/electron/main.ts index df0f1e4..05c2ed6 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -157,6 +157,7 @@ import { import { AgentRuntime } from "./agent/runtime.js"; import { createAiAgentPlanner } from "./agent/planner.js"; import { findCdpEndpointForUrl, type CdpListEntry } from "./chromeDebugging.js"; +import { createPlaywrightBrowserController } from "./playwrightBrowser.js"; import { findSystemBrowser } from "./systemBrowser.js"; import { ensureRadarKeychainInSearchList, trustProxyCa } from "./trustCa.js"; @@ -242,6 +243,20 @@ let browserState: BrowserState = { loading: false, engine: "none" }; +const playwrightBrowser = createPlaywrightBrowserController({ + allowlist: () => allowlist.slice(), + onStateChange: (automation) => { + browserState = { + ...browserState, + url: automation.url || browserState.url, + title: automation.title || browserState.title, + loading: automation.loading, + automation: automation.status, + automationPageCount: automation.pageCount, + automationError: automation.error + }; + } +}); let proxyState: ProxyState = { running: false, port: defaultProxyPort, @@ -1038,6 +1053,10 @@ function webSocketEventMap() { } async function waitForNetworkIdle({ idleMs = 700, timeoutMs = 8000 }: { idleMs?: number; timeoutMs?: number }) { + if (browserState.engine === "chrome" && browserState.remoteDebuggingUrl) { + const automation = await ensurePlaywrightBrowser(); + return automation.waitForNetworkIdle({ idleMs, timeoutMs }); + } const started = Date.now(); let observedChangeAt = lastCaptureChangeAt; while (Date.now() - started < timeoutMs) { @@ -1462,7 +1481,19 @@ async function evaluateChromePage(expression: string) { return result.result?.value; } +async function ensurePlaywrightBrowser() { + const endpoint = browserState.remoteDebuggingUrl; + if (!endpoint) { + throw new Error("No Chrome debugging endpoint is available for Playwright automation."); + } + await playwrightBrowser.connect(endpoint); + return playwrightBrowser; +} + async function getPageText() { + if (browserState.engine === "chrome") { + return (await ensurePlaywrightBrowser()).getPageText(); + } const expression = `(() => ({ url: location.href, title: document.title, @@ -1477,6 +1508,9 @@ async function getPageText() { } async function getDomSummary() { + if (browserState.engine === "chrome") { + return (await ensurePlaywrightBrowser()).getDomSummary(); + } const expression = `(() => ({ url: location.href, title: document.title, @@ -1508,6 +1542,7 @@ async function getDomSummary() { url: result.url || "", title: result.title || "", text: trimAgentText(result.text, 6000), + ariaSnapshot: "", links: Array.isArray(result.links) ? result.links : [], buttons: Array.isArray(result.buttons) ? result.buttons : [], forms: Array.isArray(result.forms) ? result.forms : [] @@ -1515,6 +1550,9 @@ async function getDomSummary() { } async function getClickableElements() { + if (browserState.engine === "chrome") { + return (await ensurePlaywrightBrowser()).getClickableElements(); + } const expression = `(() => { const cssPath = (node) => { if (!node || node.nodeType !== Node.ELEMENT_NODE) return ""; @@ -1554,6 +1592,9 @@ async function getClickableElements() { } async function clickElement({ selector }: { selector: string }) { + if (browserState.engine === "chrome") { + return (await ensurePlaywrightBrowser()).clickElement({ selector }); + } const expression = `(() => { const selector = ${JSON.stringify(selector)}; const node = document.querySelector(selector); @@ -1572,6 +1613,9 @@ async function clickElement({ selector }: { selector: string }) { } async function fillInput({ selector, value }: { selector: string; value: string }) { + if (browserState.engine === "chrome") { + return (await ensurePlaywrightBrowser()).fillInput({ selector, value }); + } const expression = `(() => { const selector = ${JSON.stringify(selector)}; const value = ${JSON.stringify(value)}; @@ -1600,6 +1644,9 @@ async function fillInput({ selector, value }: { selector: string; value: string } async function submitForm({ selector }: { selector: string }) { + if (browserState.engine === "chrome") { + return (await ensurePlaywrightBrowser()).submitForm({ selector }); + } const expression = `(() => { const selector = ${JSON.stringify(selector)}; const node = document.querySelector(selector); @@ -1633,6 +1680,9 @@ function normalizeCookie(cookie: Record): AgentCookie { } async function getCookies() { + if (browserState.engine === "chrome") { + return (await ensurePlaywrightBrowser()).getCookies(); + } const result = (await withCdpPage((sendCommand) => sendCommand("Network.getAllCookies"))) as { cookies?: Array>; }; @@ -1640,6 +1690,9 @@ async function getCookies() { } async function getStorageState(): Promise { + if (browserState.engine === "chrome") { + return (await ensurePlaywrightBrowser()).getStorageState(); + } const page = await getPageText(); const expression = `(() => ({ localStorage: Object.fromEntries(Object.entries(localStorage)), @@ -2037,7 +2090,7 @@ function createAgentRuntime() { }, navigateBrowser: (url) => { activeNavigationId = `nav_${randomUUID()}`; - return openRealChrome(url); + return navigateRealChrome(url); }, getCaptures: () => listHttpCaptures(400), getWebSocketEvents: () => listWebSocketEvents(HOT_WEBSOCKET_LIMIT), @@ -2261,7 +2314,16 @@ app.on("certificate-error", (event, _contents, url, error, certificate, callback function currentBrowserState(): BrowserState { if (browserState.engine === "chrome" && browserState.open) { - return browserState; + const automation = playwrightBrowser.state(); + return { + ...browserState, + url: automation.url || browserState.url, + title: automation.title || browserState.title, + loading: automation.loading, + automation: automation.status, + automationPageCount: automation.pageCount, + automationError: automation.error + }; } if (!targetBrowserWindow || targetBrowserWindow.isDestroyed()) { @@ -2301,6 +2363,7 @@ function chromeProfileDir() { function stopChromeProcess() { stopChromeObserver(); + playwrightBrowser.reset(); if (!chromeProcess || chromeProcess.killed) { chromeProcess = null; return; @@ -2407,6 +2470,8 @@ async function openRealChrome(urlString: string) { title: browser.channel, loading: false, engine: "chrome", + automation: "connecting", + automationPageCount: 0, remoteDebuggingUrl, profileDir, executablePath: browser.executablePath, @@ -2416,7 +2481,8 @@ async function openRealChrome(urlString: string) { try { await waitForChromeDebugger(remoteDebuggingUrl, 8000); await startChromeObserver(remoteDebuggingUrl); - await chromeObserverSendCommand("Page.reload", { ignoreCache: false }); + await playwrightBrowser.connect(remoteDebuggingUrl); + await playwrightBrowser.reload(); } catch (error) { const recoveredDebuggingUrl = await findCdpEndpointForUrl({ requestedUrl: nextUrl, @@ -2430,7 +2496,8 @@ async function openRealChrome(urlString: string) { remoteDebuggingUrl: recoveredDebuggingUrl }; await startChromeObserver(recoveredDebuggingUrl); - await chromeObserverSendCommand("Page.reload", { ignoreCache: false }); + await playwrightBrowser.connect(recoveredDebuggingUrl); + await playwrightBrowser.reload(); console.warn( `[radar] Chrome reused an existing debugging endpoint at ${recoveredDebuggingUrl}: ${ error instanceof Error ? error.message : "unknown error" @@ -2448,6 +2515,16 @@ async function openRealChrome(urlString: string) { return browserState; } +async function navigateRealChrome(urlString: string) { + const nextUrl = normalizeBrowserUrl(urlString); + if (!browserState.open || browserState.engine !== "chrome" || !browserState.remoteDebuggingUrl) { + return openRealChrome(nextUrl); + } + const automation = await ensurePlaywrightBrowser(); + await automation.navigate(nextUrl); + return syncBrowserState(); +} + async function ensureProxyCa() { const caDir = path.join(app.getPath("userData"), "proxy-ca"); const caCertPath = path.join(caDir, "radar-ca.pem"); @@ -3624,24 +3701,36 @@ ipcMain.handle("browser:open", (_event, url) => { }); ipcMain.handle("browser:navigate", (_event, url) => { - return openRealChrome(url); + return navigateRealChrome(url); }); -ipcMain.handle("browser:back", () => { +ipcMain.handle("browser:back", async () => { + if (browserState.engine === "chrome" && browserState.remoteDebuggingUrl) { + await (await ensurePlaywrightBrowser()).back(); + return syncBrowserState(); + } if (targetBrowserWindow && !targetBrowserWindow.isDestroyed() && targetBrowserWindow.webContents.canGoBack()) { targetBrowserWindow.webContents.goBack(); } return syncBrowserState(); }); -ipcMain.handle("browser:forward", () => { +ipcMain.handle("browser:forward", async () => { + if (browserState.engine === "chrome" && browserState.remoteDebuggingUrl) { + await (await ensurePlaywrightBrowser()).forward(); + return syncBrowserState(); + } if (targetBrowserWindow && !targetBrowserWindow.isDestroyed() && targetBrowserWindow.webContents.canGoForward()) { targetBrowserWindow.webContents.goForward(); } return syncBrowserState(); }); -ipcMain.handle("browser:reload", () => { +ipcMain.handle("browser:reload", async () => { + if (browserState.engine === "chrome" && browserState.remoteDebuggingUrl) { + await (await ensurePlaywrightBrowser()).reload(); + return syncBrowserState(); + } if (targetBrowserWindow && !targetBrowserWindow.isDestroyed()) { targetBrowserWindow.webContents.reload(); } diff --git a/electron/playwrightBrowser.test.ts b/electron/playwrightBrowser.test.ts new file mode 100644 index 0000000..356d781 --- /dev/null +++ b/electron/playwrightBrowser.test.ts @@ -0,0 +1,26 @@ +import { describe, expect, it } from "vitest"; +import { + automationSelectorForRef, + isAutomationRequestAllowed, + normalizeAutomationSelector +} from "./playwrightBrowser.js"; + +describe("playwright browser helpers", () => { + it("allows non-network resources and saved-scope network requests", () => { + const allowlist = ["https://allowed.test", "http://localhost:*"]; + + expect(isAutomationRequestAllowed("data:text/plain,radar", allowlist)).toBe(true); + expect(isAutomationRequestAllowed("https://allowed.test/account", allowlist)).toBe(true); + expect(isAutomationRequestAllowed("http://localhost:4310/api", allowlist)).toBe(true); + }); + + it("fails closed for an out-of-scope request emitted by a browser action", () => { + expect(isAutomationRequestAllowed("https://blocked.test/collect", ["https://allowed.test"])).toBe(false); + }); + + it("builds bounded stable element selectors and rejects empty selectors", () => { + expect(automationSelectorForRef("pw-17