@reticlehq/server 2.6.0 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -5
- package/SKILL.md +251 -33
- package/dist/bridge/bridge.d.ts +6 -1
- package/dist/bridge/bridge.js +27 -4
- package/dist/capsule/causal-summary.d.ts +20 -0
- package/dist/capsule/causal-summary.js +31 -6
- package/dist/capsule/divergence.js +7 -1
- package/dist/cli/chromium-hint.d.ts +68 -0
- package/dist/cli/chromium-hint.js +145 -0
- package/dist/cli/cli-doctor.js +31 -36
- package/dist/cli/cli-kill.d.ts +58 -0
- package/dist/cli/cli-kill.js +162 -0
- package/dist/cli/cli-launch.d.ts +18 -0
- package/dist/cli/cli-launch.js +32 -1
- package/dist/cli/cli-parse.d.ts +16 -1
- package/dist/cli/cli-parse.js +32 -9
- package/dist/cli/cli-port.d.ts +8 -0
- package/dist/cli/cli-port.js +36 -1
- package/dist/cli/cli-verify.js +2 -2
- package/dist/cli/doctor-daemon-line.js +10 -1
- package/dist/cli/doctor-sessions-line.d.ts +12 -0
- package/dist/cli/doctor-sessions-line.js +66 -0
- package/dist/cli/port-holder.d.ts +10 -0
- package/dist/cli/port-holder.js +26 -2
- package/dist/cli.js +139 -23
- package/dist/crawl/crawl-tools.js +12 -2
- package/dist/crawl/crawl.d.ts +13 -0
- package/dist/crawl/crawl.js +50 -2
- package/dist/daemon/daemon-resilience.js +2 -2
- package/dist/daemon/loopback-alias.d.ts +32 -0
- package/dist/daemon/loopback-alias.js +80 -0
- package/dist/events/contradictions.d.ts +14 -0
- package/dist/events/contradictions.js +26 -17
- package/dist/events/predicate-eval.d.ts +26 -3
- package/dist/events/predicate-eval.js +284 -95
- package/dist/events/predicate-parse.d.ts +1 -1
- package/dist/events/predicate-parse.js +18 -4
- package/dist/events/predicate.js +170 -18
- package/dist/events/ring-buffer.d.ts +8 -0
- package/dist/events/ring-buffer.js +34 -1
- package/dist/flows/flow-classify.js +1 -1
- package/dist/flows/flow-tools.js +12 -4
- package/dist/flows/heal-run.js +1 -1
- package/dist/honesty/blind-spots.js +6 -2
- package/dist/honesty/honesty.d.ts +11 -0
- package/dist/honesty/honesty.js +9 -1
- package/dist/honesty/unsettled.d.ts +40 -0
- package/dist/honesty/unsettled.js +78 -0
- package/dist/honesty/verified.d.ts +7 -0
- package/dist/honesty/verified.js +27 -4
- package/dist/http-server.js +11 -1
- package/dist/index.js +29 -2
- package/dist/init/agent-rules.d.ts +16 -0
- package/dist/init/agent-rules.js +96 -17
- package/dist/init/astro-patch.d.ts +2 -1
- package/dist/init/astro-patch.js +11 -5
- package/dist/init/capabilities.d.ts +22 -0
- package/dist/init/capabilities.js +76 -0
- package/dist/init/confirm.d.ts +96 -0
- package/dist/init/confirm.js +138 -0
- package/dist/init/cra.js +3 -2
- package/dist/init/detect.d.ts +8 -0
- package/dist/init/detect.js +15 -0
- package/dist/init/non-js-project.d.ts +27 -0
- package/dist/init/non-js-project.js +84 -0
- package/dist/init/plan-framework.d.ts +9 -0
- package/dist/init/plan-framework.js +72 -16
- package/dist/init/plan.d.ts +40 -4
- package/dist/init/plan.js +183 -43
- package/dist/init/run.d.ts +24 -2
- package/dist/init/run.js +181 -46
- package/dist/init/slash-command.d.ts +1 -1
- package/dist/init/slash-command.js +46 -6
- package/dist/init/snippets.d.ts +64 -5
- package/dist/init/snippets.js +220 -31
- package/dist/init/vite-config.js +29 -3
- package/dist/input/network-mock-tools.d.ts +19 -0
- package/dist/input/network-mock-tools.js +29 -4
- package/dist/license/license.js +1 -1
- package/dist/mcp/mcp-proxy.d.ts +69 -3
- package/dist/mcp/mcp-proxy.js +215 -23
- package/dist/mcp/mcp.js +58 -7
- package/dist/mcp/proxy-lifecycle.d.ts +20 -1
- package/dist/mcp/proxy-lifecycle.js +22 -1
- package/dist/pool/browser-pool.d.ts +22 -2
- package/dist/pool/browser-pool.js +44 -4
- package/dist/pool/playwright-launcher.js +10 -2
- package/dist/project/learned-routes.d.ts +24 -0
- package/dist/project/learned-routes.js +63 -0
- package/dist/project/project-store.d.ts +6 -0
- package/dist/project/project-store.js +25 -1
- package/dist/session/live-control-tools.js +39 -2
- package/dist/session/live-control.d.ts +7 -9
- package/dist/session/live-control.js +34 -1
- package/dist/session/no-session-diagnosis.d.ts +23 -4
- package/dist/session/no-session-diagnosis.js +128 -44
- package/dist/session/no-session-watch.js +12 -0
- package/dist/session/ref-provenance.d.ts +54 -0
- package/dist/session/ref-provenance.js +61 -0
- package/dist/session/review-store.d.ts +19 -0
- package/dist/session/review-store.js +34 -5
- package/dist/session/session-lease.js +1 -1
- package/dist/session/session-manager.d.ts +9 -0
- package/dist/session/session-manager.js +11 -0
- package/dist/session/session.d.ts +8 -0
- package/dist/session/session.js +12 -0
- package/dist/status-payload.d.ts +13 -1
- package/dist/status-payload.js +6 -1
- package/dist/telemetry/app-instrumented.d.ts +37 -0
- package/dist/telemetry/app-instrumented.js +54 -0
- package/dist/telemetry/automation-hint.d.ts +17 -0
- package/dist/telemetry/automation-hint.js +71 -0
- package/dist/telemetry/bug-found.d.ts +0 -20
- package/dist/telemetry/bug-found.js +38 -21
- package/dist/telemetry/cli-telemetry.js +7 -1
- package/dist/telemetry/daemon-telemetry.d.ts +4 -4
- package/dist/telemetry/daemon-telemetry.js +8 -4
- package/dist/telemetry/feedback.js +1 -1
- package/dist/telemetry/init-telemetry.js +9 -1
- package/dist/telemetry/install-source.d.ts +36 -0
- package/dist/telemetry/install-source.js +40 -0
- package/dist/telemetry/run-telemetry.js +4 -1
- package/dist/telemetry/session-metrics.d.ts +3 -3
- package/dist/telemetry/session-metrics.js +9 -4
- package/dist/telemetry/telemetry.d.ts +7 -1
- package/dist/telemetry/telemetry.js +17 -2
- package/dist/telemetry/tool-refused.d.ts +19 -0
- package/dist/telemetry/tool-refused.js +55 -0
- package/dist/telemetry/verification-of.js +72 -8
- package/dist/temp-dir.d.ts +27 -0
- package/dist/temp-dir.js +46 -0
- package/dist/tools/act-tools.js +77 -11
- package/dist/tools/assert-grade.d.ts +1 -1
- package/dist/tools/assert-grade.js +27 -5
- package/dist/tools/assert-verdict.js +25 -1
- package/dist/tools/contract-tools.js +4 -0
- package/dist/tools/dynamic-tools.js +1 -1
- package/dist/tools/error-recovery.d.ts +10 -0
- package/dist/tools/error-recovery.js +70 -5
- package/dist/tools/feedback-invite.js +1 -1
- package/dist/tools/invoke-tool.js +149 -32
- package/dist/tools/lease-tools.d.ts +29 -1
- package/dist/tools/lease-tools.js +58 -5
- package/dist/tools/navigate-result.js +1 -1
- package/dist/tools/observe-tools.js +1 -1
- package/dist/tools/observed-nothing.js +1 -1
- package/dist/tools/react-grace.d.ts +48 -0
- package/dist/tools/react-grace.js +87 -0
- package/dist/tools/read-tools.js +20 -4
- package/dist/tools/settle-in-flight.d.ts +79 -0
- package/dist/tools/settle-in-flight.js +106 -0
- package/dist/tools/snapshot-delta.d.ts +7 -0
- package/dist/tools/snapshot-delta.js +130 -6
- package/dist/tools/tool-kit.d.ts +52 -5
- package/dist/tools/tool-kit.js +55 -24
- package/dist/tools/tool-surface.js +28 -9
- package/dist/tools/tools.js +38 -4
- package/dist/visual/capture-cleanup.d.ts +16 -0
- package/dist/visual/capture-cleanup.js +39 -0
- package/dist/visual/visual-tools.d.ts +18 -0
- package/dist/visual/visual-tools.js +24 -5
- package/docs/README.md +56 -11
- package/docs/actions.mdx +87 -0
- package/docs/agent-cheatsheet.md +102 -26
- package/docs/architecture.md +46 -35
- package/docs/benchmarks.md +76 -72
- package/docs/best-practices.mdx +211 -0
- package/docs/capabilities.mdx +387 -0
- package/docs/cli/affected.mdx +51 -0
- package/docs/cli/capsules.mdx +69 -0
- package/docs/cli/cloud.mdx +127 -0
- package/docs/cli/doctor.mdx +76 -0
- package/docs/cli/drive.mdx +55 -0
- package/docs/cli/feedback.mdx +67 -0
- package/docs/cli/gate.mdx +64 -0
- package/docs/cli/help.mdx +92 -0
- package/docs/cli/hunt.mdx +57 -0
- package/docs/cli/identify.mdx +62 -0
- package/docs/cli/init.mdx +94 -0
- package/docs/cli/kill.mdx +91 -0
- package/docs/cli/license.mdx +48 -0
- package/docs/cli/mcp.mdx +61 -0
- package/docs/cli/open.mdx +68 -0
- package/docs/cli/restart.mdx +60 -0
- package/docs/cli/rollback.mdx +35 -0
- package/docs/cli/serve.mdx +62 -0
- package/docs/cli/status.mdx +64 -0
- package/docs/cli/stop.mdx +56 -0
- package/docs/cli/telemetry.mdx +57 -0
- package/docs/cli/update.mdx +52 -0
- package/docs/cli/verify.mdx +57 -0
- package/docs/cli/version.mdx +39 -0
- package/docs/cli/watch.mdx +55 -0
- package/docs/cli.mdx +219 -0
- package/docs/debugging.md +13 -9
- package/docs/deploy-checks.md +15 -11
- package/docs/desktop-apps.md +49 -40
- package/docs/desktop.mdx +188 -0
- package/docs/docs.json +363 -0
- package/docs/enterprise.md +20 -16
- package/docs/faq.mdx +88 -0
- package/docs/fixtures.md +11 -7
- package/docs/flows.md +26 -22
- package/docs/for-agents.md +71 -0
- package/docs/frameworks.mdx +199 -0
- package/docs/gate-plan.md +45 -41
- package/docs/gates.md +23 -19
- package/docs/getting-started.md +76 -65
- package/docs/human-control.md +22 -18
- package/docs/index.mdx +101 -0
- package/docs/install-agentic.mdx +215 -0
- package/docs/install-manual.mdx +194 -0
- package/docs/instrumentation.mdx +232 -0
- package/docs/integration-patterns.md +38 -34
- package/docs/local-registry.md +16 -12
- package/docs/multi-agent-testing.md +16 -12
- package/docs/packages/babel-plugin.mdx +70 -0
- package/docs/packages/browser.mdx +111 -0
- package/docs/packages/core.mdx +106 -0
- package/docs/packages/electron.mdx +87 -0
- package/docs/packages/eslint-plugin.mdx +84 -0
- package/docs/packages/next.mdx +91 -0
- package/docs/packages/react.mdx +91 -0
- package/docs/packages/server.mdx +98 -0
- package/docs/packages/tauri.mdx +63 -0
- package/docs/packages/test.mdx +108 -0
- package/docs/packages/vite-plugin.mdx +96 -0
- package/docs/packages.mdx +217 -0
- package/docs/platform-integration.md +33 -26
- package/docs/predicates.mdx +179 -0
- package/docs/quickstart.mdx +211 -0
- package/docs/recipes.mdx +242 -0
- package/docs/skill-file.mdx +105 -0
- package/docs/state-management.mdx +197 -0
- package/docs/style.css +14 -0
- package/docs/system-map.md +47 -32
- package/docs/telemetry-contract.md +101 -46
- package/docs/telemetry-events.mdx +430 -0
- package/docs/telemetry.md +63 -50
- package/docs/testing.md +10 -6
- package/docs/token-efficiency.md +30 -26
- package/docs/tools-act-and-wait.mdx +123 -0
- package/docs/tools-act-sequence.mdx +120 -0
- package/docs/tools-act.mdx +82 -0
- package/docs/tools-assert.mdx +70 -0
- package/docs/tools-console.mdx +59 -0
- package/docs/tools-inspect.mdx +85 -0
- package/docs/tools-navigate.mdx +63 -0
- package/docs/tools-network.mdx +86 -0
- package/docs/tools-observe.mdx +89 -0
- package/docs/tools-overview.mdx +157 -0
- package/docs/tools-query.mdx +82 -0
- package/docs/tools-session-and-feedback.mdx +91 -0
- package/docs/tools-sessions.mdx +65 -0
- package/docs/tools-snapshot.mdx +75 -0
- package/docs/tools-state.mdx +81 -0
- package/docs/tools-tools-and-run.mdx +125 -0
- package/docs/tools-wait-for.mdx +66 -0
- package/docs/troubleshooting.mdx +193 -0
- package/docs/usage.md +175 -153
- package/docs/vs-chrome-devtools-mcp.mdx +82 -0
- package/docs/vs-playwright-mcp.mdx +85 -0
- package/docs/vs-screenshots.mdx +96 -0
- package/docs/what-is-reticle.mdx +63 -0
- package/docs/why-reticle.mdx +107 -0
- package/package.json +2 -2
- package/docs/matrix/2.5.0/claude-code-machine.json +0 -19
- package/docs/matrix/2.5.0/codex-machine.json +0 -20
- package/docs/matrix/2.5.0/cursor-machine.json +0 -22
- package/docs/matrix/2.5.0/gemini-machine.json +0 -22
- package/docs/matrix/2.5.0/opencode-machine.json +0 -22
- package/docs/matrix/2.5.0/vscode-machine.json +0 -22
- package/docs/matrix/2.5.0/windsurf-machine.json +0 -22
- package/docs/matrix/MATRIX.md +0 -26
- package/docs/matrix/README.md +0 -59
- package/docs/mint.json +0 -61
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Reticle vs Chrome DevTools MCP
|
|
3
|
+
description: Chrome DevTools MCP is slightly cheaper per look. Reticle caught every bug it missed. Here is the trade, measured.
|
|
4
|
+
icon: chrome
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
**Short answer:** Chrome DevTools MCP is a few percent cheaper per observation. It also caught 8 of 10 bugs where Reticle caught 10. If your tool is cheap because it looks at less, the savings are not savings.
|
|
8
|
+
|
|
9
|
+
## The measurement
|
|
10
|
+
|
|
11
|
+
Same app, same bugs, same moment:
|
|
12
|
+
|
|
13
|
+
| | Reticle | Chrome DevTools MCP |
|
|
14
|
+
| ----------------------- | --------- | ------------------- |
|
|
15
|
+
| Bugs caught (of 10) | **10** | 8 |
|
|
16
|
+
| Detection accuracy | **1.00** | 0.82 |
|
|
17
|
+
| Avg tokens per look | 815 | **758** |
|
|
18
|
+
| Verification efficiency | **12.27** | 10.55 |
|
|
19
|
+
|
|
20
|
+
DevTools MCP genuinely wins the cost column. We are not going to bury that. 758 against 815 is a real 7% advantage per observation, and if you are making a very large number of trivial looks it adds up.
|
|
21
|
+
|
|
22
|
+
But cost per look is only half a metric. Verification efficiency combines both. Regressions caught per 1,000 tokens spent, gated on catching **all** of them with zero false alarms on a known-good control. On that measure Reticle leads 12.27 to 10.55.
|
|
23
|
+
|
|
24
|
+
<Card title="Why efficiency is gated on the catch rate" icon="chart-column" href="/benchmarks">
|
|
25
|
+
A tool can look cheap by not looking. The floor exists to stop that counting as a win.
|
|
26
|
+
</Card>
|
|
27
|
+
|
|
28
|
+
On a real production dashboard, one observation:
|
|
29
|
+
|
|
30
|
+
| | Snapshot | Network | Total |
|
|
31
|
+
| ------------------- | -------- | ------- | --------- |
|
|
32
|
+
| Reticle | 678 | 345 | **1,023** |
|
|
33
|
+
| Chrome DevTools MCP | 1,105 | 252 | 1,357 |
|
|
34
|
+
|
|
35
|
+
Note the flip. DevTools is cheaper on a small page and more expensive on a large one. Its snapshot is 1,105 tokens against Reticle's 678. The cost advantage does not survive contact with a real app.
|
|
36
|
+
|
|
37
|
+
## What DevTools MCP does better
|
|
38
|
+
|
|
39
|
+
- **Cheaper on simple pages**, as above.
|
|
40
|
+
- **It is Chrome's own tooling**, which means the performance and tracing surface is deep and authoritative in a way third-party instrumentation is not.
|
|
41
|
+
- **Nothing to install in your app.** No SDK, no plugin, no build-time step. If instrumenting is off the table, this matters a lot.
|
|
42
|
+
- **Real pixels.** Actual rendered frames, with everything that implies.
|
|
43
|
+
|
|
44
|
+
## The two bugs
|
|
45
|
+
|
|
46
|
+
DevTools MCP is DOM-and-network only. It can describe what a page looks like and what it requested; it cannot ask the application what it believes.
|
|
47
|
+
|
|
48
|
+
That is why the misses cluster where they do. The scenarios that separate the tools are the ones where the page is fine and the program is not. A mutation that never reached the store, a success handler that fired for the wrong reason. There is nothing in the DOM or the network log that distinguishes those from working code.
|
|
49
|
+
|
|
50
|
+
Reticle can require the app's own signal:
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{ "ref": "e5", "action": "click", "until": { "kind": "signal", "name": "deploy:created" } }
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
That predicate cannot be satisfied by a `200`, by a rendered row, or by a hopeful agent. Either the app declared success or it did not.
|
|
57
|
+
|
|
58
|
+
## The other difference: where to fix it
|
|
59
|
+
|
|
60
|
+
DevTools MCP can tell you a request failed. Reticle tells you a request failed **and** that the button which sent it lives at `src/components/Login.tsx:81`.
|
|
61
|
+
|
|
62
|
+
For a human, that is a convenience. For an agent, it is most of the value. Finding the bug is half the job, and the other half is knowing which file to open.
|
|
63
|
+
|
|
64
|
+
## They compose
|
|
65
|
+
|
|
66
|
+
Neither tool forbids the other. A reasonable setup:
|
|
67
|
+
|
|
68
|
+
- **DevTools MCP** for performance traces, deep Chrome internals, and real screenshots.
|
|
69
|
+
- **Reticle** for the verify loop: did the change work, and where do I fix it.
|
|
70
|
+
|
|
71
|
+
## Choosing
|
|
72
|
+
|
|
73
|
+
<CardGroup cols={2}>
|
|
74
|
+
<Card title="Pick Chrome DevTools MCP" icon="gauge">
|
|
75
|
+
You cannot instrument the app, you are chasing a performance or rendering problem, or you need
|
|
76
|
+
Chrome's own tracing.
|
|
77
|
+
</Card>
|
|
78
|
+
<Card title="Pick Reticle" icon="crosshairs">
|
|
79
|
+
You own the app and the failures you care about are the non-visual ones, mock data, dead
|
|
80
|
+
handlers, double submits, silent validation.
|
|
81
|
+
</Card>
|
|
82
|
+
</CardGroup>
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Reticle vs Playwright MCP: outside in, inside out
|
|
3
|
+
sidebarTitle: vs Playwright MCP
|
|
4
|
+
description: Playwright MCP drives any website from the outside. Reticle verifies an app you own from the inside. They solve different problems, and they compose.
|
|
5
|
+
icon: masks-theater
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
**Short answer:** if you need to drive a website you do not control, use Playwright MCP. If you need to prove that a change to _your_ app actually worked, use Reticle. They are not really competitors, and the best setup often runs both.
|
|
9
|
+
|
|
10
|
+
## The one-line difference
|
|
11
|
+
|
|
12
|
+
Playwright MCP drives a browser **from the outside**. Reticle runs **inside** your app.
|
|
13
|
+
|
|
14
|
+
That single architectural choice explains every difference below. An outside-in tool can go anywhere and see anything rendered. An inside-out tool needs to be installed, and in exchange it can read things that were never rendered at all. Application state, emitted signals, the exact requests that fired.
|
|
15
|
+
|
|
16
|
+
## Measured, on the same app at the same moment
|
|
17
|
+
|
|
18
|
+
| | Reticle | Playwright MCP |
|
|
19
|
+
| ----------------------- | --------- | -------------- |
|
|
20
|
+
| Bugs caught (of 10) | **10** | 9 |
|
|
21
|
+
| Detection accuracy | **1.00** | 0.91 |
|
|
22
|
+
| Avg tokens per look | **815** | 1,292 |
|
|
23
|
+
| Verification efficiency | **12.27** | 6.97 |
|
|
24
|
+
|
|
25
|
+
On a real production dashboard, observing once:
|
|
26
|
+
|
|
27
|
+
| | Snapshot | Network | Total |
|
|
28
|
+
| -------------- | -------- | ------- | --------- |
|
|
29
|
+
| Reticle | 678 | 345 | **1,023** |
|
|
30
|
+
| Playwright MCP | 1,522 | 671 | 2,193 |
|
|
31
|
+
|
|
32
|
+
Reticle is about 2.1x leaner on a large page. The gap comes from what each tool sends: Playwright MCP returns the accessibility tree, and on a complex app that tree is enormous. Reticle asks narrower questions: `mode: "interactive"` returns only controls, `count_only` returns a number.
|
|
33
|
+
|
|
34
|
+
<Card title="How these were measured" icon="chart-column" href="/benchmarks">
|
|
35
|
+
The method, the scenarios, and the control where a false positive would count against us.
|
|
36
|
+
</Card>
|
|
37
|
+
|
|
38
|
+
## What Playwright MCP does better
|
|
39
|
+
|
|
40
|
+
This is not a courtesy section. There are real cases where Playwright is the correct choice and Reticle is not.
|
|
41
|
+
|
|
42
|
+
- **Sites you do not own.** Reticle needs a dev-only SDK in the app. No SDK, no Reticle. Playwright drives anything with a URL, which is the entire point of it.
|
|
43
|
+
- **Cross-browser.** Firefox and WebKit are first-class in Playwright. Reticle's real-input and screenshot paths are Chromium-oriented.
|
|
44
|
+
- **True pixels.** A screenshot is the actual rendered frame. A font that failed to load or a compositing glitch shows up there and can be missed by structural reads.
|
|
45
|
+
- **Maturity and ecosystem.** Playwright is a large, battle-tested project with an enormous community. We are not going to pretend otherwise.
|
|
46
|
+
|
|
47
|
+
## What Reticle does that Playwright cannot
|
|
48
|
+
|
|
49
|
+
- **Assert on the app's own success signal.** When your app emits `auth:granted`, Reticle can require that exact signal. Playwright can check that a DOM element appeared, which a mock also does.
|
|
50
|
+
- **Read application state.** `stateDiffs` shows `auth` moving from `null` to a real user. A POST that returns `200` without touching state is caught here and nowhere else.
|
|
51
|
+
- **Map a DOM node to source.** `src/components/Login.tsx:81`, via the React fiber tree. Playwright can tell you the selector; it cannot tell you the file.
|
|
52
|
+
- **Grade its own evidence.** Every verdict reports `honesty.grade`: `presence`, `state` or `signal`. Plus whether the capture was clean and complete.
|
|
53
|
+
- **Say "unknown".** Reticle distinguishes "did not happen" from "I could not tell". That third state is the difference between a check and a coin flip.
|
|
54
|
+
|
|
55
|
+
## The false-green case
|
|
56
|
+
|
|
57
|
+
Here is the failure both tools face, and only one catches reliably.
|
|
58
|
+
|
|
59
|
+
Your agent adds a "save" button. It calls an API. The API returns `200`. A row appears in the table. Reload the page and the row is gone, nothing was ever persisted.
|
|
60
|
+
|
|
61
|
+
Playwright MCP sees the row appear. That is a pass by every DOM-based check you could write.
|
|
62
|
+
|
|
63
|
+
Reticle sees `stateDiffs: []`. The store never changed. And fails the assertion, with the file and line of the button that lied.
|
|
64
|
+
|
|
65
|
+
## Use both
|
|
66
|
+
|
|
67
|
+
They compose cleanly, and the combination is better than either alone:
|
|
68
|
+
|
|
69
|
+
- **Drive with Playwright** when you need a browser context it is better at. A third-party OAuth flow, a cross-browser check, a genuine pixel diff.
|
|
70
|
+
- **Assert with Reticle** when the question is "did my app actually do the thing".
|
|
71
|
+
|
|
72
|
+
Reticle also has a driven mode (`reticle drive`) that provides real CDP input and screenshots, so a lot of teams do not need both. Start with whichever matches the question you ask most often.
|
|
73
|
+
|
|
74
|
+
## Choosing
|
|
75
|
+
|
|
76
|
+
<CardGroup cols={2}>
|
|
77
|
+
<Card title="Pick Playwright MCP" icon="globe">
|
|
78
|
+
You are testing a site you do not own, you need Firefox or WebKit, or you need real pixel
|
|
79
|
+
comparison as the primary signal.
|
|
80
|
+
</Card>
|
|
81
|
+
<Card title="Pick Reticle" icon="crosshairs">
|
|
82
|
+
You own the app, an agent is editing it, and you want proof it worked rather than a screenshot
|
|
83
|
+
that looks fine.
|
|
84
|
+
</Card>
|
|
85
|
+
</CardGroup>
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Screenshots lie: why pixels cannot verify AI-generated code
|
|
3
|
+
sidebarTitle: vs screenshots
|
|
4
|
+
description: The failures that AI coding agents actually produce are invisible in a rendered frame. Here is why a better vision model does not fix that.
|
|
5
|
+
icon: image
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
**Short answer:** the information is not in the picture. Whether a request fired, what it returned, whether state changed, whether one click sent two requests. None of that is visible in a rendered frame, at any resolution, to any model.
|
|
9
|
+
|
|
10
|
+
## The four failures a screenshot approves
|
|
11
|
+
|
|
12
|
+
<CardGroup cols={2}>
|
|
13
|
+
<Card title="Mock data" icon="ghost">
|
|
14
|
+
POST returns `200`, the row appears, nothing persisted. Reload and it's gone. The screenshot
|
|
15
|
+
during the demo is perfect.
|
|
16
|
+
</Card>
|
|
17
|
+
<Card title="Dead handler" icon="plug-circle-xmark">
|
|
18
|
+
Button has an `onClick`, the `onClick` calls a function, the function was never wired to the
|
|
19
|
+
store. Looks connected all the way down.
|
|
20
|
+
</Card>
|
|
21
|
+
<Card title="Double submit" icon="clone">
|
|
22
|
+
One click, two POSTs, customer charged twice. Zero pixels differ.
|
|
23
|
+
</Card>
|
|
24
|
+
<Card title="Silent validation" icon="triangle-exclamation">
|
|
25
|
+
The form accepts `"abc"` as a quantity and sends it to your database. Renders beautifully.
|
|
26
|
+
</Card>
|
|
27
|
+
</CardGroup>
|
|
28
|
+
|
|
29
|
+
Every one of these renders as a correct-looking page. Ask a vision model whether the feature works and it will say yes, because the only evidence available says yes.
|
|
30
|
+
|
|
31
|
+
## "Just use a better model"
|
|
32
|
+
|
|
33
|
+
This is the intuition worth killing, because it sounds reasonable and costs teams months.
|
|
34
|
+
|
|
35
|
+
Model quality is not the constraint. **You cannot see a network call.** You cannot photograph a state mutation. A screenshot of a page whose bug is non-visual contains no signal about that bug, so asking a stronger model to look harder produces a more confident version of the same wrong answer.
|
|
36
|
+
|
|
37
|
+
Improving the model improves the reading of the evidence. It does not create evidence that was never captured.
|
|
38
|
+
|
|
39
|
+
## What "reading the program" means instead
|
|
40
|
+
|
|
41
|
+
Reticle runs inside the app and reads what actually happened:
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"verified": "yes",
|
|
46
|
+
"verdict": {
|
|
47
|
+
"evidence": { "method": "POST", "url": "/api/login", "status": 200, "durationMs": 67 }
|
|
48
|
+
},
|
|
49
|
+
"summary": {
|
|
50
|
+
"net": { "total": 1, "errors": 0 },
|
|
51
|
+
"consoleErrors": 0,
|
|
52
|
+
"stateDiffs": [{ "path": "auth", "from": null, "to": "{\"email\":\"admin@reticle.dev\"}" }],
|
|
53
|
+
"signals": ["auth:granted"]
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Read what that rules out. `net.total: 1` kills double-submit. `stateDiffs` kills mock data, the store genuinely changed. `signals` is the app declaring success in its own words. `consoleErrors: 0` kills "it worked but threw".
|
|
59
|
+
|
|
60
|
+
No pixel in the world carries that.
|
|
61
|
+
|
|
62
|
+
## A real one, caught on the first run
|
|
63
|
+
|
|
64
|
+
On the first drive of a real production dashboard, before any instrumentation, Reticle's network observation flagged two endpoints returning `500`. A database migration that had not been applied.
|
|
65
|
+
|
|
66
|
+
**The page rendered fine.** The sidebar loaded. Nothing looked broken. A screenshot agent would have called it done and moved on.
|
|
67
|
+
|
|
68
|
+
That is the thesis in one incident: "looks done" and "is done" are different properties, and the difference is usually non-visual.
|
|
69
|
+
|
|
70
|
+
## When a screenshot is the right tool
|
|
71
|
+
|
|
72
|
+
Screenshots are not useless. They are the correct instrument for a specific class of bug, and this page would be dishonest without saying so:
|
|
73
|
+
|
|
74
|
+
- A font that failed to load
|
|
75
|
+
- A GPU or compositing glitch
|
|
76
|
+
- Layout that breaks only at a particular viewport
|
|
77
|
+
- Anything where the actual rendered frame _is_ the thing under test
|
|
78
|
+
|
|
79
|
+
Those are real bugs and structural reads can miss them. Reticle has `reticle_screenshot` and `reticle_visual_diff` for exactly this, and if pixel regression is your primary concern, a dedicated visual tool will serve you better.
|
|
80
|
+
|
|
81
|
+
The argument is not "screenshots are bad". It is that a screenshot cannot answer "did the code work", and that is the question an AI coding agent needs answered on every change.
|
|
82
|
+
|
|
83
|
+
## The honest limits
|
|
84
|
+
|
|
85
|
+
We have not proven that Reticle makes agents _fix_ more bugs. A controlled test did not show a fix-rate improvement; the benchmark was confounded and we are still working on measuring it properly.
|
|
86
|
+
|
|
87
|
+
What is measured is detection: 10 of 10 injected regressions caught with zero false alarms, against 9 and 8 for the alternatives.
|
|
88
|
+
|
|
89
|
+
<CardGroup cols={2}>
|
|
90
|
+
<Card title="See a real verdict" icon="rocket" href="/quickstart">
|
|
91
|
+
Five minutes, and the output on that page was captured live.
|
|
92
|
+
</Card>
|
|
93
|
+
<Card title="The full benchmark" icon="chart-column" href="/benchmarks">
|
|
94
|
+
Method, raw numbers, and where Reticle comes second.
|
|
95
|
+
</Card>
|
|
96
|
+
</CardGroup>
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: What is Reticle?
|
|
3
|
+
sidebarTitle: What is Reticle
|
|
4
|
+
description: Reticle is a verification layer for AI coding agents. It runs a dev-only SDK inside your running web app so an agent can prove a change works, instead of guessing. What it is, what it is not, and what it needs.
|
|
5
|
+
icon: circle-question
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
**Reticle is a verification layer for AI coding agents.** It embeds a dev-only SDK inside your running web application and exposes what that application is actually doing, its DOM, network calls, routing, console, and framework state, as structured tools an agent can call over MCP. The agent names the consequence it expects, performs an action, and gets back a verdict: pass, fail, or an honest "couldn't tell", with the evidence and the `file:line` to open.
|
|
9
|
+
|
|
10
|
+
It exists because an agent that writes code cannot otherwise tell whether that code works. Reading the diff proves nothing. Unit tests do not run the application. A screenshot shows a page that renders perfectly over a failed request.
|
|
11
|
+
|
|
12
|
+
## How it works, in three parts
|
|
13
|
+
|
|
14
|
+
1. **An SDK inside the app.** Dev-only, stripped from production builds, added by a build plugin. It instruments the DOM, network, routing, console, animations, and your state library.
|
|
15
|
+
2. **A local bridge.** The SDK connects over a WebSocket to a daemon on your machine. Reticle never starts or manages your dev server; it attaches to the app you are already running.
|
|
16
|
+
3. **An MCP server.** The daemon exposes the app to your agent as tools. `reticle_snapshot` to look, `reticle_act_and_wait` to act and prove in one call, `reticle_state` and `reticle_network` to observe, `reticle_assert` to check.
|
|
17
|
+
|
|
18
|
+
Everything stays on your machine. No application code, DOM, network traffic, or console output leaves it.
|
|
19
|
+
|
|
20
|
+
## What Reticle is not
|
|
21
|
+
|
|
22
|
+
This is the section most people need, because Reticle sits next to several familiar categories without being any of them.
|
|
23
|
+
|
|
24
|
+
**Not a browser automation framework.** Playwright, Cypress and Selenium drive a browser from the outside and are excellent at it. Reticle runs inside the page you already have open. If you want to script a browser, use Playwright. Reticle is what an agent uses to answer "did the thing I just changed actually work?"
|
|
25
|
+
|
|
26
|
+
**Not a replacement for your test suite.** Unit and integration tests still do their job. Reticle covers the layer they structurally cannot reach: behaviour that only exists when the whole application runs. Many teams use both, and Reticle is often the thing that catches a suite passing over a broken app.
|
|
27
|
+
|
|
28
|
+
**Not a screenshot or visual regression tool.** It can take screenshots, but the point is that it does not need to. Verdicts come from predicates over real events, a request with a status, a state path, a signal your code fired, so they do not break when a button moves four pixels. If pixel-perfect visual diffing is your goal, a dedicated visual testing service fits better.
|
|
29
|
+
|
|
30
|
+
**Not a monitoring or observability product.** Reticle is a development-time tool aimed at localhost. It is not an APM, not error tracking, and it does not watch production.
|
|
31
|
+
|
|
32
|
+
**Not an accessibility auditor.** `reticle_snapshot` addresses elements by role and name, which is not the same as auditing contrast, focus order, or screen reader behaviour. Use a dedicated accessibility tool for that.
|
|
33
|
+
|
|
34
|
+
**Not an AI model, and not an agent.** Reticle has no model of its own and makes no decisions. It gives an agent you already use a way to see the running app. Your agent, your model, your keys.
|
|
35
|
+
|
|
36
|
+
**Not a hosted service that receives your application data.** The daemon runs on your machine and the SDK runs in your browser. Anonymous product analytics are sent unless you opt out, and they never include your code or your application's data. See the [Telemetry Policy](https://www.reticle.sh/legal/telemetry).
|
|
37
|
+
|
|
38
|
+
**Not a way to make a failing check pass.** A verdict of `unknown` means Reticle drove the app and could not tell. It is deliberately not rounded up to a pass, because a verification tool that flatters you is worse than none.
|
|
39
|
+
|
|
40
|
+
## What Reticle needs
|
|
41
|
+
|
|
42
|
+
Honest constraints, so you can tell in a minute whether it fits:
|
|
43
|
+
|
|
44
|
+
- **A web application you can run locally**, with its dev server. Reticle attaches; it does not start one.
|
|
45
|
+
- **A build step it can hook**, or two lines added by hand. Vite, Next.js, Remix and Astro are proven by gates in the repository. The SDK is framework agnostic and usually connects elsewhere, with reduced source mapping.
|
|
46
|
+
- **An agent that speaks MCP.** Claude Code, Cursor, Codex, Copilot, Windsurf, OpenCode and others.
|
|
47
|
+
- **Node 20 or newer.**
|
|
48
|
+
|
|
49
|
+
Electron and Tauri desktop applications are supported, including the IPC boundary a browser-based tool cannot observe at all.
|
|
50
|
+
|
|
51
|
+
## How it compares
|
|
52
|
+
|
|
53
|
+
Side by side with the tools people ask about most:
|
|
54
|
+
|
|
55
|
+
- [Reticle vs Playwright MCP](/vs-playwright-mcp)
|
|
56
|
+
- [Reticle vs Chrome DevTools MCP](/vs-chrome-devtools-mcp)
|
|
57
|
+
- [Reticle vs screenshots](/vs-screenshots)
|
|
58
|
+
|
|
59
|
+
## Where to go next
|
|
60
|
+
|
|
61
|
+
- [Quickstart](/quickstart) gets a real verdict out of your own app in about five minutes.
|
|
62
|
+
- [Why Reticle](/why-reticle) is the argument, with the evidence and the cases where it loses.
|
|
63
|
+
- [For agents](/for-agents) is written for the agent rather than for you.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Why Reticle: seeing is not believing
|
|
3
|
+
sidebarTitle: Why Reticle
|
|
4
|
+
description: AI-written code fails by looking correct. Reticle reads the running program instead of the pixels, so a silent failure stops being invisible.
|
|
5
|
+
icon: lightbulb
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Software has always had bugs. What changed is the _kind_ of bug that reaches you.
|
|
9
|
+
|
|
10
|
+
A human writing code by hand produces errors that announce themselves: a stack trace, a red screen, a test that goes red. An agent writing code produces something more dangerous: a change that looks completely correct, renders beautifully, and does nothing. The page is fine. The data never saved.
|
|
11
|
+
|
|
12
|
+
We call it a **false green**, and it is the defining failure mode of the AI-coding era.
|
|
13
|
+
|
|
14
|
+
## What a false green actually looks like
|
|
15
|
+
|
|
16
|
+
<CardGroup cols={2}>
|
|
17
|
+
<Card title="Mock data" icon="ghost">
|
|
18
|
+
The POST returns `200`. The row appears in the table. Reload the page and it's gone. Nothing was
|
|
19
|
+
ever persisted.
|
|
20
|
+
</Card>
|
|
21
|
+
<Card title="Dead handler" icon="plug-circle-xmark">
|
|
22
|
+
The button has an `onClick`. The `onClick` calls a function. The function was never wired to the
|
|
23
|
+
store. It looks connected all the way down.
|
|
24
|
+
</Card>
|
|
25
|
+
<Card title="Double submit" icon="clone">
|
|
26
|
+
One click, two POSTs. The user gets charged twice. Nothing on screen is wrong.
|
|
27
|
+
</Card>
|
|
28
|
+
<Card title="Silent validation" icon="triangle-exclamation">
|
|
29
|
+
The form accepts `"abc"` as a quantity and cheerfully sends it to your database.
|
|
30
|
+
</Card>
|
|
31
|
+
</CardGroup>
|
|
32
|
+
|
|
33
|
+
Every one of these renders as a perfectly nice page. A screenshot approves them all. So does an agent that just took the screenshot, and the agent is the one telling you it's done.
|
|
34
|
+
|
|
35
|
+
## Why looking harder doesn't fix it
|
|
36
|
+
|
|
37
|
+
The instinct is to give the agent better eyes: a screenshot, a vision model, a full accessibility tree. This does not work, for a reason that has nothing to do with model quality.
|
|
38
|
+
|
|
39
|
+
**The information is not in the picture.** Whether a request fired, what status it returned, whether application state changed, whether the console logged an error, whether one click sent one request or two, none of that is visible. You cannot see a network call. You cannot photograph a state mutation. Asking a better model to look more carefully at a screenshot of a page whose bug is non-visual is asking it to hallucinate more confidently.
|
|
40
|
+
|
|
41
|
+
Reticle takes the other route. It runs **inside** your app and reads the program: network, state, console, routing, framework internals, and the app's own success signals. The answer is not interpreted from pixels. It is read from the running program, which means it is deterministic and the same every time.
|
|
42
|
+
|
|
43
|
+
## The evidence
|
|
44
|
+
|
|
45
|
+
We built eleven scenarios: ten bugs, plus a control where nothing is wrong, so anything flagged on the control counts as a false positive. Each tool got the same app, the same moment, the same task.
|
|
46
|
+
|
|
47
|
+
| Tool | Bugs caught | Detection accuracy | Avg tokens per look | Verification efficiency |
|
|
48
|
+
| --- | --- | --- | --- | --- |
|
|
49
|
+
| **Reticle** | **10 / 10** | **1.00** | **815** | **12.27** |
|
|
50
|
+
| Playwright MCP | 9 / 10 | 0.91 | 1,292 | 6.97 |
|
|
51
|
+
| Chrome DevTools MCP | 8 / 10 | 0.82 | 758 | 10.55 |
|
|
52
|
+
|
|
53
|
+
Observing one real dashboard once, with no bug involved:
|
|
54
|
+
|
|
55
|
+
| Tool | Snapshot | Network | Observe total | Can it assert success? |
|
|
56
|
+
| --- | --- | --- | --- | --- |
|
|
57
|
+
| **Reticle** | 678 | 345 | **1,023** | Yes, via the app's own signal. 46 tokens, un-fakeable |
|
|
58
|
+
| Chrome DevTools MCP | 1,105 | 252 | 1,357 | No. DOM and network only |
|
|
59
|
+
| Playwright MCP | 1,522 | 671 | 2,193 | No. DOM and network only |
|
|
60
|
+
|
|
61
|
+
That last column is the one that matters more than the token counts. The other tools can _describe_ what a page looks like. Only Reticle can check whether the thing the app itself considers success actually happened.
|
|
62
|
+
|
|
63
|
+
<Card title="How every number was measured" icon="chart-column" href="/benchmarks">
|
|
64
|
+
The full method, the raw data, and the scenarios where Reticle comes second.
|
|
65
|
+
</Card>
|
|
66
|
+
|
|
67
|
+
## Where Reticle loses
|
|
68
|
+
|
|
69
|
+
A benchmark that only shows you the wins is an advertisement wearing a lab coat. Ours doesn't.
|
|
70
|
+
|
|
71
|
+
- **Sites you don't own.** Reticle needs a dev-only SDK inside the app. If you're driving a third party's website, use Playwright. That is what it's for, and it's excellent at it.
|
|
72
|
+
- **Pixels.** Reticle reads the program, not the screen. If your bug is "the button is three pixels too far left", Reticle is the wrong instrument.
|
|
73
|
+
- **Chrome DevTools MCP is cheaper per look.** 758 tokens against our 815. It catches fewer bugs, so the efficiency works out in our favour, but on raw cost per glance it wins.
|
|
74
|
+
|
|
75
|
+
## What we have not proven
|
|
76
|
+
|
|
77
|
+
Being honest here costs us something, and we'd rather pay it than have you find out later.
|
|
78
|
+
|
|
79
|
+
We ran a controlled test of whether an agent equipped with Reticle _fixes_ more bugs than one without it. **It did not show a fix-rate improvement.** The benchmark was confounded in ways we can point at, and we don't consider the question settled. But we are not going to claim a number we didn't measure.
|
|
80
|
+
|
|
81
|
+
What Reticle demonstrably does is catch failures that are invisible to the alternatives, and hand back the file and line to go fix. Whether that translates into a better fix rate is a separate question, and we're still working on measuring it properly.
|
|
82
|
+
|
|
83
|
+
## When you should use it
|
|
84
|
+
|
|
85
|
+
<CardGroup cols={2}>
|
|
86
|
+
<Card title="A good fit" icon="circle-check">
|
|
87
|
+
You own the app. An agent edits it. You want the agent to prove its work rather than assure you
|
|
88
|
+
of it. React gets you source pointers on top.
|
|
89
|
+
</Card>
|
|
90
|
+
<Card title="A bad fit" icon="circle-xmark">
|
|
91
|
+
You're testing a site you don't control, you need pixel-level visual regression, or your app has
|
|
92
|
+
no dev build to instrument.
|
|
93
|
+
</Card>
|
|
94
|
+
</CardGroup>
|
|
95
|
+
|
|
96
|
+
## The one-sentence version
|
|
97
|
+
|
|
98
|
+
Your agent already tells you it works. Reticle is the part that checks. And, more usefully, the part that says "I couldn't tell" instead of guessing.
|
|
99
|
+
|
|
100
|
+
<CardGroup cols={2}>
|
|
101
|
+
<Card title="Quickstart" icon="rocket" href="/quickstart">
|
|
102
|
+
Five minutes to your first real verdict.
|
|
103
|
+
</Card>
|
|
104
|
+
<Card title="Architecture" icon="sitemap" href="/architecture">
|
|
105
|
+
How it reads the program without slowing your app down.
|
|
106
|
+
</Card>
|
|
107
|
+
</CardGroup>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reticlehq/server",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.0",
|
|
4
4
|
"description": "Reticle bridge + MCP server. Hosts the browser WS endpoint and exposes MCP tools to the coding agent.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"@modelcontextprotocol/sdk": "^1.13.0",
|
|
23
23
|
"ws": "^8.18.0",
|
|
24
24
|
"zod": "^3.24.1",
|
|
25
|
-
"@reticlehq/core": "2.
|
|
25
|
+
"@reticlehq/core": "2.8.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/pngjs": "^6.0.5",
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"reticle": {
|
|
3
|
-
"version": "2.5.0",
|
|
4
|
-
"commit": "33629413"
|
|
5
|
-
},
|
|
6
|
-
"client": {
|
|
7
|
-
"id": "claude-code"
|
|
8
|
-
},
|
|
9
|
-
"host": {
|
|
10
|
-
"os": "darwin 25.5.0",
|
|
11
|
-
"node": "v22.14.0"
|
|
12
|
-
},
|
|
13
|
-
"checks": {
|
|
14
|
-
"snippet": true
|
|
15
|
-
},
|
|
16
|
-
"verdict": "runnable-unverified",
|
|
17
|
-
"by": "machine (client-compat.mjs)",
|
|
18
|
-
"note": "machine-checkable half only — nobody has run this client"
|
|
19
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"reticle": {
|
|
3
|
-
"version": "2.5.0",
|
|
4
|
-
"commit": "33629413"
|
|
5
|
-
},
|
|
6
|
-
"client": {
|
|
7
|
-
"id": "codex"
|
|
8
|
-
},
|
|
9
|
-
"host": {
|
|
10
|
-
"os": "darwin 25.5.0",
|
|
11
|
-
"node": "v22.14.0"
|
|
12
|
-
},
|
|
13
|
-
"checks": {
|
|
14
|
-
"writes": false,
|
|
15
|
-
"snippet": true
|
|
16
|
-
},
|
|
17
|
-
"verdict": "manual-snippet",
|
|
18
|
-
"by": "machine (client-compat.mjs)",
|
|
19
|
-
"note": "machine-checkable half only — nobody has run this client"
|
|
20
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"reticle": {
|
|
3
|
-
"version": "2.5.0",
|
|
4
|
-
"commit": "33629413"
|
|
5
|
-
},
|
|
6
|
-
"client": {
|
|
7
|
-
"id": "cursor"
|
|
8
|
-
},
|
|
9
|
-
"host": {
|
|
10
|
-
"os": "darwin 25.5.0",
|
|
11
|
-
"node": "v22.14.0"
|
|
12
|
-
},
|
|
13
|
-
"checks": {
|
|
14
|
-
"writes": true,
|
|
15
|
-
"parses": true,
|
|
16
|
-
"initialize": true,
|
|
17
|
-
"tools": 17
|
|
18
|
-
},
|
|
19
|
-
"verdict": "runnable-unverified",
|
|
20
|
-
"by": "machine (client-compat.mjs)",
|
|
21
|
-
"note": "machine-checkable half only — nobody has run this client"
|
|
22
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"reticle": {
|
|
3
|
-
"version": "2.5.0",
|
|
4
|
-
"commit": "33629413"
|
|
5
|
-
},
|
|
6
|
-
"client": {
|
|
7
|
-
"id": "gemini"
|
|
8
|
-
},
|
|
9
|
-
"host": {
|
|
10
|
-
"os": "darwin 25.5.0",
|
|
11
|
-
"node": "v22.14.0"
|
|
12
|
-
},
|
|
13
|
-
"checks": {
|
|
14
|
-
"writes": true,
|
|
15
|
-
"parses": true,
|
|
16
|
-
"initialize": true,
|
|
17
|
-
"tools": 17
|
|
18
|
-
},
|
|
19
|
-
"verdict": "runnable-unverified",
|
|
20
|
-
"by": "machine (client-compat.mjs)",
|
|
21
|
-
"note": "machine-checkable half only — nobody has run this client"
|
|
22
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"reticle": {
|
|
3
|
-
"version": "2.5.0",
|
|
4
|
-
"commit": "33629413"
|
|
5
|
-
},
|
|
6
|
-
"client": {
|
|
7
|
-
"id": "opencode"
|
|
8
|
-
},
|
|
9
|
-
"host": {
|
|
10
|
-
"os": "darwin 25.5.0",
|
|
11
|
-
"node": "v22.14.0"
|
|
12
|
-
},
|
|
13
|
-
"checks": {
|
|
14
|
-
"writes": true,
|
|
15
|
-
"parses": true,
|
|
16
|
-
"initialize": true,
|
|
17
|
-
"tools": 17
|
|
18
|
-
},
|
|
19
|
-
"verdict": "runnable-unverified",
|
|
20
|
-
"by": "machine (client-compat.mjs)",
|
|
21
|
-
"note": "machine-checkable half only — nobody has run this client"
|
|
22
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"reticle": {
|
|
3
|
-
"version": "2.5.0",
|
|
4
|
-
"commit": "33629413"
|
|
5
|
-
},
|
|
6
|
-
"client": {
|
|
7
|
-
"id": "vscode"
|
|
8
|
-
},
|
|
9
|
-
"host": {
|
|
10
|
-
"os": "darwin 25.5.0",
|
|
11
|
-
"node": "v22.14.0"
|
|
12
|
-
},
|
|
13
|
-
"checks": {
|
|
14
|
-
"writes": true,
|
|
15
|
-
"parses": true,
|
|
16
|
-
"initialize": true,
|
|
17
|
-
"tools": 17
|
|
18
|
-
},
|
|
19
|
-
"verdict": "runnable-unverified",
|
|
20
|
-
"by": "machine (client-compat.mjs)",
|
|
21
|
-
"note": "machine-checkable half only — nobody has run this client"
|
|
22
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"reticle": {
|
|
3
|
-
"version": "2.5.0",
|
|
4
|
-
"commit": "33629413"
|
|
5
|
-
},
|
|
6
|
-
"client": {
|
|
7
|
-
"id": "windsurf"
|
|
8
|
-
},
|
|
9
|
-
"host": {
|
|
10
|
-
"os": "darwin 25.5.0",
|
|
11
|
-
"node": "v22.14.0"
|
|
12
|
-
},
|
|
13
|
-
"checks": {
|
|
14
|
-
"writes": true,
|
|
15
|
-
"parses": true,
|
|
16
|
-
"initialize": true,
|
|
17
|
-
"tools": 17
|
|
18
|
-
},
|
|
19
|
-
"verdict": "runnable-unverified",
|
|
20
|
-
"by": "machine (client-compat.mjs)",
|
|
21
|
-
"note": "machine-checkable half only — nobody has run this client"
|
|
22
|
-
}
|
package/docs/matrix/MATRIX.md
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# Client matrix
|
|
2
|
-
|
|
3
|
-
> Which MCP clients Reticle is known to work in, and on whose machine that was measured.
|
|
4
|
-
> Generated by `node apps/e2e/matrix.mjs` — do not edit by hand.
|
|
5
|
-
|
|
6
|
-
| | meaning |
|
|
7
|
-
| --- | --- |
|
|
8
|
-
| ✅ | a human ran the real client and the tools were usable |
|
|
9
|
-
| ◐ | `init` wrote a runnable entry where the client documents it — **nobody has run that client** |
|
|
10
|
-
| ✎ | `init` will not write this format (TOML); the user pastes a block |
|
|
11
|
-
| ❌ | somebody ran it and it did not work — the most useful row here |
|
|
12
|
-
|
|
13
|
-
**◐ is not a tick.** It means the half a machine can check passed. Only ✅ means somebody saw
|
|
14
|
-
Reticle working in that client.
|
|
15
|
-
|
|
16
|
-
## 2.5.0
|
|
17
|
-
|
|
18
|
-
| client | verdict | tools | os | submitted by |
|
|
19
|
-
| --- | --- | --- | --- | --- |
|
|
20
|
-
| claude-code | ◐ runnable-unverified | — | darwin 25.5.0 | machine (client-compat.mjs) |
|
|
21
|
-
| codex | ✎ manual-snippet | — | darwin 25.5.0 | machine (client-compat.mjs) |
|
|
22
|
-
| cursor | ◐ runnable-unverified | — | darwin 25.5.0 | machine (client-compat.mjs) |
|
|
23
|
-
| gemini | ◐ runnable-unverified | — | darwin 25.5.0 | machine (client-compat.mjs) |
|
|
24
|
-
| opencode | ◐ runnable-unverified | — | darwin 25.5.0 | machine (client-compat.mjs) |
|
|
25
|
-
| vscode | ◐ runnable-unverified | — | darwin 25.5.0 | machine (client-compat.mjs) |
|
|
26
|
-
| windsurf | ◐ runnable-unverified | — | darwin 25.5.0 | machine (client-compat.mjs) |
|