@matware/e2e-runner 1.3.0: Learning Feedback Loop, Multi-Pool & 8 New Action Types
Our most ambitious release yet. A learning system that feeds back into test creation, intelligent routing across multiple Chrome pools, declarative GraphQL, and a complete Claude Code plugin.


Version 1.3.0 of @matware/e2e-runner represents the most significant leap since the initial launch. With 20 commits, over 17,000 lines of code added, and a fundamental redesign of how the system learns from its own executions, this release transforms e2e-runner from a test runner into an intelligent testing assistant.
Multi-Pool & Distributed Infrastructure
The first major area of improvements targets enterprise scenarios where a single Chrome pool isn’t enough.
Least-Pressure Routing
You can now configure multiple Chrome endpoints (browserless/chrome, chrome-headless-shell, or any CDP-compatible) and the system automatically routes each test to the pool with the lowest load:
{
"pools": [
{ "url": "ws://chrome-1:3000", "maxConcurrency": 10 },
{ "url": "ws://chrome-2:3000", "maxConcurrency": 10 },
{ "url": "ws://chrome-3:3000", "maxConcurrency": 5 }
],
"routing": "least-pressure"
}
The balancer considers both active connections and recent response times, distributing load optimally.
Watch Mode
For iterative development, the new watch mode automatically re-runs tests when it detects file changes:
npx @matware/e2e-runner run --watch
Combine this with the dashboard for instant feedback while developing tests.
Hub/Agent Architecture
For teams needing geographically distributed testing, we introduce a hub/agent architecture. A central hub coordinates multiple remote agents, each with its own Chrome pool. Results are consolidated in real-time on the central dashboard.
8 New Action Types
The vocabulary of actions available in your JSON tests has grown significantly.
Declarative GraphQL
The new gql action type eliminates the need to wrap GraphQL calls in giant evaluate blocks:
{
"action": "gql",
"endpoint": "/graphql",
"query": "query GetUser($id: ID!) { user(id: $id) { name email } }",
"variables": { "id": "123" },
"assert": {
"user.name": { "exists": true },
"user.email": { "contains": "@" }
}
}
Assertions are evaluated inline against the response, with JSON paths to navigate nested structures.
Storage Actions
Manipulate and verify localStorage/sessionStorage directly:
{ "action": "set_storage", "key": "auth_token", "value": "test-token-123" },
{ "action": "assert_storage", "key": "auth_token", "exists": true }
Ideal for tests that need to simulate authentication states or user preferences.
Complex UI Interactions
Three new action types for interactions that previously required fragile selectors:
- click_icon: Click icons by semantic name (search, menu, close)
- click_menu_item: Navigate dropdown menus by item text
- click_in_context: Click relative to a container element
{ "action": "click_icon", "icon": "settings", "near": ".user-profile" },
{ "action": "click_menu_item", "menu": ".dropdown", "item": "Log out" }
Wait Network Idle
For SPAs with complex async loading, wait_network_idle waits until there are no pending requests for a configurable period:
{ "action": "wait_network_idle", "timeout": 5000, "idleTime": 500 }
Learning Feedback Loop
This is the star of the release, and it deserves a detailed explanation.
Until now, execution data flowed in one direction: run tests, store results, display in dashboard. The system accumulated knowledge but didn’t actively use it.
With 1.3.0, the system learns and feeds back at two critical moments:
When Creating Tests
When you create a new test (manually or via MCP), the system queries its learnings database and warns you about:
- Selectors that have been historically unstable
- Stable selectors with high success rates
- Pages with problematic load times
- Frequent errors in similar tests
When Running Tests
When a test fails, the system doesn’t just report the error — it suggests concrete fixes based on observed patterns:
- Alternative selectors that worked in similar contexts
- Additional waits for elements with known async loading
- Retry configurations for intermittent endpoints
Intelligent Validation
The system detects anti-patterns before they cause problems:
// This evaluate ALWAYS passes - the system detects it
{
"action": "evaluate",
"script": "return `Requests: ${hasRequests}`"
}
It generates a warning: “This test will always pass because it returns a truthy string regardless of the value of hasRequests”.
It also detects:
- Implicit dependencies between tests
- Waits with fixed numeric values (anti-pattern vs. wait for selector)
- Assertions that can never fail
Complete Claude Code Plugin
The MCP plugin was completely redesigned with three specialized agents:
test-creator
Generates tests from natural language descriptions, querying learnings to avoid problematic selectors from the start.
test-analyzer
Analyzes existing tests, identifies fragilities, and suggests improvements based on execution history.
test-improver
Takes frequently failing tests and refactors them applying the project’s successful patterns.
All three agents use skills with on-demand references — context is loaded only when needed, avoiding overloading the LLM’s context window.
Compatible with Claude Code and OpenCode.
Installation
Updating is straightforward:
npm install @matware/e2e-runner@1.3.0
For the Claude Code plugin:
claude plugin install @anthropic/claude-code-marketplace/fastslack/e2e-runner
If you’re coming from an earlier version, existing learnings are automatically migrated to the new schema.
Conclusion
Version 1.3.0 represents a fundamental evolution in how we think about automated testing. It’s not just about running tests and reporting results — it’s about building a system that learns from every execution and uses that knowledge to make tests more robust, more maintainable, and easier to create.
The complete code is available on GitHub. Issues, PRs, and feedback are welcome.