@reticlehq/server 2.12.0 → 2.13.1

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 (386) hide show
  1. package/SKILL.md +67 -109
  2. package/dist/bridge/auth-failure-reason.d.ts +6 -2
  3. package/dist/bridge/auth-failure-reason.js +15 -8
  4. package/dist/bridge/bridge.d.ts +18 -1
  5. package/dist/bridge/bridge.js +247 -164
  6. package/dist/bridge/pairing-token.d.ts +5 -0
  7. package/dist/bridge/pairing-token.js +28 -0
  8. package/dist/bridge/protocol-skew.d.ts +37 -0
  9. package/dist/bridge/protocol-skew.js +45 -0
  10. package/dist/capsule/capsule-store.d.ts +6 -6
  11. package/dist/capsule/causal-summary.js +7 -2
  12. package/dist/cli/cli-doctor.js +31 -1
  13. package/dist/cli/cli-launch.d.ts +11 -1
  14. package/dist/cli/cli-launch.js +59 -10
  15. package/dist/cli/cli-parse.d.ts +15 -1
  16. package/dist/cli/cli-parse.js +212 -8
  17. package/dist/cli/cli-verify.d.ts +1 -0
  18. package/dist/cli/cli-verify.js +3 -2
  19. package/dist/cli/cloud-cli.js +428 -259
  20. package/dist/cli/cloud-keystore.d.ts +37 -0
  21. package/dist/cli/cloud-keystore.js +97 -0
  22. package/dist/cli/cloud-kit.d.ts +37 -0
  23. package/dist/cli/cloud-kit.js +121 -0
  24. package/dist/cli/cloud-login.d.ts +17 -0
  25. package/dist/cli/cloud-login.js +183 -0
  26. package/dist/cli/cloud-session.d.ts +48 -0
  27. package/dist/cli/cloud-session.js +53 -0
  28. package/dist/cli/config-discovery.js +1 -0
  29. package/dist/cli/daemon-start-options.d.ts +32 -0
  30. package/dist/cli/daemon-start-options.js +38 -0
  31. package/dist/cli/device-flow.d.ts +76 -0
  32. package/dist/cli/device-flow.js +56 -0
  33. package/dist/cli/doctor-rows.d.ts +9 -0
  34. package/dist/cli/doctor-rows.js +9 -0
  35. package/dist/cli/drive-attach.d.ts +13 -0
  36. package/dist/cli/drive-attach.js +18 -0
  37. package/dist/cli/drive-command.js +7 -3
  38. package/dist/cli/mcp-command.js +51 -20
  39. package/dist/cli/project-name.d.ts +30 -0
  40. package/dist/cli/project-name.js +44 -0
  41. package/dist/cli/status-next-action.d.ts +14 -0
  42. package/dist/cli/status-next-action.js +4 -4
  43. package/dist/cli.d.ts +1 -0
  44. package/dist/cli.js +134 -80
  45. package/dist/cloud/cloud-config.d.ts +22 -1
  46. package/dist/cloud/cloud-config.js +64 -5
  47. package/dist/cloud/cloud-sync.d.ts +5 -5
  48. package/dist/cloud/cloud-sync.js +33 -2
  49. package/dist/cloud/sync-cycle.d.ts +110 -0
  50. package/dist/cloud/sync-cycle.js +270 -0
  51. package/dist/cloud/sync-daemon.d.ts +69 -0
  52. package/dist/cloud/sync-daemon.js +260 -0
  53. package/dist/cloud/sync-disk.d.ts +9 -0
  54. package/dist/cloud/sync-disk.js +191 -0
  55. package/dist/cloud/sync-hash.d.ts +2 -0
  56. package/dist/cloud/sync-hash.js +35 -0
  57. package/dist/crawl/crawl-tools.js +5 -3
  58. package/dist/crawl/crawl.d.ts +3 -0
  59. package/dist/crawl/crawl.js +5 -0
  60. package/dist/daemon/daemon-resolve.d.ts +43 -0
  61. package/dist/daemon/daemon-resolve.js +69 -0
  62. package/dist/daemon/dev-servers.d.ts +15 -0
  63. package/dist/daemon/dev-servers.js +68 -0
  64. package/dist/daemon/wake-decision.d.ts +32 -0
  65. package/dist/daemon/wake-decision.js +38 -0
  66. package/dist/domain/domain-tools.js +2 -2
  67. package/dist/events/contradictions.d.ts +18 -0
  68. package/dist/events/contradictions.js +134 -21
  69. package/dist/events/declared.d.ts +7 -4
  70. package/dist/events/declared.js +15 -6
  71. package/dist/events/echo-mismatch.js +64 -14
  72. package/dist/events/event-filters.d.ts +8 -0
  73. package/dist/events/event-filters.js +19 -2
  74. package/dist/events/predicate-eval.js +53 -5
  75. package/dist/events/predicate-precheck.d.ts +8 -0
  76. package/dist/events/predicate-precheck.js +41 -0
  77. package/dist/events/predicate-route.d.ts +14 -0
  78. package/dist/events/predicate-route.js +36 -8
  79. package/dist/events/predicate.d.ts +5 -0
  80. package/dist/events/predicate.js +37 -5
  81. package/dist/events/split-text-miss.d.ts +30 -0
  82. package/dist/events/split-text-miss.js +44 -0
  83. package/dist/flows/flake.d.ts +6 -6
  84. package/dist/flows/flow-memory-consult.d.ts +55 -0
  85. package/dist/flows/flow-memory-consult.js +38 -0
  86. package/dist/flows/flow-replay-run.d.ts +18 -7
  87. package/dist/flows/flow-replay-run.js +239 -22
  88. package/dist/flows/flow-replay.js +11 -2
  89. package/dist/flows/flow-step-runners.d.ts +8 -0
  90. package/dist/flows/flow-step-runners.js +8 -2
  91. package/dist/flows/flow-store-for-session.d.ts +31 -0
  92. package/dist/flows/flow-store-for-session.js +33 -0
  93. package/dist/flows/flow-tools.js +58 -32
  94. package/dist/flows/flows.d.ts +8 -0
  95. package/dist/flows/flows.js +468 -2
  96. package/dist/flows/heal-run.js +5 -2
  97. package/dist/flows/predicate-to-expect.d.ts +17 -12
  98. package/dist/flows/predicate-to-expect.js +30 -12
  99. package/dist/flows/recordings.d.ts +13 -1
  100. package/dist/flows/recordings.js +17 -2
  101. package/dist/flows/replay.d.ts +22 -2
  102. package/dist/flows/replay.js +28 -2
  103. package/dist/flows/verify-change-tools.js +5 -2
  104. package/dist/honesty/blind-spots.d.ts +55 -2
  105. package/dist/honesty/blind-spots.js +63 -3
  106. package/dist/honesty/honesty.d.ts +24 -0
  107. package/dist/honesty/honesty.js +25 -1
  108. package/dist/honesty/instrumentation-gaps.d.ts +9 -0
  109. package/dist/honesty/instrumentation-gaps.js +29 -2
  110. package/dist/honesty/verified.d.ts +2 -1
  111. package/dist/honesty/verified.js +16 -1
  112. package/dist/http-server.js +12 -0
  113. package/dist/impact/impact-recorder.d.ts +31 -8
  114. package/dist/impact/impact-recorder.js +104 -21
  115. package/dist/impact/impact-store.d.ts +15 -1
  116. package/dist/impact/impact-store.js +43 -2
  117. package/dist/index.js +113 -7
  118. package/dist/init/agent-rules.d.ts +13 -6
  119. package/dist/init/agent-rules.js +23 -12
  120. package/dist/init/astro-patch.d.ts +16 -0
  121. package/dist/init/astro-patch.js +28 -0
  122. package/dist/init/capabilities.d.ts +4 -1
  123. package/dist/init/capabilities.js +22 -2
  124. package/dist/init/confirm.d.ts +31 -7
  125. package/dist/init/confirm.js +48 -8
  126. package/dist/init/cra.d.ts +20 -4
  127. package/dist/init/cra.js +57 -17
  128. package/dist/init/csp-check.js +17 -2
  129. package/dist/init/csp-doctor.d.ts +8 -1
  130. package/dist/init/csp-doctor.js +8 -3
  131. package/dist/init/dev-script.d.ts +3 -1
  132. package/dist/init/dev-script.js +8 -5
  133. package/dist/init/format-generated.d.ts +18 -0
  134. package/dist/init/format-generated.js +39 -0
  135. package/dist/init/install-hint.d.ts +9 -0
  136. package/dist/init/install-hint.js +29 -0
  137. package/dist/init/mcp-clients.d.ts +7 -0
  138. package/dist/init/mcp-clients.js +7 -0
  139. package/dist/init/mcp.d.ts +1 -1
  140. package/dist/init/mcp.js +1 -1
  141. package/dist/init/node-io.js +11 -1
  142. package/dist/init/plan-framework.js +81 -45
  143. package/dist/init/plan.d.ts +20 -7
  144. package/dist/init/plan.js +20 -45
  145. package/dist/init/preflight.d.ts +28 -0
  146. package/dist/init/preflight.js +38 -0
  147. package/dist/init/run.d.ts +32 -9
  148. package/dist/init/run.js +141 -119
  149. package/dist/init/slash-command.d.ts +1 -1
  150. package/dist/init/snippets.js +41 -25
  151. package/dist/init/vite-config.d.ts +1 -1
  152. package/dist/init/vite-config.js +39 -25
  153. package/dist/init/workspace-apps.d.ts +17 -10
  154. package/dist/init/workspace-apps.js +110 -0
  155. package/dist/input/network-mock-tools.js +3 -6
  156. package/dist/input/real-input.js +25 -5
  157. package/dist/input/scroll-tools.js +4 -6
  158. package/dist/input/viewport-tools.js +5 -4
  159. package/dist/intent/inline-intent.d.ts +10 -19
  160. package/dist/intent/inline-intent.js +91 -1
  161. package/dist/intent/intent-shard-store.d.ts +72 -0
  162. package/dist/intent/intent-shard-store.js +203 -0
  163. package/dist/intent/intent-shard.d.ts +411 -0
  164. package/dist/intent/intent-shard.js +176 -0
  165. package/dist/intent/intent-store.d.ts +12 -0
  166. package/dist/intent/intent-store.js +21 -0
  167. package/dist/intent/intent-subject.d.ts +45 -0
  168. package/dist/intent/intent-subject.js +177 -0
  169. package/dist/intent/intent-tools.js +65 -2
  170. package/dist/intent/open-intents.d.ts +21 -0
  171. package/dist/intent/open-intents.js +15 -0
  172. package/dist/license/license-env.d.ts +29 -0
  173. package/dist/license/license-env.js +148 -0
  174. package/dist/loopback-agent.d.ts +31 -0
  175. package/dist/loopback-agent.js +57 -0
  176. package/dist/mcp/attach-memory.d.ts +18 -2
  177. package/dist/mcp/attach-memory.js +50 -7
  178. package/dist/mcp/client-identity.d.ts +31 -0
  179. package/dist/mcp/client-identity.js +51 -0
  180. package/dist/mcp/mcp-post-transport.d.ts +26 -0
  181. package/dist/mcp/mcp-post-transport.js +109 -0
  182. package/dist/mcp/mcp-proxy.d.ts +2 -1
  183. package/dist/mcp/mcp-proxy.js +52 -62
  184. package/dist/mcp/mcp.js +7 -1
  185. package/dist/mcp/proxy-backoff.d.ts +11 -0
  186. package/dist/mcp/proxy-backoff.js +13 -0
  187. package/dist/mcp/proxy-daemon-probe.d.ts +1 -0
  188. package/dist/mcp/proxy-daemon-probe.js +7 -1
  189. package/dist/mcp/proxy-handshake.d.ts +23 -0
  190. package/dist/mcp/proxy-handshake.js +31 -0
  191. package/dist/mcp/tool-catalog-cache.d.ts +8 -0
  192. package/dist/mcp/tool-catalog-cache.js +12 -0
  193. package/dist/memory/memory-tools.d.ts +2 -0
  194. package/dist/memory/memory-tools.js +82 -0
  195. package/dist/memory/project-memory.d.ts +34 -0
  196. package/dist/memory/project-memory.js +96 -0
  197. package/dist/oracles/propose-consequences.js +12 -3
  198. package/dist/pool/browser-pool.d.ts +63 -4
  199. package/dist/pool/browser-pool.js +113 -4
  200. package/dist/pool/playwright-launcher.js +9 -0
  201. package/dist/project/project-tools.js +3 -3
  202. package/dist/project/reticle-dir.d.ts +15 -2
  203. package/dist/project/reticle-dir.js +21 -4
  204. package/dist/runs/run-store.d.ts +10 -0
  205. package/dist/runs/run-store.js +10 -0
  206. package/dist/runs/verification-sync.d.ts +0 -11
  207. package/dist/runs/verification-sync.js +22 -1
  208. package/dist/runs/verify-server.d.ts +8 -1
  209. package/dist/runs/verify-server.js +14 -2
  210. package/dist/session/command-timeout.d.ts +5 -2
  211. package/dist/session/command-timeout.js +5 -4
  212. package/dist/session/lease-visibility.d.ts +67 -0
  213. package/dist/session/lease-visibility.js +76 -0
  214. package/dist/session/no-session-diagnosis.d.ts +23 -0
  215. package/dist/session/no-session-diagnosis.js +58 -17
  216. package/dist/session/no-session-next-action.d.ts +7 -0
  217. package/dist/session/no-session-next-action.js +42 -3
  218. package/dist/session/no-session-watch.d.ts +10 -6
  219. package/dist/session/no-session-watch.js +51 -19
  220. package/dist/session/pending-commands.d.ts +11 -1
  221. package/dist/session/pending-commands.js +12 -2
  222. package/dist/session/resolve-within.d.ts +34 -0
  223. package/dist/session/resolve-within.js +53 -0
  224. package/dist/session/session-info.d.ts +18 -0
  225. package/dist/session/session-info.js +11 -0
  226. package/dist/session/session-manager.d.ts +14 -0
  227. package/dist/session/session-manager.js +61 -3
  228. package/dist/session/session-mirror.d.ts +16 -0
  229. package/dist/session/session-mirror.js +22 -0
  230. package/dist/session/session-recommendation.d.ts +19 -5
  231. package/dist/session/session-recommendation.js +25 -9
  232. package/dist/session/session-successor.js +36 -1
  233. package/dist/session/session-tools.js +2 -2
  234. package/dist/session/session.d.ts +22 -2
  235. package/dist/session/session.js +87 -7
  236. package/dist/session/wall-clock.d.ts +12 -0
  237. package/dist/session/wall-clock.js +14 -0
  238. package/dist/setup/agent-configs.d.ts +96 -0
  239. package/dist/setup/agent-configs.js +333 -0
  240. package/dist/setup/agent-io.d.ts +9 -0
  241. package/dist/setup/agent-io.js +16 -0
  242. package/dist/setup/agent-writer.d.ts +51 -0
  243. package/dist/setup/agent-writer.js +115 -0
  244. package/dist/setup/approval-migration.d.ts +47 -0
  245. package/dist/setup/approval-migration.js +68 -0
  246. package/dist/setup/auto-approve.d.ts +85 -0
  247. package/dist/setup/auto-approve.js +150 -0
  248. package/dist/setup/bridge-port.d.ts +15 -0
  249. package/dist/setup/bridge-port.js +24 -0
  250. package/dist/setup/desktop-shape.d.ts +57 -0
  251. package/dist/setup/desktop-shape.js +63 -0
  252. package/dist/setup/dev-server-wait.d.ts +68 -0
  253. package/dist/setup/dev-server-wait.js +67 -0
  254. package/dist/setup/drive-agent.d.ts +71 -0
  255. package/dist/setup/drive-agent.js +171 -0
  256. package/dist/setup/drive-plan.d.ts +68 -0
  257. package/dist/setup/drive-plan.js +130 -0
  258. package/dist/setup/ensure-daemon.d.ts +29 -0
  259. package/dist/setup/ensure-daemon.js +58 -0
  260. package/dist/setup/init-runtime.d.ts +47 -0
  261. package/dist/setup/init-runtime.js +160 -0
  262. package/dist/setup/interrupt.d.ts +25 -0
  263. package/dist/setup/interrupt.js +40 -0
  264. package/dist/setup/license-key.d.ts +39 -0
  265. package/dist/setup/license-key.js +72 -0
  266. package/dist/setup/listeners.d.ts +37 -0
  267. package/dist/setup/listeners.js +85 -0
  268. package/dist/setup/node-effects.d.ts +60 -0
  269. package/dist/setup/node-effects.js +210 -0
  270. package/dist/setup/page-probe.d.ts +39 -0
  271. package/dist/setup/page-probe.js +49 -0
  272. package/dist/setup/relaunch.d.ts +36 -0
  273. package/dist/setup/relaunch.js +57 -0
  274. package/dist/setup/remaining-steps.d.ts +19 -0
  275. package/dist/setup/remaining-steps.js +31 -0
  276. package/dist/setup/run-setup.d.ts +99 -0
  277. package/dist/setup/run-setup.js +203 -0
  278. package/dist/setup/session-pick.d.ts +47 -0
  279. package/dist/setup/session-pick.js +51 -0
  280. package/dist/setup/setup-command.d.ts +45 -0
  281. package/dist/setup/setup-command.js +199 -0
  282. package/dist/setup/setup-options.d.ts +74 -0
  283. package/dist/setup/setup-options.js +67 -0
  284. package/dist/setup/transcripts.d.ts +16 -0
  285. package/dist/setup/transcripts.js +43 -0
  286. package/dist/status-payload.d.ts +14 -1
  287. package/dist/status-payload.js +23 -1
  288. package/dist/telemetry/daemon-telemetry.d.ts +8 -1
  289. package/dist/telemetry/daemon-telemetry.js +52 -5
  290. package/dist/telemetry/error-class.js +1 -1
  291. package/dist/telemetry/feedback-context.d.ts +9 -1
  292. package/dist/telemetry/feedback-context.js +60 -29
  293. package/dist/telemetry/feedback-local.d.ts +15 -0
  294. package/dist/telemetry/feedback-local.js +56 -0
  295. package/dist/telemetry/feedback.d.ts +11 -0
  296. package/dist/telemetry/feedback.js +19 -6
  297. package/dist/telemetry/init-telemetry.d.ts +2 -0
  298. package/dist/telemetry/init-telemetry.js +2 -0
  299. package/dist/telemetry/install-source.d.ts +14 -0
  300. package/dist/telemetry/install-source.js +30 -0
  301. package/dist/telemetry/license-activation.d.ts +7 -1
  302. package/dist/telemetry/license-activation.js +9 -5
  303. package/dist/telemetry/mcp-connection.js +7 -0
  304. package/dist/telemetry/project-profile.d.ts +12 -1
  305. package/dist/telemetry/project-profile.js +11 -6
  306. package/dist/telemetry/proxy-telemetry.d.ts +3 -0
  307. package/dist/telemetry/proxy-telemetry.js +21 -0
  308. package/dist/telemetry/session-metrics.d.ts +12 -0
  309. package/dist/telemetry/session-metrics.js +35 -1
  310. package/dist/telemetry/telemetry.js +17 -2
  311. package/dist/telemetry/tool-refused.d.ts +3 -1
  312. package/dist/telemetry/tool-refused.js +34 -2
  313. package/dist/tools/act-capsule.d.ts +10 -0
  314. package/dist/tools/act-capsule.js +8 -2
  315. package/dist/tools/act-danger.d.ts +2 -1
  316. package/dist/tools/act-danger.js +11 -3
  317. package/dist/tools/act-observation.d.ts +41 -0
  318. package/dist/tools/act-observation.js +36 -0
  319. package/dist/tools/act-preflight.d.ts +20 -0
  320. package/dist/tools/act-preflight.js +98 -0
  321. package/dist/tools/act-sequence-retry.d.ts +45 -0
  322. package/dist/tools/act-sequence-retry.js +58 -0
  323. package/dist/tools/act-sequence-tool.d.ts +13 -0
  324. package/dist/tools/act-sequence-tool.js +135 -0
  325. package/dist/tools/act-target.d.ts +14 -0
  326. package/dist/tools/act-target.js +47 -0
  327. package/dist/tools/act-tools.d.ts +21 -1
  328. package/dist/tools/act-tools.js +100 -213
  329. package/dist/tools/assert-verdict.js +22 -16
  330. package/dist/tools/browser-tools.js +6 -2
  331. package/dist/tools/dynamic-tools.js +24 -5
  332. package/dist/tools/error-recovery.d.ts +1 -0
  333. package/dist/tools/error-recovery.js +8 -0
  334. package/dist/tools/invoke-tool.js +59 -9
  335. package/dist/tools/lease-tools.d.ts +30 -4
  336. package/dist/tools/lease-tools.js +169 -5
  337. package/dist/tools/merged-name-redirect.d.ts +13 -0
  338. package/dist/tools/merged-name-redirect.js +22 -0
  339. package/dist/tools/numeric-bounds.d.ts +100 -0
  340. package/dist/tools/numeric-bounds.js +125 -0
  341. package/dist/tools/observe-tools.js +47 -40
  342. package/dist/tools/read-tools.js +28 -7
  343. package/dist/tools/real-input-attempt.d.ts +10 -0
  344. package/dist/tools/real-input-attempt.js +59 -1
  345. package/dist/tools/reconcile-tools.js +4 -4
  346. package/dist/tools/tool-kit.d.ts +12 -0
  347. package/dist/tools/tool-kit.js +6 -1
  348. package/dist/tools/tool-names.d.ts +2 -0
  349. package/dist/tools/tool-names.js +2 -0
  350. package/dist/tools/tools-helpers.d.ts +19 -0
  351. package/dist/tools/tools-helpers.js +46 -0
  352. package/dist/tools/tools.d.ts +2 -0
  353. package/dist/tools/tools.js +56 -8
  354. package/dist/update/reticle-deps.d.ts +9 -0
  355. package/dist/update/reticle-deps.js +27 -0
  356. package/dist/update/sdk-sync.d.ts +1 -2
  357. package/dist/update/sdk-sync.js +1 -21
  358. package/dist/update/update-nudge.d.ts +18 -0
  359. package/dist/update/update-nudge.js +20 -0
  360. package/dist/version/peer-announce.js +4 -2
  361. package/dist/version/sdk-fix.d.ts +47 -0
  362. package/dist/version/sdk-fix.js +127 -0
  363. package/dist/version/version-nudge.d.ts +14 -0
  364. package/dist/version/version-nudge.js +21 -0
  365. package/dist/version/version-skew.d.ts +38 -3
  366. package/dist/version/version-skew.js +83 -7
  367. package/dist/visual/visual-store.d.ts +6 -6
  368. package/dist/visual/visual-store.js +18 -16
  369. package/dist/visual/visual-tools.js +57 -12
  370. package/docs/cli/doctor.mdx +1 -0
  371. package/docs/cli/serve.mdx +4 -2
  372. package/docs/cli.mdx +7 -3
  373. package/docs/desktop.mdx +1 -1
  374. package/docs/docs.json +1 -1
  375. package/docs/getting-started.md +19 -3
  376. package/docs/index.mdx +9 -6
  377. package/docs/install-agentic.mdx +38 -12
  378. package/docs/install-manual.mdx +1 -1
  379. package/docs/packages.mdx +1 -1
  380. package/docs/skill-file.mdx +3 -3
  381. package/docs/telemetry-contract.md +108 -4
  382. package/docs/tools-act-sequence.mdx +16 -0
  383. package/docs/usage.md +1 -1
  384. package/package.json +4 -3
  385. package/dist/init/cursor.d.ts +0 -24
  386. package/dist/init/cursor.js +0 -80
@@ -1,5 +1,5 @@
1
1
  import { asFlowName } from '@reticlehq/core';
2
- import { AnchorKind, DEGRADED_ANCHOR_ROLE, FLOW_FILE_VERSION, FlowErrorCode, FlowFileSchema, QueryBy, } from '@reticlehq/core';
2
+ import { AnchorKind, DEGRADED_ANCHOR_ROLE, FLOW_FILE_VERSION, FlowErrorCode, FlowFileSchema, QueryBy, defaultIsSensitiveKey, } from '@reticlehq/core';
3
3
  import { ReticleTool } from '../tools/tool-names.js';
4
4
  import { asString, asRecord } from '../tools/tools-helpers.js';
5
5
  import { applyHealChanges } from './heal.js';
@@ -94,8 +94,464 @@ function subStepToFlowStep(raw) {
94
94
  const { anchor, degraded } = anchorForStep(sub);
95
95
  return buildStep(ReticleTool.ACT, anchor, action, args, degraded);
96
96
  }
97
+ /**
98
+ * What a redacted fill value is replaced WITH.
99
+ *
100
+ * Replaced, never dropped. Replay still needs a step there, and a flow that silently loses its
101
+ * password step drifts at sign-in forever with no explanation of why. The placeholder also tells a
102
+ * reader what to do: the value belongs in the environment, not in a file they are about to commit.
103
+ */
104
+ export const REDACTED_FILL = '<redacted: supply at replay>';
105
+ /**
106
+ * Strip credentials from what gets written to disk.
107
+ *
108
+ * is the GIT-CHECKED flow store — that is its whole purpose, and this file's own
109
+ * header already insists a volatile ref must never "leak into a git-checked file". A password did:
110
+ * recording a sign-in captures the fill VALUE verbatim, so the first flow anybody records on an
111
+ * authenticated app writes their password into a file they then commit. Found by driving a fresh
112
+ * workspace, where .claude/scheduled_tasks.lock
113
+ .claude/skills/reticle-ui/SKILL.md
114
+ .env.example
115
+ .gcloudignore
116
+ .gitattributes
117
+ .github/workflows/ci.yml
118
+ .gitignore
119
+ .prettierignore
120
+ .prettierrc
121
+ .reticle/flows/console-4734c2f0/sign-in.json
122
+ .reticle/flows/console-4734c2f0/triage-filter-link.json
123
+ .reticle/flows/console-4734c2f0/triage-queue.json
124
+ CLAUDE.md
125
+ LICENSE
126
+ README.md
127
+ apps/api/.env.example
128
+ apps/api/.gitignore
129
+ apps/api/.prettierrc.json
130
+ apps/api/certs/supabase-prod-ca.crt
131
+ apps/api/eslint.config.mjs
132
+ apps/api/package.json
133
+ apps/api/pnpm-lock.yaml
134
+ apps/api/scripts/gen-license-keypair.mjs
135
+ apps/api/scripts/purge-test-user.mjs
136
+ apps/api/scripts/setup-razorpay-plans.mjs
137
+ apps/api/src/constants/auth.constants.ts
138
+ apps/api/src/constants/billing.constants.ts
139
+ apps/api/src/constants/corpus.constants.ts
140
+ apps/api/src/constants/http.constants.ts
141
+ apps/api/src/constants/identity.constants.ts
142
+ apps/api/src/constants/issues.constants.ts
143
+ apps/api/src/constants/overview.constants.ts
144
+ apps/api/src/constants/project.constants.ts
145
+ apps/api/src/constants/review.constants.ts
146
+ apps/api/src/constants/runs.constants.ts
147
+ apps/api/src/constants/verification.constants.ts
148
+ apps/api/src/domain/admin/admin-gate.test.ts
149
+ apps/api/src/domain/admin/admin.routes.test.ts
150
+ apps/api/src/domain/admin/admin.routes.ts
151
+ apps/api/src/domain/admin/admin.service.ts
152
+ apps/api/src/domain/billing/billing.routes.ts
153
+ apps/api/src/domain/billing/coupon.routes.test.ts
154
+ apps/api/src/domain/billing/coupons.service.ts
155
+ apps/api/src/domain/billing/entitlements.test.ts
156
+ apps/api/src/domain/billing/entitlements.ts
157
+ apps/api/src/domain/billing/plans.routes.test.ts
158
+ apps/api/src/domain/billing/subscription.routes.test.ts
159
+ apps/api/src/domain/corpus/corpus.service.test.ts
160
+ apps/api/src/domain/corpus/corpus.service.ts
161
+ apps/api/src/domain/flows/flows.routes.ts
162
+ apps/api/src/domain/flows/flows.service.test.ts
163
+ apps/api/src/domain/flows/flows.service.ts
164
+ apps/api/src/domain/identity/access-control.routes.test.ts
165
+ apps/api/src/domain/identity/api-key.test.ts
166
+ apps/api/src/domain/identity/api-key.ts
167
+ apps/api/src/domain/identity/auth-audit.service.ts
168
+ apps/api/src/domain/identity/create-org.routes.test.ts
169
+ apps/api/src/domain/identity/device-auth.service.ts
170
+ apps/api/src/domain/identity/identity.routes.ts
171
+ apps/api/src/domain/identity/identity.service.test.ts
172
+ apps/api/src/domain/identity/identity.service.ts
173
+ apps/api/src/domain/identity/identity.types.test.ts
174
+ apps/api/src/domain/identity/identity.types.ts
175
+ apps/api/src/domain/identity/invites.test.ts
176
+ apps/api/src/domain/identity/join-workspace.test.ts
177
+ apps/api/src/domain/identity/login-code.ts
178
+ apps/api/src/domain/identity/members.routes.test.ts
179
+ apps/api/src/domain/identity/members.routes.ts
180
+ apps/api/src/domain/identity/oauth.routes.test.ts
181
+ apps/api/src/domain/identity/oauth.routes.ts
182
+ apps/api/src/domain/identity/password-auth.test.ts
183
+ apps/api/src/domain/identity/password-routes.test.ts
184
+ apps/api/src/domain/identity/password.test.ts
185
+ apps/api/src/domain/identity/password.ts
186
+ apps/api/src/domain/identity/permissions.test.ts
187
+ apps/api/src/domain/identity/permissions.ts
188
+ apps/api/src/domain/identity/project-scope.routes.test.ts
189
+ apps/api/src/domain/identity/team-scenarios.test.ts
190
+ apps/api/src/domain/ingest/agent-attribution.test.ts
191
+ apps/api/src/domain/ingest/ingest.service.ts
192
+ apps/api/src/domain/insights/insights.routes.test.ts
193
+ apps/api/src/domain/insights/insights.routes.ts
194
+ apps/api/src/domain/insights/insights.service.ts
195
+ apps/api/src/domain/issues/attribution-filter.test.ts
196
+ apps/api/src/domain/issues/issue-extract.test.ts
197
+ apps/api/src/domain/issues/issue-extract.ts
198
+ apps/api/src/domain/issues/issue-owner.test.ts
199
+ apps/api/src/domain/issues/issue-repair.test.ts
200
+ apps/api/src/domain/issues/issues.routes.test.ts
201
+ apps/api/src/domain/issues/issues.routes.ts
202
+ apps/api/src/domain/issues/issues.service.test.ts
203
+ apps/api/src/domain/issues/issues.service.ts
204
+ apps/api/src/domain/licensing/licensing.service.test.ts
205
+ apps/api/src/domain/licensing/licensing.service.ts
206
+ apps/api/src/domain/licensing/subscription.service.test.ts
207
+ apps/api/src/domain/licensing/subscription.service.ts
208
+ apps/api/src/domain/memory/memory-constants.ts
209
+ apps/api/src/domain/memory/memory-from-intent.test.ts
210
+ apps/api/src/domain/memory/memory-from-intent.ts
211
+ apps/api/src/domain/memory/memory-merge.test.ts
212
+ apps/api/src/domain/memory/memory-merge.ts
213
+ apps/api/src/domain/memory/memory.routes.test.ts
214
+ apps/api/src/domain/memory/memory.routes.ts
215
+ apps/api/src/domain/memory/memory.service.ts
216
+ apps/api/src/domain/overview/honesty.test.ts
217
+ apps/api/src/domain/overview/overview.routes.ts
218
+ apps/api/src/domain/overview/overview.service.test.ts
219
+ apps/api/src/domain/overview/overview.service.ts
220
+ apps/api/src/domain/project/project-access.routes.ts
221
+ apps/api/src/domain/project/project-access.test.ts
222
+ apps/api/src/domain/project/project-cascade.test.ts
223
+ apps/api/src/domain/project/project-name.test.ts
224
+ apps/api/src/domain/project/project.routes.ts
225
+ apps/api/src/domain/project/project.service.test.ts
226
+ apps/api/src/domain/project/project.service.ts
227
+ apps/api/src/domain/reviews/review.service.test.ts
228
+ apps/api/src/domain/reviews/review.service.ts
229
+ apps/api/src/domain/runs/regrade-backfill.test.ts
230
+ apps/api/src/domain/runs/regrade-backfill.ts
231
+ apps/api/src/domain/runs/run-grade.test.ts
232
+ apps/api/src/domain/runs/run-grade.ts
233
+ apps/api/src/domain/runs/runs.routes.ts
234
+ apps/api/src/domain/runs/runs.service.test.ts
235
+ apps/api/src/domain/runs/runs.service.ts
236
+ apps/api/src/domain/sync/permutations.test.ts
237
+ apps/api/src/domain/sync/sync.routes.test.ts
238
+ apps/api/src/domain/sync/sync.routes.ts
239
+ apps/api/src/domain/sync/sync.service.ts
240
+ apps/api/src/domain/verifications/verifications.routes.ts
241
+ apps/api/src/domain/verifications/verifications.service.test.ts
242
+ apps/api/src/domain/verifications/verifications.service.ts
243
+ apps/api/src/http/app-context.ts
244
+ apps/api/src/http/app.test.ts
245
+ apps/api/src/http/app.ts
246
+ apps/api/src/http/cookies.ts
247
+ apps/api/src/http/guards.ts
248
+ apps/api/src/http/http-kit.ts
249
+ apps/api/src/http/malformed-body.test.ts
250
+ apps/api/src/http/server.ts
251
+ apps/api/src/http/spa.test.ts
252
+ apps/api/src/platform/auth/session.test.ts
253
+ apps/api/src/platform/auth/session.ts
254
+ apps/api/src/platform/clock.ts
255
+ apps/api/src/platform/config.test.ts
256
+ apps/api/src/platform/config.ts
257
+ apps/api/src/platform/db/database.test.ts
258
+ apps/api/src/platform/db/database.ts
259
+ apps/api/src/platform/db/schema.ts
260
+ apps/api/src/platform/google-id-token.test.ts
261
+ apps/api/src/platform/google-id-token.ts
262
+ apps/api/src/platform/id.ts
263
+ apps/api/src/platform/license-signer.ts
264
+ apps/api/src/platform/mailer.test.ts
265
+ apps/api/src/platform/mailer.ts
266
+ apps/api/src/platform/oauth.test.ts
267
+ apps/api/src/platform/oauth.ts
268
+ apps/api/src/platform/payment.ts
269
+ apps/api/src/platform/rate-limit.test.ts
270
+ apps/api/src/platform/rate-limit.ts
271
+ apps/api/src/platform/razorpay.test.ts
272
+ apps/api/src/platform/razorpay.ts
273
+ apps/api/src/platform/reticle-runner.test.ts
274
+ apps/api/src/platform/reticle-runner.ts
275
+ apps/api/src/platform/runner.ts
276
+ apps/api/src/platform/verification-worker.ts
277
+ apps/api/src/test-support/flow-fixture.ts
278
+ apps/api/src/test-support/run-fixture.ts
279
+ apps/api/src/types/brand.ts
280
+ apps/api/src/types/fastify.d.ts
281
+ apps/api/tsconfig.json
282
+ apps/api/vitest.config.ts
283
+ apps/console/.env.example
284
+ apps/console/.gitignore
285
+ apps/console/.prettierrc.json
286
+ apps/console/.reticle/cloud.json
287
+ apps/console/components.json
288
+ apps/console/eslint.config.mjs
289
+ apps/console/index.html
290
+ apps/console/package.json
291
+ apps/console/pnpm-lock.yaml
292
+ apps/console/scripts/selfcheck.mjs
293
+ apps/console/src/App.tsx
294
+ apps/console/src/api/client.ts
295
+ apps/console/src/api/endpoints.ts
296
+ apps/console/src/api/types.ts
297
+ apps/console/src/app/app-shell.tsx
298
+ apps/console/src/app/auth-context.tsx
299
+ apps/console/src/app/live.ts
300
+ apps/console/src/app/new-workspace.tsx
301
+ apps/console/src/app/org-switcher.tsx
302
+ apps/console/src/app/project-context.test.tsx
303
+ apps/console/src/app/project-context.tsx
304
+ apps/console/src/app/project-switcher.tsx
305
+ apps/console/src/app/scope-notice.tsx
306
+ apps/console/src/app/theme.ts
307
+ apps/console/src/app/toast.tsx
308
+ apps/console/src/components/ui.tsx
309
+ apps/console/src/constants/api.constants.ts
310
+ apps/console/src/design/tailwind.css
311
+ apps/console/src/design/theme.css
312
+ apps/console/src/design/tokens.ts
313
+ apps/console/src/features/auth/device-view.tsx
314
+ apps/console/src/features/auth/login-view.tsx
315
+ apps/console/src/features/billing/billing-view.tsx
316
+ apps/console/src/features/billing/redeem-panel.tsx
317
+ apps/console/src/features/connect/connect-view.test.tsx
318
+ apps/console/src/features/connect/connect-view.tsx
319
+ apps/console/src/features/connect/copy-button.tsx
320
+ apps/console/src/features/issues/assignee.tsx
321
+ apps/console/src/features/issues/expected-actual.tsx
322
+ apps/console/src/features/issues/fix-prompt.tsx
323
+ apps/console/src/features/issues/issues-view.test.tsx
324
+ apps/console/src/features/issues/issues-view.tsx
325
+ apps/console/src/features/issues/source-link.tsx
326
+ apps/console/src/features/keys/keys-view.test.tsx
327
+ apps/console/src/features/keys/keys-view.tsx
328
+ apps/console/src/features/memory/memory-view.tsx
329
+ apps/console/src/features/overview/getting-started.test.tsx
330
+ apps/console/src/features/overview/getting-started.tsx
331
+ apps/console/src/features/overview/impact-board.test.tsx
332
+ apps/console/src/features/overview/impact-board.tsx
333
+ apps/console/src/features/overview/impact-format.ts
334
+ apps/console/src/features/overview/overview-view.test.tsx
335
+ apps/console/src/features/overview/overview-view.tsx
336
+ apps/console/src/features/overview/people-panel.tsx
337
+ apps/console/src/features/overview/trust-panels.test.tsx
338
+ apps/console/src/features/overview/trust-panels.tsx
339
+ apps/console/src/features/runs/runs-view.tsx
340
+ apps/console/src/features/settings/members-panel.test.tsx
341
+ apps/console/src/features/settings/members-panel.tsx
342
+ apps/console/src/features/settings/plan-panel.tsx
343
+ apps/console/src/features/settings/project-access-panel.test.tsx
344
+ apps/console/src/features/settings/project-access-panel.tsx
345
+ apps/console/src/features/settings/settings-view.test.tsx
346
+ apps/console/src/features/settings/settings-view.tsx
347
+ apps/console/src/lib/utils.ts
348
+ apps/console/src/main.tsx
349
+ apps/console/src/test-setup.ts
350
+ apps/console/src/test-support.ts
351
+ apps/console/src/ui/alert-dialog.tsx
352
+ apps/console/src/ui/avatar.tsx
353
+ apps/console/src/ui/badge.tsx
354
+ apps/console/src/ui/button.tsx
355
+ apps/console/src/ui/card.tsx
356
+ apps/console/src/ui/checkbox.tsx
357
+ apps/console/src/ui/command.tsx
358
+ apps/console/src/ui/dialog.tsx
359
+ apps/console/src/ui/dropdown-menu.tsx
360
+ apps/console/src/ui/index.ts
361
+ apps/console/src/ui/input.tsx
362
+ apps/console/src/ui/label.tsx
363
+ apps/console/src/ui/popover.tsx
364
+ apps/console/src/ui/scroll-area.tsx
365
+ apps/console/src/ui/select.tsx
366
+ apps/console/src/ui/separator.tsx
367
+ apps/console/src/ui/sheet.tsx
368
+ apps/console/src/ui/skeleton.tsx
369
+ apps/console/src/ui/sonner.tsx
370
+ apps/console/src/ui/switch.tsx
371
+ apps/console/src/ui/table.tsx
372
+ apps/console/src/ui/tabs.tsx
373
+ apps/console/src/ui/textarea.tsx
374
+ apps/console/src/ui/tooltip.tsx
375
+ apps/console/tsconfig.json
376
+ apps/console/vite.config.ts
377
+ apps/console/vitest.config.ts
378
+ apps/verifier/package.json
379
+ apps/verifier/src/anthropic-driver.test.ts
380
+ apps/verifier/src/anthropic-driver.ts
381
+ apps/verifier/src/bench.ts
382
+ apps/verifier/src/best-effort.ts
383
+ apps/verifier/src/call-tool.test.ts
384
+ apps/verifier/src/call-tool.ts
385
+ apps/verifier/src/capability.ts
386
+ apps/verifier/src/cli.ts
387
+ apps/verifier/src/coverage.test.ts
388
+ apps/verifier/src/coverage.ts
389
+ apps/verifier/src/differential.test.ts
390
+ apps/verifier/src/differential.ts
391
+ apps/verifier/src/explore/routes-memory.test.ts
392
+ apps/verifier/src/explore/routes.test.ts
393
+ apps/verifier/src/explore/routes.ts
394
+ apps/verifier/src/explore/scope.test.ts
395
+ apps/verifier/src/explore/scope.ts
396
+ apps/verifier/src/explore/verify-routes-live.test.ts
397
+ apps/verifier/src/explore/verify-routes.test.ts
398
+ apps/verifier/src/explore/verify-routes.ts
399
+ apps/verifier/src/gateway-live.test.ts
400
+ apps/verifier/src/gateway.test.ts
401
+ apps/verifier/src/gateway.ts
402
+ apps/verifier/src/grade-reconcile.test.ts
403
+ apps/verifier/src/grade.ts
404
+ apps/verifier/src/harness.test.ts
405
+ apps/verifier/src/harness.ts
406
+ apps/verifier/src/index.ts
407
+ apps/verifier/src/inject/inject-live.test.ts
408
+ apps/verifier/src/inject/inject-run.test.ts
409
+ apps/verifier/src/inject/injecting-launcher.test.ts
410
+ apps/verifier/src/inject/injecting-launcher.ts
411
+ apps/verifier/src/inject/origin-bridges.test.ts
412
+ apps/verifier/src/inject/origin-bridges.ts
413
+ apps/verifier/src/inject/sdk-bundle.test.ts
414
+ apps/verifier/src/inject/sdk-bundle.ts
415
+ apps/verifier/src/memory/knowledge-store.test.ts
416
+ apps/verifier/src/memory/knowledge-store.ts
417
+ apps/verifier/src/model/app-model-starting-route.test.ts
418
+ apps/verifier/src/model/app-model.test.ts
419
+ apps/verifier/src/model/app-model.ts
420
+ apps/verifier/src/oracles/crawl-artifact.test.ts
421
+ apps/verifier/src/oracles/crawl-artifact.ts
422
+ apps/verifier/src/oracles/finding.ts
423
+ apps/verifier/src/oracles/history.test.ts
424
+ apps/verifier/src/oracles/history.ts
425
+ apps/verifier/src/oracles/index.ts
426
+ apps/verifier/src/oracles/metamorphic.test.ts
427
+ apps/verifier/src/oracles/metamorphic.ts
428
+ apps/verifier/src/oracles/state-write-drift.test.ts
429
+ apps/verifier/src/oracles/state-write-drift.ts
430
+ apps/verifier/src/parallel/fanout.test.ts
431
+ apps/verifier/src/parallel/fanout.ts
432
+ apps/verifier/src/path-segment.test.ts
433
+ apps/verifier/src/path-segment.ts
434
+ apps/verifier/src/precision.test.ts
435
+ apps/verifier/src/precision.ts
436
+ apps/verifier/src/preview/readiness-run.test.ts
437
+ apps/verifier/src/preview/readiness.test.ts
438
+ apps/verifier/src/preview/readiness.ts
439
+ apps/verifier/src/promote.test.ts
440
+ apps/verifier/src/promote.ts
441
+ apps/verifier/src/regression.test.ts
442
+ apps/verifier/src/regression.ts
443
+ apps/verifier/src/report-gaps.test.ts
444
+ apps/verifier/src/report-routes.test.ts
445
+ apps/verifier/src/report.test.ts
446
+ apps/verifier/src/report.ts
447
+ apps/verifier/src/reticle-toolset.test.ts
448
+ apps/verifier/src/reticle-toolset.ts
449
+ apps/verifier/src/runner.test.ts
450
+ apps/verifier/src/runner.ts
451
+ apps/verifier/src/serve.ts
452
+ apps/verifier/src/store-fs.test.ts
453
+ apps/verifier/src/store-fs.ts
454
+ apps/verifier/src/suite/derive-expect.test.ts
455
+ apps/verifier/src/suite/derive-expect.ts
456
+ apps/verifier/src/suite/domains.test.ts
457
+ apps/verifier/src/suite/domains.ts
458
+ apps/verifier/src/suite/flow-health.test.ts
459
+ apps/verifier/src/suite/flow-health.ts
460
+ apps/verifier/src/suite/flow-identity.test.ts
461
+ apps/verifier/src/suite/flow-identity.ts
462
+ apps/verifier/src/suite/replay-live.test.ts
463
+ apps/verifier/src/suite/replay.test.ts
464
+ apps/verifier/src/suite/replay.ts
465
+ apps/verifier/src/suite/route-set.test.ts
466
+ apps/verifier/src/suite/route-set.ts
467
+ apps/verifier/src/suite/route-tagging.test.ts
468
+ apps/verifier/src/suite/segment.test.ts
469
+ apps/verifier/src/suite/segment.ts
470
+ apps/verifier/src/suite/suite-store.test.ts
471
+ apps/verifier/src/suite/suite-store.ts
472
+ apps/verifier/src/suite/unproven.test.ts
473
+ apps/verifier/src/suite/unproven.ts
474
+ apps/verifier/src/suite/write-set.ts
475
+ apps/verifier/src/tool-contract.test.ts
476
+ apps/verifier/src/transport.test.ts
477
+ apps/verifier/src/transport.ts
478
+ apps/verifier/src/with-timeout.test.ts
479
+ apps/verifier/src/with-timeout.ts
480
+ apps/verifier/tsconfig.json
481
+ deploy/README.md
482
+ deploy/api.Dockerfile
483
+ deploy/deploy.sh
484
+ deploy/secrets.env.example
485
+ deploy/verifier.Dockerfile
486
+ docs/fixtures.md
487
+ docs/gates.md
488
+ docs/persona.md
489
+ docs/service-api.md
490
+ eslint.config.mjs
491
+ eval/fixtures/index.html
492
+ eval/fixtures/package.json
493
+ eval/fixtures/src/main.ts
494
+ eval/fixtures/src/manifest.ts
495
+ eval/fixtures/src/scenario.ts
496
+ eval/fixtures/src/scenarios/canvas.ts
497
+ eval/fixtures/src/scenarios/checkout.ts
498
+ eval/fixtures/src/scenarios/dashboard.ts
499
+ eval/fixtures/src/scenarios/game.ts
500
+ eval/fixtures/src/scenarios/index.ts
501
+ eval/fixtures/src/scenarios/landing.ts
502
+ eval/fixtures/src/scenarios/realtime.ts
503
+ eval/fixtures/src/scenarios/trading.ts
504
+ eval/fixtures/src/scenarios/video.ts
505
+ eval/fixtures/src/scenarios/workspace.ts
506
+ eval/fixtures/src/styles.css
507
+ eval/fixtures/tsconfig.json
508
+ eval/fixtures/vite.config.ts
509
+ package.json
510
+ pnpm-lock.yaml
511
+ pnpm-workspace.yaml
512
+ pre-commit.sh
513
+ scripts/capacity.mjs
514
+ scripts/eval-env.sh
515
+ scripts/token-cost.mjs
516
+ tsconfig.base.json
517
+ tsconfig.json
518
+ turbo.json confirmed a tracked flow holding a plaintext password.
519
+ *
520
+ * The decision keys off the ANCHOR, not the value. The anchor names the field — ,
521
+ * — so a credential is recognised by WHERE it was typed rather than by guessing whether
522
+ * the characters look secret, which is the guess that both over-redacts a search box and misses a
523
+ * password that happens to be a dictionary word.
524
+ *
525
+ * is the same rule the network channel already redacts by. One rule, so a
526
+ * field considered sensitive on the wire cannot be considered safe on disk.
527
+ */
528
+ function redactSecretFill(anchor, args) {
529
+ if (typeof args['value'] !== 'string')
530
+ return args;
531
+ const field = anchorFieldName(anchor);
532
+ if (field === undefined || !defaultIsSensitiveKey(field))
533
+ return args;
534
+ return { ...args, value: REDACTED_FILL };
535
+ }
536
+ /**
537
+ * What the anchor CALLS the field it points at.
538
+ *
539
+ * Every anchor kind names its target differently and all of them can name a password: a testid
540
+ * (auth-password), an accessible name (role=textbox, name="Password"), a signal. Checking only the
541
+ * testid variant would redact the app that uses test ids and quietly leak the one that does not —
542
+ * and an app without test ids is exactly the app whose flows were recorded by role.
543
+ */
544
+ function anchorFieldName(anchor) {
545
+ if (AnchorKind.TESTID === anchor.kind)
546
+ return anchor.value;
547
+ if (AnchorKind.ROLE === anchor.kind)
548
+ return anchor.name;
549
+ if (AnchorKind.SIGNAL === anchor.kind)
550
+ return anchor.name;
551
+ return undefined;
552
+ }
97
553
  function buildStep(tool, anchor, action, args, degraded) {
98
- const step = { tool, anchor, args };
554
+ const step = { tool, anchor, args: redactSecretFill(anchor, args) };
99
555
  if (action !== undefined)
100
556
  step.action = action;
101
557
  if (degraded)
@@ -215,6 +671,16 @@ export class FlowStore {
215
671
  ...(pid === undefined ? {} : { projectId: pid }),
216
672
  createdAt: this.#clock.now(),
217
673
  steps,
674
+ /*
675
+ * The route the journey started on, when the recording captured one.
676
+ *
677
+ * The in-page recorder has always written this; the agent's recording had nowhere to put it,
678
+ * so a flow an agent recorded replayed from wherever the tab happened to be. A first step
679
+ * whose whole consequence is "this navigation fetches" fetches nothing when replay already
680
+ * sits on the destination, and the flow then drifts for a reason that has nothing to do with
681
+ * the app. Observed doing exactly that.
682
+ */
683
+ ...(program.startPath === undefined ? {} : { startPath: program.startPath }),
218
684
  };
219
685
  const flow = await this.#linkIntent(withAnnotations(base, annotations));
220
686
  await this.#fs.mkdir(flowDir(this.#root, pid));
@@ -12,6 +12,7 @@ import { replayFlow } from './flow-replay.js';
12
12
  import { applyHealChanges, collectProposals } from './heal.js';
13
13
  import { assertSuccess, dynamicTestids, successLabel } from './flow-success.js';
14
14
  import { flowErrorMessage, sessionProjectId } from './flow-replay-run.js';
15
+ import { flowsForSession } from './flow-store-for-session.js';
15
16
  const HEAL_MESSAGES = {
16
17
  NOTHING: 'nothing to heal — every anchor resolved on replay',
17
18
  HEALED: "rewrote drifted testid anchors to their nearest surviving match and re-verified the flow's success consequence still fires",
@@ -27,7 +28,7 @@ export async function healFlow(deps, args) {
27
28
  const name = asString(args['flowName']) ?? '';
28
29
  const apply = true === args['apply'];
29
30
  const projectId = sessionProjectId(deps, asString(args['sessionId']));
30
- const loaded = await deps.flows.load(name, projectId);
31
+ const loaded = await flowsForSession(deps, projectId).flows.load(name, projectId);
31
32
  if (!loaded.ok) {
32
33
  return {
33
34
  name,
@@ -113,7 +114,9 @@ export async function healFlow(deps, args) {
113
114
  };
114
115
  }
115
116
  }
116
- const written = await deps.flows.heal(name, proposals.map(toChange), projectId);
117
+ // Healing WRITES, so it must land where the load came from — a heal that read the app's flow and
118
+ // wrote the daemon's copy would silently fork the two.
119
+ const written = await flowsForSession(deps, projectId).flows.heal(name, proposals.map(toChange), projectId);
117
120
  if (!written.ok) {
118
121
  return {
119
122
  name,
@@ -19,20 +19,25 @@ import type { FlowExpect } from '@reticlehq/core';
19
19
  import type { Predicate } from '../events/predicate.js';
20
20
  export declare function predicateToExpect(predicate: Predicate): FlowExpect | undefined;
21
21
  /**
22
- * The subset a REPLAY actually enforces today.
22
+ * The subset a REPLAY actually enforces.
23
23
  *
24
- * `flow-replay` checks exactly two things per step: `expect.element.testid` is present after the
25
- * action, and `expect.state` holds. A recorded `net` or `signal` expect is graded as a consequence
26
- * assertion by `classifyFlowAssertions` and then never evaluated — so writing one into a flow file
27
- * would make it report `grade: "asserted"` while nothing checks it.
24
+ * The rule has never changed: never write an assertion into a flow file that nothing evaluates. A
25
+ * flow reporting `grade: "asserted"` while its assertion is read by no one is a false green, in the
26
+ * feature whose entire purpose is preventing them.
28
27
  *
29
- * That is a false green, in the feature whose entire purpose is preventing them, produced by the
30
- * change that was meant to strengthen it. So only the enforced kinds are recorded: a flow that says
31
- * it asserts something must actually go red when that thing breaks.
28
+ * What changed is the SET. This kept only `element.testid` and `state`, because for a long time
29
+ * those were the only kinds replay checked — and the note here said lifting it "requires replay to
30
+ * evaluate them per step". Replay now does exactly that: `assertStepExpect` compiles every
31
+ * remaining kind through `successToPredicate` and waits on it. The condition was met and the filter
32
+ * was not updated, so the two drifted.
32
33
  *
33
- * Lifting this is worth doing — net and signal are the assertions agents most often make, and the
34
- * conversion above already handles them — but it requires replay to evaluate them per step (the
35
- * machinery exists: successToPredicate + the predicate engine). Until then, recording them would
36
- * trade a weak flow for a lying one.
34
+ * That drift had a cost, and it fell on the agent. `reticle_act_and_wait { until }` IS the agent
35
+ * saying what success means, and `net` is overwhelmingly what it says. Every one of those was
36
+ * discarded at capture, so an agent-recorded flow reached disk assertion-free BY CONSTRUCTION and
37
+ * `reticle_verify` then correctly called it `unverifiable` — the record → save → verify path
38
+ * completing all the way to a run that could never be a pass. Found by driving it.
39
+ *
40
+ * The list below is exactly what `successToPredicate` reads, plus the testid the step runner
41
+ * asserts directly against the DOM. Anything it cannot compile is still dropped.
37
42
  */
38
43
  export declare function enforcedOnReplay(expect: FlowExpect | undefined): FlowExpect | undefined;
@@ -78,29 +78,47 @@ export function predicateToExpect(predicate) {
78
78
  }
79
79
  }
80
80
  /**
81
- * The subset a REPLAY actually enforces today.
81
+ * The subset a REPLAY actually enforces.
82
82
  *
83
- * `flow-replay` checks exactly two things per step: `expect.element.testid` is present after the
84
- * action, and `expect.state` holds. A recorded `net` or `signal` expect is graded as a consequence
85
- * assertion by `classifyFlowAssertions` and then never evaluated — so writing one into a flow file
86
- * would make it report `grade: "asserted"` while nothing checks it.
83
+ * The rule has never changed: never write an assertion into a flow file that nothing evaluates. A
84
+ * flow reporting `grade: "asserted"` while its assertion is read by no one is a false green, in the
85
+ * feature whose entire purpose is preventing them.
87
86
  *
88
- * That is a false green, in the feature whose entire purpose is preventing them, produced by the
89
- * change that was meant to strengthen it. So only the enforced kinds are recorded: a flow that says
90
- * it asserts something must actually go red when that thing breaks.
87
+ * What changed is the SET. This kept only `element.testid` and `state`, because for a long time
88
+ * those were the only kinds replay checked — and the note here said lifting it "requires replay to
89
+ * evaluate them per step". Replay now does exactly that: `assertStepExpect` compiles every
90
+ * remaining kind through `successToPredicate` and waits on it. The condition was met and the filter
91
+ * was not updated, so the two drifted.
91
92
  *
92
- * Lifting this is worth doing — net and signal are the assertions agents most often make, and the
93
- * conversion above already handles them — but it requires replay to evaluate them per step (the
94
- * machinery exists: successToPredicate + the predicate engine). Until then, recording them would
95
- * trade a weak flow for a lying one.
93
+ * That drift had a cost, and it fell on the agent. `reticle_act_and_wait { until }` IS the agent
94
+ * saying what success means, and `net` is overwhelmingly what it says. Every one of those was
95
+ * discarded at capture, so an agent-recorded flow reached disk assertion-free BY CONSTRUCTION and
96
+ * `reticle_verify` then correctly called it `unverifiable` — the record → save → verify path
97
+ * completing all the way to a run that could never be a pass. Found by driving it.
98
+ *
99
+ * The list below is exactly what `successToPredicate` reads, plus the testid the step runner
100
+ * asserts directly against the DOM. Anything it cannot compile is still dropped.
96
101
  */
97
102
  export function enforcedOnReplay(expect) {
98
103
  if (expect === undefined)
99
104
  return undefined;
100
105
  const kept = {};
106
+ // The step runner asserts this one directly against the live DOM, before the predicate engine.
101
107
  if (expect.element?.testid !== undefined)
102
108
  kept.element = expect.element;
109
+ // Everything `successToPredicate` can compile. Replay evaluates EVERY kind of expect through it
110
+ // (see assertStepExpect); this list is what that function actually reads.
103
111
  if (expect.state !== undefined)
104
112
  kept.state = expect.state;
113
+ if (expect.signal !== undefined)
114
+ kept.signal = expect.signal;
115
+ if (expect.signalData !== undefined)
116
+ kept.signalData = expect.signalData;
117
+ if (expect.signalCount !== undefined)
118
+ kept.signalCount = expect.signalCount;
119
+ if (expect.net !== undefined)
120
+ kept.net = expect.net;
121
+ if (expect.console !== undefined)
122
+ kept.console = expect.console;
105
123
  return 0 === Object.keys(kept).length ? undefined : kept;
106
124
  }