@reticlehq/server 3.6.0 → 3.7.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 (614) hide show
  1. package/SKILL.md +122 -123
  2. package/dist/command/cli/adhoc-suite.d.ts +14 -0
  3. package/dist/command/cli/adhoc-suite.js +42 -7
  4. package/dist/command/cli/adhoc-verdict.d.ts +18 -2
  5. package/dist/command/cli/adhoc-verdict.js +70 -6
  6. package/dist/command/cli/answers/gate-exit.d.ts +23 -0
  7. package/dist/command/cli/answers/gate-exit.js +45 -0
  8. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  9. package/dist/command/cli/answers/gate-hook-message.js +3 -1
  10. package/dist/command/cli/auth/device-flow.d.ts +13 -2
  11. package/dist/command/cli/auth/device-flow.js +17 -0
  12. package/dist/command/cli/cli-doctor.js +14 -0
  13. package/dist/command/cli/cli-flow-commands.d.ts +0 -11
  14. package/dist/command/cli/cli-flow-commands.js +28 -105
  15. package/dist/command/cli/cli-kill.js +3 -2
  16. package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
  17. package/dist/command/cli/cli-parse-grammar.js +75 -0
  18. package/dist/command/cli/cli-parse-verify.d.ts +2 -0
  19. package/dist/command/cli/cli-parse-verify.js +18 -0
  20. package/dist/command/cli/cli-parse.d.ts +19 -28
  21. package/dist/command/cli/cli-parse.js +82 -182
  22. package/dist/command/cli/cli-update-commands.d.ts +1 -1
  23. package/dist/command/cli/cli-update-commands.js +61 -9
  24. package/dist/command/cli/cli-usage.d.ts +33 -0
  25. package/dist/command/cli/cli-usage.js +287 -0
  26. package/dist/command/cli/cli-verify.d.ts +34 -4
  27. package/dist/command/cli/cli-verify.js +81 -12
  28. package/dist/command/cli/cloud-cli.d.ts +13 -0
  29. package/dist/command/cli/cloud-cli.js +145 -333
  30. package/dist/command/cli/cloud-kit.d.ts +12 -0
  31. package/dist/command/cli/cloud-kit.js +41 -2
  32. package/dist/command/cli/cloud-link.d.ts +57 -0
  33. package/dist/command/cli/cloud-link.js +308 -0
  34. package/dist/command/cli/cloud-login.d.ts +15 -1
  35. package/dist/command/cli/cloud-login.js +67 -13
  36. package/dist/command/cli/context-command.d.ts +1 -0
  37. package/dist/command/cli/context-command.js +33 -0
  38. package/dist/command/cli/daemon-start-options.d.ts +3 -0
  39. package/dist/command/cli/daemon-start-options.js +24 -3
  40. package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
  41. package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
  42. package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
  43. package/dist/command/cli/doctor/doctor-project-line.js +5 -4
  44. package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
  45. package/dist/command/cli/doctor/doctor-rows.js +6 -0
  46. package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
  47. package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
  48. package/dist/command/cli/known-regression.d.ts +13 -0
  49. package/dist/command/cli/known-regression.js +34 -0
  50. package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
  51. package/dist/command/cli/launch/sdk-version-match.js +25 -0
  52. package/dist/command/cli/lifecycle/daemon-lifecycle.js +11 -2
  53. package/dist/command/cli/mcp-command.d.ts +6 -0
  54. package/dist/command/cli/mcp-command.js +13 -5
  55. package/dist/command/cli/ports/port-holder.js +1 -1
  56. package/dist/command/cli/project-name.d.ts +29 -1
  57. package/dist/command/cli/project-name.js +107 -2
  58. package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
  59. package/dist/command/cli/setup-mcp-cli.js +29 -8
  60. package/dist/command/cli/status/status-lines.d.ts +1 -0
  61. package/dist/command/cli/status/status-lines.js +47 -2
  62. package/dist/command/cli/status/workspace-links.d.ts +10 -0
  63. package/dist/command/cli/status/workspace-links.js +29 -0
  64. package/dist/command/cli/try-command.d.ts +96 -0
  65. package/dist/command/cli/try-command.js +362 -0
  66. package/dist/command/cli/tutorial.d.ts +0 -100
  67. package/dist/command/cli/tutorial.js +0 -178
  68. package/dist/command/cli/verify-results.d.ts +19 -0
  69. package/dist/command/cli/verify-results.js +29 -0
  70. package/dist/command/cli-onboarding.d.ts +0 -11
  71. package/dist/command/cli-onboarding.js +0 -15
  72. package/dist/command/cli.d.ts +14 -0
  73. package/dist/command/cli.js +103 -83
  74. package/dist/command/daemon/daemon-resilience.js +4 -4
  75. package/dist/command/daemon/daemon-resolve.d.ts +9 -1
  76. package/dist/command/daemon/daemon-resolve.js +49 -10
  77. package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
  78. package/dist/command/setup/bringup/bridge-port.js +13 -3
  79. package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
  80. package/dist/command/setup/bringup/ensure-daemon.js +9 -2
  81. package/dist/command/setup/init/agent-restart.d.ts +23 -0
  82. package/dist/command/setup/init/agent-restart.js +28 -0
  83. package/dist/command/setup/init/init-port.d.ts +10 -1
  84. package/dist/command/setup/init/init-port.js +22 -2
  85. package/dist/command/setup/init/init-runtime.d.ts +12 -2
  86. package/dist/command/setup/init/init-runtime.js +96 -37
  87. package/dist/command/setup/node-effects.d.ts +2 -0
  88. package/dist/command/setup/node-effects.js +36 -8
  89. package/dist/command/setup/probe/existing-app.d.ts +12 -0
  90. package/dist/command/setup/probe/existing-app.js +14 -0
  91. package/dist/command/setup/remaining-steps.js +1 -1
  92. package/dist/command/setup/run-setup.d.ts +29 -9
  93. package/dist/command/setup/run-setup.js +34 -28
  94. package/dist/command/setup/setup-command.d.ts +23 -0
  95. package/dist/command/setup/setup-command.js +57 -4
  96. package/dist/command/setup/setup-mcp.js +25 -2
  97. package/dist/command/setup/tauri-signing.d.ts +19 -0
  98. package/dist/command/setup/tauri-signing.js +79 -0
  99. package/dist/command/setup/terminal/listeners.d.ts +10 -1
  100. package/dist/command/setup/terminal/listeners.js +37 -6
  101. package/dist/command/update/update-nudge.d.ts +9 -0
  102. package/dist/command/update/update-nudge.js +1 -1
  103. package/dist/command/update/updater.js +11 -15
  104. package/dist/command/version/version-nudge.js +3 -0
  105. package/dist/command/version/version-skew.d.ts +20 -1
  106. package/dist/command/version/version-skew.js +38 -2
  107. package/dist/features/crawl/crawl.js +14 -1
  108. package/dist/features/exhaust/ledger.d.ts +14 -14
  109. package/dist/features/harness/drive-report.d.ts +39 -5
  110. package/dist/features/harness/drive-report.js +271 -54
  111. package/dist/features/harness/drive-runs.d.ts +120 -0
  112. package/dist/features/harness/drive-runs.js +289 -0
  113. package/dist/features/harness/drivers.d.ts +1 -1
  114. package/dist/features/harness/drivers.js +1 -1
  115. package/dist/features/harness/explore/console-pages.d.ts +15 -0
  116. package/dist/features/harness/explore/console-pages.js +146 -0
  117. package/dist/features/harness/explore/disparity.d.ts +19 -0
  118. package/dist/features/harness/explore/disparity.js +71 -0
  119. package/dist/features/harness/explore/fake-app.d.ts +16 -0
  120. package/dist/features/harness/explore/fake-app.js +49 -0
  121. package/dist/features/harness/explore/goal-search.d.ts +26 -0
  122. package/dist/features/harness/explore/goal-search.js +144 -0
  123. package/dist/features/harness/explore/page-tree.d.ts +49 -0
  124. package/dist/features/harness/explore/page-tree.js +148 -0
  125. package/dist/features/harness/explore/site-map.d.ts +34 -0
  126. package/dist/features/harness/explore/site-map.js +150 -0
  127. package/dist/features/harness/goals.d.ts +68 -7
  128. package/dist/features/harness/goals.js +289 -36
  129. package/dist/features/harness/harness.d.ts +30 -1
  130. package/dist/features/harness/harness.js +141 -7
  131. package/dist/features/harness/platform/local-apps.d.ts +36 -3
  132. package/dist/features/harness/platform/local-apps.js +81 -5
  133. package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
  134. package/dist/features/harness/platform/persona-credentials.js +69 -0
  135. package/dist/features/harness/platform/platform-drives.d.ts +61 -0
  136. package/dist/features/harness/platform/platform-drives.js +114 -0
  137. package/dist/features/harness/platform/refusal.d.ts +52 -0
  138. package/dist/features/harness/platform/refusal.js +71 -0
  139. package/dist/features/harness/platform/remote-drive.d.ts +8 -2
  140. package/dist/features/harness/platform/remote-drive.js +22 -9
  141. package/dist/features/harness/platform/script.d.ts +57 -11
  142. package/dist/features/harness/platform/script.js +144 -12
  143. package/dist/features/harness/platform/server-driver.d.ts +17 -4
  144. package/dist/features/harness/platform/server-driver.js +29 -26
  145. package/dist/features/harness/platform-config.d.ts +38 -5
  146. package/dist/features/harness/platform-config.js +93 -8
  147. package/dist/features/harness/route-guess.d.ts +13 -0
  148. package/dist/features/harness/route-guess.js +49 -0
  149. package/dist/features/harness/script/script-run.d.ts +30 -1
  150. package/dist/features/harness/script/script-run.js +355 -48
  151. package/dist/features/license/license.d.ts +2 -2
  152. package/dist/features/visual/step-shots.d.ts +31 -0
  153. package/dist/features/visual/step-shots.js +231 -0
  154. package/dist/features/visual/visual-tools.js +22 -14
  155. package/dist/hooks/client-directory.d.ts +18 -0
  156. package/dist/hooks/client-directory.js +57 -0
  157. package/dist/hooks/coding-agents.d.ts +34 -0
  158. package/dist/hooks/coding-agents.js +117 -0
  159. package/dist/hooks/driven-by.d.ts +21 -2
  160. package/dist/hooks/driven-by.js +42 -2
  161. package/dist/hooks/hook-bus.d.ts +4 -0
  162. package/dist/hooks/hook-bus.js +18 -0
  163. package/dist/index.d.ts +1 -0
  164. package/dist/index.js +26 -183
  165. package/dist/judgement/capsule/capsule-store.d.ts +2 -2
  166. package/dist/judgement/capsule/causal-summary.d.ts +15 -1
  167. package/dist/judgement/capsule/causal-summary.js +33 -0
  168. package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
  169. package/dist/judgement/runs/artifact/build-verification-run.js +20 -4
  170. package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
  171. package/dist/judgement/runs/artifact/gap-summary.js +12 -3
  172. package/dist/judgement/runs/artifact/replay-mapping.js +25 -9
  173. package/dist/judgement/runs/artifact/run-store.d.ts +13 -1
  174. package/dist/judgement/runs/artifact/run-store.js +175 -8
  175. package/dist/judgement/runs/context-tools.js +59 -1
  176. package/dist/judgement/runs/default-run-id.d.ts +3 -0
  177. package/dist/judgement/runs/default-run-id.js +16 -0
  178. package/dist/judgement/runs/drive-run.d.ts +53 -5
  179. package/dist/judgement/runs/drive-run.js +234 -20
  180. package/dist/judgement/runs/resume.d.ts +44 -0
  181. package/dist/judgement/runs/resume.js +137 -0
  182. package/dist/judgement/runs/reticle-runner.js +5 -2
  183. package/dist/judgement/runs/runner-port.d.ts +5 -1
  184. package/dist/judgement/runs/runner-port.js +8 -2
  185. package/dist/judgement/runs/verification-sync.d.ts +2 -0
  186. package/dist/judgement/runs/verification-sync.js +36 -15
  187. package/dist/language/flows/decision.js +2 -1
  188. package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
  189. package/dist/language/flows/fields/flow-secret-field.js +25 -2
  190. package/dist/language/flows/flow-anchor.d.ts +7 -2
  191. package/dist/language/flows/flow-anchor.js +10 -3
  192. package/dist/language/flows/flow-intent.d.ts +1 -0
  193. package/dist/language/flows/flow-journey.d.ts +6 -0
  194. package/dist/language/flows/flow-journey.js +20 -0
  195. package/dist/language/flows/flow-learning.d.ts +4 -0
  196. package/dist/language/flows/flow-learning.js +37 -3
  197. package/dist/language/flows/flow-replay-run.js +16 -18
  198. package/dist/language/flows/flow-replay-types.d.ts +1 -1
  199. package/dist/language/flows/flow-replay.d.ts +18 -1
  200. package/dist/language/flows/flow-replay.js +22 -7
  201. package/dist/language/flows/flow-result.d.ts +22 -1
  202. package/dist/language/flows/flow-result.js +47 -2
  203. package/dist/language/flows/flow-step-runners.d.ts +2 -0
  204. package/dist/language/flows/flow-step-runners.js +12 -6
  205. package/dist/language/flows/flow-store-for-session.js +5 -1
  206. package/dist/language/flows/flow-tools.d.ts +10 -0
  207. package/dist/language/flows/flow-tools.js +61 -62
  208. package/dist/language/flows/flows.d.ts +16 -1
  209. package/dist/language/flows/flows.js +69 -10
  210. package/dist/language/flows/narrow-write.d.ts +7 -0
  211. package/dist/language/flows/narrow-write.js +36 -1
  212. package/dist/language/flows/recording/recording-backtrack.js +14 -1
  213. package/dist/language/flows/recording/tape/recordings.d.ts +29 -1
  214. package/dist/language/flows/recording/tape/recordings.js +60 -10
  215. package/dist/language/flows/replay.js +29 -6
  216. package/dist/language/flows/single-replay.d.ts +7 -0
  217. package/dist/language/flows/single-replay.js +26 -0
  218. package/dist/language/flows/verify-change-tools.d.ts +1 -0
  219. package/dist/language/flows/verify-change-tools.js +200 -193
  220. package/dist/memory/cloud/cloud-config.d.ts +10 -1
  221. package/dist/memory/cloud/cloud-config.js +19 -5
  222. package/dist/memory/cloud/cloud-sync.js +3 -3
  223. package/dist/memory/cloud/harness-config.d.ts +49 -0
  224. package/dist/memory/cloud/harness-config.js +16 -20
  225. package/dist/memory/cloud/memory-scope.d.ts +17 -0
  226. package/dist/memory/cloud/memory-scope.js +22 -0
  227. package/dist/memory/cloud/sync-cycle.d.ts +32 -4
  228. package/dist/memory/cloud/sync-cycle.js +113 -12
  229. package/dist/memory/cloud/sync-daemon.d.ts +11 -0
  230. package/dist/memory/cloud/sync-daemon.js +114 -4
  231. package/dist/memory/cloud/sync-disk.js +26 -2
  232. package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
  233. package/dist/memory/cloud/sync-screenshots.js +105 -0
  234. package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
  235. package/dist/memory/cloud/unsynced-roots.js +166 -0
  236. package/dist/memory/impact/account-watch.d.ts +16 -1
  237. package/dist/memory/impact/account-watch.js +26 -1
  238. package/dist/memory/impact/impact-store.d.ts +1 -4
  239. package/dist/memory/impact/impact-store.js +32 -42
  240. package/dist/memory/intent/inline-intent.d.ts +1 -0
  241. package/dist/memory/intent/intent-shard-store.js +16 -4
  242. package/dist/memory/intent/intent-shard.d.ts +12 -0
  243. package/dist/memory/intent/intent-store.d.ts +1 -0
  244. package/dist/memory/intent/intent-tools.js +42 -2
  245. package/dist/memory/intent/open-intents.d.ts +6 -0
  246. package/dist/memory/intent/open-intents.js +10 -1
  247. package/dist/memory/intent/settled-words.d.ts +24 -0
  248. package/dist/memory/intent/settled-words.js +130 -0
  249. package/dist/memory/journal/drive-flow.d.ts +16 -0
  250. package/dist/memory/journal/drive-flow.js +34 -2
  251. package/dist/memory/journal/drive-run-flush.d.ts +2 -0
  252. package/dist/memory/journal/drive-run-flush.js +20 -5
  253. package/dist/memory/journal/journal-recorder.js +46 -3
  254. package/dist/memory/journal/on-disk/retention.d.ts +5 -0
  255. package/dist/memory/journal/on-disk/retention.js +27 -2
  256. package/dist/memory/journal/on-disk/workspace-tiers.js +2 -0
  257. package/dist/memory/journal/session-end.d.ts +15 -1
  258. package/dist/memory/journal/session-end.js +38 -7
  259. package/dist/memory/project/artifact-root-resolver.js +33 -5
  260. package/dist/memory/project/artifact-root.d.ts +4 -3
  261. package/dist/memory/project/artifact-root.js +2 -2
  262. package/dist/memory/project/dir/reticle-dir.d.ts +14 -0
  263. package/dist/memory/project/dir/reticle-dir.js +23 -2
  264. package/dist/memory/project/link-directory.d.ts +15 -0
  265. package/dist/memory/project/link-directory.js +44 -0
  266. package/dist/memory/project/root-claims.d.ts +6 -0
  267. package/dist/memory/project/root-claims.js +39 -0
  268. package/dist/memory/project/session-root.d.ts +2 -0
  269. package/dist/memory/project/session-root.js +9 -1
  270. package/dist/memory/project/sync-status.d.ts +46 -0
  271. package/dist/memory/project/sync-status.js +135 -1
  272. package/dist/memory/recall/memory-tools.js +46 -3
  273. package/dist/memory/recall/platform-memory.d.ts +34 -0
  274. package/dist/memory/recall/platform-memory.js +139 -0
  275. package/dist/memory/recall/project-memory.js +36 -8
  276. package/dist/portal/bridge/bridge.d.ts +9 -5
  277. package/dist/portal/bridge/bridge.js +66 -23
  278. package/dist/portal/bridge/harness-request.d.ts +23 -0
  279. package/dist/portal/bridge/harness-request.js +27 -0
  280. package/dist/portal/bridge/wrong-path.d.ts +17 -0
  281. package/dist/portal/bridge/wrong-path.js +35 -0
  282. package/dist/portal/input/network-mock-tools.js +11 -2
  283. package/dist/portal/input/real-input.d.ts +2 -0
  284. package/dist/portal/input/real-input.js +13 -10
  285. package/dist/portal/pool/browser-pool.d.ts +48 -0
  286. package/dist/portal/pool/browser-pool.js +120 -2
  287. package/dist/portal/pool/context-permissions.d.ts +33 -0
  288. package/dist/portal/pool/context-permissions.js +33 -0
  289. package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
  290. package/dist/portal/pool/lease-marker-stamp.js +49 -0
  291. package/dist/portal/pool/playwright-launcher.d.ts +27 -5
  292. package/dist/portal/pool/playwright-launcher.js +59 -14
  293. package/dist/portal/pool/pool-contract.d.ts +21 -1
  294. package/dist/portal/session/agent-link.d.ts +8 -0
  295. package/dist/portal/session/agent-link.js +17 -0
  296. package/dist/portal/session/command-payload.js +6 -1
  297. package/dist/portal/session/daemon-answers.d.ts +3 -3
  298. package/dist/portal/session/daemon-answers.js +4 -2
  299. package/dist/portal/session/dev-server/dev-command.d.ts +9 -0
  300. package/dist/portal/session/dev-server/dev-command.js +27 -1
  301. package/dist/portal/session/facts/observed-state.d.ts +16 -18
  302. package/dist/portal/session/facts/observed-state.js +46 -3
  303. package/dist/portal/session/human/live-control.d.ts +9 -2
  304. package/dist/portal/session/human/live-control.js +12 -3
  305. package/dist/portal/session/live-control-tools.js +82 -13
  306. package/dist/portal/session/narration-args.d.ts +5 -0
  307. package/dist/portal/session/narration-args.js +17 -0
  308. package/dist/portal/session/no-session-diagnosis.d.ts +1 -1
  309. package/dist/portal/session/no-session-diagnosis.js +31 -9
  310. package/dist/portal/session/no-session-next-action.d.ts +20 -0
  311. package/dist/portal/session/no-session-next-action.js +134 -61
  312. package/dist/portal/session/no-session-watch.js +179 -22
  313. package/dist/portal/session/presence/session-lease.js +1 -1
  314. package/dist/portal/session/recorded-gaps.d.ts +97 -0
  315. package/dist/portal/session/recorded-gaps.js +251 -0
  316. package/dist/portal/session/session-health.d.ts +11 -0
  317. package/dist/portal/session/session-health.js +3 -1
  318. package/dist/portal/session/session-info.js +2 -1
  319. package/dist/portal/session/session-manager.d.ts +18 -0
  320. package/dist/portal/session/session-manager.js +54 -3
  321. package/dist/portal/session/session-successor.d.ts +8 -0
  322. package/dist/portal/session/session-successor.js +1 -1
  323. package/dist/portal/session/session.d.ts +15 -28
  324. package/dist/portal/session/session.js +60 -61
  325. package/dist/portal/session/timing/command-timeout.js +25 -1
  326. package/dist/portal/session/timing/wall-clock.d.ts +1 -1
  327. package/dist/portal/session/timing/wall-clock.js +1 -1
  328. package/dist/portal/session/zero-install-first-call.d.ts +31 -0
  329. package/dist/portal/session/zero-install-first-call.js +88 -0
  330. package/dist/start-options.d.ts +7 -1
  331. package/dist/start-wiring.d.ts +63 -0
  332. package/dist/start-wiring.js +169 -0
  333. package/dist/status-payload.d.ts +13 -1
  334. package/dist/status-payload.js +13 -1
  335. package/dist/surface/http-server.js +7 -1
  336. package/dist/surface/mcp/attach-memory.d.ts +1 -0
  337. package/dist/surface/mcp/attach-memory.js +12 -1
  338. package/dist/surface/mcp/mcp-proxy.d.ts +4 -0
  339. package/dist/surface/mcp/mcp-proxy.js +29 -8
  340. package/dist/surface/mcp/mcp.d.ts +23 -0
  341. package/dist/surface/mcp/mcp.js +34 -4
  342. package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
  343. package/dist/surface/mcp/proxy/drive-calls.js +27 -0
  344. package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
  345. package/dist/surface/mcp/server-instructions.js +22 -14
  346. package/dist/surface/mcp/shared-params.js +1 -1
  347. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  348. package/dist/surface/mcp/surface-vocabulary.js +1 -0
  349. package/dist/surface/tools/account-tool.d.ts +22 -0
  350. package/dist/surface/tools/account-tool.js +157 -0
  351. package/dist/surface/tools/act/act-danger.d.ts +11 -0
  352. package/dist/surface/tools/act/act-danger.js +38 -1
  353. package/dist/surface/tools/act/act-observation.d.ts +33 -0
  354. package/dist/surface/tools/act/act-observation.js +57 -0
  355. package/dist/surface/tools/act/act-preflight.js +25 -2
  356. package/dist/surface/tools/act/act-target.js +8 -3
  357. package/dist/surface/tools/act/resolve-target.d.ts +1 -1
  358. package/dist/surface/tools/act/resolve-target.js +18 -3
  359. package/dist/surface/tools/act/screen-request.d.ts +34 -0
  360. package/dist/surface/tools/act/screen-request.js +113 -0
  361. package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
  362. package/dist/surface/tools/act/sequence-grade.js +13 -2
  363. package/dist/surface/tools/act-sequence-tool.js +136 -27
  364. package/dist/surface/tools/act-tools.d.ts +0 -9
  365. package/dist/surface/tools/act-tools.js +48 -34
  366. package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
  367. package/dist/surface/tools/agent/app-notes-learning.js +80 -0
  368. package/dist/surface/tools/agent/app-notes.d.ts +4 -0
  369. package/dist/surface/tools/agent/app-notes.js +48 -0
  370. package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
  371. package/dist/surface/tools/agent/build-staleness.js +62 -0
  372. package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
  373. package/dist/surface/tools/agent/compact-envelope.js +374 -0
  374. package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
  375. package/dist/surface/tools/agent/for-the-agent.js +44 -0
  376. package/dist/surface/tools/agent/notices.d.ts +50 -0
  377. package/dist/surface/tools/agent/notices.js +152 -0
  378. package/dist/surface/tools/agent/reteach.d.ts +11 -0
  379. package/dist/surface/tools/agent/reteach.js +50 -0
  380. package/dist/surface/tools/args/alias-args.d.ts +5 -0
  381. package/dist/surface/tools/args/alias-args.js +10 -0
  382. package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
  383. package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
  384. package/dist/surface/tools/assert/assert-source.d.ts +15 -0
  385. package/dist/surface/tools/assert/assert-source.js +40 -0
  386. package/dist/surface/tools/assert/assert-verdict.js +25 -15
  387. package/dist/surface/tools/browser-tools.js +43 -1
  388. package/dist/surface/tools/chat-drives.d.ts +75 -0
  389. package/dist/surface/tools/chat-drives.js +265 -21
  390. package/dist/surface/tools/coverage-tools.d.ts +2 -10
  391. package/dist/surface/tools/coverage-tools.js +2 -53
  392. package/dist/surface/tools/dynamic-tools.js +29 -1
  393. package/dist/surface/tools/empty-session-list.d.ts +10 -0
  394. package/dist/surface/tools/empty-session-list.js +45 -5
  395. package/dist/surface/tools/error-recovery.d.ts +8 -0
  396. package/dist/surface/tools/error-recovery.js +69 -5
  397. package/dist/surface/tools/explore-tools.d.ts +23 -2
  398. package/dist/surface/tools/explore-tools.js +377 -74
  399. package/dist/surface/tools/feedback-tools.d.ts +2 -3
  400. package/dist/surface/tools/feedback-tools.js +4 -3
  401. package/dist/surface/tools/gap-novelty.d.ts +3 -1
  402. package/dist/surface/tools/gap-novelty.js +8 -1
  403. package/dist/surface/tools/harness-explore.d.ts +52 -73
  404. package/dist/surface/tools/harness-explore.js +177 -146
  405. package/dist/surface/tools/harness-gate.d.ts +88 -0
  406. package/dist/surface/tools/harness-gate.js +235 -0
  407. package/dist/surface/tools/harness-hunt.d.ts +43 -0
  408. package/dist/surface/tools/harness-hunt.js +215 -0
  409. package/dist/surface/tools/harness-plan.d.ts +5 -0
  410. package/dist/surface/tools/harness-plan.js +7 -0
  411. package/dist/surface/tools/harness-script.d.ts +22 -0
  412. package/dist/surface/tools/harness-script.js +256 -38
  413. package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
  414. package/dist/surface/tools/harness-tab-guard.js +27 -0
  415. package/dist/surface/tools/harness-toolset.d.ts +8 -0
  416. package/dist/surface/tools/harness-toolset.js +27 -4
  417. package/dist/surface/tools/human-notes.d.ts +16 -0
  418. package/dist/surface/tools/human-notes.js +27 -0
  419. package/dist/surface/tools/invoke-tool.d.ts +5 -2
  420. package/dist/surface/tools/invoke-tool.js +220 -93
  421. package/dist/surface/tools/lease-hint.js +26 -5
  422. package/dist/surface/tools/lease-permissions.d.ts +33 -0
  423. package/dist/surface/tools/lease-permissions.js +73 -0
  424. package/dist/surface/tools/lease-readiness.d.ts +38 -0
  425. package/dist/surface/tools/lease-readiness.js +57 -0
  426. package/dist/surface/tools/lease-seed.d.ts +20 -0
  427. package/dist/surface/tools/lease-seed.js +45 -1
  428. package/dist/surface/tools/lease-tools.d.ts +10 -1
  429. package/dist/surface/tools/lease-tools.js +119 -69
  430. package/dist/surface/tools/live-call-text.js +2 -2
  431. package/dist/surface/tools/merge-tools.js +42 -2
  432. package/dist/surface/tools/merged-name-redirect.js +4 -0
  433. package/dist/surface/tools/next-step.d.ts +11 -1
  434. package/dist/surface/tools/next-step.js +73 -18
  435. package/dist/surface/tools/observe-tools.js +43 -5
  436. package/dist/surface/tools/platform-moment.d.ts +60 -0
  437. package/dist/surface/tools/platform-moment.js +132 -4
  438. package/dist/surface/tools/read-tools.js +65 -14
  439. package/dist/surface/tools/reticle-result.d.ts +120 -0
  440. package/dist/surface/tools/reticle-result.js +364 -0
  441. package/dist/surface/tools/tool-kit.d.ts +68 -2
  442. package/dist/surface/tools/tool-kit.js +73 -1
  443. package/dist/surface/tools/tools.js +25 -13
  444. package/dist/telemetry/account-envelope.d.ts +7 -0
  445. package/dist/telemetry/account-envelope.js +61 -0
  446. package/dist/telemetry/agent-client.d.ts +15 -0
  447. package/dist/telemetry/agent-client.js +57 -0
  448. package/dist/telemetry/app-instrumented.js +9 -2
  449. package/dist/telemetry/argument-shape.d.ts +7 -0
  450. package/dist/telemetry/argument-shape.js +86 -1
  451. package/dist/telemetry/automation-hint.d.ts +2 -3
  452. package/dist/telemetry/automation-hint.js +33 -8
  453. package/dist/telemetry/cli-telemetry.js +7 -2
  454. package/dist/telemetry/daemon-telemetry.js +3 -0
  455. package/dist/telemetry/error-fingerprint.d.ts +10 -1
  456. package/dist/telemetry/error-fingerprint.js +61 -5
  457. package/dist/telemetry/feedback-cli.d.ts +0 -13
  458. package/dist/telemetry/feedback-cli.js +0 -77
  459. package/dist/telemetry/feedback.d.ts +13 -0
  460. package/dist/telemetry/feedback.js +183 -17
  461. package/dist/telemetry/harness-run.d.ts +18 -0
  462. package/dist/telemetry/harness-run.js +80 -0
  463. package/dist/telemetry/hud-events.d.ts +16 -0
  464. package/dist/telemetry/hud-events.js +27 -0
  465. package/dist/telemetry/hud-metrics.d.ts +27 -6
  466. package/dist/telemetry/hud-metrics.js +99 -25
  467. package/dist/telemetry/init-telemetry.js +2 -2
  468. package/dist/telemetry/install-source.d.ts +13 -25
  469. package/dist/telemetry/install-source.js +44 -3
  470. package/dist/telemetry/mcp-connection.d.ts +0 -14
  471. package/dist/telemetry/mcp-connection.js +5 -1
  472. package/dist/telemetry/onboarding-firsts.d.ts +32 -0
  473. package/dist/telemetry/onboarding-firsts.js +81 -6
  474. package/dist/telemetry/platform-linked.d.ts +5 -0
  475. package/dist/telemetry/platform-linked.js +32 -0
  476. package/dist/telemetry/project-profile.js +5 -3
  477. package/dist/telemetry/proxy-telemetry.js +4 -1
  478. package/dist/telemetry/session-metrics.d.ts +15 -4
  479. package/dist/telemetry/session-metrics.js +88 -52
  480. package/dist/telemetry/telemetry.d.ts +26 -2
  481. package/dist/telemetry/telemetry.js +102 -21
  482. package/dist/telemetry/verification-of.d.ts +3 -1
  483. package/dist/telemetry/verification-of.js +12 -4
  484. package/dist/wire-journal.d.ts +2 -2
  485. package/dist/wire-journal.js +16 -5
  486. package/docs/README.md +2 -2
  487. package/docs/actions.mdx +6 -3
  488. package/docs/adapters.md +1 -1
  489. package/docs/agent-cheatsheet.md +24 -27
  490. package/docs/architecture.md +5 -5
  491. package/docs/autodrive.md +13 -12
  492. package/docs/benchmarks.md +5 -5
  493. package/docs/best-practices.mdx +27 -9
  494. package/docs/capabilities.mdx +14 -16
  495. package/docs/cli/affected.mdx +1 -1
  496. package/docs/cli/cloud.mdx +54 -75
  497. package/docs/cli/doctor.mdx +8 -3
  498. package/docs/cli/drive.mdx +12 -12
  499. package/docs/cli/feedback.mdx +3 -3
  500. package/docs/cli/gate.mdx +7 -2
  501. package/docs/cli/help.mdx +50 -55
  502. package/docs/cli/init.mdx +32 -15
  503. package/docs/cli/license.mdx +12 -8
  504. package/docs/cli/mcp.mdx +4 -4
  505. package/docs/cli/open.mdx +3 -3
  506. package/docs/cli/report.mdx +4 -2
  507. package/docs/cli/restart.mdx +2 -2
  508. package/docs/cli/rollback.mdx +14 -8
  509. package/docs/cli/serve.mdx +4 -4
  510. package/docs/cli/setup.mdx +23 -0
  511. package/docs/cli/status.mdx +13 -4
  512. package/docs/cli/stop.mdx +67 -8
  513. package/docs/cli/try.mdx +62 -0
  514. package/docs/cli/update.mdx +4 -3
  515. package/docs/cli/verify.mdx +17 -6
  516. package/docs/cli/version.mdx +3 -2
  517. package/docs/cli.mdx +110 -41
  518. package/docs/debugging.md +3 -3
  519. package/docs/deploy-checks.md +1 -1
  520. package/docs/desktop.mdx +5 -3
  521. package/docs/enterprise.md +11 -10
  522. package/docs/environment.mdx +5 -2
  523. package/docs/faq.mdx +3 -3
  524. package/docs/first-drive.md +5 -4
  525. package/docs/flows.md +35 -27
  526. package/docs/for-agents.md +4 -5
  527. package/docs/frameworks.mdx +32 -21
  528. package/docs/getting-started.md +66 -64
  529. package/docs/human-control.md +15 -14
  530. package/docs/index.mdx +15 -43
  531. package/docs/install-agentic.mdx +22 -37
  532. package/docs/install-manual.mdx +22 -12
  533. package/docs/instrumentation.mdx +5 -3
  534. package/docs/integration-patterns.md +7 -7
  535. package/docs/license-activation.mdx +1 -1
  536. package/docs/multi-agent-testing.md +24 -6
  537. package/docs/packages/babel-plugin.mdx +4 -2
  538. package/docs/packages/browser.mdx +16 -10
  539. package/docs/packages/core.mdx +12 -5
  540. package/docs/packages/electron.mdx +3 -2
  541. package/docs/packages/engine.mdx +1 -1
  542. package/docs/packages/eslint-plugin.mdx +18 -12
  543. package/docs/packages/next.mdx +8 -7
  544. package/docs/packages/open-verification.mdx +1 -1
  545. package/docs/packages/server.mdx +5 -5
  546. package/docs/packages/tauri.mdx +8 -8
  547. package/docs/packages/test.mdx +4 -10
  548. package/docs/packages/vite-plugin.mdx +11 -4
  549. package/docs/packages.mdx +11 -15
  550. package/docs/platform-integration.md +6 -5
  551. package/docs/predicates.mdx +40 -24
  552. package/docs/quickstart.mdx +58 -29
  553. package/docs/required-checks.md +8 -7
  554. package/docs/reticle-manual.md +15 -5
  555. package/docs/skill-file.mdx +17 -79
  556. package/docs/skill-setup.md +9 -9
  557. package/docs/skill.md +200 -0
  558. package/docs/system-map.md +7 -7
  559. package/docs/telemetry.md +22 -24
  560. package/docs/testing.md +4 -4
  561. package/docs/token-efficiency.md +12 -12
  562. package/docs/tools/act-and-wait.mdx +9 -2
  563. package/docs/tools/act-sequence.mdx +6 -7
  564. package/docs/tools/act.mdx +2 -2
  565. package/docs/tools/assert.mdx +18 -17
  566. package/docs/tools/console.mdx +9 -9
  567. package/docs/tools/inspect.mdx +16 -7
  568. package/docs/tools/look.mdx +24 -0
  569. package/docs/tools/navigate.mdx +5 -3
  570. package/docs/tools/network.mdx +2 -2
  571. package/docs/tools/observe.mdx +6 -6
  572. package/docs/tools/overview.mdx +34 -33
  573. package/docs/tools/query.mdx +5 -5
  574. package/docs/tools/session-and-feedback.mdx +13 -4
  575. package/docs/tools/sessions.mdx +8 -8
  576. package/docs/tools/snapshot.mdx +6 -5
  577. package/docs/tools/state.mdx +9 -9
  578. package/docs/tools/tools-and-run.mdx +26 -24
  579. package/docs/tools/verify.mdx +28 -0
  580. package/docs/tools/wait-for.mdx +8 -4
  581. package/docs/troubleshooting.mdx +21 -6
  582. package/docs/usage.md +51 -45
  583. package/docs/use-cases.mdx +3 -3
  584. package/docs/vs-chrome-devtools-mcp.mdx +9 -6
  585. package/docs/vs-playwright-mcp.mdx +3 -1
  586. package/docs/what-is-recorded.md +7 -5
  587. package/docs/what-is-reticle.mdx +2 -2
  588. package/docs/why-reticle.mdx +1 -1
  589. package/package.json +6 -5
  590. package/dist/command/cli/demo/demo-page.d.ts +0 -78
  591. package/dist/command/cli/demo/demo-page.js +0 -249
  592. package/dist/command/cli/demo/demo-run.d.ts +0 -38
  593. package/dist/command/cli/demo/demo-run.js +0 -138
  594. package/dist/judgement/hunt/hunt-report.d.ts +0 -49
  595. package/dist/judgement/hunt/hunt-report.js +0 -84
  596. package/dist/language/flows/buddy-status.d.ts +0 -25
  597. package/dist/language/flows/buddy-status.js +0 -32
  598. package/dist/language/flows/change/watch-batcher.d.ts +0 -18
  599. package/dist/language/flows/change/watch-batcher.js +0 -19
  600. package/dist/memory/cloud/harness-offer.d.ts +0 -44
  601. package/dist/memory/cloud/harness-offer.js +0 -145
  602. package/dist/surface/tools/feature-capture.d.ts +0 -151
  603. package/dist/surface/tools/feature-capture.js +0 -235
  604. package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
  605. package/dist/surface/tools/tool-hit-rate.js +0 -90
  606. package/dist/telemetry/harness-drive.d.ts +0 -4
  607. package/dist/telemetry/harness-drive.js +0 -35
  608. package/dist/telemetry/identify.d.ts +0 -22
  609. package/dist/telemetry/identify.js +0 -73
  610. package/docs/cli/capsules.mdx +0 -70
  611. package/docs/cli/hunt.mdx +0 -73
  612. package/docs/cli/identify.mdx +0 -76
  613. package/docs/cli/kill.mdx +0 -91
  614. package/docs/cli/watch.mdx +0 -62
@@ -5,7 +5,7 @@ description: The grammar for declaring what should be true. Every kind, every fi
5
5
  icon: filter
6
6
  ---
7
7
 
8
- A predicate declares what should be true, as `{ kind, ...fields }`. Reticle has twelve kinds: `signal`, `state`, `net`, `route`, `element`, `text`, `console`, `animation`, `settled`, and the combinators `allOf`, `anyOf` and `not`. Which one you pick decides whether a green means anything.
8
+ A predicate declares what should be true, as `{ kind, ...fields }`. Reticle has thirteen kinds: `signal`, `state`, `net`, `route`, `element`, `text`, `console`, `animation`, `settled`, `compare`, and the combinators `allOf`, `anyOf` and `not`. Which one you pick decides whether a green means anything.
9
9
 
10
10
  It is the argument to `until` on [`reticle_act_and_wait`](/tools/act-and-wait), and to `predicate` on [`reticle_assert`](/tools/assert) and [`reticle_assert { action: "wait" }`](/tools/wait-for).
11
11
 
@@ -25,17 +25,19 @@ Reticle grades them, and it will tell you when you have chosen a weak one. This
25
25
 
26
26
  Take the advice. `element` and `text` are convenient and weak; `signal`, `state` and `net` are what make a green trustworthy.
27
27
 
28
- | Kind | Grade | Proves |
29
- | ------------------ | --------- | ------------------------------------------------------ |
30
- | `signal` | strongest | The app declared success in its own words |
31
- | `state` | strong | A registered store actually changed |
32
- | `net` | strong | A specific request fired, with a countable cardinality |
33
- | `route` | medium | Navigation happened |
34
- | `console` | medium | Something logged, or nothing did |
35
- | `element` / `text` | weak | Something rendered. A mock renders too |
36
- | `animation` | weak | An animation ran or finished |
37
- | `settled` | timing | The page went quiet. A precondition, not a proof |
38
- | `compare` | its sides | Two readings agree: the stronger side's grade |
28
+ The verdict reports the grade it proved, strongest first: `signal`, `net`, `state`, then `presence`.
29
+
30
+ | Kind | Grade | Proves |
31
+ | ------------------ | ---------- | ------------------------------------------------------ |
32
+ | `signal` | `signal` | The app declared success in its own words |
33
+ | `net` | `net` | A specific request fired, with a countable cardinality |
34
+ | `state` | `state` | A registered store actually changed |
35
+ | `route` | `presence` | Navigation happened |
36
+ | `console` | `presence` | Something logged, or nothing did |
37
+ | `element` / `text` | `presence` | Something rendered. A mock renders too |
38
+ | `animation` | `presence` | An animation ran or finished |
39
+ | `settled` | `presence` | The page went quiet. A precondition, not a proof |
40
+ | `compare` | its sides | Two readings agree: the stronger side's grade |
39
41
 
40
42
  ## The leaves
41
43
 
@@ -49,7 +51,7 @@ Take the advice. `element` and `text` are convenient and weak; `signal`, `state`
49
51
  }
50
52
  ```
51
53
 
52
- `query` accepts `role`, `name`, `text`, `label`, `placeholder`, `testid`, `alt`, `value`, `by`, `component`, `source`, `scope`, `self`, `attrs`. `state` is one of `visible`, `hidden`, `enabled`, `disabled`, `checked`, `expanded`, `pressed`, `focused`, `inViewport`, `present`.
54
+ `query` accepts `role`, `name`, `text`, `label`, `placeholder`, `testid`, `alt`, `value`, `by`, `component`, `source`, `scope`, `self`, `attrs`, `matchCase`. Written flat on the predicate instead of under `query`, these fields are moved into `query` for you. `state` is one of `visible`, `hidden`, `enabled`, `disabled`, `checked`, `expanded`, `pressed`, `focused`, `inViewport`, `present`.
53
55
 
54
56
  `value` is the one worth knowing about. `{ "role": "textbox", "name": "Amount" }` collapses to "a textbox called Amount exists", which passes against an empty field; adding `value` is what makes it an assertion about what the user will actually send. `by` selects the locator strategy explicitly, `component` and `source` match React component identity and source location, and `self` restricts a scoped match to the scope element itself rather than its descendants.
55
57
 
@@ -69,7 +71,7 @@ Add `"absent": true` to assert something is **gone**. The predicate for a remova
69
71
  { "kind": "text", "contains": "Saved successfully", "visible": true }
70
72
  ```
71
73
 
72
- `contains` is the field the published schema declares. `value` and `text` are accepted as aliases and rewritten to it. `absent: true` asserts the text is not present, and `visible: true` requires it to be on screen rather than merely in the DOM.
74
+ `contains` is the field the published schema declares. `value`, `text` and `query` are accepted as aliases and rewritten to it. The match is case-sensitive; `ignoreCase: true` relaxes that. `absent: true` asserts the text is not present, and `visible: true` requires it to be on screen rather than merely in the DOM.
73
75
 
74
76
  Use `scope` to restrict the search to a CSS selector or element ref. If Reticle reports that the text is split across the scope's children, retry its generated predicate with `"self": true`; that checks the scope root's combined subtree text while still enforcing `contains`.
75
77
 
@@ -121,7 +123,17 @@ Two fields read the RESPONSE BODY, so a request that succeeded with the wrong nu
121
123
 
122
124
  `bodyMatches` is a field match, keyed like `signal.dataMatches` and taking the same operators (`*`, `$gte`, `$contains`). A key can be a dotted path into a wrapped answer: `{ "data.status": "completed" }`, `{ "items.0.id": "a1" }`, `{ "items.length": 3 }`. A nested object written out as a value is compared whole, so use the path to match one field inside it. Reach for it whenever the value is an enum, because that is the case a substring cannot decide: `bodyContains: "completed"` passes on a body carrying `"completedAt": null`, where the needle matched the KEY and the job was still queued. `completed`/`completedAt`, `success`/`successRate`, `sent`/`unsent` all have that shape.
123
125
 
124
- Both require body capture, `reticle({ captureNetworkBodies: true })`, and say so when the body was never recorded rather than reporting an ordinary mismatch.
126
+ Two more read the REQUEST body, what the UI sent: `requestBodyContains` (a substring) and `requestBodyMatches` (a field match, same operators). They are separate fields so neither can be satisfied by the wrong half of the exchange.
127
+
128
+ All four require body capture, `reticle.connect({ captureNetworkBodies: true })`, and say so when the body was never recorded rather than reporting an ordinary mismatch.
129
+
130
+ Some endpoints read over POST: a GraphQL query, a tRPC batch, a query bus, a Server Action that loads a list. When one runs twice in an action window, which React StrictMode does in development, the second call looks like a double submit and the verdict comes back `unknown` with `duplicate-request`. Declare the endpoint a read on its clause:
131
+
132
+ ```json
133
+ { "kind": "net", "method": "POST", "urlContains": "/graphql", "repeatable": true }
134
+ ```
135
+
136
+ `repeatable: true` keeps that endpoint out of `duplicate-request` for this verdict only. The request is still waited for and still counted, so `count` keeps its meaning. It needs a non-empty `urlContains`, and a clause without one is refused, because it would excuse every request in the window. When the clause names a `method`, only calls with that method are excused: a repeatable `GET` never excuses a `POST` to the same URL. Leave it off for an endpoint that writes: there, the second call is the bug.
125
137
 
126
138
  ### route
127
139
 
@@ -129,7 +141,7 @@ Both require body capture, `reticle({ captureNetworkBodies: true })`, and say so
129
141
  { "kind": "route", "pathname": "/success" }
130
142
  ```
131
143
 
132
- `pathname` matches the path exactly. `contains` matches anywhere in the whole route, path, query and fragment together. `path` is accepted as an alias for `pathname`, and `url` and `urlContains` as aliases for `contains`, but the canonical spellings are the ones above.
144
+ `pathname` matches the path exactly. `contains` matches anywhere in the whole route, path, query and fragment together. `path` is accepted as an alias for `pathname`, and `url`, `urlContains` and `pathContains` as aliases for `contains`, but the canonical spellings are the ones above.
133
145
 
134
146
  A passing route verdict quotes the transition itself:
135
147
 
@@ -143,10 +155,12 @@ A passing route verdict quotes the transition itself:
143
155
  }
144
156
  ```
145
157
 
146
- <Warning>
147
- `route` asserts the route **changed**. Asserting the route you are already on always fails, and
148
- the response says so: `expected: "a route change to /"`, `assertion: "route.changed"`.
149
- </Warning>
158
+ <Note>
159
+ `route` reads the last route change in the window. When there was none, it reads the session's
160
+ current URL instead, and the evidence says `decidedBy: "current-route"`. Only when neither exists
161
+ does it fail, and the response says so: `expected: "a route change to /"`, `assertion:
162
+ "route.changed"`.
163
+ </Note>
150
164
 
151
165
  ### console
152
166
 
@@ -156,6 +170,8 @@ A passing route verdict quotes the transition itself:
156
170
 
157
171
  "The flow completed and logged nothing." Worth attaching to most actions. Plenty of features work while quietly throwing.
158
172
 
173
+ `contains` narrows it to one message: with `absent: true` it asserts THIS message did not appear, rather than that nothing was logged at all. `textContains` is accepted as an alias.
174
+
159
175
  ### signal
160
176
 
161
177
  ```json
@@ -269,7 +285,7 @@ A number is read out of displayed text, so `"$1,234.50"` compares as `1234.5`. A
269
285
 
270
286
  These only work where a before-reading was taken, which today is `reticle_act_and_wait`. Asked anywhere else they report `unknown` with "no before-reading was taken", never a failure, because nothing was compared and a `false` would blame the app for a reading nobody took. For the same reason a relative property is never `already_true`: `unchanged` is trivially true against a baseline taken a microsecond earlier, so the pre-action check skips it and lets the action decide.
271
287
 
272
- A saved flow cannot keep one yet: `FlowExpect` has no slot for `satisfies`, and rather than record a weaker assertion than the one you made, the converter records none.
288
+ A saved flow keeps it: a step's `expect` is a full predicate, `satisfies` included.
273
289
 
274
290
  A miss quotes the real value back at you:
275
291
 
@@ -398,7 +414,7 @@ A combinator needs its own `kind`, and the children go in `predicates`, or in `o
398
414
  accepted as an alias for it. `not` takes a single child in `predicate`, or in `of`. A bare
399
415
  `{ "allOf": [ … ] }` does not parse, and neither does `{ "kind": "allOf", "allOf": [ … ] }`.
400
416
 
401
- Reticle refuses the call rather than running half of it. The real refusal names the field, the fix and the consequence: _"predicates: Required; unknown field allOf. Nothing ran, the predicate was not evaluated, so no verdict was produced. allOf accepts: predicates."_ Better to be told than to get a green from an assertion that never executed.
417
+ Reticle refuses the call rather than running half of it. The refusal names the field, says that nothing ran and no verdict was produced, lists the fields `allOf` accepts, and shows a valid example. Better to be told than to get a green from an assertion that never executed.
402
418
 
403
419
  </Warning>
404
420
 
@@ -433,10 +449,10 @@ On a failure each child reports separately too, so you can see which one broke:
433
449
 
434
450
  | Field | Where | What it does |
435
451
  | --- | --- | --- |
436
- | `timeout_ms` | `assert`, `wait_for`, `act_and_wait` | Wait up to N ms for it to become true |
452
+ | `timeout_ms` | `reticle_assert` (both actions), `reticle_act_and_wait` | Wait up to N ms for it to become true |
437
453
  | `since` | `net`, `route`, `console`, `animation` and `signal` leaves, and the call itself | Only consider events after this cursor |
438
454
 
439
- The `since` cursor comes from a prior `reticle_act` response. Use it whenever you are asserting something an action was supposed to cause. Without it, an assertion can pass on an event from two clicks ago. That applies to every one of the five kinds above, not only to network calls: an unscoped `signal` matches a fire from an earlier action just as readily.
455
+ The `since` cursor comes from a prior `reticle_act` or `reticle_observe` response. Use it whenever you are asserting something an action was supposed to cause. Without it, an assertion can pass on an event from two clicks ago. That applies to every one of the five kinds above, not only to network calls: an unscoped `signal` matches a fire from an earlier action just as readily.
440
456
 
441
457
  <Card title="Where predicates get used" icon="circle-check" href="/tools/act-and-wait">
442
458
  Naming the consequence before the action is the whole point.
@@ -5,7 +5,7 @@ description: Install Reticle, connect your coding agent, and get a real verdict
5
5
  icon: rocket
6
6
  ---
7
7
 
8
- **Run the installer once, then ask your agent to verify something in your app; its first Reticle call wires the app (the same thing `reticle init` does, which you can also run yourself).** Reticle embeds a dev-only SDK in your running app and proves a browser session connected. No account needed. Add `reticle connect` later if you want a cloud dashboard.
8
+ **Four steps: run the installer once per machine, run `reticle init` once per project, then optionally `reticle connect` for the dashboard and `reticle sync` to send runs.** Skip `init` and your agent's first `reticle_session` call wires the app instead. Reticle embeds a dev-only SDK in your running app and proves a browser session connected. No account needed for steps 1 and 2.
9
9
 
10
10
  By the end of this page your agent will click a button in your app and prove what happened: the request that fired, the state that changed, and the file to open if it didn't.
11
11
 
@@ -16,7 +16,7 @@ By the end of this page your agent will click a button in your app and prove wha
16
16
 
17
17
  ## Prerequisites
18
18
 
19
- - Node 20 or newer
19
+ - Node 20.11 or newer
20
20
  - A web app you can run locally, and its dev server
21
21
  - A coding agent that speaks MCP (Claude Code, Cursor, Codex, OpenCode, Windsurf, VS Code)
22
22
 
@@ -36,9 +36,9 @@ irm https://raw.githubusercontent.com/reticlehq/reticle/main/install/install.ps1
36
36
 
37
37
  </CodeGroup>
38
38
 
39
- This puts `reticle` on your PATH and registers the MCP server with every coding agent it can reach: Claude Code, Cursor, Windsurf, VS Code, Zed, Gemini CLI, Copilot CLI, OpenCode, Warp, Kiro, Amazon Q, Cline, Amp, Continue and Factory Droid. Nothing is asked.
39
+ This puts `reticle` on your PATH and registers the MCP server with every coding agent it can reach: Claude Code, Cursor, Windsurf, VS Code, Zed, Gemini CLI, Copilot CLI, OpenCode, Antigravity, Warp, Kiro, Amazon Q, Cline, Roo Code, Amp, Continue and Factory Droid. Nothing is asked. It does not wire your app, and says so: that is step 2. Want a verdict first? Signed in, `reticle try <url>` drives a URL once in a window you watch.
40
40
 
41
- Codex CLI keeps a TOML config that Reticle will not rewrite, so the installer prints the lines to paste and the file to paste them into.
41
+ Codex CLI keeps a TOML config that Reticle will not rewrite itself, so with the `codex` command installed the installer registers Reticle through `codex mcp add`. Without it, the installer prints the lines to paste and the file to paste them into.
42
42
 
43
43
  <Note>
44
44
  **Run this before opening your agent, and there is nothing to restart.** A coding agent reads its
@@ -46,7 +46,7 @@ Codex CLI keeps a TOML config that Reticle will not rewrite, so the installer pr
46
46
  you open it. If it was already open, quit and reopen it once.
47
47
  </Note>
48
48
 
49
- Prefer not to pipe a script into a shell? The two commands it runs are:
49
+ Prefer not to pipe a script into a shell? The same result by hand:
50
50
 
51
51
  ```bash
52
52
  npm install -g @reticlehq/server
@@ -61,17 +61,16 @@ In your project directory, before opening your coding agent:
61
61
  RETICLE_INSTALL_SOURCE=docs_site npx @reticlehq/server init
62
62
  ```
63
63
 
64
- This installs the dev-only SDK, wires your build config, starts the dev server, and checks that a browser session connected. Nothing from your project leaves your machine. Open your coding agent once this command finishes; if it was already open during installation, restart it to load the new tools. The `RETICLE_INSTALL_SOURCE` prefix is optional and only tells us which page you installed from. It is idempotent: run it twice and the second run reports what was already done rather than doing it again.
64
+ This installs the dev-only SDK, wires your build config, starts the dev server, and checks that a browser session connected. Nothing from your project leaves your machine. If your dev server was already running, restart it once and hard-reload the tab: it read your build config before `init` edited it. Open your coding agent once this command finishes; if it was already open during installation, restart it to load the new tools. The `RETICLE_INSTALL_SOURCE` prefix is optional and only tells us which page you installed from. It is idempotent: run it twice and the second run reports what was already done rather than doing it again.
65
65
 
66
- Step 1 is once per machine. This step is once per project. **Skipping it is the most common reason Reticle "does nothing":** the agent has the tools, but there is no app on the other end for them to see.
67
-
68
- Want a cloud dashboard too? Run `npx @reticlehq/server connect --project "My App"` instead of, or after, `init`. It does everything `init` does, then opens browser sign-in approval, links this folder to the named cloud project, and sends existing local history. Approve the short code shown in the browser and terminal; the command resumes by itself.
66
+ Step 1 is once per machine. This step is once per project. **Skipping it is a common reason Reticle "does nothing":** the agent has the tools, but there is no app on the other end for them to see.
69
67
 
70
68
  <Note>
71
69
  **Skipped this step?** Ask your agent to verify something in the app. Its first `reticle_session`
72
70
  call finds a project that has never connected, runs `init` there itself, and lists every file it
73
71
  changed under `wired`. Asked about something unrelated, it offers to wire the app instead of doing
74
- it. This works in Claude Code, Codex, Cursor and other MCP agents.
72
+ it. This works in Claude Code, Codex, Cursor and other MCP agents, including a second project
73
+ while Reticle is already running for another one.
75
74
  </Note>
76
75
 
77
76
  Prefer to install the skill and let the agent run setup itself? On Claude Code the plugin registers the MCP server and the skill in one step:
@@ -93,6 +92,7 @@ Useful flags for the local-only `reticle init` path:
93
92
 
94
93
  ```
95
94
  reticle init [--dry-run] [--port N] [--no-mcp] [--no-install] [--app <dir>]
95
+ [--env KEY=VALUE]... [--files-only] [--json] [--relaunch]
96
96
  --app picks WHICH app in a monorepo, when several are found
97
97
  --no-mcp skips MORE than the server registration: also the agent rule files
98
98
  (CLAUDE.md / AGENTS.md / .cursor) and the /reticle command, because all three
@@ -102,13 +102,38 @@ reticle init [--dry-run] [--port N] [--no-mcp] [--no-install] [--app <dir>]
102
102
  Start with `reticle init --dry-run` if you want to see the app changes before anything is written.
103
103
 
104
104
  <Tip>
105
- In a monorepo, `init` will find several apps and ask which one you mean. `--app packages/web`
106
- skips the question.
105
+ In a monorepo, `init` run at the root lists every app it found, each with its own
106
+ `reticle init --app <dir>` line, and stops. Run the line for the app you want: it writes that
107
+ app's files and starts nothing (add `--start` to boot it). With only one app, it wires that one
108
+ without asking.
107
109
  </Tip>
108
110
 
109
111
  Prefer to wire it yourself? See [Manual install](/install-manual). It is about ten lines, and worth reading once even if you let the agent do it, because it explains what the agent actually changed.
110
112
 
111
- ## Step 3. Check the setup
113
+ ## Step 3. Connect the dashboard (optional)
114
+
115
+ Skip this if you only want local verdicts. Everything above works without an account.
116
+
117
+ ```bash
118
+ npx @reticlehq/server connect --project "My App"
119
+ ```
120
+
121
+ `connect` runs Step 2 first if this project isn't wired yet, so you can use it in place of `init`. Then it:
122
+
123
+ 1. Opens a browser so you can sign in, or create a free account at app.reticle.sh. Approve the short code shown in the browser and in the terminal, and the command carries on by itself.
124
+ 2. Links this folder to the cloud project you named, creating it if it doesn't exist. `npx @reticlehq/server status` shows the link.
125
+ 3. Sends the runs and flows already on this machine.
126
+
127
+ After that, every verified run syncs on its own. To sync right now, for example before showing a teammate:
128
+
129
+ ```bash
130
+ npx @reticlehq/server sync # one sync
131
+ npx @reticlehq/server sync --watch # keep syncing while you work
132
+ ```
133
+
134
+ A new account gets 10 free credits to try the Harness. What syncs, and how to switch each part off (`reticle config --runs/--memory/--flows on|off`), is in [What is recorded](/what-is-recorded). In CI, set `RETICLE_API_KEY` instead of signing in.
135
+
136
+ ## Step 4. Check the setup
112
137
 
113
138
  ```bash
114
139
  npx @reticlehq/server doctor
@@ -116,9 +141,9 @@ npx @reticlehq/server doctor
116
141
 
117
142
  `doctor` diagnoses the whole setup in one command: Chromium, the daemon, the port. If something is wrong this is the page you want before you start debugging your app instead.
118
143
 
119
- ## Step 4. Open your app again when you need it
144
+ ## Step 5. Open your app again when you need it
120
145
 
121
- `connect` already started the dev server and opened the app. On a later day, start your dev server as usual, then:
146
+ `init` (or `connect`) already started the dev server and opened the app. On a later day, start your dev server as usual, then:
122
147
 
123
148
  ```bash
124
149
  npx @reticlehq/server open
@@ -128,12 +153,13 @@ This reuses the tab you already have open, or opens one if you don't. The SDK co
128
153
 
129
154
  <Warning>
130
155
  If the browser console says `[Reticle] this page could not open a websocket to …`, your app and
131
- the daemon disagree about the port. Set it explicitly:
132
- `VITE_RETICLE_WS_URL=ws://localhost:4400/reticle` for Vite, or `reticle.connect({url})`. This is
133
- the single most common setup problem, and the console message names the exact address it tried.
156
+ the daemon disagree about the port. Set it explicitly: `RETICLE_PORT=4400 pnpm dev` (Vite
157
+ plugin), `reticle({ port: 4400 })` in `vite.config`, or
158
+ `reticle.connect({ url: 'ws://localhost:4400/reticle' })` by hand. The console
159
+ message names the exact address it tried.
134
160
  </Warning>
135
161
 
136
- ## Step 5. Look at the page
162
+ ## Step 6. Look at the page
137
163
 
138
164
  Ask your agent to take a snapshot. This is what came back from a real app:
139
165
 
@@ -155,7 +181,7 @@ The whole snapshot cost **61 tokens**. This is `mode: "interactive"`, which retu
155
181
 
156
182
  Each control has a `ref` like `e5`. That's the handle for the next step, and it stays valid until the element leaves the DOM, so you don't re-snapshot between actions.
157
183
 
158
- ## Step 6. Act, and prove it
184
+ ## Step 7. Act, and prove it
159
185
 
160
186
  Here is the whole idea of Reticle in one call. Your agent names the expected consequence **before** it acts:
161
187
 
@@ -259,17 +285,19 @@ That third state is the one that matters. Most tools have two outcomes and quiet
259
285
  </Accordion>
260
286
 
261
287
  <Accordion title="Will any of this end up in my production build?">
262
- No. The SDK is dev-only. The Vite plugin declares `apply: 'serve'`, so it is dropped from `vite
263
- build` entirely, and `connect()` self-disables when the build reports `NODE_ENV=production`. The
264
- recommended wiring also guards the call behind `import.meta.env.DEV`, so there are two independent
265
- locks.
288
+ No. The SDK is dev-only. A production `vite build` with the Vite plugin injects nothing and
289
+ replaces the SDK with an inert stub, and `connect()` self-disables when the build reports
290
+ `NODE_ENV=production`. The recommended wiring also guards the call behind `import.meta.env.DEV`,
291
+ so there are two independent locks.
266
292
  </Accordion>
267
293
 
268
294
  <Accordion title="Does my code or my app's data leave my machine?">
269
- No. The daemon runs on your machine and the SDK runs in your browser. No application code, DOM,
270
- network traffic or console output leaves it. Anonymous product analytics are sent unless you opt
271
- out with `npx @reticlehq/server telemetry disable`, and they never include your code or your app's
272
- data.
295
+ Not unless you link a project. The daemon runs on your machine and the SDK runs in your browser.
296
+ Nothing from your app leaves the machine until you link a project (`reticle connect`, or
297
+ `RETICLE_API_KEY` in CI). After that, what syncs is set by `reticle config`, and when the Harness
298
+ drives, the platform sees the steps it drives. Secret values never leave. Anonymous product
299
+ analytics are sent unless you opt out with `npx @reticlehq/server telemetry disable`, and they
300
+ never include your code or your app's data.
273
301
  </Accordion>
274
302
 
275
303
  <Accordion title="What if my framework is not React or Next.js?">
@@ -293,7 +321,8 @@ That third state is the one that matters. Most tools have two outcomes and quiet
293
321
  Emit signals like `auth:granted` so your verdicts get stronger than "the DOM changed".
294
322
  </Card>
295
323
  <Card title="Every tool" icon="list" href="/tools/overview">
296
- The 18 tools your agent sees by default, and the 30 more it can reach on demand.
324
+ The 10 tools your agent sees by default, and the rest it reaches through `reticle_tools` and
325
+ `reticle_run`.
297
326
  </Card>
298
327
  <Card title="Run it in CI" icon="circle-check" href="/testing">
299
328
  Turn this session into a suite that blocks a bad merge.
@@ -9,9 +9,9 @@ That gap is the difference between a gate and a decoration. A decoration still c
9
9
 
10
10
  ## How it works here
11
11
 
12
- `ci.yml` ends in a single job called **`gate`**. It waits on every other job in that file and passes only when each one either succeeded or was legitimately skipped. So one required check, `gate`, covers all fifteen jobs in `ci.yml`.
12
+ `ci.yml` ends in a single job called **`gate`**. It waits on every other job in that file and passes only when each one either succeeded or was legitimately skipped. So one required check, `gate`, covers every other job in `ci.yml` except `fixtures-dispatch`, which notifies another repository and never runs on a pull request.
13
13
 
14
- That trick only reaches so far. A job can only wait on jobs in **its own workflow file**, so the five workflows below cannot be folded into `gate`. Each has to be named in branch protection separately, or it blocks nothing.
14
+ That trick only reaches so far. A job can only wait on jobs in **its own workflow file**, so the other workflows below cannot be folded into `gate`. Each has to be named in branch protection separately, or it blocks nothing.
15
15
 
16
16
  `server/src/ci-aggregate-covers-jobs.test.ts` fails if a new workflow starts running on pull requests without being accounted for, and if a job in `ci.yml` is not watched by `gate`.
17
17
 
@@ -21,13 +21,14 @@ Set these as required status checks on the default branch:
21
21
 
22
22
  | check | what it is | what merges without it |
23
23
  | --- | --- | --- |
24
- | `gate` | every job in `ci.yml`: build, tests, e2e, desktop, install, Rust, Windows, macOS, bench | a red build of any kind |
25
- | `package-quality` | the published packages: exports and types correctness, and the browser SDK's size budget | a package that installs but cannot be imported, or a silently growing SDK |
26
- | `break-gates` | onboarding | a broken first-run experience |
27
- | `codeql` | security scan | a flagged vulnerability |
24
+ | `gate` | every job in `ci.yml`: build, tests, e2e, desktop, install, Rust, Windows, macOS, bench, package quality, the break gates | a red build of any kind (bench and the Windows install cells run only after merge) |
28
25
  | `dco` | contributions are signed off | an unsigned contribution |
29
26
 
30
- `labeler` is deliberately absent. It adds labels to a pull request; there is no result to block on.
27
+ package-quality and the break gates (`launchers`, `early-gates`, `break-matrix`) run as jobs inside `ci.yml` and are covered by `gate`. They used to be separate workflows with no `merge_group` trigger, so requiring them by name would have stalled the queue.
28
+
29
+ CodeQL (`analyze (javascript-typescript)`) runs on pull requests and in the merge queue, but the ruleset does not require it, so a flagged vulnerability is reported rather than blocked.
30
+
31
+ `labeler`, `welcome` and `dependabot-auto-merge` are deliberately absent. They label a pull request, greet a first contribution, and turn on auto-merge for Dependabot updates the queue still gates; there is no result to block on.
31
32
 
32
33
  ## Adding a workflow
33
34
 
@@ -10,7 +10,9 @@ Every row below is a call that was made against a running app and the answer tha
10
10
 
11
11
  `refused (names the fix)` means the error told you what to call instead, so you can correct without reading anything else. `refused (no fix named)` means it did not.
12
12
 
13
- ## reticle_snapshot
13
+ ## reticle_look { action: "page" }
14
+
15
+ Probed as `reticle_snapshot`, its name before the merge, which still answers. Call it as `reticle_look { action: "page" }` and pass the arguments below alongside `action`.
14
16
 
15
17
  | you call it with | you get back | bytes |
16
18
  | --- | --- | --- |
@@ -18,7 +20,9 @@ Every row below is a call that was made against a running app and the answer tha
18
20
  | the documented call: `{"mode":"interactive"}` | ran | 434 |
19
21
  | a value outside the allowed set: `{"mode":"not-a-mode"}` | refused (names the fix) | 236 |
20
22
 
21
- ## reticle_query
23
+ ## reticle_look { action: "find" }
24
+
25
+ Probed as `reticle_query`, its name before the merge, which still answers. Call it as `reticle_look { action: "find" }` and pass the arguments below alongside `action`.
22
26
 
23
27
  | you call it with | you get back | bytes |
24
28
  | --- | --- | --- |
@@ -26,7 +30,9 @@ Every row below is a call that was made against a running app and the answer tha
26
30
  | the documented call: `{"by":"role","value":"button"}` | ran | 200 |
27
31
  | a value outside the allowed set: `{"by":"telepathy","value":"x"}` | refused (names the fix) | 290 |
28
32
 
29
- ## reticle_network
33
+ ## reticle_observe { action: "network" }
34
+
35
+ Probed as `reticle_network`, its name before the merge, which still answers. Call it as `reticle_observe { action: "network" }` and pass the arguments below alongside `action`.
30
36
 
31
37
  | you call it with | you get back | bytes |
32
38
  | --- | --- | --- |
@@ -34,13 +40,17 @@ Every row below is a call that was made against a running app and the answer tha
34
40
  | the documented call: `{"limit":5}` | ran | 1175 |
35
41
  | a number outside its range: `{"limit":-1}` | refused (names the fix) | 222 |
36
42
 
37
- ## reticle_console
43
+ ## reticle_observe { action: "console" }
44
+
45
+ Probed as `reticle_console`, its name before the merge, which still answers. Call it as `reticle_observe { action: "console" }` and pass the arguments below alongside `action`.
38
46
 
39
47
  | you call it with | you get back | bytes |
40
48
  | --- | --- | --- |
41
49
  | an argument the tool does not declare: `{"thisArgDoesNotExist":1}` | refused (names the fix) | 293 |
42
50
 
43
- ## reticle_state
51
+ ## reticle_look { action: "state" }
52
+
53
+ Probed as `reticle_state`, its name before the merge, which still answers. Call it as `reticle_look { action: "state" }` and pass the arguments below alongside `action`.
44
54
 
45
55
  | you call it with | you get back | bytes |
46
56
  | --- | --- | --- |
@@ -1,107 +1,45 @@
1
1
  ---
2
2
  title: 'The SKILL file: paste and go'
3
3
  sidebarTitle: SKILL file
4
- description: One URL you paste into any coding agent to teach it Reticle. How it works, what it contains, and when you need it at all.
4
+ description: One URL you paste into any coding agent to teach it Reticle. Where it lives and what it tells the agent.
5
5
  icon: graduation-cap
6
6
  ---
7
7
 
8
- Paste `https://raw.githubusercontent.com/reticlehq/reticle/main/SKILL.md` into any coding agent and say "read this and set up Reticle". The document tells the agent to run `npx @reticlehq/server init`, which wires the project and gets the app connected, then to do the first run with `reticle_verify { action: "explore", persona: "<the journey worth proving>" }`, and gives it the rules for verifying afterwards. You often do not need the file at all: that one command configures Claude Code, Cursor and nine other agents directly, and the file mostly exists to tell an agent which journey to prove and how to read what comes back.
8
+ `SKILL.md` is one short document written for a coding agent. Its home is this docs site:
9
9
 
10
- `SKILL.md` is a single document you hand to a coding agent. It teaches the agent to install Reticle, wire it into your app, and then drive a verification loop properly. Without you explaining any of it.
11
-
12
- ```
13
- https://raw.githubusercontent.com/reticlehq/reticle/main/SKILL.md
14
- ```
15
-
16
- That URL is live and returns the current version. Paste it into your agent and say "read this and set up Reticle".
17
-
18
- <Note>
19
- You often do not need it. `npx @reticlehq/server init` writes a `/reticle` slash command for
20
- Claude Code automatically, and installs agent rule files for Claude and Cursor. The SKILL file is
21
- for agents that `init` cannot configure, for a from-scratch install, or when you want the agent to
22
- have the full protocol in context rather than a summary.
23
- </Note>
24
-
25
- ## It has two modes, and it picks one itself
26
-
27
- The first thing the document tells an agent to do is check which situation it is in:
28
-
29
- ```bash
30
- cat .reticle.json 2>/dev/null || echo "NOT_FOUND"
31
10
  ```
32
-
33
- - **Not found** → run **Setup mode**: register the MCP server, install the SDK, wire the entry point, validate the connection, and prove it on one flow while the user watches.
34
- - **Found** → run **Test mode**: connect, orient, decide what to test, drive it, report.
35
-
36
- One document, two jobs, no flag for you to remember. The second time you invoke it, it skips straight to the useful part.
37
-
38
- ## What Setup mode actually does
39
-
40
- | Phase | What the agent does |
41
- | --- | --- |
42
- | Save the skill | Store it as `/reticle` so the loop is one word away from then on |
43
- | Run `init`, then the first run | Without asking you questions it can answer itself, naming the journey worth proving as the `persona` |
44
- | Manual fallbacks | Only when `init` could not run: an older CLI that stops after writing files, or the same failure twice |
45
- | Validate | Confirm a session actually connected. Not that a checklist went green |
46
- | Prove it | Drive one real flow while you watch, so the install ends in evidence |
47
-
48
- That last row is the one that matters. Plenty of installs "succeed" and then nothing works. The skill does not consider itself finished until a real flow has produced a real verdict.
49
-
50
- ## What Test mode actually does
51
-
52
- Five phases: connect, orient, decide what to test, run the tests, report. The reporting format is specified, which matters more than it sounds. An agent left to summarise freely will summarise optimistically.
53
-
54
- The rules it operates under are the same ones these docs keep repeating:
55
-
56
- - Only `reticle_act_and_wait` and `reticle_assert` produce a verdict.
57
- - `verified: "unknown"` is not a pass.
58
- - Never weaken a check to make it pass.
59
-
60
- ## Feedback is the first section, on purpose
61
-
62
- Before setup, before anything, the document tells the agent that reporting problems is part of the job. And that this applies **during** setup, which is where Reticle is most likely to break and least likely to hear about it.
63
-
64
- It even covers the case where nothing is installed yet:
65
-
66
- ```bash
67
- npx @reticlehq/server feedback --agent --kind gap "init finished but no session ever connected"
11
+ https://docs.reticle.sh/skill.md
68
12
  ```
69
13
 
70
- That works with no daemon running, which is the entire point. The install that failed halfway is the one worth hearing about, and in that state the MCP tools do not exist.
71
-
72
- <Tip>
73
- It also draws a line that saves everyone time: report defects in **Reticle**. A bug found in the
74
- app under test is Reticle working correctly, and belongs in the answer to the user.
75
- </Tip>
76
-
77
- ## It ships inside the package too
78
-
79
- `SKILL.md` is bundled into `@reticlehq/server` at publish time, alongside a copy of this entire documentation site. So an agent that has already installed Reticle can read it from disk without a network round trip:
14
+ Paste that URL into the agent and say "read this and set up Reticle". It is the canonical file with [Agent Skill](https://agentskills.io) frontmatter (`name`, `description`) added. The repository copy, `https://raw.githubusercontent.com/reticlehq/reticle/main/SKILL.md`, has the same body without the frontmatter, and a test fails if the two ever differ. To install the rules as a skill instead, `npx skills add reticlehq/reticle` installs `reticle` (the Claude Code plugin's shorter restructure of this file, held to the same rules by that test) and the task skills beside it. The same file ships inside the package, so an agent with no network can read it from disk:
80
15
 
81
16
  ```
82
17
  node_modules/@reticlehq/server/SKILL.md
83
18
  node_modules/@reticlehq/server/docs/
84
19
  ```
85
20
 
86
- Handy in a sandbox with no outbound network, which is an increasingly common place for an agent to live.
21
+ The `docs/` folder beside it is a copy of this site.
22
+
23
+ ## What it tells the agent
87
24
 
88
- ## Should you read it?
25
+ It is the critical path and nothing else. Read [SKILL.md](https://github.com/reticlehq/reticle/blob/main/SKILL.md) itself to get the rules exactly right; in short:
89
26
 
90
- Probably not, unless you are curious. It is roughly 60 KB and written for an agent, which means it is exhaustive in the way a runbook is exhaustive. Every fallback, every framework, every failure mode spelled out rather than summarised.
27
+ - **First move:** if the `reticle_*` tools are visible, call `reticle_session { action: "list" }`. If they are not, hand the user the installer line and stop.
28
+ - **Setup is `init`, then the first run.** `init` wires the app and waits for a session. It never drives. A dev server that was already running must be restarted once.
29
+ - **Done means a verdict.** A session listed means the SDK reached the page. Setup is finished when the first run returns a verdict.
30
+ - **Only `verified: "yes"` is a pass.** `unknown` means Reticle could not tell. Never weaken a check to make it pass.
31
+ - **Replay before you drive.** `reticle_verify { action: "change" }` or `{ action: "flows" }` re-verifies saved journeys in one call.
32
+ - **Report problems with Reticle** through `reticle_session { action: "feedback" }`, or `reticle feedback --agent` from the shell.
91
33
 
92
- If you want the human version of the same material, you are already in it:
34
+ ## Do you need it?
35
+
36
+ Often not. The installer registers the MCP server with your agents, and `reticle init` writes agent rule files and a `/reticle` command for Claude Code. The SKILL file is for agents `init` cannot configure, for a from-scratch install, or for an agent you want to hold the rules in context.
93
37
 
94
38
  <CardGroup cols={2}>
95
39
  <Card title="Agentic install" icon="wand-magic-sparkles" href="/install-agentic">
96
40
  What `reticle init` does, with real output.
97
41
  </Card>
98
- <Card title="Manual install" icon="screwdriver-wrench" href="/install-manual">
99
- Every step `init` cannot automate.
100
- </Card>
101
42
  <Card title="Agent cheat sheet" icon="bolt" href="/agent-cheatsheet">
102
43
  The one-screen version of the drive loop.
103
44
  </Card>
104
- <Card title="Best practices" icon="star" href="/best-practices">
105
- The habits that make verdicts worth trusting.
106
- </Card>
107
45
  </CardGroup>