- Rebuild both runners after the memory protection changes
- PG database with a task run that has large datasets (see seeding below)
- Task Manager / Resource Monitor open to watch
WebView2process memory
| Data source | Table | Target row count | Estimated size |
|---|---|---|---|
| Process session output | process_session_output |
240K rows | ~48MB |
| Task run events | task_run_events |
8K+ rows | ~5MB |
| API requests | task_run_api_requests |
4K+ rows | ~22MB (large bodies) |
| MCP calls | task_run_mcp_calls |
1K+ rows | ~3MB |
| Playwright results | task_run_playwright_results |
500+ rows | ~2MB |
| AWAS steps | task_run_awas_steps |
500+ rows | ~1MB |
| Output chunks | task_run_output_chunks |
4K+ rows | ~22MB |
If the existing database doesn't have enough rows for a stress test, seed with:
-- Pick a task_run_id that already exists
-- Example: seed 10K API request rows for a task run
INSERT INTO task_run_api_requests (id, task_run_id, step_id, method, url, resolved_url, status_code, response_time_ms, response_body_type, success, created_at)
SELECT
gen_random_uuid()::text,
'YOUR_TASK_RUN_ID',
'step-' || i,
CASE WHEN i % 3 = 0 THEN 'POST' ELSE 'GET' END,
'https://api.example.com/endpoint/' || i,
'https://api.example.com/endpoint/' || i,
CASE WHEN i % 10 = 0 THEN 500 ELSE 200 END,
(random() * 2000)::int,
'json',
i % 10 != 0,
NOW() - (10000 - i) * interval '1 second'
FROM generate_series(1, 10000) AS i;
-- Seed 10K events
INSERT INTO task_run_events (task_run_id, event_type, message, timestamp)
SELECT
'YOUR_TASK_RUN_ID',
CASE WHEN i % 3 = 0 THEN 'action' WHEN i % 3 = 1 THEN 'ai_output' ELSE 'general' END,
'Event message ' || i || ' - ' || repeat('x', 200),
NOW() - (10000 - i) * interval '1 second'
FROM generate_series(1, 10000) AS i;
-- Seed 5K MCP calls
INSERT INTO task_run_mcp_calls (id, task_run_id, step_id, server_id, server_name, tool_name, response_type, duration_ms, success, created_at)
SELECT
gen_random_uuid()::text,
'YOUR_TASK_RUN_ID',
'step-' || i,
'server-1',
'test-server',
'tool_' || (i % 20),
'json',
(random() * 5000)::int,
i % 8 != 0,
NOW() - (5000 - i) * interval '1 second'
FROM generate_series(1, 5000) AS i;- Open Task Manager, note WebView2 process memory
- Expected idle: 100-200MB
- Go to Processes page
- Click on a process with extensive output
- PASS criteria:
- Page loads without "Out of Memory" error
- WebView2 memory stays under 500MB
- Scrolling is smooth (no jank)
- "Scroll to bottom" button works
- Search filtering works
- Output updates in real-time
- Go to AI Data Viewer tab
- Select a completed task run with 8K+ events
- Click "Events" section
- PASS criteria:
- Initial load shows first page (200 events)
- "Show more" button appears with count of remaining
- Clicking "Show more" loads next page without freezing
- Filter by event type works and resets pagination
- Memory stays under 400MB
- In AI Data Viewer, click "API Requests" section
- PASS criteria:
- Initial load shows first 50 requests
- "Show more" loads next 50
- Expanding a request shows details (headers, body, response)
- No memory spike when expanding rows with large response bodies
- Memory stays under 400MB
- In AI Data Viewer, click "MCP Calls" section
- PASS criteria:
- Initial load shows first 50 calls
- "Show more" works
- Expanding calls shows arguments and response
- Memory stays under 300MB
- Go to Reflection Dashboard, click "Pipeline" tab
- PASS criteria:
- Shows "50 of N" count
- "Load more" button works
- Virtualized scrolling is smooth
- Go to Active page during a running task
- PASS criteria:
- Output preview renders without freezing
- "Load more" button works
- Memory stays under 300MB
- Open multiple tabs simultaneously:
- Process output viewer with large logs
- Task run events (8K+)
- API requests (4K+)
- PASS criteria:
- WebView2 memory stays under 800MB total
- No "Out of Memory" crash
- All pages remain responsive
If OOM occurs:
- Check which page/component triggered it
- Open DevTools (F12) → Memory → Take heap snapshot
- Look for large arrays (>10K elements) in retained objects
- Check Network tab for large IPC payloads (>5MB)
- Verify the
limitparam is being sent in the invoke call
| Test | WebView2 RAM (MB) | Load time (s) | Scroll FPS | OOM? |
|---|---|---|---|---|
| Test 1: Process output | ||||
| Test 2: Events | ||||
| Test 3: API requests | ||||
| Test 4: MCP calls | ||||
| Test 5: Pipeline events | ||||
| Test 6: Task output | ||||
| Test 7: Concurrent |