@reticlehq/server 2.7.0 → 2.9.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.
Files changed (357) hide show
  1. package/README.md +14 -5
  2. package/SKILL.md +130 -778
  3. package/dist/bridge/bridge.d.ts +23 -0
  4. package/dist/bridge/bridge.js +80 -2
  5. package/dist/bridge/bridge.test-harness.d.ts +5 -0
  6. package/dist/bridge/bridge.test-harness.js +6 -4
  7. package/dist/capsule/causal-summary.d.ts +36 -1
  8. package/dist/capsule/causal-summary.js +33 -7
  9. package/dist/capsule/divergence.js +7 -1
  10. package/dist/cli/chromium-hint.d.ts +33 -5
  11. package/dist/cli/chromium-hint.js +82 -12
  12. package/dist/cli/cli-doctor.js +65 -34
  13. package/dist/cli/cli-flow-commands.js +8 -8
  14. package/dist/cli/cli-kill.d.ts +58 -0
  15. package/dist/cli/cli-kill.js +162 -0
  16. package/dist/cli/cli-parse.d.ts +16 -1
  17. package/dist/cli/cli-parse.js +32 -9
  18. package/dist/cli/cli-port.d.ts +32 -0
  19. package/dist/cli/cli-port.js +82 -35
  20. package/dist/cli/cli-verify.d.ts +21 -0
  21. package/dist/cli/cli-verify.js +47 -3
  22. package/dist/cli/config-discovery.d.ts +35 -0
  23. package/dist/cli/config-discovery.js +163 -0
  24. package/dist/cli/doctor-daemon-line.js +4 -1
  25. package/dist/cli/doctor-project-line.d.ts +37 -0
  26. package/dist/cli/doctor-project-line.js +35 -0
  27. package/dist/cli/doctor-rows.d.ts +51 -0
  28. package/dist/cli/doctor-rows.js +54 -0
  29. package/dist/cli/doctor-sessions-line.d.ts +12 -0
  30. package/dist/cli/doctor-sessions-line.js +69 -0
  31. package/dist/cli/drive-attach.d.ts +99 -0
  32. package/dist/cli/drive-attach.js +203 -0
  33. package/dist/cli/drive-command.d.ts +13 -0
  34. package/dist/cli/drive-command.js +103 -0
  35. package/dist/cli/open-note.d.ts +20 -0
  36. package/dist/cli/open-note.js +37 -0
  37. package/dist/cli/port-holder.d.ts +10 -0
  38. package/dist/cli/port-holder.js +26 -2
  39. package/dist/cli/status-next-action.d.ts +37 -0
  40. package/dist/cli/status-next-action.js +61 -0
  41. package/dist/cli.js +119 -39
  42. package/dist/crawl/crawl-tools.js +12 -2
  43. package/dist/crawl/crawl.d.ts +13 -0
  44. package/dist/crawl/crawl.js +50 -2
  45. package/dist/events/contradictions.d.ts +46 -0
  46. package/dist/events/contradictions.js +35 -22
  47. package/dist/events/declared.d.ts +45 -0
  48. package/dist/events/declared.js +73 -0
  49. package/dist/events/echo-mismatch.d.ts +8 -2
  50. package/dist/events/echo-mismatch.js +33 -5
  51. package/dist/events/event-filters.d.ts +1 -1
  52. package/dist/events/event-filters.js +7 -4
  53. package/dist/events/predicate-eval.d.ts +17 -72
  54. package/dist/events/predicate-eval.js +117 -236
  55. package/dist/events/predicate-parse.js +31 -3
  56. package/dist/events/predicate-route.d.ts +32 -0
  57. package/dist/events/predicate-route.js +102 -0
  58. package/dist/events/predicate-schema.d.ts +99 -0
  59. package/dist/events/predicate-schema.js +309 -0
  60. package/dist/events/predicate.d.ts +8 -0
  61. package/dist/events/predicate.js +296 -22
  62. package/dist/flows/annotate-tools.js +3 -0
  63. package/dist/flows/annotate.js +18 -4
  64. package/dist/flows/coverage.d.ts +38 -5
  65. package/dist/flows/coverage.js +30 -4
  66. package/dist/flows/decision.d.ts +15 -0
  67. package/dist/flows/decision.js +1 -1
  68. package/dist/flows/flow-classify.js +1 -1
  69. package/dist/flows/flow-replay-run.js +8 -1
  70. package/dist/flows/flow-tools.js +21 -5
  71. package/dist/flows/heal-run.js +1 -1
  72. package/dist/flows/replay.js +3 -0
  73. package/dist/honesty/accepted-write.d.ts +3 -0
  74. package/dist/honesty/accepted-write.js +8 -3
  75. package/dist/honesty/already-true.js +15 -0
  76. package/dist/honesty/blind-spots.js +10 -2
  77. package/dist/honesty/honesty.d.ts +11 -0
  78. package/dist/honesty/honesty.js +1 -0
  79. package/dist/honesty/uncaptured-bodies.d.ts +4 -2
  80. package/dist/honesty/uncaptured-bodies.js +9 -2
  81. package/dist/honesty/unread-outcome.d.ts +8 -0
  82. package/dist/honesty/unread-outcome.js +36 -9
  83. package/dist/honesty/unsettled.d.ts +49 -0
  84. package/dist/honesty/unsettled.js +82 -0
  85. package/dist/honesty/verified.d.ts +36 -3
  86. package/dist/honesty/verified.js +54 -11
  87. package/dist/http-server.d.ts +19 -0
  88. package/dist/http-server.js +202 -4
  89. package/dist/impact/impact-recorder.d.ts +23 -0
  90. package/dist/impact/impact-recorder.js +76 -0
  91. package/dist/impact/impact-store.d.ts +47 -0
  92. package/dist/impact/impact-store.js +171 -0
  93. package/dist/index.d.ts +7 -0
  94. package/dist/index.js +47 -10
  95. package/dist/init/agent-rules.d.ts +36 -0
  96. package/dist/init/agent-rules.js +132 -22
  97. package/dist/init/astro-patch.d.ts +2 -1
  98. package/dist/init/astro-patch.js +38 -6
  99. package/dist/init/capabilities.d.ts +22 -0
  100. package/dist/init/capabilities.js +76 -0
  101. package/dist/init/confirm.d.ts +114 -0
  102. package/dist/init/confirm.js +165 -0
  103. package/dist/init/connect-steps.d.ts +2 -0
  104. package/dist/init/connect-steps.js +50 -0
  105. package/dist/init/cra.js +3 -2
  106. package/dist/init/csp-check.d.ts +38 -0
  107. package/dist/init/csp-check.js +92 -0
  108. package/dist/init/csp-doctor.d.ts +25 -0
  109. package/dist/init/csp-doctor.js +49 -0
  110. package/dist/init/cursor.js +6 -9
  111. package/dist/init/detect.d.ts +8 -0
  112. package/dist/init/detect.js +33 -3
  113. package/dist/init/mcp-clients.d.ts +1 -0
  114. package/dist/init/mcp-clients.js +51 -7
  115. package/dist/init/mcp.d.ts +15 -0
  116. package/dist/init/mcp.js +19 -0
  117. package/dist/init/non-js-project.js +29 -5
  118. package/dist/init/plan-framework.d.ts +10 -0
  119. package/dist/init/plan-framework.js +78 -16
  120. package/dist/init/plan.d.ts +47 -6
  121. package/dist/init/plan.js +228 -69
  122. package/dist/init/run.d.ts +24 -2
  123. package/dist/init/run.js +157 -45
  124. package/dist/init/slash-command.d.ts +1 -1
  125. package/dist/init/slash-command.js +54 -6
  126. package/dist/init/snippets.d.ts +45 -5
  127. package/dist/init/snippets.js +194 -42
  128. package/dist/init/vite-config.js +53 -5
  129. package/dist/input/network-mock-tools.d.ts +19 -0
  130. package/dist/input/network-mock-tools.js +37 -5
  131. package/dist/input/scroll-find.d.ts +6 -0
  132. package/dist/input/scroll-find.js +17 -2
  133. package/dist/input/scroll-tools.js +4 -0
  134. package/dist/journal/attach-journal.d.ts +9 -1
  135. package/dist/journal/attach-journal.js +13 -2
  136. package/dist/journal/journal-query.d.ts +13 -0
  137. package/dist/journal/journal-query.js +28 -3
  138. package/dist/journal/workspace-gitignore.d.ts +10 -0
  139. package/dist/journal/workspace-gitignore.js +59 -0
  140. package/dist/license/license.js +1 -1
  141. package/dist/mcp/mcp-proxy.d.ts +35 -30
  142. package/dist/mcp/mcp-proxy.js +306 -104
  143. package/dist/mcp/mcp.d.ts +10 -1
  144. package/dist/mcp/mcp.js +70 -34
  145. package/dist/mcp/proxy-handshake.d.ts +82 -1
  146. package/dist/mcp/proxy-handshake.js +109 -2
  147. package/dist/mcp/proxy-lifecycle.d.ts +11 -2
  148. package/dist/mcp/proxy-lifecycle.js +12 -3
  149. package/dist/mcp/proxy-log.d.ts +63 -0
  150. package/dist/mcp/proxy-log.js +132 -0
  151. package/dist/mcp/server-instructions.d.ts +17 -0
  152. package/dist/mcp/server-instructions.js +56 -0
  153. package/dist/mcp/shared-params.d.ts +27 -0
  154. package/dist/mcp/shared-params.js +36 -0
  155. package/dist/pool/browser-pool.d.ts +22 -2
  156. package/dist/pool/browser-pool.js +44 -4
  157. package/dist/project/learned-routes.d.ts +24 -0
  158. package/dist/project/learned-routes.js +63 -0
  159. package/dist/project/project-store.d.ts +6 -0
  160. package/dist/project/project-store.js +25 -1
  161. package/dist/project/reticle-dir.d.ts +2 -0
  162. package/dist/project/reticle-dir.js +1 -0
  163. package/dist/session/connection-memory.d.ts +59 -0
  164. package/dist/session/connection-memory.js +108 -0
  165. package/dist/session/dev-command.d.ts +26 -0
  166. package/dist/session/dev-command.js +89 -0
  167. package/dist/session/dev-server-probe.d.ts +68 -0
  168. package/dist/session/dev-server-probe.js +102 -7
  169. package/dist/session/last-act.d.ts +26 -0
  170. package/dist/session/last-act.js +35 -1
  171. package/dist/session/live-control-tools.js +42 -5
  172. package/dist/session/no-session-diagnosis.d.ts +67 -2
  173. package/dist/session/no-session-diagnosis.js +236 -27
  174. package/dist/session/no-session-next-action.d.ts +46 -0
  175. package/dist/session/no-session-next-action.js +85 -0
  176. package/dist/session/no-session-watch.d.ts +40 -1
  177. package/dist/session/no-session-watch.js +174 -8
  178. package/dist/session/pending-commands.d.ts +12 -0
  179. package/dist/session/pending-commands.js +13 -1
  180. package/dist/session/ref-provenance.d.ts +54 -0
  181. package/dist/session/ref-provenance.js +61 -0
  182. package/dist/session/session-lease.js +1 -1
  183. package/dist/session/session-manager.d.ts +4 -0
  184. package/dist/session/session-manager.js +35 -5
  185. package/dist/session/session.d.ts +10 -1
  186. package/dist/session/session.js +146 -5
  187. package/dist/telemetry/app-instrumented.d.ts +8 -0
  188. package/dist/telemetry/app-instrumented.js +10 -0
  189. package/dist/telemetry/automation-hint.d.ts +17 -0
  190. package/dist/telemetry/automation-hint.js +71 -0
  191. package/dist/telemetry/bug-found.d.ts +15 -17
  192. package/dist/telemetry/bug-found.js +52 -21
  193. package/dist/telemetry/cli-telemetry.js +7 -1
  194. package/dist/telemetry/daemon-telemetry.js +24 -0
  195. package/dist/telemetry/feedback.js +1 -1
  196. package/dist/telemetry/init-telemetry.js +9 -1
  197. package/dist/telemetry/install-source.d.ts +56 -0
  198. package/dist/telemetry/install-source.js +74 -0
  199. package/dist/telemetry/instrumentation-stall.d.ts +50 -0
  200. package/dist/telemetry/instrumentation-stall.js +90 -0
  201. package/dist/telemetry/run-telemetry.js +4 -1
  202. package/dist/telemetry/session-metrics.d.ts +8 -0
  203. package/dist/telemetry/session-metrics.js +15 -0
  204. package/dist/telemetry/telemetry.d.ts +7 -1
  205. package/dist/telemetry/telemetry.js +26 -2
  206. package/dist/telemetry/tool-refused.d.ts +19 -0
  207. package/dist/telemetry/tool-refused.js +55 -0
  208. package/dist/telemetry/verification-of.js +46 -7
  209. package/dist/temp-dir.d.ts +27 -0
  210. package/dist/temp-dir.js +46 -0
  211. package/dist/tools/act-tools.js +209 -28
  212. package/dist/tools/assert-grade.d.ts +1 -1
  213. package/dist/tools/assert-grade.js +27 -5
  214. package/dist/tools/assert-verdict.js +49 -7
  215. package/dist/tools/browser-tools.js +10 -0
  216. package/dist/tools/contract-tools.js +4 -0
  217. package/dist/tools/dynamic-tools.js +16 -7
  218. package/dist/tools/error-recovery.d.ts +10 -0
  219. package/dist/tools/error-recovery.js +73 -9
  220. package/dist/tools/feedback-invite.js +1 -1
  221. package/dist/tools/invoke-tool.js +159 -26
  222. package/dist/tools/lease-hint.d.ts +30 -8
  223. package/dist/tools/lease-hint.js +65 -14
  224. package/dist/tools/lease-tools.d.ts +40 -1
  225. package/dist/tools/lease-tools.js +181 -83
  226. package/dist/tools/navigate-result.js +1 -1
  227. package/dist/tools/observe-tools.js +10 -4
  228. package/dist/tools/observed-nothing.js +1 -1
  229. package/dist/tools/react-grace.d.ts +52 -0
  230. package/dist/tools/react-grace.js +90 -0
  231. package/dist/tools/read-tools.js +67 -5
  232. package/dist/tools/resolve-target.d.ts +33 -0
  233. package/dist/tools/resolve-target.js +53 -0
  234. package/dist/tools/settle-in-flight.d.ts +94 -0
  235. package/dist/tools/settle-in-flight.js +146 -0
  236. package/dist/tools/snapshot-delta.d.ts +10 -0
  237. package/dist/tools/snapshot-delta.js +194 -9
  238. package/dist/tools/tool-kit.d.ts +8 -0
  239. package/dist/tools/tool-surface.d.ts +60 -0
  240. package/dist/tools/tool-surface.js +86 -1
  241. package/dist/tools/tools.js +61 -8
  242. package/dist/tools/unadvertised-help.js +9 -6
  243. package/docs/README.md +55 -11
  244. package/docs/actions.mdx +120 -0
  245. package/docs/agent-cheatsheet.md +95 -29
  246. package/docs/architecture.md +52 -35
  247. package/docs/benchmarks.md +127 -75
  248. package/docs/best-practices.mdx +216 -0
  249. package/docs/capabilities.mdx +534 -0
  250. package/docs/cli/affected.mdx +53 -0
  251. package/docs/cli/capsules.mdx +70 -0
  252. package/docs/cli/cloud.mdx +153 -0
  253. package/docs/cli/doctor.mdx +109 -0
  254. package/docs/cli/drive.mdx +74 -0
  255. package/docs/cli/feedback.mdx +67 -0
  256. package/docs/cli/gate.mdx +64 -0
  257. package/docs/cli/help.mdx +94 -0
  258. package/docs/cli/hunt.mdx +73 -0
  259. package/docs/cli/identify.mdx +76 -0
  260. package/docs/cli/init.mdx +121 -0
  261. package/docs/cli/kill.mdx +91 -0
  262. package/docs/cli/license.mdx +48 -0
  263. package/docs/cli/mcp.mdx +61 -0
  264. package/docs/cli/open.mdx +74 -0
  265. package/docs/cli/restart.mdx +60 -0
  266. package/docs/cli/rollback.mdx +35 -0
  267. package/docs/cli/serve.mdx +69 -0
  268. package/docs/cli/status.mdx +88 -0
  269. package/docs/cli/stop.mdx +64 -0
  270. package/docs/cli/telemetry.mdx +57 -0
  271. package/docs/cli/update.mdx +52 -0
  272. package/docs/cli/verify.mdx +76 -0
  273. package/docs/cli/version.mdx +39 -0
  274. package/docs/cli/watch.mdx +62 -0
  275. package/docs/cli.mdx +241 -0
  276. package/docs/debugging.md +16 -10
  277. package/docs/deploy-checks.md +45 -12
  278. package/docs/desktop.mdx +384 -0
  279. package/docs/docs.json +364 -0
  280. package/docs/enterprise.md +22 -16
  281. package/docs/faq.mdx +102 -0
  282. package/docs/fixtures.md +13 -7
  283. package/docs/flows.md +29 -23
  284. package/docs/for-agents.md +71 -0
  285. package/docs/frameworks.mdx +238 -0
  286. package/docs/gate-plan.md +48 -42
  287. package/docs/gates.md +28 -22
  288. package/docs/getting-started.md +129 -77
  289. package/docs/human-control.md +24 -18
  290. package/docs/index.mdx +143 -0
  291. package/docs/install-agentic.mdx +224 -0
  292. package/docs/install-manual.mdx +196 -0
  293. package/docs/instrumentation.mdx +238 -0
  294. package/docs/integration-patterns.md +41 -35
  295. package/docs/local-registry.md +19 -13
  296. package/docs/multi-agent-testing.md +19 -13
  297. package/docs/packages/babel-plugin.mdx +79 -0
  298. package/docs/packages/browser.mdx +111 -0
  299. package/docs/packages/core.mdx +116 -0
  300. package/docs/packages/electron.mdx +85 -0
  301. package/docs/packages/eslint-plugin.mdx +86 -0
  302. package/docs/packages/next.mdx +89 -0
  303. package/docs/packages/react.mdx +91 -0
  304. package/docs/packages/server.mdx +98 -0
  305. package/docs/packages/tauri.mdx +63 -0
  306. package/docs/packages/test.mdx +119 -0
  307. package/docs/packages/vite-plugin.mdx +94 -0
  308. package/docs/packages.mdx +218 -0
  309. package/docs/platform-integration.md +35 -26
  310. package/docs/predicates.mdx +248 -0
  311. package/docs/quickstart.mdx +257 -0
  312. package/docs/recipes.mdx +282 -0
  313. package/docs/skill-file.mdx +107 -0
  314. package/docs/state-management.mdx +199 -0
  315. package/docs/style.css +14 -0
  316. package/docs/system-map.md +50 -33
  317. package/docs/telemetry-contract.md +106 -52
  318. package/docs/telemetry-events.mdx +475 -0
  319. package/docs/telemetry.md +63 -55
  320. package/docs/testing.md +44 -6
  321. package/docs/token-efficiency.md +37 -27
  322. package/docs/tools-act-and-wait.mdx +173 -0
  323. package/docs/tools-act-sequence.mdx +137 -0
  324. package/docs/tools-act.mdx +95 -0
  325. package/docs/tools-assert.mdx +129 -0
  326. package/docs/tools-console.mdx +63 -0
  327. package/docs/tools-inspect.mdx +88 -0
  328. package/docs/tools-navigate.mdx +99 -0
  329. package/docs/tools-network.mdx +119 -0
  330. package/docs/tools-observe.mdx +145 -0
  331. package/docs/tools-overview.mdx +160 -0
  332. package/docs/tools-query.mdx +126 -0
  333. package/docs/tools-session-and-feedback.mdx +112 -0
  334. package/docs/tools-sessions.mdx +94 -0
  335. package/docs/tools-snapshot.mdx +129 -0
  336. package/docs/tools-state.mdx +104 -0
  337. package/docs/tools-tools-and-run.mdx +156 -0
  338. package/docs/tools-wait-for.mdx +85 -0
  339. package/docs/troubleshooting.mdx +263 -0
  340. package/docs/usage.md +209 -165
  341. package/docs/vs-chrome-devtools-mcp.mdx +123 -0
  342. package/docs/vs-playwright-mcp.mdx +125 -0
  343. package/docs/vs-screenshots.mdx +137 -0
  344. package/docs/what-is-reticle.mdx +63 -0
  345. package/docs/why-reticle.mdx +109 -0
  346. package/package.json +5 -5
  347. package/docs/desktop-apps.md +0 -256
  348. package/docs/matrix/2.5.0/claude-code-machine.json +0 -19
  349. package/docs/matrix/2.5.0/codex-machine.json +0 -20
  350. package/docs/matrix/2.5.0/cursor-machine.json +0 -22
  351. package/docs/matrix/2.5.0/gemini-machine.json +0 -22
  352. package/docs/matrix/2.5.0/opencode-machine.json +0 -22
  353. package/docs/matrix/2.5.0/vscode-machine.json +0 -22
  354. package/docs/matrix/2.5.0/windsurf-machine.json +0 -22
  355. package/docs/matrix/MATRIX.md +0 -26
  356. package/docs/matrix/README.md +0 -59
  357. package/docs/mint.json +0 -61
package/docs/docs.json ADDED
@@ -0,0 +1,364 @@
1
+ {
2
+ "$schema": "https://mintlify.com/docs.json",
3
+ "theme": "mint",
4
+ "name": "Reticle",
5
+ "description": "Reticle is the proof layer for AI agents: it verifies a running web app from the inside, without screenshots, and returns a verdict with evidence.",
6
+ "colors": {
7
+ "primary": "#ff9d86",
8
+ "light": "#ffbcac",
9
+ "dark": "#d04425"
10
+ },
11
+ "logo": {
12
+ "light": "/logo/wordmark-black.svg",
13
+ "dark": "/logo/wordmark-white.svg"
14
+ },
15
+ "favicon": {
16
+ "light": "/favicon/mark-black.svg",
17
+ "dark": "/favicon/mark-white.svg"
18
+ },
19
+ "appearance": {
20
+ "default": "system"
21
+ },
22
+ "styling": {
23
+ "eyebrows": "breadcrumbs",
24
+ "codeblocks": "dark"
25
+ },
26
+ "search": {
27
+ "prompt": "Search the Reticle docs"
28
+ },
29
+ "metadata": {
30
+ "timestamp": true
31
+ },
32
+ "navigation": {
33
+ "versions": [
34
+ {
35
+ "version": "2.9.0",
36
+ "default": true,
37
+ "tabs": [
38
+ {
39
+ "tab": "Guides",
40
+ "groups": [
41
+ {
42
+ "group": "Get started",
43
+ "pages": [
44
+ "quickstart",
45
+ "what-is-reticle",
46
+ "why-reticle",
47
+ "getting-started",
48
+ "for-agents"
49
+ ]
50
+ },
51
+ {
52
+ "group": "Install",
53
+ "pages": ["install-agentic", "install-manual", "frameworks"]
54
+ },
55
+ {
56
+ "group": "Instrument",
57
+ "pages": ["instrumentation", "state-management"]
58
+ },
59
+ {
60
+ "group": "Verify and ship",
61
+ "pages": ["flows", "testing", "deploy-checks", "integration-patterns"]
62
+ },
63
+ {
64
+ "group": "Working with agents",
65
+ "pages": ["multi-agent-testing", "human-control", "platform-integration"]
66
+ },
67
+ {
68
+ "group": "When it goes wrong",
69
+ "pages": ["troubleshooting", "debugging"]
70
+ }
71
+ ]
72
+ },
73
+ {
74
+ "tab": "Reference",
75
+ "groups": [
76
+ {
77
+ "group": "Tools",
78
+ "pages": [
79
+ "tools-overview",
80
+ "tools-snapshot",
81
+ "tools-query",
82
+ "tools-inspect",
83
+ "tools-navigate",
84
+ "tools-act",
85
+ "tools-act-and-wait",
86
+ "tools-act-sequence",
87
+ "tools-observe",
88
+ "tools-network",
89
+ "tools-console",
90
+ "tools-state",
91
+ "tools-wait-for",
92
+ "tools-assert",
93
+ "tools-sessions",
94
+ "tools-tools-and-run",
95
+ "tools-session-and-feedback"
96
+ ]
97
+ },
98
+ {
99
+ "group": "Beyond the loop",
100
+ "pages": ["capabilities"]
101
+ },
102
+ {
103
+ "group": "CLI commands",
104
+ "pages": [
105
+ "cli",
106
+ "cli/init",
107
+ "cli/doctor",
108
+ "cli/status",
109
+ "cli/serve",
110
+ "cli/stop",
111
+ "cli/kill",
112
+ "cli/restart",
113
+ "cli/mcp",
114
+ "cli/open",
115
+ "cli/drive",
116
+ "cli/verify",
117
+ "cli/affected",
118
+ "cli/gate",
119
+ "cli/watch",
120
+ "cli/capsules",
121
+ "cli/hunt",
122
+ "cli/update",
123
+ "cli/rollback",
124
+ "cli/license",
125
+ "cli/version",
126
+ "cli/telemetry",
127
+ "cli/feedback",
128
+ "cli/identify",
129
+ "cli/help",
130
+ "cli/cloud"
131
+ ]
132
+ },
133
+ {
134
+ "group": "Packages",
135
+ "pages": [
136
+ "packages",
137
+ "packages/core",
138
+ "packages/browser",
139
+ "packages/server",
140
+ "packages/react",
141
+ "packages/vite-plugin",
142
+ "packages/babel-plugin",
143
+ "packages/next",
144
+ "packages/test",
145
+ "packages/eslint-plugin",
146
+ "packages/electron",
147
+ "packages/tauri"
148
+ ]
149
+ },
150
+ {
151
+ "group": "Grammar",
152
+ "pages": ["predicates", "actions", "recipes"]
153
+ },
154
+ {
155
+ "group": "Long form",
156
+ "pages": ["agent-cheatsheet", "usage", "faq"]
157
+ }
158
+ ]
159
+ },
160
+ {
161
+ "tab": "Desktop",
162
+ "groups": [
163
+ {
164
+ "group": "Electron and Tauri",
165
+ "pages": ["desktop"]
166
+ }
167
+ ]
168
+ },
169
+ {
170
+ "tab": "Resources",
171
+ "groups": [
172
+ {
173
+ "group": "How it works",
174
+ "pages": ["architecture", "benchmarks", "token-efficiency"]
175
+ },
176
+ {
177
+ "group": "Compare",
178
+ "pages": ["vs-playwright-mcp", "vs-chrome-devtools-mcp", "vs-screenshots"]
179
+ },
180
+ {
181
+ "group": "Practice",
182
+ "pages": ["best-practices", "skill-file"]
183
+ },
184
+ {
185
+ "group": "Trust & licensing",
186
+ "pages": ["telemetry", "enterprise"]
187
+ }
188
+ ]
189
+ },
190
+ {
191
+ "tab": "Contributing",
192
+ "groups": [
193
+ {
194
+ "group": "Working on Reticle",
195
+ "pages": ["gates", "gate-plan", "fixtures", "local-registry"]
196
+ },
197
+ {
198
+ "group": "Internals",
199
+ "pages": ["system-map", "telemetry-contract", "telemetry-events"]
200
+ }
201
+ ]
202
+ }
203
+ ]
204
+ }
205
+ ],
206
+ "global": {
207
+ "anchors": [
208
+ {
209
+ "anchor": "GitHub",
210
+ "href": "https://github.com/reticlehq/reticle",
211
+ "icon": "github"
212
+ },
213
+ {
214
+ "anchor": "Discord",
215
+ "href": "https://discord.gg/BwAbzv9ZRz",
216
+ "icon": "discord"
217
+ },
218
+ {
219
+ "anchor": "npm",
220
+ "href": "https://www.npmjs.com/org/reticlehq",
221
+ "icon": "npm"
222
+ },
223
+ {
224
+ "anchor": "Changelog",
225
+ "href": "https://github.com/reticlehq/reticle/blob/main/CHANGELOG.md",
226
+ "icon": "clock-rotate-left"
227
+ }
228
+ ]
229
+ }
230
+ },
231
+ "navbar": {
232
+ "links": [
233
+ {
234
+ "type": "github",
235
+ "href": "https://github.com/reticlehq/reticle"
236
+ }
237
+ ],
238
+ "primary": {
239
+ "type": "button",
240
+ "label": "Get started",
241
+ "href": "/quickstart"
242
+ }
243
+ },
244
+ "footer": {
245
+ "socials": {
246
+ "x": "https://x.com/reticle_hq",
247
+ "github": "https://github.com/reticlehq/reticle",
248
+ "linkedin": "https://www.linkedin.com/company/reticlehq",
249
+ "discord": "https://discord.gg/BwAbzv9ZRz"
250
+ },
251
+ "links": [
252
+ {
253
+ "header": "Docs",
254
+ "items": [
255
+ {
256
+ "label": "Quickstart",
257
+ "href": "/quickstart"
258
+ },
259
+ {
260
+ "label": "Usage guide",
261
+ "href": "/usage"
262
+ },
263
+ {
264
+ "label": "Agent cheat sheet",
265
+ "href": "/agent-cheatsheet"
266
+ },
267
+ {
268
+ "label": "For agents",
269
+ "href": "/for-agents"
270
+ }
271
+ ]
272
+ },
273
+ {
274
+ "header": "Project",
275
+ "items": [
276
+ {
277
+ "label": "Contributing",
278
+ "href": "https://github.com/reticlehq/reticle/blob/main/CONTRIBUTING.md"
279
+ },
280
+ {
281
+ "label": "Security",
282
+ "href": "https://github.com/reticlehq/reticle/blob/main/SECURITY.md"
283
+ },
284
+ {
285
+ "label": "License",
286
+ "href": "https://github.com/reticlehq/reticle/blob/main/LICENSE"
287
+ }
288
+ ]
289
+ },
290
+ {
291
+ "header": "Community",
292
+ "items": [
293
+ {
294
+ "label": "Discord",
295
+ "href": "https://discord.gg/BwAbzv9ZRz"
296
+ },
297
+ {
298
+ "label": "Star on GitHub",
299
+ "href": "https://github.com/reticlehq/reticle"
300
+ },
301
+ {
302
+ "label": "X",
303
+ "href": "https://x.com/reticle_hq"
304
+ },
305
+ {
306
+ "label": "LinkedIn",
307
+ "href": "https://www.linkedin.com/company/reticlehq"
308
+ }
309
+ ]
310
+ }
311
+ ]
312
+ },
313
+ "redirects": [
314
+ {
315
+ "source": "/README",
316
+ "destination": "/getting-started",
317
+ "permanent": true
318
+ },
319
+ {
320
+ "source": "/desktop-apps",
321
+ "destination": "/desktop",
322
+ "permanent": true
323
+ }
324
+ ],
325
+ "contextual": {
326
+ "options": ["copy", "view", "claude", "chatgpt", "cursor", "vscode", "mcp", "add-mcp"]
327
+ },
328
+ "markdown": {
329
+ "instructions": [
330
+ "Reticle is a dev-only, localhost-only verification layer for AI coding agents. It reads program truth (network, state, console, routing, animations, framework state) from inside a running web app and returns a deterministic verdict with evidence. It is not a screenshot tool and not a browser automation library.",
331
+ "Only `reticle_act_and_wait` and `reticle_assert` produce a verdict. Every other tool moves or reads the app and proves nothing. A drive that ends without one of those two has no result, however many tools it used.",
332
+ "A verdict of `verified: \"unknown\"` is not a pass. It means Reticle drove the app and could not tell what happened. Report it as unknown; never weaken a check to make it pass.",
333
+ "Package names are scoped `@reticlehq/*`. Run every CLI command as `npx @reticlehq/server <command>`, for example `npx @reticlehq/server init`. `reticle` is a bin name that `@reticlehq/server` installs once it is on your PATH, NOT a package on npm: `npx reticle` fetches an unrelated package published by somebody else, so never run that. The complete tool surface is on the `/usage` page; `/agent-cheatsheet` is the one-screen version."
334
+ ]
335
+ },
336
+ "seo": {
337
+ "metatags": {
338
+ "og:site_name": "Reticle Docs",
339
+ "og:type": "website",
340
+ "og:title": "Reticle Docs: verification for AI coding agents",
341
+ "og:description": "Reticle verifies a running web app from the inside and returns a verdict with evidence, not a screenshot. Install it, instrument it, and read the full tool reference.",
342
+ "og:url": "https://docs.reticle.sh",
343
+ "og:image": "https://docs.reticle.sh/images/og.png",
344
+ "og:image:alt": "Reticle: your agent says it works. Reticle checks.",
345
+ "twitter:card": "summary_large_image",
346
+ "twitter:site": "@reticle_hq",
347
+ "twitter:creator": "@reticle_hq",
348
+ "twitter:image": "https://docs.reticle.sh/images/og.png"
349
+ },
350
+ "organization": {
351
+ "name": "Reticle",
352
+ "url": "https://docs.reticle.sh",
353
+ "logo": "https://docs.reticle.sh/images/og.png",
354
+ "sameAs": ["https://github.com/reticlehq/reticle", "https://www.npmjs.com/org/reticlehq"]
355
+ }
356
+ },
357
+ "errors": {
358
+ "404": {
359
+ "redirect": false,
360
+ "title": "No such page",
361
+ "description": "That page moved or never existed. Start at [Getting started](/getting-started), or search above."
362
+ }
363
+ }
364
+ }
@@ -1,55 +1,61 @@
1
- # Reticle for enterprises
1
+ ---
2
+ title: Enterprise
3
+ description: 'Premium access and activation, what is gated, the security and data-handling posture, and the licensing model.'
4
+ icon: building
5
+ ---
6
+
7
+ Enterprise features ship inside the open package and are unlocked by a signed license key you set as `RETICLE_LICENSE_KEY`. Activation is verified locally with Ed25519 and makes **no network call**, so nothing about your usage leaves your machine. Run `npx @reticlehq/server license` to see whether you are `active`, `eval`, `missing` or `expired`.
2
8
 
3
9
  > Premium access (how you get + activate it), what's gated, the security/data-handling posture, and the licensing model. Integration mechanics live in [`platform-integration.md`](./platform-integration.md).
4
10
 
5
11
  ## How premium access works (offline, no phone-home)
6
12
 
7
- Enterprise (`ee/`) features ship **inside the open package** — they're source-available (free for development, testing, and evaluation). A **license key activates them in production**. Activation is verified locally with Ed25519; nothing about your usage ever leaves your machine.
13
+ Enterprise (`ee/`) features ship **inside the open package**; they're source-available (free for development, testing, and evaluation). A **license key activates them in production**. Activation is verified locally with Ed25519; nothing about your usage ever leaves your machine.
8
14
 
9
15
  **The flow, end to end:**
10
16
 
11
- 1. **Buy** — contact **[hey@reticle.sh](mailto:hey@reticle.sh)**; we issue you a signed license key (org, plan, expiry, feature set).
12
- 2. **Install** — set it on the machine running the Reticle server:
17
+ 1. **Buy.** Contact **[hey@reticle.sh](mailto:hey@reticle.sh)**; we issue you a signed license key (org, plan, expiry, feature set).
18
+ 2. **Install.** Set it on the machine running the Reticle server:
13
19
  ```bash
14
20
  export RETICLE_LICENSE_KEY="<your key>"
15
21
  # the release already bakes the issuer public key (RETICLE_LICENSE_PUBLIC_KEY)
16
22
  ```
17
- 3. **Verify** — `reticle license` shows your status:
23
+ 3. **Verify.** `reticle license` shows your status:
18
24
  ```
19
25
  active licensed to Acme Corp (enterprise), expires 2027-06-20 · features: sso, audit
20
- eval evaluation mode — enterprise features run free (no issuer key configured)
26
+ eval evaluation mode: enterprise features run free (no issuer key configured)
21
27
  missing set RETICLE_LICENSE_KEY to activate enterprise features in production
22
28
  expired renew to keep using enterprise features
23
29
  ```
24
- 4. **Unlock** — enterprise features now run in production; without a valid key they refuse to run there (a clear error, never a silent half-feature). In eval/dev they always run free.
25
- 5. **Renew** — keys carry an expiry; `reticle license` warns before it lapses.
30
+ 4. **Unlock.** Enterprise features now run in production; without a valid key they refuse to run there (a clear error, never a silent half-feature). In eval/dev they always run free.
31
+ 5. **Renew.** Keys carry an expiry; `reticle license` warns before it lapses.
26
32
 
27
33
  > Procuring a license: contact **[hey@reticle.sh](mailto:hey@reticle.sh)**. Keys are issued offline and signed with Ed25519; the activation you run (`reticle license`) verifies them locally with no network call.
28
34
 
29
35
  ## What's gated (and the roadmap)
30
36
 
31
- The licensing **mechanism** is open core (inspectable, FSL) — only the **features** under `ee/` are gated:
37
+ The licensing **mechanism** is open core (inspectable, FSL). Only the **features** under `ee/` are gated:
32
38
 
33
39
  - **Today:** the activation gate + an example gated feature (audit event recording).
34
40
  - **Roadmap** (the reliably enterprise-only set): **SSO/SAML, SCIM, RBAC / team permissions, audit logs, multi-org management, verify-before-merge policy gates, and the hosted control-plane connectors.** These are the things a security/compliance org pays for; the core verification engine stays free forever.
35
41
 
36
- > What's premium vs free, and pricing, are business decisions for the owner — this doc describes the _mechanism_, not the price list.
42
+ > What's premium vs free, and pricing, are business decisions for the owner; this doc describes the _mechanism_, not the price list.
37
43
 
38
44
  ## Security & data handling
39
45
 
40
- The honest one-pager a security review needs. Reticle is built so the answer to "where does our data go?" is **nowhere — it runs on your machine, in your infra.**
46
+ The honest one-pager a security review needs. Reticle is built so the answer to "where does our data go?" is **nowhere. It runs on your machine, in your infra.**
41
47
 
42
48
  | Question | Answer |
43
49
  | --- | --- |
44
- | Does the SDK ship to production? | **No** — dev/preview-only, tree-shaken from production builds. |
45
- | Where does the server run? | **Localhost** — the bridge binds `127.0.0.1`; the verify endpoint is localhost-bound + token-guarded (constant-time), with request/body-size/timeout limits. |
46
- | Does anything phone home? | **No app data, ever.** License checks are offline (Ed25519). The CLI sends anonymous, opt-out usage metrics only (random id + event names — no code, no PII; see [telemetry](telemetry.md)); disable fleet-wide with `RETICLE_TELEMETRY=0` or per-machine with `reticle telemetry disable`. Feedback your team explicitly sends us (`reticle feedback`) is the only free text that ever leaves; it is never collected passively, is redacted client-side, and is disabled fleet-wide with `RETICLE_FEEDBACK=0`. |
50
+ | Does the SDK ship to production? | **No.** Dev/preview-only, tree-shaken from production builds. |
51
+ | Where does the server run? | **Localhost.** The bridge binds `127.0.0.1`; the verify endpoint is localhost-bound + token-guarded (constant-time), with request/body-size/timeout limits. |
52
+ | Does anything phone home? | **No app data, ever.** License checks are offline (Ed25519). The CLI sends anonymous, opt-out usage metrics only (random id + event names, no code, no PII; see [telemetry](telemetry.md)); disable fleet-wide with `RETICLE_TELEMETRY=0` or per-machine with `reticle telemetry disable`. Feedback your team explicitly sends us (`reticle feedback`) is the only free text that ever leaves; it is never collected passively, is redacted client-side, and is disabled fleet-wide with `RETICLE_FEEDBACK=0`. |
47
53
  | Where do artifacts live? | Your disk: `.reticle/runs/<id>.json` (atomic writes, bounded retention), `.reticle/flows/`, `.reticle/contract.json`. You own them. |
48
- | What can the server read? | The DOM/network/console/routing/state of the app under test — locally. |
54
+ | What can the server read? | The DOM/network/console/routing/state of the app under test, locally. |
49
55
  | Leak risk downstream? | The **`prod-preview` profile** redacts source `file:line`, raw bodies, and app-state values. |
50
56
  | Path safety | Run/flow ids are validated as single path segments on read **and** write (no traversal). |
51
57
 
52
- **Verify it yourself:** the SDK + server are source-available — read the tree-shaking, the `127.0.0.1` bind, and the offline license verify. `SECURITY.md` has the disclosure process; an SBOM is available on request. SOC 2 is a GA-stage item (no Reticle-hosted data exists today to certify); the posture above is the honest current state.
58
+ **Verify it yourself:** the SDK + server are source-available, so read the tree-shaking, the `127.0.0.1` bind, and the offline license verify. `SECURITY.md` has the disclosure process; an SBOM is available on request. SOC 2 is a GA-stage item (no Reticle-hosted data exists today to certify); the posture above is the honest current state.
53
59
 
54
60
  ## Licensing model (per package)
55
61
 
package/docs/faq.mdx ADDED
@@ -0,0 +1,102 @@
1
+ ---
2
+ title: 'FAQ: frequently asserted questions'
3
+ sidebarTitle: FAQ
4
+ description: Does it run in production, does it need React, does it replace Playwright, and the other questions people actually ask.
5
+ icon: circle-question
6
+ ---
7
+
8
+ Reticle is a dev-only, localhost-only verification layer an AI coding agent uses to prove a change actually worked in your running app. It does not run in production, it does not need React, and it does not replace Playwright. The rest of the questions people actually ask are below.
9
+
10
+ <AccordionGroup>
11
+
12
+ <Accordion title="Does this run in production?">
13
+ No, and it is built so that it cannot easily be made to. Keep `reticle.connect()` behind a dev
14
+ guard; the SDK is side-effect-free and tree-shakes out of production builds. The Vite plugin uses
15
+ `apply: 'serve'`, which means it is not part of a production build at all.
16
+ </Accordion>
17
+
18
+ <Accordion title="Do I have to change my components?">
19
+ No, for look, act and observe. You get DOM, network, console and routing with zero changes.
20
+
21
+ You get considerably better results by adding `data-testid` attributes and by [emitting signals](/instrumentation). That is the difference between a verdict that says "something appeared" and one that says "the app declared success".
22
+
23
+ </Accordion>
24
+
25
+ <Accordion title="Does it work without React?">
26
+ The core is framework-agnostic: DOM, network, routing, console, animations, snapshots and actions are gated against a vanilla TypeScript app.
27
+
28
+ Support beyond that is uneven, and we would rather say so than let you find out:
29
+
30
+ | Framework | Status |
31
+ | --- | --- |
32
+ | React, Next.js, Remix, Astro | Supported, each with an app and a CI gate |
33
+ | SvelteKit | Wired end to end. `init` writes the client hook, the plugin stamps `.svelte` source. But **no CI gate**, so unverified rather than supported |
34
+ | Vue | A Pinia store adapter and nothing else. No detection, no `.vue` stamping, no gate |
35
+
36
+ </Accordion>
37
+
38
+ <Accordion title="Can it tell me whether my UI looks good?">
39
+ No. Reticle verifies behaviour, not aesthetics. Visual correctness and "does this feel right" remain a human job, or a visual-diff tool's.
40
+
41
+ It does read design tokens. [`reticle_inspect`](/tools-inspect) reports whether a colour came from your theme or from someone's clipboard. But that is a consistency check, not taste.
42
+
43
+ </Accordion>
44
+
45
+ <Accordion title="Does it replace Playwright or Cypress?">
46
+ No. Those are your scripted CI suite. Reticle is for in-loop verification while an agent is coding, and for the flows you never got round to automating. They compose.
47
+
48
+ <Card title="The full comparison" icon="masks-theater" href="/vs-playwright-mcp">
49
+ Where Playwright is the right choice, stated plainly.
50
+ </Card>
51
+ </Accordion>
52
+
53
+ <Accordion title="How does it compare to Playwright MCP or Chrome DevTools MCP?">
54
+ Those drive a **separate** browser from the outside. Reticle verifies your **own running app** from the inside, with your real session and auth, and with assertions and regression as first-class.
55
+
56
+ Measured on the same app: Reticle caught 10 of 10 injected bugs, Playwright MCP 9, Chrome DevTools MCP 8. DevTools MCP is about 7% cheaper per look on a simple page, and more expensive on a real one.
57
+
58
+ </Accordion>
59
+
60
+ <Accordion title="Can I run several apps or tabs at once?">
61
+ Yes. Each is a session. Pass `sessionId` to any tool when more than one is connected, and [`reticle_sessions`](/tools-sessions) lists them.
62
+
63
+ Reticle scopes to your project and prefers the active tab, and it **refuses rather than guesses** when the choice is ambiguous. A refusal you can act on beats a silent pick of the wrong tab.
64
+
65
+ </Accordion>
66
+
67
+ <Accordion title="Why did I get `verified: \"unknown\"` on something that clearly worked?">
68
+ Because Reticle could not confirm it saw the whole story, and it will not call that a pass.
69
+
70
+ The most common cause is a **throttled tab**: a backgrounded browser tab has its timers suppressed, which suppresses the quiescence detection used to decide the page has settled. Focus the tab, or drive a dedicated context.
71
+
72
+ If you believe an `unknown` is wrong, report it. Reticle's own response says as much: "an unknown verdict is our defect, not yours".
73
+
74
+ </Accordion>
75
+
76
+ <Accordion title="Does my data leave the machine?">
77
+ Your app's data, no. Reticle is dev-only, localhost-only and offline. Credential-shaped values are redacted before they leave the page. You will see `[REDACTED]` in request bodies without configuring anything.
78
+
79
+ Anonymous usage telemetry is sent separately and can be turned off with `reticle telemetry disable`.
80
+
81
+ <Card title="Exactly what is collected" icon="chart-line" href="/telemetry">
82
+ The complete list. If it is not on that page, it is not sent.
83
+ </Card>
84
+ </Accordion>
85
+
86
+ <Accordion title="Is Reticle proven to make agents fix more bugs?">
87
+ No, and we are not going to claim it. A controlled test of fix-rate did **not** show an improvement. The benchmark was confounded in ways we can point at, and we consider the question open.
88
+
89
+ What is measured is detection: 10 of 10 injected regressions caught, with zero false alarms on a known-good control, against 9 and 8 for the alternatives.
90
+
91
+ </Accordion>
92
+
93
+ <Accordion title="Why does my agent only see some of Reticle's tools?">
94
+ Because MCP re-sends every advertised tool definition on **every turn**, so the tool list is rent, not a one-time cost. Reticle advertises the verify loop directly and keeps the cold tail one call away.
95
+
96
+ Nothing is unreachable. `reticle_tools` lists every tool (pass `names: [...]` for full parameters) and `reticle_run({ tool, args })` invokes any of them by name. If you want the whole surface advertised directly, set `RETICLE_ADVERTISE_ALL_TOOLS=1` in the **daemon's** environment and restart it, which costs roughly seven times the per-turn schema tax and is meant for suites that call by name rather than for running agents.
97
+
98
+ <Card title="The surface, explained" icon="wrench" href="/tools-overview">
99
+ Which tools are advertised directly, and why each earned its slot.
100
+ </Card>
101
+ </Accordion>
102
+ </AccordionGroup>
package/docs/fixtures.md CHANGED
@@ -1,6 +1,12 @@
1
- # Fixture apps
1
+ ---
2
+ title: Fixture apps
3
+ description: 'Why the apps in apps/ cannot answer the one question that matters before a release, and what does.'
4
+ icon: cubes
5
+ ---
2
6
 
3
- The apps in `apps/` are ours. We chose their defects, so passing against them says less than it looks like — and they are all wired to Reticle already, which makes them useless for the one question that matters before a release: **does the install still work on an app that has never seen Reticle?**
7
+ The apps in `apps/` cannot tell you whether the install still works, because every one of them is already wired to Reticle. That question is answered in a separate repo, **[`reticle-fixtures`](https://github.com/reticlehq/reticle-fixtures)**, which keeps a pristine `clean` branch of real third-party apps and runs `node scripts/verify.mjs` to install into each one and assert a session actually connects.
8
+
9
+ The apps in `apps/` are ours. We chose their defects, so passing against them says less than it looks like, and they are all wired to Reticle already, which makes them useless for the one question that matters before a release: **does the install still work on an app that has never seen Reticle?**
4
10
 
5
11
  That question is answered in a separate repo: **[`reticle-fixtures`](https://github.com/reticlehq/reticle-fixtures)**.
6
12
 
@@ -9,7 +15,7 @@ That question is answered in a separate repo: **[`reticle-fixtures`](https://git
9
15
  Three reasons, each of which bit us before the split:
10
16
 
11
17
  - **They are somebody else's package managers.** `react-admin` is a yarn monorepo. Putting it under `apps/*` makes it a member of this pnpm workspace and breaks `pnpm install` for everyone.
12
- - **They need a branch model this repo cannot give them.** A fresh install is only meaningful on a surface that has never been instrumented. Re-running `init` over an already-wired app reports `·` (already wired) for every step and proves nothing — which is exactly how an install regression ships unnoticed. `reticle-fixtures` keeps a pristine `clean` branch for that, plus `main` at the latest version and `reticle/<version>` per release.
18
+ - **They need a branch model this repo cannot give them.** A fresh install is only meaningful on a surface that has never been instrumented. Re-running `init` over an already-wired app reports `·` (already wired) for every step and proves nothing, which is exactly how an install regression ships unnoticed. `reticle-fixtures` keeps a pristine `clean` branch for that, plus `main` at the latest version and `reticle/<version>` per release.
13
19
  - **They are large.** The upstream checkouts were eight gigabytes of somebody else's git history sitting gitignored inside this repo.
14
20
 
15
21
  ## What runs there
@@ -19,21 +25,21 @@ node scripts/materialise.mjs # build apps/ from fixtures.json at pinned refs
19
25
  node scripts/verify.mjs # install into every clean app, boot it, assert a session connects
20
26
  ```
21
27
 
22
- The last step is the one that earns its keep. Every install bug found so far has been silent: the app boots, the `init` report reads clean, and nothing connects. Next.js shipped in that state through a whole release — three independent defects, none visible to any check short of opening a browser and looking at `reticle status`.
28
+ The last step is the one that earns its keep. Every install bug found so far has been silent: the app boots, the `init` report reads clean, and nothing connects. Next.js shipped in that state through a whole release: three independent defects, none visible to any check short of opening a browser and looking at `reticle status`.
23
29
 
24
30
  ## What stays here
25
31
 
26
- `apps/` — bench-app, next-smoke, the Remix and Astro examples, the Electron and Tauri smoke apps, atlas, and the API. These are the CI gates (`pnpm test:e2e`, `pnpm test:e2e:desktop`), and `integration-coverage.test.ts` fails if one of them goes missing while `SKILL.md` still offers its framework.
32
+ `apps/` holds bench-app, next-smoke, the Remix and Astro examples, the Electron and Tauri smoke apps, atlas, and the API. These are the CI gates (`pnpm test:e2e`, `pnpm test:e2e:desktop`), and `integration-coverage.test.ts` fails if one of them goes missing while `SKILL.md` still offers its framework.
27
33
 
28
34
  The split is: **`apps/` proves the tools work. `reticle-fixtures` proves the install works.**
29
35
 
30
36
  ## Wiring Tier 2 (not yet live)
31
37
 
32
- CI can ask this repo to verify a Reticle commit automatically — the [`vite-ecosystem-ci`](https://github.com/vitejs/vite-ecosystem-ci) shape, where a separate repo holds the downstream apps and the main repo asks it to run. The sending half is built (`fixtures-dispatch` in `.github/workflows/ci.yml`); the receiving half is a template at [`docs/fixtures-dispatch-receiver.yml`](./fixtures-dispatch-receiver.yml).
38
+ CI can ask this repo to verify a Reticle commit automatically, in the [`vite-ecosystem-ci`](https://github.com/vitejs/vite-ecosystem-ci) shape, where a separate repo holds the downstream apps and the main repo asks it to run. The sending half is built (`fixtures-dispatch` in `.github/workflows/ci.yml`); the receiving half is a template at [`docs/fixtures-dispatch-receiver.yml`](./fixtures-dispatch-receiver.yml).
33
39
 
34
40
  **It is inert until two things happen, and neither can be done from inside this repository:**
35
41
 
36
- 1. A fine-grained PAT with **Actions: write** on `reticlehq/reticle-fixtures`, added to `reticlehq/reticle` as the secret `FIXTURES_DISPATCH_TOKEN`. Until it exists the job logs that Tier 2 is unwired and exits 0 — it never reddens CI, because a dispatch failure has nothing to do with the change being pushed.
42
+ 1. A fine-grained PAT with **Actions: write** on `reticlehq/reticle-fixtures`, added to `reticlehq/reticle` as the secret `FIXTURES_DISPATCH_TOKEN`. Until it exists the job logs that Tier 2 is unwired and exits 0. It never reddens CI, because a dispatch failure has nothing to do with the change being pushed.
37
43
  2. The template copied into `reticle-fixtures` as `.github/workflows/verify-on-dispatch.yml`.
38
44
 
39
45
  The template lives in the _sending_ repo deliberately: the two halves must agree on an event name and payload shape, and a contract whose ends live in different repositories drifts the first time somebody edits one of them.