@reticlehq/server 3.5.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 (721) hide show
  1. package/README.md +1 -1
  2. package/SKILL.md +123 -116
  3. package/dist/chromium-launch-options.d.ts +3 -1
  4. package/dist/chromium-launch-options.js +2 -1
  5. package/dist/command/cli/adhoc-suite.d.ts +14 -0
  6. package/dist/command/cli/adhoc-suite.js +42 -7
  7. package/dist/command/cli/adhoc-verdict.d.ts +19 -2
  8. package/dist/command/cli/adhoc-verdict.js +76 -9
  9. package/dist/command/cli/answers/gate-exit.d.ts +23 -0
  10. package/dist/command/cli/answers/gate-exit.js +45 -0
  11. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  12. package/dist/command/cli/answers/gate-hook-message.js +3 -1
  13. package/dist/command/cli/answers/open-note.d.ts +2 -0
  14. package/dist/command/cli/answers/open-note.js +22 -0
  15. package/dist/command/cli/auth/device-flow.d.ts +13 -2
  16. package/dist/command/cli/auth/device-flow.js +17 -0
  17. package/dist/command/cli/cli-doctor.js +14 -0
  18. package/dist/command/cli/cli-flow-commands.d.ts +0 -11
  19. package/dist/command/cli/cli-flow-commands.js +31 -112
  20. package/dist/command/cli/cli-kill.js +3 -2
  21. package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
  22. package/dist/command/cli/cli-parse-grammar.js +75 -0
  23. package/dist/command/cli/cli-parse-verify.d.ts +2 -0
  24. package/dist/command/cli/cli-parse-verify.js +18 -0
  25. package/dist/command/cli/cli-parse.d.ts +19 -28
  26. package/dist/command/cli/cli-parse.js +82 -182
  27. package/dist/command/cli/cli-update-commands.d.ts +1 -1
  28. package/dist/command/cli/cli-update-commands.js +61 -9
  29. package/dist/command/cli/cli-usage.d.ts +33 -0
  30. package/dist/command/cli/cli-usage.js +287 -0
  31. package/dist/command/cli/cli-verify.d.ts +35 -5
  32. package/dist/command/cli/cli-verify.js +114 -35
  33. package/dist/command/cli/cloud-cli.d.ts +13 -0
  34. package/dist/command/cli/cloud-cli.js +192 -341
  35. package/dist/command/cli/cloud-kit.d.ts +12 -0
  36. package/dist/command/cli/cloud-kit.js +41 -2
  37. package/dist/command/cli/cloud-link.d.ts +57 -0
  38. package/dist/command/cli/cloud-link.js +308 -0
  39. package/dist/command/cli/cloud-login.d.ts +22 -0
  40. package/dist/command/cli/cloud-login.js +96 -8
  41. package/dist/command/cli/context-command.d.ts +1 -0
  42. package/dist/command/cli/context-command.js +33 -0
  43. package/dist/command/cli/daemon-start-options.d.ts +3 -0
  44. package/dist/command/cli/daemon-start-options.js +24 -3
  45. package/dist/command/cli/doctor/browser/chromium-hint.d.ts +46 -0
  46. package/dist/command/cli/doctor/browser/chromium-hint.js +99 -1
  47. package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
  48. package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
  49. package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
  50. package/dist/command/cli/doctor/doctor-project-line.js +5 -4
  51. package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
  52. package/dist/command/cli/doctor/doctor-rows.js +6 -0
  53. package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
  54. package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
  55. package/dist/command/cli/drive/drive-attach.d.ts +27 -2
  56. package/dist/command/cli/drive/drive-attach.js +71 -4
  57. package/dist/command/cli/drive/drive-command.d.ts +2 -1
  58. package/dist/command/cli/drive/drive-command.js +13 -7
  59. package/dist/command/cli/known-regression.d.ts +13 -0
  60. package/dist/command/cli/known-regression.js +34 -0
  61. package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
  62. package/dist/command/cli/launch/sdk-version-match.js +25 -0
  63. package/dist/command/cli/lifecycle/daemon-lifecycle.js +15 -3
  64. package/dist/command/cli/mcp-command.d.ts +6 -0
  65. package/dist/command/cli/mcp-command.js +13 -5
  66. package/dist/command/cli/ports/port-holder.d.ts +10 -0
  67. package/dist/command/cli/ports/port-holder.js +25 -1
  68. package/dist/command/cli/project-name.d.ts +29 -1
  69. package/dist/command/cli/project-name.js +107 -2
  70. package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
  71. package/dist/command/cli/setup-mcp-cli.js +35 -12
  72. package/dist/command/cli/status/status-lines.d.ts +1 -0
  73. package/dist/command/cli/status/status-lines.js +47 -2
  74. package/dist/command/cli/status/workspace-links.d.ts +10 -0
  75. package/dist/command/cli/status/workspace-links.js +29 -0
  76. package/dist/command/cli/try-command.d.ts +96 -0
  77. package/dist/command/cli/try-command.js +362 -0
  78. package/dist/command/cli/tutorial.d.ts +0 -100
  79. package/dist/command/cli/tutorial.js +0 -181
  80. package/dist/command/cli/verify-results.d.ts +19 -0
  81. package/dist/command/cli/verify-results.js +29 -0
  82. package/dist/command/cli-onboarding.d.ts +0 -11
  83. package/dist/command/cli-onboarding.js +0 -15
  84. package/dist/command/cli.d.ts +20 -0
  85. package/dist/command/cli.js +130 -104
  86. package/dist/command/daemon/binding/daemon-status-probe.d.ts +2 -0
  87. package/dist/command/daemon/binding/daemon-status-probe.js +1 -0
  88. package/dist/command/daemon/daemon-resilience.js +4 -4
  89. package/dist/command/daemon/daemon-resolve.d.ts +23 -1
  90. package/dist/command/daemon/daemon-resolve.js +79 -9
  91. package/dist/command/setup/agent-writer.d.ts +1 -1
  92. package/dist/command/setup/agent-writer.js +3 -2
  93. package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
  94. package/dist/command/setup/bringup/bridge-port.js +13 -3
  95. package/dist/command/setup/bringup/connect-lease.d.ts +1 -0
  96. package/dist/command/setup/bringup/connect-lease.js +1 -0
  97. package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
  98. package/dist/command/setup/bringup/dev-server-wait.d.ts +8 -0
  99. package/dist/command/setup/bringup/dev-server-wait.js +19 -0
  100. package/dist/command/setup/bringup/ensure-daemon.js +9 -2
  101. package/dist/command/setup/init/agent-restart.d.ts +23 -0
  102. package/dist/command/setup/init/agent-restart.js +28 -0
  103. package/dist/command/setup/init/init-port.d.ts +14 -1
  104. package/dist/command/setup/init/init-port.js +32 -2
  105. package/dist/command/setup/init/init-runtime.d.ts +22 -2
  106. package/dist/command/setup/init/init-runtime.js +114 -38
  107. package/dist/command/setup/node-effects.d.ts +2 -0
  108. package/dist/command/setup/node-effects.js +38 -9
  109. package/dist/command/setup/probe/existing-app.d.ts +12 -0
  110. package/dist/command/setup/probe/existing-app.js +14 -0
  111. package/dist/command/setup/remaining-steps.js +2 -1
  112. package/dist/command/setup/run-setup.d.ts +34 -9
  113. package/dist/command/setup/run-setup.js +65 -51
  114. package/dist/command/setup/setup-command.d.ts +25 -1
  115. package/dist/command/setup/setup-command.js +59 -4
  116. package/dist/command/setup/setup-mcp.js +25 -2
  117. package/dist/command/setup/tauri-signing.d.ts +19 -0
  118. package/dist/command/setup/tauri-signing.js +79 -0
  119. package/dist/command/setup/terminal/listeners.d.ts +10 -1
  120. package/dist/command/setup/terminal/listeners.js +37 -6
  121. package/dist/command/update/update-nudge.d.ts +9 -0
  122. package/dist/command/update/update-nudge.js +1 -1
  123. package/dist/command/update/updater.js +11 -15
  124. package/dist/command/version/version-nudge.js +3 -0
  125. package/dist/command/version/version-skew.d.ts +20 -1
  126. package/dist/command/version/version-skew.js +49 -4
  127. package/dist/features/crawl/crawl-tools.js +4 -0
  128. package/dist/features/crawl/crawl.d.ts +6 -0
  129. package/dist/features/crawl/crawl.js +23 -2
  130. package/dist/features/exhaust/ledger.d.ts +21 -14
  131. package/dist/features/exhaust/ledger.js +35 -9
  132. package/dist/features/harness/app-findings.d.ts +2 -0
  133. package/dist/features/harness/app-findings.js +52 -0
  134. package/dist/features/harness/drive-report.d.ts +61 -1
  135. package/dist/features/harness/drive-report.js +394 -26
  136. package/dist/features/harness/drive-runs.d.ts +120 -0
  137. package/dist/features/harness/drive-runs.js +289 -0
  138. package/dist/features/harness/drivers.d.ts +10 -14
  139. package/dist/features/harness/drivers.js +10 -14
  140. package/dist/features/harness/explore/console-pages.d.ts +15 -0
  141. package/dist/features/harness/explore/console-pages.js +146 -0
  142. package/dist/features/harness/explore/disparity.d.ts +19 -0
  143. package/dist/features/harness/explore/disparity.js +71 -0
  144. package/dist/features/harness/explore/fake-app.d.ts +16 -0
  145. package/dist/features/harness/explore/fake-app.js +49 -0
  146. package/dist/features/harness/explore/goal-search.d.ts +26 -0
  147. package/dist/features/harness/explore/goal-search.js +144 -0
  148. package/dist/features/harness/explore/page-tree.d.ts +49 -0
  149. package/dist/features/harness/explore/page-tree.js +148 -0
  150. package/dist/features/harness/explore/site-map.d.ts +34 -0
  151. package/dist/features/harness/explore/site-map.js +150 -0
  152. package/dist/features/harness/fill-values.d.ts +3 -73
  153. package/dist/features/harness/fill-values.js +3 -169
  154. package/dist/features/harness/goals.d.ts +82 -0
  155. package/dist/features/harness/goals.js +330 -0
  156. package/dist/features/harness/harness.d.ts +51 -1
  157. package/dist/features/harness/harness.js +207 -6
  158. package/dist/features/harness/platform/drive-target.d.ts +30 -0
  159. package/dist/features/harness/platform/drive-target.js +81 -0
  160. package/dist/features/harness/platform/local-apps.d.ts +127 -0
  161. package/dist/features/harness/platform/local-apps.js +280 -0
  162. package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
  163. package/dist/features/harness/platform/persona-credentials.js +69 -0
  164. package/dist/features/harness/platform/platform-drives.d.ts +61 -0
  165. package/dist/features/harness/platform/platform-drives.js +114 -0
  166. package/dist/features/harness/platform/refusal.d.ts +52 -0
  167. package/dist/features/harness/platform/refusal.js +71 -0
  168. package/dist/features/harness/platform/remote-drive.d.ts +186 -0
  169. package/dist/features/harness/platform/remote-drive.js +378 -0
  170. package/dist/features/harness/platform/script.d.ts +94 -0
  171. package/dist/features/harness/platform/script.js +260 -0
  172. package/dist/features/harness/platform/server-driver.d.ts +54 -0
  173. package/dist/features/harness/platform/server-driver.js +182 -0
  174. package/dist/features/harness/platform-config.d.ts +41 -1
  175. package/dist/features/harness/platform-config.js +106 -9
  176. package/dist/features/harness/route-guess.d.ts +13 -0
  177. package/dist/features/harness/route-guess.js +49 -0
  178. package/dist/features/harness/script/app-controls.d.ts +5 -0
  179. package/dist/features/harness/script/app-controls.js +40 -0
  180. package/dist/features/harness/script/lane-ids.d.ts +14 -0
  181. package/dist/features/harness/script/lane-ids.js +16 -0
  182. package/dist/features/harness/script/script-run.d.ts +70 -0
  183. package/dist/features/harness/script/script-run.js +606 -0
  184. package/dist/features/license/license.d.ts +2 -2
  185. package/dist/features/visual/step-shots.d.ts +31 -0
  186. package/dist/features/visual/step-shots.js +231 -0
  187. package/dist/features/visual/visual-tools.d.ts +10 -1
  188. package/dist/features/visual/visual-tools.js +62 -17
  189. package/dist/hooks/client-directory.d.ts +18 -0
  190. package/dist/hooks/client-directory.js +57 -0
  191. package/dist/hooks/coding-agents.d.ts +34 -0
  192. package/dist/hooks/coding-agents.js +117 -0
  193. package/dist/hooks/driven-by.d.ts +23 -0
  194. package/dist/hooks/driven-by.js +56 -0
  195. package/dist/hooks/hook-bus.d.ts +4 -0
  196. package/dist/hooks/hook-bus.js +18 -0
  197. package/dist/hooks/hook-commands.js +15 -4
  198. package/dist/hooks/tool-log.d.ts +9 -0
  199. package/dist/hooks/tool-log.js +29 -0
  200. package/dist/index.d.ts +2 -0
  201. package/dist/index.js +80 -243
  202. package/dist/judgement/capsule/capsule-store.d.ts +2 -2
  203. package/dist/judgement/capsule/causal-summary.d.ts +15 -1
  204. package/dist/judgement/capsule/causal-summary.js +33 -0
  205. package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
  206. package/dist/judgement/runs/artifact/build-verification-run.js +25 -3
  207. package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
  208. package/dist/judgement/runs/artifact/gap-summary.js +12 -3
  209. package/dist/judgement/runs/artifact/replay-mapping.d.ts +1 -1
  210. package/dist/judgement/runs/artifact/replay-mapping.js +37 -11
  211. package/dist/judgement/runs/artifact/run-store.d.ts +14 -2
  212. package/dist/judgement/runs/artifact/run-store.js +195 -3
  213. package/dist/judgement/runs/context-tools.js +59 -1
  214. package/dist/judgement/runs/default-run-id.d.ts +3 -0
  215. package/dist/judgement/runs/default-run-id.js +16 -0
  216. package/dist/judgement/runs/drive-run.d.ts +71 -1
  217. package/dist/judgement/runs/drive-run.js +317 -5
  218. package/dist/judgement/runs/repair-prompt.js +1 -1
  219. package/dist/judgement/runs/resume.d.ts +44 -0
  220. package/dist/judgement/runs/resume.js +137 -0
  221. package/dist/judgement/runs/reticle-runner.js +13 -3
  222. package/dist/judgement/runs/runner-port.d.ts +5 -1
  223. package/dist/judgement/runs/runner-port.js +8 -2
  224. package/dist/judgement/runs/verification-sync.d.ts +5 -2
  225. package/dist/judgement/runs/verification-sync.js +40 -18
  226. package/dist/language/flows/change/gate.d.ts +10 -0
  227. package/dist/language/flows/change/gate.js +22 -0
  228. package/dist/language/flows/decision.js +36 -1
  229. package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
  230. package/dist/language/flows/fields/flow-secret-field.js +25 -2
  231. package/dist/language/flows/flow-anchor.d.ts +61 -10
  232. package/dist/language/flows/flow-anchor.js +98 -6
  233. package/dist/language/flows/flow-cross-step.d.ts +15 -0
  234. package/dist/language/flows/flow-cross-step.js +21 -0
  235. package/dist/language/flows/flow-intent.d.ts +1 -0
  236. package/dist/language/flows/flow-journey.d.ts +6 -0
  237. package/dist/language/flows/flow-journey.js +20 -0
  238. package/dist/language/flows/flow-learning.d.ts +4 -0
  239. package/dist/language/flows/flow-learning.js +45 -14
  240. package/dist/language/flows/flow-mutate-tools.js +5 -3
  241. package/dist/language/flows/flow-replay-run.d.ts +23 -9
  242. package/dist/language/flows/flow-replay-run.js +115 -110
  243. package/dist/language/flows/flow-replay-types.d.ts +1 -1
  244. package/dist/language/flows/flow-replay.d.ts +40 -1
  245. package/dist/language/flows/flow-replay.js +110 -22
  246. package/dist/language/flows/flow-result.d.ts +22 -1
  247. package/dist/language/flows/flow-result.js +47 -2
  248. package/dist/language/flows/flow-scope.js +5 -1
  249. package/dist/language/flows/flow-step-runners.d.ts +22 -2
  250. package/dist/language/flows/flow-step-runners.js +247 -47
  251. package/dist/language/flows/flow-store-for-session.d.ts +2 -2
  252. package/dist/language/flows/flow-store-for-session.js +7 -3
  253. package/dist/language/flows/flow-tools.d.ts +10 -0
  254. package/dist/language/flows/flow-tools.js +112 -89
  255. package/dist/language/flows/flows.d.ts +16 -1
  256. package/dist/language/flows/flows.js +74 -12
  257. package/dist/language/flows/heal-run.js +6 -4
  258. package/dist/language/flows/narrow-write.d.ts +7 -0
  259. package/dist/language/flows/narrow-write.js +36 -1
  260. package/dist/language/flows/recording/flake.d.ts +2 -2
  261. package/dist/language/flows/recording/recording-backtrack.js +14 -1
  262. package/dist/language/flows/recording/tape/recordings.d.ts +58 -4
  263. package/dist/language/flows/recording/tape/recordings.js +95 -13
  264. package/dist/language/flows/replay-from-hud.d.ts +20 -0
  265. package/dist/language/flows/replay-from-hud.js +51 -0
  266. package/dist/language/flows/replay.d.ts +9 -5
  267. package/dist/language/flows/replay.js +56 -15
  268. package/dist/language/flows/single-replay.d.ts +7 -0
  269. package/dist/language/flows/single-replay.js +26 -0
  270. package/dist/language/flows/suite/suite-flakes.js +2 -0
  271. package/dist/language/flows/suite-selection.d.ts +2 -15
  272. package/dist/language/flows/suite-selection.js +4 -3
  273. package/dist/language/flows/verify-change-tools.d.ts +1 -0
  274. package/dist/language/flows/verify-change-tools.js +202 -191
  275. package/dist/launch-chromium.d.ts +27 -5
  276. package/dist/launch-chromium.js +38 -8
  277. package/dist/memory/cloud/cloud-config.d.ts +22 -1
  278. package/dist/memory/cloud/cloud-config.js +34 -5
  279. package/dist/memory/cloud/cloud-sync.d.ts +17 -14
  280. package/dist/memory/cloud/cloud-sync.js +15 -4
  281. package/dist/memory/cloud/harness-config.d.ts +75 -1
  282. package/dist/memory/cloud/harness-config.js +115 -24
  283. package/dist/memory/cloud/hud-notices-source.d.ts +21 -0
  284. package/dist/memory/cloud/hud-notices-source.js +128 -0
  285. package/dist/memory/cloud/memory-scope.d.ts +161 -0
  286. package/dist/memory/cloud/memory-scope.js +227 -0
  287. package/dist/memory/cloud/sync-cycle.d.ts +44 -7
  288. package/dist/memory/cloud/sync-cycle.js +129 -15
  289. package/dist/memory/cloud/sync-daemon.d.ts +11 -0
  290. package/dist/memory/cloud/sync-daemon.js +121 -9
  291. package/dist/memory/cloud/sync-disk.d.ts +1 -1
  292. package/dist/memory/cloud/sync-disk.js +31 -10
  293. package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
  294. package/dist/memory/cloud/sync-screenshots.js +105 -0
  295. package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
  296. package/dist/memory/cloud/unsynced-roots.js +166 -0
  297. package/dist/memory/impact/account-watch.d.ts +34 -0
  298. package/dist/memory/impact/account-watch.js +59 -0
  299. package/dist/memory/impact/impact-recorder.d.ts +8 -0
  300. package/dist/memory/impact/impact-recorder.js +12 -2
  301. package/dist/memory/impact/impact-store.d.ts +17 -4
  302. package/dist/memory/impact/impact-store.js +169 -63
  303. package/dist/memory/intent/inline-intent.d.ts +1 -0
  304. package/dist/memory/intent/intent-shard-store.js +16 -4
  305. package/dist/memory/intent/intent-shard.d.ts +14 -2
  306. package/dist/memory/intent/intent-store.d.ts +1 -0
  307. package/dist/memory/intent/intent-tools.js +122 -4
  308. package/dist/memory/intent/open-intents.d.ts +6 -0
  309. package/dist/memory/intent/open-intents.js +10 -1
  310. package/dist/memory/intent/settled-words.d.ts +24 -0
  311. package/dist/memory/intent/settled-words.js +130 -0
  312. package/dist/memory/journal/drive-flow.d.ts +16 -0
  313. package/dist/memory/journal/drive-flow.js +34 -2
  314. package/dist/memory/journal/drive-run-flush.d.ts +2 -0
  315. package/dist/memory/journal/drive-run-flush.js +20 -5
  316. package/dist/memory/journal/envelope.d.ts +8 -8
  317. package/dist/memory/journal/journal-recorder.js +52 -3
  318. package/dist/memory/journal/on-disk/retention.d.ts +8 -0
  319. package/dist/memory/journal/on-disk/retention.js +32 -2
  320. package/dist/memory/journal/on-disk/startup-maintenance.js +3 -1
  321. package/dist/memory/journal/on-disk/workspace-tiers.js +9 -4
  322. package/dist/memory/journal/session-end.d.ts +15 -1
  323. package/dist/memory/journal/session-end.js +42 -9
  324. package/dist/memory/project/artifact-root-resolver.d.ts +26 -1
  325. package/dist/memory/project/artifact-root-resolver.js +125 -16
  326. package/dist/memory/project/artifact-root.d.ts +46 -8
  327. package/dist/memory/project/artifact-root.js +89 -10
  328. package/dist/memory/project/dir/reticle-dir.d.ts +18 -2
  329. package/dist/memory/project/dir/reticle-dir.js +26 -3
  330. package/dist/memory/project/link-directory.d.ts +15 -0
  331. package/dist/memory/project/link-directory.js +44 -0
  332. package/dist/memory/project/project-tools.js +22 -3
  333. package/dist/memory/project/root-claims.d.ts +6 -0
  334. package/dist/memory/project/root-claims.js +39 -0
  335. package/dist/memory/project/session-root.d.ts +26 -1
  336. package/dist/memory/project/session-root.js +49 -5
  337. package/dist/memory/project/sync-status.d.ts +85 -0
  338. package/dist/memory/project/sync-status.js +224 -0
  339. package/dist/memory/recall/memory-tools.js +47 -2
  340. package/dist/memory/recall/platform-memory.d.ts +34 -0
  341. package/dist/memory/recall/platform-memory.js +139 -0
  342. package/dist/memory/recall/project-memory.d.ts +19 -0
  343. package/dist/memory/recall/project-memory.js +80 -13
  344. package/dist/portal/bridge/bridge.d.ts +9 -3
  345. package/dist/portal/bridge/bridge.js +82 -22
  346. package/dist/portal/bridge/harness-request.d.ts +23 -0
  347. package/dist/portal/bridge/harness-request.js +27 -0
  348. package/dist/portal/bridge/pairing-token.d.ts +9 -0
  349. package/dist/portal/bridge/pairing-token.js +17 -0
  350. package/dist/portal/bridge/wrong-path.d.ts +17 -0
  351. package/dist/portal/bridge/wrong-path.js +35 -0
  352. package/dist/portal/input/network-mock-tools.js +11 -2
  353. package/dist/portal/input/real-input.d.ts +83 -10
  354. package/dist/portal/input/real-input.js +218 -30
  355. package/dist/portal/input/viewport-tools.js +3 -3
  356. package/dist/portal/pool/browser-pool.d.ts +70 -9
  357. package/dist/portal/pool/browser-pool.js +190 -37
  358. package/dist/portal/pool/context-permissions.d.ts +33 -0
  359. package/dist/portal/pool/context-permissions.js +33 -0
  360. package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
  361. package/dist/portal/pool/lease-marker-stamp.js +49 -0
  362. package/dist/portal/pool/playwright-launcher.d.ts +35 -0
  363. package/dist/portal/pool/playwright-launcher.js +64 -3
  364. package/dist/portal/pool/pool-contract.d.ts +28 -5
  365. package/dist/portal/session/agent-link.d.ts +8 -0
  366. package/dist/portal/session/agent-link.js +17 -0
  367. package/dist/portal/session/command-payload.d.ts +8 -0
  368. package/dist/portal/session/command-payload.js +24 -0
  369. package/dist/portal/session/daemon-answers.d.ts +3 -3
  370. package/dist/portal/session/daemon-answers.js +4 -2
  371. package/dist/portal/session/dev-server/dev-command.d.ts +21 -0
  372. package/dist/portal/session/dev-server/dev-command.js +87 -12
  373. package/dist/portal/session/facts/departure-note.d.ts +22 -0
  374. package/dist/portal/session/facts/departure-note.js +47 -0
  375. package/dist/portal/session/facts/observed-state.d.ts +16 -18
  376. package/dist/portal/session/facts/observed-state.js +46 -3
  377. package/dist/portal/session/facts/session-replaced.d.ts +5 -0
  378. package/dist/portal/session/facts/session-replaced.js +5 -0
  379. package/dist/portal/session/first-run-wiring.d.ts +42 -0
  380. package/dist/portal/session/first-run-wiring.js +132 -0
  381. package/dist/portal/session/human/live-control.d.ts +9 -2
  382. package/dist/portal/session/human/live-control.js +12 -3
  383. package/dist/portal/session/human/notes-ledger.d.ts +20 -0
  384. package/dist/portal/session/human/notes-ledger.js +55 -0
  385. package/dist/portal/session/human/review-store.d.ts +12 -0
  386. package/dist/portal/session/human/review-store.js +18 -10
  387. package/dist/portal/session/live-control-tools.d.ts +0 -13
  388. package/dist/portal/session/live-control-tools.js +107 -13
  389. package/dist/portal/session/narration-args.d.ts +5 -0
  390. package/dist/portal/session/narration-args.js +17 -0
  391. package/dist/portal/session/no-session-diagnosis.d.ts +8 -1
  392. package/dist/portal/session/no-session-diagnosis.js +46 -9
  393. package/dist/portal/session/no-session-next-action.d.ts +31 -0
  394. package/dist/portal/session/no-session-next-action.js +159 -60
  395. package/dist/portal/session/no-session-watch.d.ts +14 -1
  396. package/dist/portal/session/no-session-watch.js +227 -17
  397. package/dist/portal/session/presence/session-lease.js +1 -1
  398. package/dist/portal/session/presence/session-mirror.js +3 -0
  399. package/dist/portal/session/recorded-gaps.d.ts +97 -0
  400. package/dist/portal/session/recorded-gaps.js +251 -0
  401. package/dist/portal/session/serving-directory.d.ts +27 -0
  402. package/dist/portal/session/serving-directory.js +45 -0
  403. package/dist/portal/session/session-health.d.ts +18 -0
  404. package/dist/portal/session/session-health.js +9 -1
  405. package/dist/portal/session/session-info.d.ts +8 -1
  406. package/dist/portal/session/session-info.js +8 -1
  407. package/dist/portal/session/session-manager.d.ts +39 -0
  408. package/dist/portal/session/session-manager.js +98 -11
  409. package/dist/portal/session/session-reaper.js +4 -1
  410. package/dist/portal/session/session-successor.d.ts +13 -0
  411. package/dist/portal/session/session-successor.js +1 -1
  412. package/dist/portal/session/session-tools.js +26 -3
  413. package/dist/portal/session/session.d.ts +22 -30
  414. package/dist/portal/session/session.js +81 -79
  415. package/dist/portal/session/timing/command-timeout.js +25 -1
  416. package/dist/portal/session/timing/wall-clock.d.ts +1 -1
  417. package/dist/portal/session/timing/wall-clock.js +1 -1
  418. package/dist/portal/session/zero-install-first-call.d.ts +31 -0
  419. package/dist/portal/session/zero-install-first-call.js +88 -0
  420. package/dist/start-options.d.ts +12 -0
  421. package/dist/start-wiring.d.ts +63 -0
  422. package/dist/start-wiring.js +169 -0
  423. package/dist/status-payload.d.ts +23 -1
  424. package/dist/status-payload.js +36 -1
  425. package/dist/surface/http-server.js +18 -2
  426. package/dist/surface/mcp/attach-memory.d.ts +1 -0
  427. package/dist/surface/mcp/attach-memory.js +12 -1
  428. package/dist/surface/mcp/mcp-proxy.d.ts +9 -0
  429. package/dist/surface/mcp/mcp-proxy.js +65 -13
  430. package/dist/surface/mcp/mcp.d.ts +34 -6
  431. package/dist/surface/mcp/mcp.js +61 -17
  432. package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
  433. package/dist/surface/mcp/proxy/drive-calls.js +27 -0
  434. package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
  435. package/dist/surface/mcp/server-instructions.d.ts +4 -2
  436. package/dist/surface/mcp/server-instructions.js +32 -14
  437. package/dist/surface/mcp/shared-params.js +2 -2
  438. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  439. package/dist/surface/mcp/surface-vocabulary.js +1 -0
  440. package/dist/surface/tools/account-tool.d.ts +22 -0
  441. package/dist/surface/tools/account-tool.js +157 -0
  442. package/dist/surface/tools/act/act-danger.d.ts +11 -0
  443. package/dist/surface/tools/act/act-danger.js +38 -1
  444. package/dist/surface/tools/act/act-observation.d.ts +33 -0
  445. package/dist/surface/tools/act/act-observation.js +57 -0
  446. package/dist/surface/tools/act/act-preflight.js +25 -2
  447. package/dist/surface/tools/act/act-target.js +8 -3
  448. package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +8 -0
  449. package/dist/surface/tools/act/navigation/navigate-arrival.js +56 -2
  450. package/dist/surface/tools/act/resolve-target.d.ts +1 -1
  451. package/dist/surface/tools/act/resolve-target.js +18 -3
  452. package/dist/surface/tools/act/screen-request.d.ts +34 -0
  453. package/dist/surface/tools/act/screen-request.js +113 -0
  454. package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
  455. package/dist/surface/tools/act/sequence-grade.js +13 -2
  456. package/dist/surface/tools/act/settle-in-flight.js +25 -3
  457. package/dist/surface/tools/act-sequence-tool.js +138 -29
  458. package/dist/surface/tools/act-tools.d.ts +0 -9
  459. package/dist/surface/tools/act-tools.js +71 -41
  460. package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
  461. package/dist/surface/tools/agent/app-notes-learning.js +80 -0
  462. package/dist/surface/tools/agent/app-notes.d.ts +4 -0
  463. package/dist/surface/tools/agent/app-notes.js +48 -0
  464. package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
  465. package/dist/surface/tools/agent/build-staleness.js +62 -0
  466. package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
  467. package/dist/surface/tools/agent/compact-envelope.js +374 -0
  468. package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
  469. package/dist/surface/tools/agent/for-the-agent.js +44 -0
  470. package/dist/surface/tools/agent/notices.d.ts +50 -0
  471. package/dist/surface/tools/agent/notices.js +152 -0
  472. package/dist/surface/tools/agent/reteach.d.ts +11 -0
  473. package/dist/surface/tools/agent/reteach.js +50 -0
  474. package/dist/surface/tools/args/alias-args.d.ts +5 -0
  475. package/dist/surface/tools/args/alias-args.js +10 -0
  476. package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
  477. package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
  478. package/dist/surface/tools/assert/assert-source.d.ts +15 -0
  479. package/dist/surface/tools/assert/assert-source.js +40 -0
  480. package/dist/surface/tools/assert/assert-verdict.d.ts +1 -1
  481. package/dist/surface/tools/assert/assert-verdict.js +42 -17
  482. package/dist/surface/tools/browser-tools.js +51 -2
  483. package/dist/surface/tools/chat-drives.d.ts +101 -0
  484. package/dist/surface/tools/chat-drives.js +409 -0
  485. package/dist/surface/tools/coverage-tools.d.ts +2 -10
  486. package/dist/surface/tools/coverage-tools.js +2 -53
  487. package/dist/surface/tools/dynamic-tools.js +29 -1
  488. package/dist/surface/tools/empty-session-list.d.ts +51 -0
  489. package/dist/surface/tools/empty-session-list.js +120 -0
  490. package/dist/surface/tools/error-recovery.d.ts +14 -0
  491. package/dist/surface/tools/error-recovery.js +105 -8
  492. package/dist/surface/tools/explore-tools.d.ts +31 -1
  493. package/dist/surface/tools/explore-tools.js +438 -66
  494. package/dist/surface/tools/feedback-tools.d.ts +2 -3
  495. package/dist/surface/tools/feedback-tools.js +18 -3
  496. package/dist/surface/tools/gap-novelty.d.ts +3 -1
  497. package/dist/surface/tools/gap-novelty.js +8 -1
  498. package/dist/surface/tools/harness-explore.d.ts +118 -57
  499. package/dist/surface/tools/harness-explore.js +344 -292
  500. package/dist/surface/tools/harness-gate.d.ts +88 -0
  501. package/dist/surface/tools/harness-gate.js +235 -0
  502. package/dist/surface/tools/harness-hunt.d.ts +43 -0
  503. package/dist/surface/tools/harness-hunt.js +215 -0
  504. package/dist/surface/tools/harness-plan.d.ts +17 -0
  505. package/dist/surface/tools/harness-plan.js +38 -0
  506. package/dist/surface/tools/harness-script.d.ts +30 -0
  507. package/dist/surface/tools/harness-script.js +560 -0
  508. package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
  509. package/dist/surface/tools/harness-tab-guard.js +27 -0
  510. package/dist/surface/tools/harness-toolset.d.ts +22 -1
  511. package/dist/surface/tools/harness-toolset.js +101 -7
  512. package/dist/surface/tools/human-notes.d.ts +16 -0
  513. package/dist/surface/tools/human-notes.js +27 -0
  514. package/dist/surface/tools/invoke-tool.d.ts +5 -2
  515. package/dist/surface/tools/invoke-tool.js +263 -85
  516. package/dist/surface/tools/lease-hint.js +26 -5
  517. package/dist/surface/tools/lease-permissions.d.ts +33 -0
  518. package/dist/surface/tools/lease-permissions.js +73 -0
  519. package/dist/surface/tools/lease-readiness.d.ts +38 -0
  520. package/dist/surface/tools/lease-readiness.js +57 -0
  521. package/dist/surface/tools/lease-seed.d.ts +49 -0
  522. package/dist/surface/tools/lease-seed.js +167 -0
  523. package/dist/surface/tools/lease-tools.d.ts +13 -24
  524. package/dist/surface/tools/lease-tools.js +146 -197
  525. package/dist/surface/tools/live-call-text.js +4 -4
  526. package/dist/surface/tools/merge-tools.js +42 -2
  527. package/dist/surface/tools/merged-name-redirect.js +4 -0
  528. package/dist/surface/tools/next-step.d.ts +29 -0
  529. package/dist/surface/tools/next-step.js +214 -0
  530. package/dist/surface/tools/observe-tools.js +45 -9
  531. package/dist/surface/tools/platform-moment.d.ts +72 -0
  532. package/dist/surface/tools/platform-moment.js +296 -0
  533. package/dist/surface/tools/query-hint-schema.d.ts +7 -0
  534. package/dist/surface/tools/query-hint-schema.js +10 -0
  535. package/dist/surface/tools/read-tools.js +71 -14
  536. package/dist/surface/tools/real-input-attempt.js +96 -13
  537. package/dist/surface/tools/reticle-result.d.ts +120 -0
  538. package/dist/surface/tools/reticle-result.js +364 -0
  539. package/dist/surface/tools/tool-kit.d.ts +83 -3
  540. package/dist/surface/tools/tool-kit.js +77 -7
  541. package/dist/surface/tools/tools.js +43 -59
  542. package/dist/telemetry/account-envelope.d.ts +7 -0
  543. package/dist/telemetry/account-envelope.js +61 -0
  544. package/dist/telemetry/agent-client.d.ts +15 -0
  545. package/dist/telemetry/agent-client.js +57 -0
  546. package/dist/telemetry/app-instrumented.js +9 -2
  547. package/dist/telemetry/argument-shape.d.ts +7 -0
  548. package/dist/telemetry/argument-shape.js +86 -1
  549. package/dist/telemetry/automation-hint.d.ts +2 -3
  550. package/dist/telemetry/automation-hint.js +33 -8
  551. package/dist/telemetry/cli-telemetry.js +7 -2
  552. package/dist/telemetry/daemon-telemetry.js +3 -0
  553. package/dist/telemetry/error-fingerprint.d.ts +10 -1
  554. package/dist/telemetry/error-fingerprint.js +61 -5
  555. package/dist/telemetry/feedback-cli.d.ts +0 -13
  556. package/dist/telemetry/feedback-cli.js +0 -77
  557. package/dist/telemetry/feedback.d.ts +13 -0
  558. package/dist/telemetry/feedback.js +183 -17
  559. package/dist/telemetry/harness-run.d.ts +18 -0
  560. package/dist/telemetry/harness-run.js +80 -0
  561. package/dist/telemetry/hud-events.d.ts +16 -0
  562. package/dist/telemetry/hud-events.js +27 -0
  563. package/dist/telemetry/hud-metrics.d.ts +29 -6
  564. package/dist/telemetry/hud-metrics.js +116 -25
  565. package/dist/telemetry/init-telemetry.js +2 -2
  566. package/dist/telemetry/install-source.d.ts +13 -25
  567. package/dist/telemetry/install-source.js +44 -3
  568. package/dist/telemetry/mcp-connection.d.ts +0 -14
  569. package/dist/telemetry/mcp-connection.js +5 -1
  570. package/dist/telemetry/onboarding-firsts.d.ts +32 -0
  571. package/dist/telemetry/onboarding-firsts.js +81 -6
  572. package/dist/telemetry/platform-linked.d.ts +5 -0
  573. package/dist/telemetry/platform-linked.js +32 -0
  574. package/dist/telemetry/project-profile.js +5 -3
  575. package/dist/telemetry/proxy-telemetry.js +4 -1
  576. package/dist/telemetry/session-metrics.d.ts +15 -4
  577. package/dist/telemetry/session-metrics.js +88 -52
  578. package/dist/telemetry/telemetry.d.ts +38 -2
  579. package/dist/telemetry/telemetry.js +144 -34
  580. package/dist/telemetry/verification-of.d.ts +3 -1
  581. package/dist/telemetry/verification-of.js +13 -4
  582. package/dist/wire-journal.d.ts +2 -2
  583. package/dist/wire-journal.js +20 -6
  584. package/docs/README.md +3 -3
  585. package/docs/actions.mdx +6 -3
  586. package/docs/adapters.md +1 -1
  587. package/docs/agent-cheatsheet.md +25 -28
  588. package/docs/architecture.md +5 -5
  589. package/docs/autodrive.md +33 -28
  590. package/docs/benchmarks.md +5 -5
  591. package/docs/best-practices.mdx +27 -9
  592. package/docs/capabilities.mdx +14 -16
  593. package/docs/cli/affected.mdx +1 -1
  594. package/docs/cli/cloud.mdx +54 -75
  595. package/docs/cli/doctor.mdx +14 -3
  596. package/docs/cli/drive.mdx +20 -14
  597. package/docs/cli/feedback.mdx +3 -3
  598. package/docs/cli/gate.mdx +7 -2
  599. package/docs/cli/help.mdx +50 -55
  600. package/docs/cli/init.mdx +43 -28
  601. package/docs/cli/license.mdx +12 -8
  602. package/docs/cli/mcp.mdx +4 -4
  603. package/docs/cli/open.mdx +3 -3
  604. package/docs/cli/report.mdx +4 -2
  605. package/docs/cli/restart.mdx +2 -2
  606. package/docs/cli/rollback.mdx +14 -8
  607. package/docs/cli/serve.mdx +4 -4
  608. package/docs/cli/setup.mdx +23 -0
  609. package/docs/cli/status.mdx +18 -5
  610. package/docs/cli/stop.mdx +67 -8
  611. package/docs/cli/try.mdx +62 -0
  612. package/docs/cli/update.mdx +4 -3
  613. package/docs/cli/verify.mdx +17 -6
  614. package/docs/cli/version.mdx +5 -4
  615. package/docs/cli.mdx +111 -42
  616. package/docs/debugging.md +3 -3
  617. package/docs/deploy-checks.md +1 -1
  618. package/docs/desktop.mdx +9 -3
  619. package/docs/enterprise.md +11 -10
  620. package/docs/environment.mdx +7 -8
  621. package/docs/faq.mdx +3 -3
  622. package/docs/first-drive.md +5 -4
  623. package/docs/flows.md +35 -27
  624. package/docs/for-agents.md +4 -5
  625. package/docs/frameworks.mdx +32 -21
  626. package/docs/getting-started.md +65 -61
  627. package/docs/human-control.md +16 -16
  628. package/docs/index.mdx +15 -42
  629. package/docs/install-agentic.mdx +22 -37
  630. package/docs/install-manual.mdx +23 -13
  631. package/docs/instrumentation.mdx +5 -3
  632. package/docs/integration-patterns.md +7 -7
  633. package/docs/license-activation.mdx +1 -1
  634. package/docs/multi-agent-testing.md +24 -6
  635. package/docs/packages/babel-plugin.mdx +4 -2
  636. package/docs/packages/browser.mdx +16 -10
  637. package/docs/packages/core.mdx +12 -5
  638. package/docs/packages/electron.mdx +3 -2
  639. package/docs/packages/engine.mdx +1 -1
  640. package/docs/packages/eslint-plugin.mdx +18 -12
  641. package/docs/packages/next.mdx +8 -7
  642. package/docs/packages/open-verification.mdx +1 -1
  643. package/docs/packages/server.mdx +5 -5
  644. package/docs/packages/tauri.mdx +9 -9
  645. package/docs/packages/test.mdx +4 -10
  646. package/docs/packages/vite-plugin.mdx +32 -4
  647. package/docs/packages.mdx +11 -15
  648. package/docs/platform-integration.md +6 -5
  649. package/docs/predicates.mdx +40 -24
  650. package/docs/quickstart.mdx +69 -30
  651. package/docs/required-checks.md +8 -7
  652. package/docs/reticle-manual.md +15 -5
  653. package/docs/skill-file.mdx +17 -79
  654. package/docs/skill-setup.md +9 -9
  655. package/docs/skill.md +200 -0
  656. package/docs/system-map.md +7 -7
  657. package/docs/telemetry.md +23 -25
  658. package/docs/testing.md +4 -4
  659. package/docs/token-efficiency.md +12 -12
  660. package/docs/tools/act-and-wait.mdx +9 -2
  661. package/docs/tools/act-sequence.mdx +6 -7
  662. package/docs/tools/act.mdx +2 -2
  663. package/docs/tools/assert.mdx +18 -17
  664. package/docs/tools/console.mdx +9 -9
  665. package/docs/tools/inspect.mdx +16 -7
  666. package/docs/tools/look.mdx +24 -0
  667. package/docs/tools/navigate.mdx +5 -3
  668. package/docs/tools/network.mdx +2 -2
  669. package/docs/tools/observe.mdx +6 -6
  670. package/docs/tools/overview.mdx +34 -33
  671. package/docs/tools/query.mdx +5 -5
  672. package/docs/tools/session-and-feedback.mdx +22 -13
  673. package/docs/tools/sessions.mdx +8 -8
  674. package/docs/tools/snapshot.mdx +6 -5
  675. package/docs/tools/state.mdx +9 -9
  676. package/docs/tools/tools-and-run.mdx +26 -24
  677. package/docs/tools/verify.mdx +28 -0
  678. package/docs/tools/wait-for.mdx +8 -4
  679. package/docs/troubleshooting.mdx +21 -6
  680. package/docs/usage.md +55 -46
  681. package/docs/use-cases.mdx +3 -3
  682. package/docs/vs-chrome-devtools-mcp.mdx +9 -6
  683. package/docs/vs-playwright-mcp.mdx +3 -1
  684. package/docs/what-is-recorded.md +17 -5
  685. package/docs/what-is-reticle.mdx +5 -3
  686. package/docs/why-reticle.mdx +1 -1
  687. package/package.json +9 -12
  688. package/dist/command/cli/demo/demo-page.d.ts +0 -78
  689. package/dist/command/cli/demo/demo-page.js +0 -241
  690. package/dist/command/cli/demo/demo-run.d.ts +0 -38
  691. package/dist/command/cli/demo/demo-run.js +0 -138
  692. package/dist/features/harness/driver.d.ts +0 -50
  693. package/dist/features/harness/driver.js +0 -236
  694. package/dist/features/harness/jev-driver.d.ts +0 -188
  695. package/dist/features/harness/jev-driver.js +0 -678
  696. package/dist/features/harness/openai-driver.d.ts +0 -58
  697. package/dist/features/harness/openai-driver.js +0 -206
  698. package/dist/judgement/hunt/hunt-report.d.ts +0 -49
  699. package/dist/judgement/hunt/hunt-report.js +0 -84
  700. package/dist/language/flows/buddy-status.d.ts +0 -25
  701. package/dist/language/flows/buddy-status.js +0 -32
  702. package/dist/language/flows/change/watch-batcher.d.ts +0 -18
  703. package/dist/language/flows/change/watch-batcher.js +0 -19
  704. package/dist/memory/cloud/harness-offer.d.ts +0 -44
  705. package/dist/memory/cloud/harness-offer.js +0 -145
  706. package/dist/memory/project/dir/fill-value-store.d.ts +0 -32
  707. package/dist/memory/project/dir/fill-value-store.js +0 -88
  708. package/dist/surface/tools/feature-capture.d.ts +0 -151
  709. package/dist/surface/tools/feature-capture.js +0 -235
  710. package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
  711. package/dist/surface/tools/tool-hit-rate.js +0 -90
  712. package/dist/telemetry/harness-drive.d.ts +0 -4
  713. package/dist/telemetry/harness-drive.js +0 -35
  714. package/dist/telemetry/identify.d.ts +0 -22
  715. package/dist/telemetry/identify.js +0 -73
  716. package/docs/cli/capsules.mdx +0 -70
  717. package/docs/cli/hunt.mdx +0 -73
  718. package/docs/cli/identify.mdx +0 -76
  719. package/docs/cli/kill.mdx +0 -91
  720. package/docs/cli/watch.mdx +0 -62
  721. package/docs/local-registry.md +0 -143
@@ -6,14 +6,14 @@ icon: gavel
6
6
 
7
7
  `reticle_assert` evaluates a predicate against what the app actually did and returns a verdict: `verified` plus `pass`, evidence when it holds, and `expected` versus `observed` when it does not. Reach for it when you want a verdict on something you did not just cause, or on several actions at once.
8
8
 
9
- It is the second of the two tools that produce a verdict, the other being [`reticle_act_and_wait`](/tools/act-and-wait). It takes the same predicate grammar and evaluates it against what already happened.
9
+ Verdicts come from [`reticle_act_and_wait`](/tools/act-and-wait), `reticle_assert`, `reticle_act { steps }` when a step declares `expect`, and `reticle_verify` (`change`/`flows`). Everything else moves or reads the app and proves nothing. Only `verified: "yes"` is a pass: `unknown` means Reticle could not tell, and `no-fault` means nothing was declared to prove. `reticle_assert` takes the same predicate grammar as `until` and evaluates it against what already happened.
10
10
 
11
11
  ## A real failure
12
12
 
13
- Failures are more instructive than passes, so here is one. I asserted a route change to `/` on a page that was already at `/`:
13
+ Failures are more instructive than passes, so here is one. I asserted that signing in lands on `/dashboard`, after a click that did not navigate. The page was still on `/login`:
14
14
 
15
15
  ```json
16
- { "predicate": { "kind": "route", "pathname": "/" } }
16
+ { "predicate": { "kind": "route", "pathname": "/dashboard" } }
17
17
  ```
18
18
 
19
19
  ```json
@@ -22,10 +22,10 @@ Failures are more instructive than passes, so here is one. I asserted a route ch
22
22
  "verifiedReason": "assertion_failed",
23
23
  "because": "the declared consequence did not hold",
24
24
  "pass": false,
25
- "failureReason": "no route change observed",
26
- "observed": "no route change in the window",
27
- "expected": "a route change to /",
28
- "assertion": "route.changed",
25
+ "failureReason": "current route (no route change in the window) '/login', expected '/dashboard'",
26
+ "observed": "current route (no route change in the window) '/login'",
27
+ "expected": "route '/dashboard'",
28
+ "assertion": "route.pathname",
29
29
  "source": "src/components/Login.tsx:81",
30
30
  "buffer": {
31
31
  "held": 536,
@@ -40,12 +40,12 @@ Failures are more instructive than passes, so here is one. I asserted a route ch
40
40
  `pathname` is what the published schema declares, so it is the one to write.
41
41
  </Note>
42
42
 
43
- <Warning>
44
- Read `assertion: "route.changed"` carefully. The `route` predicate asserts that the route
45
- **changed**, not that it currently equals a value. Asserting the route you are already on will
46
- always fail. This catches people out, and the response says so in `expected` rather than leaving
47
- you to work it out.
48
- </Warning>
43
+ <Note>
44
+ A `route` predicate is decided by the last route change in the window. When there was none, it
45
+ reads the session's current URL instead, and `observed` says so ("current route (no route change
46
+ in the window)"). So asserting the route you are already on passes; on its own it does not prove
47
+ that anything navigated. Check `evidence.decidedBy` on a pass to see which of the two decided it.
48
+ </Note>
49
49
 
50
50
  Note also `expected` and `observed` side by side. A verdict that says only "failed" makes you go digging; this one tells you what it wanted, what it saw, and where in your source the relevant element lives.
51
51
 
@@ -98,11 +98,12 @@ A presence-only predicate passes and tells you not to trust it much:
98
98
 
99
99
  ## Arguments
100
100
 
101
- | Argument | What it does |
102
- | ------------------------ | ----------------------------------------------------------------- |
101
+ | Argument | What it does |
102
+ | --- | --- |
103
+ | `action` | `now` (the default) evaluates against the window that already exists; `wait` waits for it to hold |
103
104
  | `predicate` (or `until`) | `{ kind, ...fields }`. See the [predicate reference](/predicates) |
104
- | `timeout_ms` | If above zero, wait this long before failing. Default `0` |
105
- | `since` | Cursor from a prior act. Scope to events after that action |
105
+ | `timeout_ms` | `now`: if above zero, wait this long before failing (default `0`, capped at `55000`). `wait`: default `4000`, up to `600000`, resumed with `resume_ms` past one call's limit |
106
+ | `since` | Cursor from a prior act. Scope to events after that action |
106
107
 
107
108
  ## Scope it with `since`
108
109
 
@@ -11,7 +11,7 @@ icon: terminal
11
11
  `allowedTools` allowlist or an MCP permission rule naming it refuses before Reticle is asked.
12
12
  </Warning>
13
13
 
14
- `reticle_console` returns the app's console log, filtered by level, and tells you whether an empty result is a real reading or a missing one. Reach for it as the fast triage read after something goes wrong, and assert `{ "kind": "console", "absent": true }` when you want a clean console to be part of the pass.
14
+ `reticle_observe { action: "console" }` returns the app's console log, filtered by level, and tells you whether an empty result is a real reading or a missing one. Reach for it as the fast triage read after something goes wrong, and assert `{ "kind": "console", "absent": true }` when you want a clean console to be part of the pass.
15
15
 
16
16
  ```json
17
17
  { "limit": 3 }
@@ -44,12 +44,12 @@ Read both fields together. `observed: true` with a non-zero `dropped` count mean
44
44
 
45
45
  ## Arguments
46
46
 
47
- | Argument | What it does |
48
- | ----------------- | ---------------------------------------------------- |
49
- | `level` | `log` · `warn` · `error` · `info` |
50
- | `limit` | Most recent N. Older matches are dropped and counted |
51
- | `actionId` | Only lines attributed to one action |
52
- | `since` / `until` | Cursors from a prior act |
47
+ | Argument | What it does |
48
+ | ----------------- | ------------------------------------------------------------------ |
49
+ | `level` | `log` · `warn` · `error` · `info` |
50
+ | `limit` | Most recent N (default 200). Older matches are dropped and counted |
51
+ | `actionId` | Only lines attributed to one action |
52
+ | `since` / `until` | Cursors from a prior act |
53
53
 
54
54
  ## The check worth making by default
55
55
 
@@ -63,8 +63,8 @@ That fails if the click succeeds _and_ logs an error, which is exactly the case
63
63
 
64
64
  <Tip>
65
65
  `level: "error"` is the fast triage read. If it comes back empty with `observed: true`, stop
66
- looking at the console and go look at [`reticle_network`](/tools/network) or
67
- [`reticle_state`](/tools/state) instead. That is a real capture from this fixture:
66
+ looking at the console and go look at [`reticle_observe { action: "network" }`](/tools/network) or
67
+ [`reticle_look { action: "state" }`](/tools/state) instead. That is a real capture from this fixture:
68
68
  `{"logs":[],"observed":true,"cost":{"bytes":337,"tokens":85}}`, eighty-five tokens to rule out a
69
69
  whole class of bug.
70
70
  </Tip>
@@ -1,5 +1,5 @@
1
1
  ---
2
- title: reticle_inspect
2
+ title: 'reticle_look { action: "element" }'
3
3
  description: Everything about one element. Accessibility properties, geometry, computed styles, design tokens, React component stack, and the exact source file and line.
4
4
  icon: crosshairs
5
5
  ---
@@ -11,12 +11,12 @@ icon: crosshairs
11
11
  `allowedTools` allowlist or an MCP permission rule naming it refuses before Reticle is asked.
12
12
  </Warning>
13
13
 
14
- `reticle_query` finds elements. `reticle_inspect` tells you everything about one of them. It is the tool that turns a finding into an edit, because it ends with a file and a line number.
14
+ `reticle_look { action: "find" }` finds elements. `reticle_look { action: "element" }` tells you everything about one of them. It is the tool that turns a finding into an edit, because it ends with a file and a line number.
15
15
 
16
16
  ## Example
17
17
 
18
18
  ```json
19
- { "ref": "e120" }
19
+ { "action": "element", "ref": "e120" }
20
20
  ```
21
21
 
22
22
  Real response:
@@ -40,7 +40,16 @@ Real response:
40
40
  "display": "flex",
41
41
  "visibility": "visible"
42
42
  },
43
- "scroll": { "scrollTop": 0, "scrollHeight": 36, "clientHeight": 36, "overflowY": "visible" },
43
+ "scroll": {
44
+ "scrollTop": 0,
45
+ "scrollHeight": 36,
46
+ "clientHeight": 36,
47
+ "overflowY": "visible",
48
+ "scrollLeft": 0,
49
+ "scrollWidth": 219,
50
+ "clientWidth": 219,
51
+ "overflowX": "visible"
52
+ },
44
53
  "theme": {
45
54
  "colorToken": "--muted",
46
55
  "backgroundToken": null,
@@ -65,7 +74,7 @@ Real response:
65
74
 
66
75
  Read `colorTokens` rather than `colorToken` when it matters. Design systems routinely give several tokens the same value, and the singular field is `null` whenever more than one matches, because naming an arbitrary winner is worse than admitting the palette cannot tell them apart. `themeScope` says which theme the reading was taken under, so two inspects either side of a theme toggle are comparable instead of quietly contradictory. It is `null`, as above, when the element sits under no scoped theme at all.
67
76
 
68
- **`scroll`** reports the element's own scroll box. `scrollHeight` above `clientHeight` means there is content below the fold inside this element, which is a different problem from the page being scrolled wrong.
77
+ **`scroll`** reports the element's own scroll box on both axes. `scrollHeight` above `clientHeight` means there is content below the fold inside this element, which is a different problem from the page being scrolled wrong. `scrollWidth` above `clientWidth` means the content did not fit across, which is how a label clipped by `text-overflow: ellipsis` shows up.
69
78
 
70
79
  **`occluded`** is the difference between "visible" and "actually clickable". An element can be present, visible and enabled while sitting under a modal overlay. `states` will look perfect; `occluded: true` is the honest answer.
71
80
 
@@ -90,6 +99,6 @@ Read `colorTokens` rather than `colorToken` when it matters. Design systems rout
90
99
  </CardGroup>
91
100
 
92
101
  <Note>
93
- `inspect` returns one element in detail. If you find yourself inspecting six things in a row, you
94
- probably want [`reticle_query`](/tools/query) with `attrs` instead, one call, six answers.
102
+ `{ action: "element" }` returns one element in detail. If you find yourself inspecting six things in a row, you
103
+ probably want [`reticle_look { action: "find" }`](/tools/query) with `attrs` instead, one call, six answers.
95
104
  </Note>
@@ -0,0 +1,24 @@
1
+ ---
2
+ title: reticle_look
3
+ description: Read the page without changing it. The rendered tree, a locator resolved to refs, one element in full, or the app's store.
4
+ icon: magnifying-glass
5
+ ---
6
+
7
+ `reticle_look` reads the page and changes nothing. Pick what to read with `action`. With no `action`, it reads the page.
8
+
9
+ ```json
10
+ { "action": "find", "by": "testid", "value": "submit" }
11
+ ```
12
+
13
+ | `action` | What it returns | Unmerged name | Details |
14
+ | --- | --- | --- | --- |
15
+ | `page` (default) | The semantic snapshot of what is rendered, with a `ref` for each control. `mode: "interactive"` keeps only what you can act on; `diff: true` returns only what changed since the last look | `reticle_snapshot` | [Snapshot](/tools/snapshot) |
16
+ | `find` | A locator (testid, role, text, label, component) resolved to refs you can act on. `limit` caps the list; `count_only` returns just the count | `reticle_query` | [Query](/tools/query) |
17
+ | `element` | Everything about one `ref`: geometry, scroll, design tokens, and on React the source `file:line` | `reticle_inspect` | [Inspect](/tools/inspect) |
18
+ | `state` | A registered store's value. Scope it with `store`, `path` and `depth` | `reticle_state` | [State](/tools/state) |
19
+
20
+ A `ref` like `e7` stays valid until its element leaves the DOM, so you do not re-look between actions.
21
+
22
+ `reticle_look` never produces a verdict. Verdicts come from `reticle_act_and_wait`, `reticle_assert`, `reticle_act { steps }` when a step declares `expect`, and `reticle_verify` (`change`/`flows`). Everything else moves or reads the app and proves nothing. Only `verified: "yes"` is a pass: `unknown` means Reticle could not tell, and `no-fault` means nothing was declared to prove.
23
+
24
+ With `RETICLE_ADVERTISE_ALL_TOOLS=1`, the daemon advertises the four unmerged names instead of `reticle_look`.
@@ -24,7 +24,7 @@ Real response, with the throttled-tab `session` and `warning` fields trimmed off
24
24
 
25
25
  ## `confirmed: true` when the page comes back in time
26
26
 
27
- The daemon waits up to `timeout_ms` (default 5000) for the SDK to re-announce itself. When it does, you are told so and can act immediately without a `reticle_sessions` round trip. This is a real reload response:
27
+ The daemon waits up to `timeout_ms` (default 5000) for the SDK to re-announce itself. When it does, you are told so, with the `sessionId` it came back as, and can act immediately without a `reticle_session { action: "list" }` round trip. This is a real reload response:
28
28
 
29
29
  ```json
30
30
  {
@@ -42,6 +42,8 @@ A full navigation destroys the document the SDK was living in. Reticle cannot re
42
42
 
43
43
  Most tools would return `ok: true` and let you assume arrival. When the page then fails to load, or loads without instrumentation, you get a confusing cascade of "element not found" errors several calls later, with nothing pointing at the real cause.
44
44
 
45
+ `confirmed: false` with a `landedOn` URL is a different case: the page arrived, but the app sent it somewhere else, such as a login or route-guard redirect. `landedOn` says where the browser actually is.
46
+
45
47
  `waitedMs` says which of two things you are looking at. Reticle stopped waiting at the budget it had, or the page never came back. The first is fixed by asking for more: a single-page app reattaching under HMR has been measured at 30–60s, which no default should wait for on every call, but which the caller who knows the app can grant.
46
48
 
47
49
  ```json
@@ -57,10 +59,10 @@ Most tools would return `ok: true` and let you assume arrival. When the page the
57
59
  then confirm a session reconnected:
58
60
 
59
61
  ```json
60
- {}
62
+ { "action": "list" }
61
63
  ```
62
64
 
63
- with [`reticle_sessions`](/tools/sessions), and only then snapshot. If no session appears at the new URL, the page did not load or is not instrumented. And you know that immediately rather than three calls later.
65
+ with [`reticle_session`](/tools/sessions), and only then look at the page. If no session appears at the new URL, the page did not load or is not instrumented. And you know that immediately rather than three calls later.
64
66
 
65
67
  <Warning>
66
68
  **Refs do not survive a navigation.** A new document means new refs. Across one afternoon on the
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: reticle_network
3
- description: A filtered log of every request the app made, with bodies, status, timing, automatic credential redaction, and an honest note when evidence has expired.
3
+ description: A filtered log of every request the app made, with status, timing, bodies when capture is on, automatic credential redaction, and an honest note when evidence has expired.
4
4
  icon: satellite-dish
5
5
  ---
6
6
 
@@ -11,7 +11,7 @@ icon: satellite-dish
11
11
  `allowedTools` allowlist or an MCP permission rule naming it refuses before Reticle is asked.
12
12
  </Warning>
13
13
 
14
- `reticle_network` returns a filtered log of every request the app made, with request and response bodies, status, timing, and automatic credential redaction. Reach for it to answer "did that call actually fire, and what came back?", which is the thing a screenshot fundamentally cannot show.
14
+ `reticle_network` returns a filtered log of every request the app made, with status, timing, and automatic credential redaction. Request and response bodies are recorded only when the app connects with `captureNetworkBodies: true` (off by default); a failed response keeps its body either way. Reach for it to answer "did that call actually fire, and what came back?", which is the thing a screenshot fundamentally cannot show.
15
15
 
16
16
  ## Example
17
17
 
@@ -6,7 +6,7 @@ icon: timeline
6
6
 
7
7
  `reticle_observe` returns the full timeline of everything the app did in a window: DOM, network, routing, console, animations and signals, in order, with a summary on top. Reach for it when you do not yet know what went wrong. It reads and diagnoses; it does not produce a verdict.
8
8
 
9
- It is the wide-angle lens. Where `reticle_network` and `reticle_console` answer one question each, `observe` returns everything.
9
+ It is the wide-angle lens. Where `reticle_observe { action: "network" }` and `reticle_observe { action: "console" }` answer one question each, the default `events` action returns everything.
10
10
 
11
11
  ## Example
12
12
 
@@ -75,15 +75,15 @@ The `summary` block is the cheap answer. `consoleErrors: 0` and `network: 0` tel
75
75
 
76
76
  | Argument | What it does |
77
77
  | ----------------- | ------------------------------------------------------------------ |
78
- | `window_ms` | How far back to look |
78
+ | `window_ms` | How far back to look. Default 2000, ignored when `since` is given |
79
79
  | `since` / `until` | Cursors from a prior act. The precise way to scope |
80
80
  | `actionId` | Only events attributed to one action: "what did that click cause?" |
81
81
  | `filters` | Event-type allowlist. The cheapest way to shrink a big timeline |
82
- | `max_events` | Cap the timeline to the most recent N |
82
+ | `max_events` | Cap the timeline to the most recent N (default 200) |
83
83
 
84
84
  ## Scope by cursor, not by clock
85
85
 
86
- Every `reticle_act` response includes a `since` cursor. Passing it to `observe` scopes the timeline to exactly what followed that action, with no guessing about how many milliseconds to look back:
86
+ Every `reticle_act` and `reticle_act_and_wait` response includes a `since` cursor. Passing it to `observe` scopes the timeline to exactly what followed that action, with no guessing about how many milliseconds to look back:
87
87
 
88
88
  ```json
89
89
  { "since": 30224, "filters": ["signal", "net"] }
@@ -127,7 +127,7 @@ When two channels disagree, `observe` says so without being asked:
127
127
 
128
128
  Punctuation in that block is lightly normalised for the docs; the field names and values are verbatim.
129
129
 
130
- A successful write that moved nothing on the client is the exact shape of a false green. Note that this one was a false alarm caused by a narrow filter: the same window's DOM and state did change, and the filtered read simply could not see it. Widen the window before you act on a contradiction.
130
+ A successful write that moved nothing on the client is the exact shape of a false green. `filters` and `max_events` shape what the call returns, never what it concludes: contradictions are computed over the whole window, so a narrow filter cannot manufacture one.
131
131
 
132
132
  ## When to use it
133
133
 
@@ -138,7 +138,7 @@ Use `observe` when you do not yet know what went wrong. Use the narrow tools whe
138
138
  "Something broke after that click, show me everything that happened."
139
139
  </Card>
140
140
  <Card title="Wasteful use" icon="circle-xmark">
141
- "Did a POST fire?" [`reticle_network`](/tools/network) answers that far more cheaply.
141
+ "Did a POST fire?" [`reticle_observe { action: "network" }`](/tools/network) answers that far more cheaply.
142
142
  </Card>
143
143
  </CardGroup>
144
144
 
@@ -5,7 +5,7 @@ description: The tools your agent sees every turn, the many more it can reach on
5
5
  icon: wrench
6
6
  ---
7
7
 
8
- Reticle's table holds 45 tools. Your agent is shown **nine**: `reticle_act`, `reticle_act_and_wait`, `reticle_assert`, `reticle_look`, `reticle_navigate`, `reticle_observe`, `reticle_session`, `reticle_tools` and `reticle_verify`. Only `reticle_act_and_wait` and `reticle_assert` produce a verdict.
8
+ Your agent is shown **ten** tools by default: `reticle_navigate`, `reticle_look`, `reticle_act`, `reticle_act_and_wait`, `reticle_observe`, `reticle_assert`, `reticle_session`, `reticle_verify`, `reticle_tools` and `reticle_run`. Verdicts come from `reticle_act_and_wait`, `reticle_assert`, `reticle_act { steps }` when a step declares `expect`, and `reticle_verify` (`change`/`flows`). Everything else moves or reads the app and proves nothing. Only `verified: "yes"` is a pass: `unknown` means Reticle could not tell, and `no-fault` means nothing was declared to prove.
9
9
 
10
10
  Most of the rest were not removed. They were **merged**. `reticle_snapshot` is `reticle_look { action: "page" }`; `reticle_console` is `reticle_observe { action: "console" }`. One tool, one action argument, same work. Calling a retired name returns the call that replaced it, and `reticle_tools` prints the whole mapping.
11
11
 
@@ -13,61 +13,60 @@ That is not a limitation, it's the design. MCP re-sends every advertised tool de
13
13
 
14
14
  A wider surface costs tokens on every message. Less obviously, it makes the model wander: give it fifty ways to look at a page and it will try several before doing anything useful.
15
15
 
16
- What the verify loop does **not** advertise are the specialised tools: `reticle_screenshot`, `reticle_visual_diff`, `reticle_storage`, `reticle_network_mock`, `reticle_clock`. Each is one `reticle_run { tool, args }` hop away, and a daemon started with `RETICLE_ADVERTISE_ALL_TOOLS=1` advertises them outright.
16
+ What the verify loop does **not** advertise are the specialised tools: `reticle_screenshot`, `reticle_visual_diff`, `reticle_storage`, `reticle_network_mock`, `reticle_clock`. Each is one `reticle_run { tool, args }` hop away.
17
+
18
+ A daemon started with `RETICLE_ADVERTISE_ALL_TOOLS=1` advertises 30 tools outright, and it **switches to the unmerged spelling**: `reticle_snapshot`, `reticle_query`, `reticle_inspect` and `reticle_state` replace `reticle_look`; `reticle_network` and `reticle_console` replace `reticle_observe { action }`; `reticle_wait_for` replaces `reticle_assert { action: "wait" }`; `reticle_sessions` and `reticle_feedback` replace `reticle_session` list and feedback; `reticle_act_sequence` replaces `reticle_act { steps }`. Examples in these docs use the default spelling. The counts are asserted by `server/src/surface/tools/surface-sizes.test.ts`.
17
19
 
18
20
  <Note>
19
- Measured off the real wire on 2026-09-16, by reading `tools/list` from a fresh daemon: the default
20
- surface is **9 tools at 17,663 bytes**, against **30 tools at 126,954 bytes** when
21
- `RETICLE_ADVERTISE_ALL_TOOLS` is set, 7.2x more and charged on every message.
22
- [`bench/harness/schema-tax.mjs`](/token-efficiency) converts those bytes to tokens by putting
23
- every server through one tokenizer in a single pass. Re-measure before quoting any of it; the
24
- surface grows, and the figures this note replaced were a year out of date and described a surface
25
- that no longer existed.
21
+ Measured with [`bench/harness/schema-tax.mjs`](/token-efficiency) on 2026-10-08: the default
22
+ surface is **10 tools, about 4,650 schema tokens**, against **30 tools, about 35,000 tokens** with
23
+ `RETICLE_ADVERTISE_ALL_TOOLS=1`, charged on every message. Re-measure before quoting; the surface
24
+ grows.
26
25
  </Note>
27
26
 
28
- ## The default 19
29
-
30
- Grouped by the job they do in the verify loop.
27
+ ## The ten, by job
31
28
 
32
29
  <CardGroup cols={2}>
33
30
  <Card title="Look" icon="magnifying-glass">
34
- `reticle_snapshot` · `reticle_query` · `reticle_inspect` · `reticle_sessions` ·
35
- `reticle_capabilities`
31
+ `reticle_look { action: "page" | "find" | "element" | "state" }`
36
32
  </Card>
37
33
  <Card title="Act" icon="hand-pointer">
38
- `reticle_act` · `reticle_act_and_wait` · `reticle_act_sequence` · `reticle_navigate`
34
+ `reticle_act` · `reticle_act { steps }` · `reticle_act_and_wait` · `reticle_navigate`
39
35
  </Card>
40
36
  <Card title="Observe" icon="satellite-dish">
41
- `reticle_observe` · `reticle_network` · `reticle_console` · `reticle_state` · `reticle_wait_for`
37
+ `reticle_observe` · `{ action: "network" }` · `{ action: "console" }`
38
+ </Card>
39
+ <Card title="Prove" icon="circle-check">
40
+ `reticle_act_and_wait` · `reticle_assert` · `reticle_verify`
42
41
  </Card>
43
- <Card title="Prove & discover" icon="circle-check">
44
- `reticle_assert` · `reticle_tools` · `reticle_run`
42
+ <Card title="Discover" icon="compass">
43
+ `reticle_tools` · `reticle_run`
45
44
  </Card>
46
45
  <Card title="Session & feedback" icon="comment">
47
- `reticle_session` · `reticle_feedback`
46
+ `reticle_session { action: "list" | "feedback" | "yield" | … }`
48
47
  </Card>
49
48
  </CardGroup>
50
49
 
51
50
  <Warning>
52
- Only **`reticle_act_and_wait`** and **`reticle_assert`** produce a verdict. Everything else moves
53
- or reads the app and proves nothing. A drive that ends without one of those two has no result,
54
- however many tools it used and however confident the summary sounds.
51
+ Verdicts come from `reticle_act_and_wait`, `reticle_assert`, `reticle_act {steps}` when a step
52
+ declares `expect`, and `reticle_verify` (`change`/`flows`). Everything else moves or reads the app
53
+ and proves nothing. Only `verified: "yes"` is a pass: `unknown` means Reticle could not tell, and
54
+ `no-fault` means nothing was declared to prove. A drive that ends without a verdict has no result,
55
+ however many tools it used.
55
56
  </Warning>
56
57
 
57
58
  ## Why these and not others
58
59
 
59
60
  Each one earned its slot, and a couple are there because of measured mistakes.
60
61
 
61
- `reticle_inspect` maps a DOM node to `src/components/Sidebar.tsx:41`. Finding a bug is half the job. Knowing which file to open is the half that makes an agent useful.
62
+ `reticle_look { action: "element" }` (unmerged name `reticle_inspect`) maps a DOM node to `src/components/Sidebar.tsx:41`. Finding a bug is half the job. Knowing which file to open is the half that makes an agent useful.
62
63
 
63
64
  It used to be reachable only through `reticle_run`, which meant an agent had to already know it existed to use it.
64
65
 
65
- `reticle_act_sequence` batches a multi-step interaction into one round trip. It was also reachable only through `reticle_run`, and the consequence is a login form driven one call at a time, over and over.
66
+ `reticle_act { steps }` (unmerged name `reticle_act_sequence`) batches a multi-step interaction into one round trip. It was also reachable only through `reticle_run`, and the consequence is a login form driven one call at a time, over and over.
66
67
 
67
68
  Those repeats were not retries. The calls succeeded and got repeated, because the batching tool was invisible. A tool an agent must already know about is a tool that never gets called.
68
69
 
69
- Direct `reticle_network` and `reticle_console` stay advertised even though `reticle_observe` can filter for both, because two obvious tools beat one clever tool with a filter grammar.
70
-
71
70
  <Tip>
72
71
  Trimming further has a floor. An eight-tool cut measurably dropped real-agent accuracy, because
73
72
  the model loses scaffolding and wanders on harder flows. That reading is old enough to be dated
@@ -75,7 +74,7 @@ Direct `reticle_network` and `reticle_console` stay advertised even though `reti
75
74
  good; empty is not.
76
75
  </Tip>
77
76
 
78
- ## Reaching the other 29
77
+ ## Reaching every other tool
79
78
 
80
79
  ```json
81
80
  { "tool": "reticle_verify", "args": { "action": "flows" } }
@@ -85,15 +84,15 @@ Direct `reticle_network` and `reticle_console` stay advertised even though `reti
85
84
 
86
85
  Notable residents of the cold tail: flow recording and replay, visual diffing and screenshots, network mocking, viewport pinning, coverage, autonomous crawling, and the human-in-the-loop session controls.
87
86
 
88
- ## Every response carries its cost
87
+ ## Read responses carry their cost
89
88
 
90
- Reticle tells you what each answer cost, because a verification tool that quietly eats your context window is not saving you anything:
89
+ The read tools (`reticle_look` page and find, `reticle_observe` network and console) tell you what each answer cost, because a verification tool that quietly eats your context window is not saving you anything:
91
90
 
92
91
  ```json
93
92
  "cost": { "bytes": 944, "tokens": 236 }
94
93
  ```
95
94
 
96
- That is a real `reticle_query` response: seven buttons found, with source pointers, for 236 tokens.
95
+ That is from a real `reticle_look { action: "find" }` response: seven buttons found, with source pointers, for 236 tokens.
97
96
 
98
97
  ## Every response tells you when not to trust it
99
98
 
@@ -119,6 +118,8 @@ A tool that says "no requests found" when it actually means "I lost the ones you
119
118
 
120
119
  ## Reference
121
120
 
121
+ These pages are named for the unmerged tools. Each one gives the default spelling (`reticle_look { action: "page" }` for `reticle_snapshot`, and so on).
122
+
122
123
  ### Look
123
124
 
124
125
  | Tool | Answers |
@@ -154,10 +155,10 @@ A tool that says "no requests found" when it actually means "I lost the ones you
154
155
  | --- | --- |
155
156
  | [`reticle_assert`](/tools/assert) | Did the named consequence hold? **Produces a verdict** |
156
157
  | [`reticle_tools`](/tools/tools-and-run) | What else is available, and what are its arguments? |
157
- | [`reticle_run`](/tools/tools-and-run) | Invoke any of the other 29 |
158
+ | [`reticle_run`](/tools/tools-and-run) | Invoke any other registered tool by name |
158
159
  | [`reticle_session`](/tools/session-and-feedback) | Hand control back to the human |
159
- | [`reticle_feedback`](/tools/session-and-feedback) | Tell the maintainers Reticle got something wrong |
160
+ | [`reticle_session { action: "feedback" }`](/tools/session-and-feedback) | Tell the maintainers Reticle got something wrong (`reticle_feedback` is its unmerged name, not advertised by default) |
160
161
 
161
162
  <Card title="The complete reference" icon="book" href="/usage">
162
- Every tool, every argument, including the 29 in the cold tail.
163
+ Every tool, every argument, including the cold tail.
163
164
  </Card>
@@ -11,7 +11,7 @@ icon: magnifying-glass
11
11
  `allowedTools` allowlist or an MCP permission rule naming it refuses before Reticle is asked.
12
12
  </Warning>
13
13
 
14
- `reticle_query` answers "where is the thing I mean?" without dumping the whole page into your context window. It queries the way a testing library does. By role, label, text, testid. So your agent binds to meaning rather than to DOM structure that a refactor will move.
14
+ `reticle_look { action: "find" }` answers "where is the thing I mean?" without dumping the whole page into your context window. It queries the way a testing library does. By role, label, text, testid. So your agent binds to meaning rather than to DOM structure that a refactor will move.
15
15
 
16
16
  ## Example
17
17
 
@@ -63,7 +63,7 @@ Seven buttons, each with a `ref` to act on and a source file to open, for 236 to
63
63
  | `attrs` | Attribute NAMES to project per match, e.g. `['href']` to inventory links. The values come back in each match's `attrs` map. It does not filter, so `name=value` is refused |
64
64
  | `self` | Return the `scope` element itself instead of searching inside it |
65
65
 
66
- Every argument also has a predicate spelling, so `{ "role": "button" }` works as shorthand for `{ "by": "role", "value": "button" }`.
66
+ `role`, `text`, `label`, `placeholder`, `testid` and `alt` also have a predicate spelling, so `{ "role": "button" }` works as shorthand for `{ "by": "role", "value": "button" }`.
67
67
 
68
68
  ## Use `count_only` when you only need a number
69
69
 
@@ -119,13 +119,13 @@ The testid existed, on another route. `hint.route` says where you actually are,
119
119
 
120
120
  ## Reading the response
121
121
 
122
- `ref` is the handle for every other tool: `act`, `inspect`, `state`. It stays valid until the element leaves the DOM, so you do not need to re-snapshot between actions on the same element.
122
+ `ref` is the handle for every other call: `reticle_act`, `reticle_look { action: "element" }`, `reticle_look { action: "state" }`. It stays valid until the element leaves the DOM, so you do not need to re-snapshot between actions on the same element.
123
123
 
124
- `source` appears when `@reticlehq/react` is installed. Note that both sidebar buttons above report `Sidebar.tsx:41`, and so do the three trimmed out of the example. That is the line where the component renders all five in a loop, which is exactly the line you want to edit.
124
+ `source` appears when the app is built in dev with the Reticle build plugin; production builds omit it. Note that both sidebar buttons above report `Sidebar.tsx:41`, and so do the three trimmed out of the example. That is the line where the component renders all five in a loop, which is exactly the line you want to edit.
125
125
 
126
126
  `truncated: true` with `total: 7` means `limit` cut the list, not that Reticle ran out of room. Neither field is emitted when nothing was cut, so their absence is itself the signal that you are looking at every match.
127
127
 
128
- `states` distinguishes `present` from `visible` from `enabled`. An element can be all three and still be covered by a modal. [`reticle_inspect`](/tools/inspect) reports `occluded` for that.
128
+ `states` distinguishes `present` from `visible` from `enabled`. An element can be all three and still be covered by a modal. [`reticle_look { action: "element" }`](/tools/inspect) reports `occluded` for that.
129
129
 
130
130
  <Tip>
131
131
  Query by `testid` when you can. Role and text queries survive refactors well; testids survive
@@ -10,15 +10,18 @@ icon: comments
10
10
 
11
11
  The presenter panel in your app shows a live transcript of what the agent is doing. It reads "live" until the agent says otherwise. So an agent that wanders off without a word leaves a panel claiming work is in progress forever.
12
12
 
13
- | Action | What it does |
14
- | ---------- | ------------------------------------------------------------------------ |
15
- | `yield` | Hand control back between turns. `mode: "waiting"` or `"ask"`. Revivable |
16
- | `end` | The task is done. Frees the session; revives on the next action |
17
- | `tune` | Adjust session behaviour, such as `idleEndMs`, the idle-end window |
18
- | `resume` | Clear a pause the human applied |
19
- | `messages` | Drain the human-to-agent inbox |
20
- | `review` | List, and with `resolve`, retire the mistakes a human pinned to elements |
21
- | `narrate` | State your intent on the presenter panel, with an optional `level` |
13
+ | Action | What it does |
14
+ | --- | --- |
15
+ | `list` | Which tabs are connected, and whether they can be driven. Your first call. An empty list carries a `why` naming the cause |
16
+ | `feedback` | Tell the maintainers Reticle got something wrong. Takes the fields described under [reticle_feedback](#reticle-feedback) below |
17
+ | `yield` | Hand control back between turns. `mode: "waiting"` or `"ask"`. Revivable |
18
+ | `end` | The task is done. Frees the session; revives on the next action |
19
+ | `tune` | Adjust session behaviour: `idleEndMs`, the idle-end window, or `hud`: `hidden`, `shown`, `removed` (until reload), or a corner (`top-left`, `top-right`, `bottom-left`, `bottom-right`) when the HUD covers a control you must test |
20
+ | `resume` | Clear a pause the human applied |
21
+ | `messages` | Drain the human-to-agent inbox |
22
+ | `review` | List, and with `resolve`, retire the mistakes a human pinned to elements |
23
+ | `narrate` | State your intent on the presenter panel, with an optional `level` |
24
+ | `account` | Where the user stands: signed in or not, whether the project reports to the dashboard, plan and credits, whether the Harness is on, and the one thing to do next. Read it before telling the user anything about credits or the plan |
22
25
 
23
26
  ```json
24
27
  { "action": "yield", "mode": "waiting" }
@@ -40,7 +43,7 @@ And each lease carries the rule in the payload itself:
40
43
 
41
44
  ```json
42
45
  "session_lease": {
43
- "IMPORTANT": "When you stop driving, call reticle_session {action:\"yield\", mode:\"waiting\"|\"ask\"}. The panel reads \"live\" until you do."
46
+ "IMPORTANT": "When you stop driving, call reticle_session {action:\"yield\", mode:\"waiting\"|\"ask\"}. The panel reads \"live\" until you do. {action:\"end\"} only when the task is done: it is final."
44
47
  }
45
48
  ```
46
49
 
@@ -52,6 +55,10 @@ And each lease carries the rule in the payload itself:
52
55
 
53
56
  ## reticle_feedback
54
57
 
58
+ <Note>
59
+ `reticle_feedback` is not advertised by default. Call `reticle_session { action: "feedback", kind, text }`: the same fields, routed on `action`. The old name answers with the new call.
60
+ </Note>
61
+
55
62
  Reticle is built for agents, which creates an unusual problem: the primary user's experience vanishes the moment its context does. If an agent hits a gap and works around it silently, nobody ever learns the gap existed.
56
63
 
57
64
  ```json
@@ -78,13 +85,15 @@ The `rating` is secondary to that text on purpose. A score produced because some
78
85
 
79
86
  ### It will tell you when it cannot send
80
87
 
81
- Feedback is not fire-and-forget, and it does not pretend to succeed:
88
+ Feedback sends in the background so you are not kept waiting, but it does not pretend to succeed: `sent` stays `false` until delivery is confirmed, `accepted` says the report was validated and queued, and a send that later fails is reported on a later tool result. A report that is not accepted says why:
82
89
 
83
90
  ```json
84
91
  {
85
92
  "sent": false,
86
93
  "accepted": false,
87
- "reason": "this is a Reticle source checkout, where telemetry is disabled by design, so feedback has nowhere to go. Open an issue at https://github.com/reticlehq/reticle/issues instead, or run from the app you are verifying.",
94
+ "reason": "this is a Reticle source checkout, where telemetry is disabled by design, so this could not be sent (it has been written to disk instead, and nothing was lost).",
95
+ "savedTo": "<project>/.reticle/feedback/<timestamp>-bug.md",
96
+ "fileWith": "gh issue create --repo reticlehq/reticle --title \"Reticle feedback: bug\" --body-file \"<project>/.reticle/feedback/<timestamp>-bug.md\"",
88
97
  "redacted": [],
89
98
  "context": {
90
99
  "stack": "react",
@@ -100,7 +109,7 @@ Feedback is not fire-and-forget, and it does not pretend to succeed:
100
109
 
101
110
  `redacted` names anything stripped from your report before it left the machine, so you can see what was and was not sent. `context` is the environment attached automatically, which is why a useful report costs one call and no boilerplate.
102
111
 
103
- That is a real response, captured while writing these docs. The instruction in `note` is the important part: when the report cannot be delivered, say so in your answer to the human rather than letting the finding evaporate.
112
+ When the report cannot be sent it is written to disk: `savedTo` is the file and `fileWith` is a ready-to-run command that turns it into an issue. The instruction in `note` is the important part: when the report cannot be delivered, say so in your answer to the human rather than letting the finding evaporate.
104
113
 
105
114
  ### From the shell, when the tools are unreachable
106
115
 
@@ -51,7 +51,7 @@ A backgrounded tab adds a `recommendation` telling you what to do about it, and
51
51
  "outages": 3,
52
52
  "lastOutage": { "startedMs": 1786818483776, "durationMs": 967 }
53
53
  },
54
- "recommendation": "tab hidden/throttled and may be un-focusable from here; refocus it, or run `reticle drive <url>` for a guaranteed scriptable context"
54
+ "recommendation": "tab is not hidden but has not reported health recently ... Timing-sensitive work (animations, debounces, gestures) is what degrades: pass `refuseWhenThrottled: true` to refuse rather than act over events that may not land. Lease a separate context only if a drive here actually fails; ..."
55
55
  }
56
56
  ```
57
57
 
@@ -62,27 +62,27 @@ An empty list is not silent. It comes back with a `why` that separates the two c
62
62
  ```json
63
63
  {
64
64
  "sessions": [],
65
- "why": "no browser session connected. Two things to weigh, and neither of them is proof. (1) Nothing is listening on the ports Reticle scans, so the dev server may not be running. That scan is narrow though: a server on any other port is invisible to it, so if the app IS running, ask for its URL rather than assuming it is down, and open it with `reticle open <url>`. (2) There is no `.reticle.json` in the directory this daemon is running in. That is the file `reticle init` writes, so the app may carry no Reticle SDK."
65
+ "why": "no browser session connected. Two things to weigh, and neither of them is proof. (1) Nothing is listening on the ports Reticle scans, so the dev server may not be running: START IT YOURSELF, in the background, using the command in `next_action`, and tell the human in one line that it is running. (2) There is no `.reticle.json` in the directory this daemon is running in, which is the file `reticle init` writes, so the app may carry no Reticle SDK. Check the app's OWN directory before re-running it. ..."
66
66
  }
67
67
  ```
68
68
 
69
- That string is trimmed. The full text also lists the exact ports it scanned and warns that in a monorepo the daemon often runs at the root while the app lives in a subdirectory, so you should check the app's own directory before re-running `init`.
69
+ That string is trimmed. The full text also lists the exact ports it scanned, says a server on any other port is invisible to the scan (ask for the app's URL and open it with `reticle open <url>`), and warns that in a monorepo the daemon often runs at the root while the app lives in a subdirectory.
70
70
 
71
71
  ## The fields that decide whether driving will work
72
72
 
73
73
  | Field | Why it matters |
74
74
  | --- | --- |
75
- | `throttled` | The browser is deprioritising a background tab. Synthetic timers and pointer gestures may silently no-op |
75
+ | `throttled` | The tab is hidden, or has not reported health recently. A hidden tab clamps timers and animation frames, so an action can land on a page that never advances; a throttled tab that is not hidden is usually just quiet and often still driveable |
76
76
  | `hidden` / `focused` | Why it's throttled, and what to do about it |
77
- | `hasCapabilities` | Whether the app registered testids, signals and stores. `false` means [`reticle_state`](/tools/state) has nothing to read |
77
+ | `hasCapabilities` | Whether the app registered testids, signals and stores. `false` means [`reticle_look { action: "state" }`](/tools/state) has nothing to read |
78
78
  | `adapters` | `["react"]` means you get component names and source pointers |
79
79
  | `realInputAvailable` | `true` when native CDP input is available, under `reticle drive` |
80
80
  | `outages` | How often the connection has dropped. Non-zero is worth investigating |
81
81
 
82
82
  <Warning>
83
- `throttled: true` is the most common cause of "the click did nothing". Focus the tab, or drive a
84
- dedicated context. It is not your app being broken. It is the browser saving battery on a tab
85
- nobody is looking at.
83
+ A hidden tab (`hidden: true`, which also sets `throttled`) is the most common cause of "the click
84
+ did nothing". Focus the tab, or drive a dedicated context. It is not your app being broken. It is
85
+ the browser saving battery on a tab nobody is looking at.
86
86
  </Warning>
87
87
 
88
88
  ## Confirm after navigating