@reticlehq/server 2.8.0 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +130 -813
- package/dist/bridge/bridge.d.ts +23 -0
- package/dist/bridge/bridge.js +80 -2
- package/dist/bridge/bridge.test-harness.d.ts +5 -0
- package/dist/bridge/bridge.test-harness.js +6 -4
- package/dist/capsule/capsule-store.d.ts +2 -2
- package/dist/capsule/causal-summary.d.ts +16 -1
- package/dist/capsule/causal-summary.js +2 -1
- package/dist/cli/cli-doctor.js +41 -13
- package/dist/cli/cli-flow-commands.js +8 -8
- package/dist/cli/cli-launch.d.ts +0 -17
- package/dist/cli/cli-launch.js +0 -28
- package/dist/cli/cli-parse.d.ts +1 -1
- package/dist/cli/cli-parse.js +1 -1
- package/dist/cli/cli-port.d.ts +24 -0
- package/dist/cli/cli-port.js +66 -35
- package/dist/cli/cli-verify.d.ts +21 -0
- package/dist/cli/cli-verify.js +45 -1
- package/dist/cli/config-discovery.d.ts +35 -0
- package/dist/cli/config-discovery.js +163 -0
- package/dist/cli/doctor-daemon-line.js +4 -1
- package/dist/cli/doctor-project-line.d.ts +37 -0
- package/dist/cli/doctor-project-line.js +35 -0
- package/dist/cli/doctor-rows.d.ts +51 -0
- package/dist/cli/doctor-rows.js +54 -0
- package/dist/cli/doctor-sessions-line.js +6 -3
- package/dist/cli/drive-attach.d.ts +99 -0
- package/dist/cli/drive-attach.js +203 -0
- package/dist/cli/drive-command.d.ts +13 -0
- package/dist/cli/drive-command.js +103 -0
- package/dist/cli/open-note.d.ts +20 -0
- package/dist/cli/open-note.js +37 -0
- package/dist/cli/status-next-action.d.ts +37 -0
- package/dist/cli/status-next-action.js +61 -0
- package/dist/cli.js +65 -70
- package/dist/crawl/crawl.d.ts +7 -2
- package/dist/crawl/crawl.js +52 -9
- package/dist/ee/audit-log.js +2 -2
- package/dist/events/body-failures.d.ts +2 -2
- package/dist/events/contradiction-folds.d.ts +45 -0
- package/dist/events/contradiction-folds.js +42 -0
- package/dist/events/contradictions.d.ts +51 -1
- package/dist/events/contradictions.js +26 -7
- package/dist/events/declared.d.ts +45 -0
- package/dist/events/declared.js +73 -0
- package/dist/events/echo-mismatch.d.ts +9 -3
- package/dist/events/echo-mismatch.js +33 -5
- package/dist/events/event-filters.d.ts +1 -1
- package/dist/events/event-filters.js +7 -4
- package/dist/events/predicate-eval.d.ts +17 -91
- package/dist/events/predicate-eval.js +85 -326
- package/dist/events/predicate-parse.js +31 -3
- package/dist/events/predicate-route.d.ts +32 -0
- package/dist/events/predicate-route.js +102 -0
- package/dist/events/predicate-schema.d.ts +99 -0
- package/dist/events/predicate-schema.js +309 -0
- package/dist/events/predicate.d.ts +8 -0
- package/dist/events/predicate.js +127 -5
- package/dist/events/stale-response.d.ts +2 -3
- package/dist/events/stale-response.js +49 -2
- package/dist/events/unit-mismatch.d.ts +2 -2
- package/dist/flows/annotate-tools.js +3 -0
- package/dist/flows/annotate.js +18 -4
- package/dist/flows/coverage.d.ts +38 -5
- package/dist/flows/coverage.js +30 -4
- package/dist/flows/decision.d.ts +15 -0
- package/dist/flows/decision.js +1 -1
- package/dist/flows/flow-replay-run.js +8 -1
- package/dist/flows/flow-tools.js +9 -1
- package/dist/flows/replay.js +3 -0
- package/dist/flows/verify-change-tools.js +1 -1
- package/dist/honesty/accepted-write.d.ts +3 -0
- package/dist/honesty/accepted-write.js +8 -3
- package/dist/honesty/already-true.js +15 -0
- package/dist/honesty/blind-spots.js +4 -0
- package/dist/honesty/honesty.d.ts +11 -0
- package/dist/honesty/honesty.js +1 -0
- package/dist/honesty/uncaptured-bodies.d.ts +4 -2
- package/dist/honesty/uncaptured-bodies.js +9 -2
- package/dist/honesty/unread-outcome.d.ts +8 -0
- package/dist/honesty/unread-outcome.js +36 -9
- package/dist/honesty/unsettled.d.ts +9 -0
- package/dist/honesty/unsettled.js +7 -3
- package/dist/honesty/verified.d.ts +29 -3
- package/dist/honesty/verified.js +67 -8
- package/dist/http-server.d.ts +19 -0
- package/dist/http-server.js +202 -4
- package/dist/impact/impact-recorder.d.ts +23 -0
- package/dist/impact/impact-recorder.js +76 -0
- package/dist/impact/impact-store.d.ts +47 -0
- package/dist/impact/impact-store.js +171 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +60 -10
- package/dist/init/agent-rules.d.ts +20 -0
- package/dist/init/agent-rules.js +36 -0
- package/dist/init/astro-patch.js +27 -1
- package/dist/init/confirm.d.ts +21 -3
- package/dist/init/confirm.js +32 -5
- package/dist/init/connect-steps.d.ts +2 -0
- package/dist/init/connect-steps.js +50 -0
- package/dist/init/csp-check.d.ts +38 -0
- package/dist/init/csp-check.js +92 -0
- package/dist/init/csp-doctor.d.ts +25 -0
- package/dist/init/csp-doctor.js +49 -0
- package/dist/init/cursor.js +6 -9
- package/dist/init/detect.d.ts +8 -0
- package/dist/init/detect.js +33 -3
- package/dist/init/mcp-clients.d.ts +1 -0
- package/dist/init/mcp-clients.js +51 -7
- package/dist/init/mcp.d.ts +16 -2
- package/dist/init/mcp.js +23 -1
- package/dist/init/plan-framework.d.ts +10 -0
- package/dist/init/plan-framework.js +25 -1
- package/dist/init/plan.d.ts +7 -2
- package/dist/init/plan.js +66 -30
- package/dist/init/run.js +11 -5
- package/dist/init/slash-command.d.ts +1 -1
- package/dist/init/slash-command.js +12 -4
- package/dist/init/snippets.d.ts +1 -1
- package/dist/init/snippets.js +35 -7
- package/dist/init/vite-config.js +24 -2
- package/dist/input/network-mock-tools.js +8 -1
- package/dist/input/scroll-find.d.ts +6 -0
- package/dist/input/scroll-find.js +17 -2
- package/dist/input/scroll-tools.js +4 -0
- package/dist/journal/attach-journal.d.ts +9 -1
- package/dist/journal/attach-journal.js +13 -2
- package/dist/journal/journal-query.d.ts +13 -0
- package/dist/journal/journal-query.js +28 -3
- package/dist/journal/workspace-gitignore.d.ts +10 -0
- package/dist/journal/workspace-gitignore.js +59 -0
- package/dist/license/license.d.ts +69 -4
- package/dist/license/license.js +84 -15
- package/dist/mcp/mcp-proxy.d.ts +7 -93
- package/dist/mcp/mcp-proxy.js +183 -250
- package/dist/mcp/mcp.d.ts +27 -2
- package/dist/mcp/mcp.js +77 -36
- package/dist/mcp/proxy-daemon-probe.d.ts +8 -0
- package/dist/mcp/proxy-daemon-probe.js +48 -0
- package/dist/mcp/proxy-handshake.d.ts +82 -1
- package/dist/mcp/proxy-handshake.js +110 -3
- package/dist/mcp/proxy-lifecycle.d.ts +10 -1
- package/dist/mcp/proxy-lifecycle.js +11 -2
- package/dist/mcp/proxy-log.d.ts +63 -0
- package/dist/mcp/proxy-log.js +132 -0
- package/dist/mcp/server-instructions.d.ts +17 -0
- package/dist/mcp/server-instructions.js +56 -0
- package/dist/mcp/shared-params.d.ts +27 -0
- package/dist/mcp/shared-params.js +36 -0
- package/dist/mcp/sse-frame-parser.d.ts +19 -0
- package/dist/mcp/sse-frame-parser.js +41 -0
- package/dist/project/reticle-dir.d.ts +2 -0
- package/dist/project/reticle-dir.js +1 -0
- package/dist/session/connection-memory.d.ts +59 -0
- package/dist/session/connection-memory.js +108 -0
- package/dist/session/dev-command.d.ts +26 -0
- package/dist/session/dev-command.js +89 -0
- package/dist/session/dev-server-probe.d.ts +68 -0
- package/dist/session/dev-server-probe.js +102 -7
- package/dist/session/last-act.d.ts +26 -0
- package/dist/session/last-act.js +35 -1
- package/dist/session/live-control-tools.js +42 -5
- package/dist/session/no-session-diagnosis.d.ts +55 -2
- package/dist/session/no-session-diagnosis.js +199 -22
- package/dist/session/no-session-next-action.d.ts +46 -0
- package/dist/session/no-session-next-action.js +85 -0
- package/dist/session/no-session-watch.d.ts +40 -1
- package/dist/session/no-session-watch.js +172 -11
- package/dist/session/pending-commands.d.ts +12 -0
- package/dist/session/pending-commands.js +13 -1
- package/dist/session/session-manager.d.ts +4 -0
- package/dist/session/session-manager.js +35 -5
- package/dist/session/session-readiness.js +1 -1
- package/dist/session/session.d.ts +10 -1
- package/dist/session/session.js +146 -5
- package/dist/telemetry/app-instrumented.d.ts +8 -0
- package/dist/telemetry/app-instrumented.js +10 -0
- package/dist/telemetry/bug-found.d.ts +18 -0
- package/dist/telemetry/bug-found.js +14 -0
- package/dist/telemetry/daemon-telemetry.js +29 -0
- package/dist/telemetry/install-source.d.ts +20 -0
- package/dist/telemetry/install-source.js +34 -0
- package/dist/telemetry/instrumentation-stall.d.ts +57 -0
- package/dist/telemetry/instrumentation-stall.js +103 -0
- package/dist/telemetry/license-activation.d.ts +48 -0
- package/dist/telemetry/license-activation.js +57 -0
- package/dist/telemetry/session-metrics.d.ts +8 -0
- package/dist/telemetry/session-metrics.js +10 -0
- package/dist/telemetry/telemetry.d.ts +3 -1
- package/dist/telemetry/telemetry.js +23 -3
- package/dist/tools/act-tools.js +166 -29
- package/dist/tools/assert-verdict.js +32 -7
- package/dist/tools/browser-tools.js +10 -0
- package/dist/tools/dynamic-tools.js +17 -8
- package/dist/tools/error-recovery.js +10 -6
- package/dist/tools/feedback-tools.js +31 -6
- package/dist/tools/invoke-tool.d.ts +1 -1
- package/dist/tools/invoke-tool.js +30 -8
- package/dist/tools/lease-hint.d.ts +30 -8
- package/dist/tools/lease-hint.js +65 -14
- package/dist/tools/lease-tools.d.ts +11 -0
- package/dist/tools/lease-tools.js +141 -96
- package/dist/tools/observe-tools.js +9 -3
- package/dist/tools/react-grace.d.ts +4 -0
- package/dist/tools/react-grace.js +6 -3
- package/dist/tools/read-tools.js +47 -1
- package/dist/tools/resolve-target.d.ts +33 -0
- package/dist/tools/resolve-target.js +53 -0
- package/dist/tools/settle-in-flight.d.ts +15 -0
- package/dist/tools/settle-in-flight.js +42 -2
- package/dist/tools/snapshot-delta.d.ts +3 -0
- package/dist/tools/snapshot-delta.js +67 -6
- package/dist/tools/tool-kit.d.ts +38 -3
- package/dist/tools/tool-names.d.ts +2 -0
- package/dist/tools/tool-names.js +2 -0
- package/dist/tools/tool-surface.d.ts +60 -0
- package/dist/tools/tool-surface.js +84 -19
- package/dist/tools/tools.js +61 -5
- package/dist/tools/unadvertised-help.js +9 -6
- package/docs/README.md +1 -2
- package/docs/actions.mdx +41 -8
- package/docs/agent-cheatsheet.md +6 -4
- package/docs/architecture.md +6 -0
- package/docs/benchmarks.md +60 -12
- package/docs/best-practices.mdx +11 -6
- package/docs/capabilities.mdx +204 -57
- package/docs/cli/affected.mdx +6 -4
- package/docs/cli/capsules.mdx +9 -8
- package/docs/cli/cloud.mdx +30 -4
- package/docs/cli/doctor.mdx +41 -8
- package/docs/cli/drive.mdx +34 -15
- package/docs/cli/gate.mdx +6 -6
- package/docs/cli/help.mdx +8 -6
- package/docs/cli/hunt.mdx +20 -4
- package/docs/cli/identify.mdx +16 -2
- package/docs/cli/init.mdx +35 -8
- package/docs/cli/kill.mdx +5 -5
- package/docs/cli/license.mdx +1 -1
- package/docs/cli/open.mdx +6 -0
- package/docs/cli/restart.mdx +6 -6
- package/docs/cli/serve.mdx +10 -3
- package/docs/cli/status.mdx +29 -5
- package/docs/cli/stop.mdx +8 -0
- package/docs/cli/verify.mdx +20 -1
- package/docs/cli/version.mdx +1 -1
- package/docs/cli/watch.mdx +9 -2
- package/docs/cli.mdx +44 -22
- package/docs/debugging.md +3 -1
- package/docs/deploy-checks.md +31 -2
- package/docs/desktop.mdx +276 -80
- package/docs/docs.json +13 -12
- package/docs/enterprise.md +9 -3
- package/docs/faq.mdx +49 -35
- package/docs/fixtures.md +2 -0
- package/docs/flows.md +7 -5
- package/docs/for-agents.md +3 -3
- package/docs/frameworks.mdx +46 -7
- package/docs/gate-plan.md +4 -2
- package/docs/gates.md +8 -6
- package/docs/getting-started.md +53 -12
- package/docs/human-control.md +2 -0
- package/docs/index.mdx +43 -1
- package/docs/install-agentic.mdx +13 -4
- package/docs/install-manual.mdx +6 -4
- package/docs/instrumentation.mdx +7 -1
- package/docs/integration-patterns.md +3 -1
- package/docs/local-registry.md +4 -2
- package/docs/multi-agent-testing.md +3 -1
- package/docs/packages/babel-plugin.mdx +15 -6
- package/docs/packages/browser.mdx +2 -2
- package/docs/packages/core.mdx +26 -16
- package/docs/packages/electron.mdx +5 -7
- package/docs/packages/eslint-plugin.mdx +5 -3
- package/docs/packages/next.mdx +3 -5
- package/docs/packages/react.mdx +3 -3
- package/docs/packages/server.mdx +2 -2
- package/docs/packages/tauri.mdx +6 -6
- package/docs/packages/test.mdx +18 -7
- package/docs/packages/vite-plugin.mdx +4 -6
- package/docs/packages.mdx +14 -13
- package/docs/platform-integration.md +2 -0
- package/docs/predicates.mdx +76 -7
- package/docs/quickstart.mdx +51 -5
- package/docs/recipes.mdx +63 -23
- package/docs/skill-file.mdx +3 -1
- package/docs/state-management.mdx +2 -0
- package/docs/system-map.md +3 -1
- package/docs/telemetry-contract.md +33 -5
- package/docs/telemetry-events.mdx +63 -18
- package/docs/telemetry.md +8 -5
- package/docs/testing.md +35 -1
- package/docs/token-efficiency.md +8 -2
- package/docs/tools-act-and-wait.mdx +64 -14
- package/docs/tools-act-sequence.mdx +34 -17
- package/docs/tools-act.mdx +24 -11
- package/docs/tools-assert.mdx +69 -10
- package/docs/tools-console.mdx +11 -7
- package/docs/tools-inspect.mdx +11 -8
- package/docs/tools-navigate.mdx +41 -5
- package/docs/tools-network.mdx +42 -9
- package/docs/tools-observe.mdx +66 -10
- package/docs/tools-overview.mdx +26 -23
- package/docs/tools-query.mdx +52 -8
- package/docs/tools-session-and-feedback.mdx +35 -9
- package/docs/tools-sessions.mdx +39 -10
- package/docs/tools-snapshot.mdx +57 -3
- package/docs/tools-state.mdx +24 -1
- package/docs/tools-tools-and-run.mdx +55 -24
- package/docs/tools-wait-for.mdx +34 -15
- package/docs/troubleshooting.mdx +80 -10
- package/docs/usage.md +46 -24
- package/docs/vs-chrome-devtools-mcp.mdx +41 -0
- package/docs/vs-playwright-mcp.mdx +42 -2
- package/docs/vs-screenshots.mdx +42 -1
- package/docs/what-is-reticle.mdx +1 -1
- package/docs/why-reticle.mdx +3 -1
- package/package.json +5 -5
- package/docs/desktop-apps.md +0 -265
package/docs/best-practices.mdx
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Best practices: how to earn a green
|
|
2
|
+
title: 'Best practices: how to earn a green'
|
|
3
3
|
sidebarTitle: Best practices
|
|
4
4
|
description: The habits that make a verdict worth trusting, and the specific mistakes that produce a confident, wrong pass.
|
|
5
5
|
icon: star
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
+
A green is worth trusting when you named the consequence **before** you acted, ended the run on `reticle_act_and_wait` or `reticle_assert` (nothing else produces a verdict), scoped the assertion with `since`, and read `verified` rather than `pass`. Everything below is one of those habits, or the specific mistake that breaks it.
|
|
9
|
+
|
|
8
10
|
Everything here comes from driving Reticle against real apps and getting it wrong first. None of it is theoretical, and several entries exist because they bit us while writing these docs.
|
|
9
11
|
|
|
10
12
|
## Name the consequence before you act
|
|
@@ -87,11 +89,14 @@ Every `act` response returns a `since`. Use it.
|
|
|
87
89
|
|
|
88
90
|
Every verdict reports `honesty.grade`. Aim for `signal`.
|
|
89
91
|
|
|
90
|
-
| Grade | What it means
|
|
91
|
-
| ---------- |
|
|
92
|
-
| `presence` | Something appeared
|
|
93
|
-
| `state` | A registered store changed
|
|
94
|
-
| `
|
|
92
|
+
| Grade | What it means | How much it proves |
|
|
93
|
+
| ---------- | ----------------------------- | --------------------------- |
|
|
94
|
+
| `presence` | Something appeared | A mock does this too |
|
|
95
|
+
| `state` | A registered store changed | The app accepted it |
|
|
96
|
+
| `net` | A request fired and came back | The app talked to the world |
|
|
97
|
+
| `signal` | The app fired a named signal | The app declared success |
|
|
98
|
+
|
|
99
|
+
Ranked weakest to strongest, that is `presence` < `state` < `net` < `signal`. A predicate with no consequence at all grades `none`.
|
|
95
100
|
|
|
96
101
|
Getting from `presence` to `signal` is roughly ten minutes of [instrumentation](/instrumentation) per flow, and it is the highest-leverage work available.
|
|
97
102
|
|
package/docs/capabilities.mdx
CHANGED
|
@@ -4,9 +4,9 @@ description: Coverage, storage, fake clocks, autonomous crawling, visual diffing
|
|
|
4
4
|
icon: sparkles
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
These are the Reticle tools that do something other than look, act, observe and assert: control coverage, client storage, a fake clock, autonomous crawling, semantic and visual baselines, network mocking, flow recording and replay, and the CI artifact. Reach for them when the verify loop is not the shape of the question. None of them live in the default advertised surface, so all of them are called through [`reticle_run`](/tools-tools-and-run).
|
|
8
8
|
|
|
9
|
-
These are the tools for the times you want something else, and they are the ones people are most surprised exist.
|
|
9
|
+
Most of the time you want the verify loop. Look, act, observe, assert. These are the tools for the times you want something else, and they are the ones people are most surprised exist.
|
|
10
10
|
|
|
11
11
|
## Available anywhere
|
|
12
12
|
|
|
@@ -15,21 +15,24 @@ These work through the always-on SDK, in any connected session.
|
|
|
15
15
|
### Coverage: what you have not driven yet
|
|
16
16
|
|
|
17
17
|
```json
|
|
18
|
-
{ "tool": "
|
|
18
|
+
{ "tool": "reticle_verify", "args": { "action": "coverage" } }
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
```json
|
|
22
22
|
{
|
|
23
|
-
"total":
|
|
24
|
-
"exercised":
|
|
23
|
+
"total": 43,
|
|
24
|
+
"exercised": 2,
|
|
25
25
|
"untouched": [
|
|
26
|
-
{ "ref": "
|
|
27
|
-
{ "ref": "
|
|
28
|
-
{ "ref": "
|
|
26
|
+
{ "ref": "e619", "label": "button \"Overview\"" },
|
|
27
|
+
{ "ref": "e627", "label": "button \"Compose\"" },
|
|
28
|
+
{ "ref": "e632", "label": "textbox \"Filter by service…\"" },
|
|
29
|
+
{ "ref": "e635", "label": "button \"Row actions\"" }
|
|
29
30
|
]
|
|
30
31
|
}
|
|
31
32
|
```
|
|
32
33
|
|
|
34
|
+
That is a real capture with 39 of the 41 untouched entries trimmed out. Two controls driven out of forty-three.
|
|
35
|
+
|
|
33
36
|
Not code coverage. Control coverage: which interactive elements this session has actually touched.
|
|
34
37
|
|
|
35
38
|
Useful at the end of a drive, when the agent is about to report success. "I verified the page" reads differently next to `exercised: 0`.
|
|
@@ -42,12 +45,18 @@ Useful at the end of a drive, when the agent is about to report success. "I veri
|
|
|
42
45
|
|
|
43
46
|
```json
|
|
44
47
|
{
|
|
45
|
-
"local": {},
|
|
46
|
-
"session": {
|
|
47
|
-
|
|
48
|
+
"local": { "reticle.bench.authToken": "[REDACTED]" },
|
|
49
|
+
"session": {
|
|
50
|
+
"__reticle_ref_base": "700",
|
|
51
|
+
"__reticle_session": "s223e0fad-e012-43f9-a23d-6d585470c90d",
|
|
52
|
+
"reticle.bench.sessionId": "[REDACTED]"
|
|
53
|
+
},
|
|
54
|
+
"cookies": { "bench_session": "724fa5c2-d913-4d19-8a90-3a4d85dc09a0" }
|
|
48
55
|
}
|
|
49
56
|
```
|
|
50
57
|
|
|
58
|
+
Note the token redaction. Credential-shaped values are stripped here exactly as they are in [`reticle_network`](/tools-network), so reading storage never puts a session token in your context.
|
|
59
|
+
|
|
51
60
|
localStorage, sessionStorage and readable cookies.
|
|
52
61
|
|
|
53
62
|
This is where the "logged in but nothing persisted" bug lives. A login can fire its success signal, mutate state, and write nothing. Reload, and you are back at the login screen.
|
|
@@ -72,6 +81,8 @@ This is where the "logged in but nothing persisted" bug lives. A login can fire
|
|
|
72
81
|
{ "tool": "reticle_clock", "args": { "reset": true } }
|
|
73
82
|
```
|
|
74
83
|
|
|
84
|
+
`advanceMs` answers `{ "frozen": true }`, because advancing keeps the clock frozen at the new time. `reset` answers `{ "frozen": false }` and hands time back to the browser.
|
|
85
|
+
|
|
75
86
|
Toasts that auto-dismiss, debounced search, polling, session timeouts, retry backoff. All of these are normally verified by sleeping, which is slow and flaky in equal measure.
|
|
76
87
|
|
|
77
88
|
Freeze the clock, advance it by exactly the interval, assert the consequence. No sleeping, no guessing, and the same result on a fast laptop and a loaded CI runner.
|
|
@@ -79,20 +90,30 @@ Freeze the clock, advance it by exactly the interval, assert the consequence. No
|
|
|
79
90
|
### Crawl: click everything, report anomalies
|
|
80
91
|
|
|
81
92
|
```json
|
|
82
|
-
{ "tool": "
|
|
93
|
+
{ "tool": "reticle_verify", "args": { "action": "crawl", "maxSteps": 6 } }
|
|
83
94
|
```
|
|
84
95
|
|
|
85
96
|
```json
|
|
86
97
|
{
|
|
87
|
-
"interactiveFound":
|
|
88
|
-
"stepsRun":
|
|
98
|
+
"interactiveFound": 43,
|
|
99
|
+
"stepsRun": 6,
|
|
89
100
|
"anomalies": [],
|
|
90
101
|
"counts": { "consoleErrors": 0, "failedRequests": 0, "deadControls": 0, "contradictions": 0 },
|
|
91
|
-
"visited": [
|
|
92
|
-
|
|
102
|
+
"visited": [
|
|
103
|
+
"- button \"Overview\"",
|
|
104
|
+
"- button \"Deployments40\"",
|
|
105
|
+
"- button \"Compose\"",
|
|
106
|
+
"- button \"Diagnostics\"",
|
|
107
|
+
"- button \"Hostile\"",
|
|
108
|
+
"- button \"Search or jump to…⌘K\""
|
|
109
|
+
],
|
|
110
|
+
"truncated": true,
|
|
111
|
+
"coverageNote": "the page changed as you clicked: 7 control(s) that did not exist when this crawl started were never visited, interactiveFound is a floor, not a total; re-run the crawl from the state you are now in to cover them"
|
|
93
112
|
}
|
|
94
113
|
```
|
|
95
114
|
|
|
115
|
+
Read `coverageNote` before you read the counts. `interactiveFound` is measured when the crawl starts, so on any app where clicking reveals new controls it is a floor rather than a total, and the tool says so rather than letting `43` read as complete.
|
|
116
|
+
|
|
96
117
|
Autonomously clicks every reachable control and reports what went wrong. No script, no plan. The counts are the useful part: `deadControls` and `contradictions` are the two that indicate a real problem rather than a busy page.
|
|
97
118
|
|
|
98
119
|
This is the tool for an app you did not write and do not understand yet.
|
|
@@ -108,7 +129,15 @@ This is the tool for an app you did not write and do not understand yet.
|
|
|
108
129
|
{ "tool": "reticle_reconcile" }
|
|
109
130
|
```
|
|
110
131
|
|
|
111
|
-
|
|
132
|
+
```json
|
|
133
|
+
{
|
|
134
|
+
"mismatches": [],
|
|
135
|
+
"compared": 2,
|
|
136
|
+
"note": "compared 2 response(s); nothing on screen contradicts them"
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Compares the data an endpoint returned against what the page actually displays. `compared` is the field that makes the empty `mismatches` meaningful: `compared: 0` would mean it had nothing to check, not that everything agreed.
|
|
112
141
|
|
|
113
142
|
The bug it catches is specific and common: the API returned ten rows, the table shows nine, and nothing errored. Neither the network log nor the DOM is wrong on its own. Only the comparison is.
|
|
114
143
|
|
|
@@ -134,7 +163,7 @@ The most useful tool nobody knows about.
|
|
|
134
163
|
],
|
|
135
164
|
"declaredUntestedTestids": ["deploy-submit", "drawer", "palette", "…"]
|
|
136
165
|
},
|
|
137
|
-
"summary": "47 flows: 14 asserted, 2 presence-only, 31 assertion-free. 13 declared signal(s) no flow asserts. 33 flow(s) assert no consequence."
|
|
166
|
+
"summary": "47 flows: 14 asserted, 2 presence-only, 31 assertion-free. test first: asserted-demo2 (last run drifted). 13 declared signal(s) no flow asserts. 33 flow(s) assert no consequence."
|
|
138
167
|
}
|
|
139
168
|
```
|
|
140
169
|
|
|
@@ -159,7 +188,7 @@ Each flow comes back graded, with the consequence that must hold and a risk leve
|
|
|
159
188
|
}
|
|
160
189
|
```
|
|
161
190
|
|
|
162
|
-
`declaredUntestedSignals` is the other half: signals your app emits that no flow ever checks. It is a to-do list for your test suite, generated from what the app says about itself.
|
|
191
|
+
`declaredUntestedSignals` is the other half: signals your app emits that no flow ever checks. It is a to-do list for your test suite, generated from what the app says about itself. The full response also carries `declared` (the app's registered testids, signals and stores), `riskRanked` (every flow ordered worst first) and `unassertedFlows`.
|
|
163
192
|
|
|
164
193
|
<Tip>
|
|
165
194
|
Run this before writing a new flow. It tells you what is already covered, what is covered badly,
|
|
@@ -171,20 +200,47 @@ Each flow comes back graded, with the consequence that must hold and a risk leve
|
|
|
171
200
|
|
|
172
201
|
```json
|
|
173
202
|
{ "tool": "reticle_baseline", "args": { "action": "save", "name": "checkout-empty" } }
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
```json
|
|
206
|
+
{ "baseline": "checkout-empty", "lineCount": 174 }
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
```json
|
|
174
210
|
{ "tool": "reticle_baseline", "args": { "action": "diff", "name": "checkout-empty" } }
|
|
175
211
|
```
|
|
176
212
|
|
|
177
|
-
|
|
213
|
+
```json
|
|
214
|
+
{
|
|
215
|
+
"baseline": "checkout-empty",
|
|
216
|
+
"removed": [],
|
|
217
|
+
"added": [],
|
|
218
|
+
"consoleErrors": 0,
|
|
219
|
+
"routeChanged": false
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Records the meaningful state of a page and compares later. Structure and content rather than pixels, so a font change does not fail your check and a missing row does. `action: "list"` returns the saved names.
|
|
178
224
|
|
|
179
225
|
## Needs a driven browser
|
|
180
226
|
|
|
181
227
|
Four tools apply their effects through the Chrome DevTools Protocol. The always-on SDK cannot do that, so they need a browser Reticle is driving.
|
|
182
228
|
|
|
183
229
|
<Warning>
|
|
184
|
-
**A pooled lease is not enough.**
|
|
185
|
-
|
|
230
|
+
**A pooled lease is not enough.** Re-verified on 2026-08-16: acquire one with `reticle_lease` and
|
|
231
|
+
`reticle_screenshot` answers
|
|
232
|
+
|
|
233
|
+
```json
|
|
234
|
+
{
|
|
235
|
+
"ok": false,
|
|
236
|
+
"reason": "no-visual-provider",
|
|
237
|
+
"recommendation": "visual capture needs a driven browser, start with `reticle drive <url>` or set RETICLE_CDP_URL; the always-on SDK does not ship a screenshotter"
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
while `reticle_network_mock` answers `{ "applied": false, "count": 0, "ok": false, "reason": "no-cdp-provider" }`. Under a driven browser, all four work: the captures below were taken that way.
|
|
186
242
|
|
|
187
|
-
|
|
243
|
+
Run `reticle drive <url>`, or point `RETICLE_CDP_URL` at a Chrome started with `--remote-debugging-port`.
|
|
188
244
|
|
|
189
245
|
</Warning>
|
|
190
246
|
|
|
@@ -192,16 +248,45 @@ Point `RETICLE_CDP_URL` at a Chrome started with `--remote-debugging-port`. That
|
|
|
192
248
|
|
|
193
249
|
```json
|
|
194
250
|
{ "tool": "reticle_screenshot", "args": { "name": "login-baseline" } }
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
```json
|
|
254
|
+
{
|
|
255
|
+
"ok": true,
|
|
256
|
+
"saved": true,
|
|
257
|
+
"name": "login-baseline",
|
|
258
|
+
"path": ".reticle/visual/login-baseline.png",
|
|
259
|
+
"bytes": 191150
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
```json
|
|
195
264
|
{ "tool": "reticle_visual_diff", "args": { "baseline": "login-baseline" } }
|
|
196
265
|
```
|
|
197
266
|
|
|
267
|
+
```json
|
|
268
|
+
{
|
|
269
|
+
"ok": true,
|
|
270
|
+
"matched": true,
|
|
271
|
+
"changedPixels": 0,
|
|
272
|
+
"totalPixels": 921600,
|
|
273
|
+
"ratio": 0,
|
|
274
|
+
"dimensionMismatch": false,
|
|
275
|
+
"baseline": { "width": 1280, "height": 720 },
|
|
276
|
+
"current": { "width": 1280, "height": 720 },
|
|
277
|
+
"diffPath": ".reticle/visual/login-baseline.diff.png"
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
`dimensionMismatch` is the field that saves an afternoon. A diff between two different viewport sizes is meaningless, and this says so rather than reporting a huge `ratio`.
|
|
282
|
+
|
|
198
283
|
<Warning>
|
|
199
284
|
Note the asymmetry. `reticle_screenshot` names the baseline with **`name`**; `reticle_visual_diff`
|
|
200
285
|
refers to it with **`baseline`**. Passing `name` to the diff is rejected, and it is an easy
|
|
201
286
|
mistake to make twice.
|
|
202
287
|
</Warning>
|
|
203
288
|
|
|
204
|
-
`fullPage` captures the whole scroll height. `ref` or `clip` scopes to one element or region. `threshold` sets the pixel-difference tolerance, defaulting to `0.01`, and `masks` excludes regions that are expected to change.
|
|
289
|
+
`fullPage` captures the whole scroll height. `ref` or `clip` scopes to one element or region. `threshold` sets the pixel-difference tolerance, defaulting to `0.01`, `maxRatio` caps the acceptable changed fraction, and `masks` excludes regions that are expected to change.
|
|
205
290
|
|
|
206
291
|
Reticle reads program truth, not pixels, so this is the deliberate exception: a font that failed to load or a compositing glitch is only visible in the actual frame.
|
|
207
292
|
|
|
@@ -211,6 +296,10 @@ Reticle reads program truth, not pixels, so this is the deliberate exception: a
|
|
|
211
296
|
{ "tool": "reticle_viewport", "args": { "width": 1280, "height": 800 } }
|
|
212
297
|
```
|
|
213
298
|
|
|
299
|
+
```json
|
|
300
|
+
{ "applied": true, "width": 1280, "height": 800 }
|
|
301
|
+
```
|
|
302
|
+
|
|
214
303
|
Fixes the viewport so a visual baseline is reproducible across machines. Without it, a diff taken on a laptop and re-run in CI compares two different layouts and fails for a reason nobody wants to debug.
|
|
215
304
|
|
|
216
305
|
### Network mocking
|
|
@@ -222,7 +311,11 @@ Fixes the viewport so a visual baseline is reproducible across machines. Without
|
|
|
222
311
|
}
|
|
223
312
|
```
|
|
224
313
|
|
|
225
|
-
|
|
314
|
+
```json
|
|
315
|
+
{ "applied": true, "count": 1 }
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
Return a 500, force offline, or delay a response. First matching rule wins. `clear: true` turns it off and answers `{ "applied": true, "count": 0 }`.
|
|
226
319
|
|
|
227
320
|
Most error states have never actually run. This is how you find out whether yours works, without touching the backend or waiting for a real outage to tell you.
|
|
228
321
|
|
|
@@ -234,7 +327,7 @@ The loop closer, and the reason Reticle is not only an interactive tool.
|
|
|
234
327
|
{ "tool": "reticle_record", "args": { "action": "start", "recordingName": "ship-a-deploy" } }
|
|
235
328
|
{ "tool": "reticle_record", "args": { "action": "stop", "recordingName": "ship-a-deploy" } }
|
|
236
329
|
{ "tool": "reticle_flow_save", "args": { "flowName": "ship-a-deploy" } }
|
|
237
|
-
{ "tool": "
|
|
330
|
+
{ "tool": "reticle_verify", "args": { "action": "flows" } }
|
|
238
331
|
```
|
|
239
332
|
|
|
240
333
|
<Warning>
|
|
@@ -243,22 +336,37 @@ The loop closer, and the reason Reticle is not only an interactive tool.
|
|
|
243
336
|
rather than guessing, which is the right call and still costs you a turn.
|
|
244
337
|
</Warning>
|
|
245
338
|
|
|
246
|
-
Stopping a recording
|
|
247
|
-
|
|
248
|
-
The parts you actually want are tiny. Read these and ignore the rest:
|
|
339
|
+
Stopping a recording used to return a very large payload, almost all of it the raw `events` array. It no longer does. The timeline is omitted and replaced with a pointer, so a stop is under a kilobyte. This is a real capture of a one-click recording, complete rather than trimmed:
|
|
249
340
|
|
|
250
341
|
```json
|
|
251
342
|
{
|
|
252
|
-
"
|
|
343
|
+
"recordingName": "docs-check",
|
|
344
|
+
"program": {
|
|
345
|
+
"name": "docs-check",
|
|
346
|
+
"version": 1,
|
|
347
|
+
"steps": [{ "tool": "reticle_act", "stable": true, "args": { … } }]
|
|
348
|
+
},
|
|
349
|
+
"timeline_omitted": "445 event(s) were recorded and are not included here. Call reticle_observe { since: 11445 } for the raw timeline.",
|
|
253
350
|
"proposedConsequences": [
|
|
254
|
-
{ "predicate": { "kind": "signal", "name": "auth:granted" }, "tier": 0, "label": "signal \"auth:granted\" fires" },
|
|
255
|
-
{ "predicate": { "kind": "state", "store": "app", "path": "auth" }, "tier": 1, "label": "state \"app\" changes" },
|
|
256
|
-
{ "predicate": { "kind": "net", "method": "POST", "urlContains": "/api/login", "status": 200 }, "tier": 1, "label": "POST /api/login responds" }
|
|
351
|
+
{ "predicate": { "kind": "signal", "name": "auth:granted" }, "tier": 0, "label": "signal \"auth:granted\" fires", "weak": false },
|
|
352
|
+
{ "predicate": { "kind": "state", "store": "app", "path": "auth" }, "tier": 1, "label": "state \"app\" changes", "weak": false },
|
|
353
|
+
{ "predicate": { "kind": "net", "method": "POST", "urlContains": "/api/login", "status": 200 }, "tier": 1, "label": "POST /api/login responds", "weak": false }
|
|
257
354
|
],
|
|
258
|
-
"
|
|
355
|
+
"window_ms": 17387,
|
|
356
|
+
"summary": { "total": 445, "network": 1, "domChanged": 304, "consoleErrors": 0, "animations": 12, "signals": 1 },
|
|
357
|
+
"cost": { "events": 445, "bytes": 953 }
|
|
259
358
|
}
|
|
260
359
|
```
|
|
261
360
|
|
|
361
|
+
Each step's `args` is elided above because a recorded step is an anchor, not a call you make by hand: it resolves a testid at replay time rather than a `ref`, so copying it into [`reticle_act`](/tools-act) would not work.
|
|
362
|
+
|
|
363
|
+
Nine hundred and fifty-three bytes for 445 recorded events. `timeline_omitted` hands you the exact `reticle_observe` call to make if you want them, so nothing is lost, it is only not charged for by default.
|
|
364
|
+
|
|
365
|
+
<Note>
|
|
366
|
+
`reticle_record` takes `action`, `recordingName` and `sessionId` and nothing else. `max_events`
|
|
367
|
+
and `filters` are rejected, which no longer matters now that the timeline is omitted anyway.
|
|
368
|
+
</Note>
|
|
369
|
+
|
|
262
370
|
`proposedConsequences` is the useful part and the reason to record at all. Reticle watched the interaction and worked out what would have proved it, ranked by strength. Tier 0 is the app's own signal. You do not have to invent the assertion; you pick one.
|
|
263
371
|
|
|
264
372
|
### Saving and replaying
|
|
@@ -271,28 +379,46 @@ The parts you actually want are tiny. Read these and ignore the rest:
|
|
|
271
379
|
{
|
|
272
380
|
"name": "ship-a-deploy",
|
|
273
381
|
"stepCount": 1,
|
|
382
|
+
"degraded": 0,
|
|
383
|
+
"empty": false,
|
|
274
384
|
"assertions": {
|
|
275
385
|
"grade": "assertion-free",
|
|
276
|
-
"
|
|
386
|
+
"hasConsequenceAssertion": false,
|
|
387
|
+
"totalSteps": 1,
|
|
388
|
+
"consequenceSteps": 0,
|
|
389
|
+
"weakSteps": 0,
|
|
390
|
+
"successIsConsequence": false,
|
|
391
|
+
"intentVerified": false,
|
|
392
|
+
"warning": "This flow performs actions but asserts no observable consequence, so it will pass even if the feature is broken. Add a consequence assertion with reticle_annotate (assert-signal / assert-net) or a success-state."
|
|
277
393
|
}
|
|
278
394
|
}
|
|
279
395
|
```
|
|
280
396
|
|
|
281
397
|
Reticle grades the flow as you save it, and tells you when you have just created a test that cannot fail. Take the warning seriously: an assertion-free flow replays green whatever the app does.
|
|
282
398
|
|
|
283
|
-
A replay against a drifted app names what moved and where:
|
|
399
|
+
A replay against a drifted app names what moved and where. This is `reticle_verify {action:"flows"}` reporting the same flow after the app changed underneath it:
|
|
284
400
|
|
|
285
401
|
```json
|
|
286
402
|
{
|
|
287
|
-
"status": "
|
|
288
|
-
"
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
403
|
+
"status": "fail",
|
|
404
|
+
"total": 1,
|
|
405
|
+
"passed": 0,
|
|
406
|
+
"failed": 1,
|
|
407
|
+
"failures": [
|
|
408
|
+
{
|
|
409
|
+
"flow": "docs-check",
|
|
410
|
+
"verdict": "drift",
|
|
411
|
+
"whatChanged": "testid \"login-submit\" not found",
|
|
412
|
+
"whereInSource": "src/components/Login.tsx:81",
|
|
413
|
+
"nextAction": "rebind the anchor to \"sign-out\" (closest survivor), or update the flow if the change was intended."
|
|
414
|
+
}
|
|
415
|
+
],
|
|
416
|
+
"flaky": ["suite-500", "suite-route", "drift-demo", "stitch-probe"]
|
|
293
417
|
}
|
|
294
418
|
```
|
|
295
419
|
|
|
420
|
+
Passing flows are counted, not described. Only failures carry detail, because the detail is the actionable part. `flaky` lists flows seen to both pass and fail on unchanged code, which is a bug in the flow rather than in the app.
|
|
421
|
+
|
|
296
422
|
`reticle_flow_heal` proposes the rebind. It refuses when it is not confident:
|
|
297
423
|
|
|
298
424
|
```json
|
|
@@ -319,27 +445,46 @@ Flows live in `.reticle/` as human-readable files, so they are reviewed in pull
|
|
|
319
445
|
|
|
320
446
|
```json
|
|
321
447
|
{
|
|
322
|
-
"
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
{
|
|
330
|
-
|
|
448
|
+
"run": {
|
|
449
|
+
"schemaVersion": 1,
|
|
450
|
+
"runId": "1f49b2d8-e402-4629-b202-819566fcace5",
|
|
451
|
+
"createdAt": 1786817831460,
|
|
452
|
+
"durationMs": 4,
|
|
453
|
+
"profile": "dev",
|
|
454
|
+
"project": { "name": "reticle", "framework": "other" },
|
|
455
|
+
"agent": { "id": "reticle-mcp", "kind": "coding-agent" },
|
|
456
|
+
"trigger": { "kind": "manual" },
|
|
457
|
+
"changedFiles": [],
|
|
458
|
+
"flows": [
|
|
459
|
+
{
|
|
460
|
+
"name": "sweep-flow",
|
|
461
|
+
"status": "fail",
|
|
462
|
+
"steps": 0,
|
|
463
|
+
"durationMs": 4,
|
|
464
|
+
"failureReason": "no such flow on disk, run reticle_flow{action:\"list\"} to see saved flows"
|
|
465
|
+
}
|
|
466
|
+
],
|
|
467
|
+
"checks": [],
|
|
468
|
+
"risks": [],
|
|
469
|
+
"evidence": {
|
|
470
|
+
"consoleErrors": [],
|
|
471
|
+
"networkAnomalies": [],
|
|
472
|
+
"stateAssertions": [],
|
|
473
|
+
"timeline": []
|
|
474
|
+
},
|
|
475
|
+
"verdict": {
|
|
331
476
|
"status": "fail",
|
|
332
|
-
"
|
|
333
|
-
"
|
|
477
|
+
"reasons": ["flow sweep-flow: no such flow on disk"],
|
|
478
|
+
"confidence": "medium",
|
|
479
|
+
"blockingRisks": 0
|
|
334
480
|
}
|
|
335
|
-
|
|
336
|
-
"verdict": { "status": "partial", "confidence": "high", "blockingRisks": 0 }
|
|
481
|
+
}
|
|
337
482
|
}
|
|
338
483
|
```
|
|
339
484
|
|
|
340
|
-
|
|
485
|
+
Note the `run` wrapper. The artifact is nested one level down, which matters if you are parsing it in CI.
|
|
341
486
|
|
|
342
|
-
|
|
487
|
+
A versioned, machine-readable record of a verification run. This is what you hand to CI, a dashboard, or a platform embedding Reticle in its pipeline. A passing flow additionally carries `oracle`, the consequence that made it a pass, so a green row says what it proved rather than only that it was green.
|
|
343
488
|
|
|
344
489
|
### The capability contract
|
|
345
490
|
|
|
@@ -351,6 +496,8 @@ A versioned, machine-readable record of a verification run. This is what you han
|
|
|
351
496
|
{ "saved": true, "path": ".reticle/contract.json", "testidCount": 49, "signalCount": 16 }
|
|
352
497
|
```
|
|
353
498
|
|
|
499
|
+
Read it back with `reticle_capabilities { "fromDisk": true }`, which needs no browser at all.
|
|
500
|
+
|
|
354
501
|
Persists the app's live capability registry to a git-checked file. A fresh agent can read it without booting the app, and a diff shows when someone removes a signal something depended on.
|
|
355
502
|
|
|
356
503
|
### Talking to the human
|
package/docs/cli/affected.mdx
CHANGED
|
@@ -25,14 +25,16 @@ One `reticle_affected` line. Real capture from this repository, with the file an
|
|
|
25
25
|
|
|
26
26
|
```json
|
|
27
27
|
{
|
|
28
|
-
"t": "2026-08-
|
|
28
|
+
"t": "2026-08-15T18:42:58.072Z",
|
|
29
29
|
"event": "reticle_affected",
|
|
30
|
-
"changedFiles": ["docs/cli.mdx"
|
|
31
|
-
"affected": ["
|
|
32
|
-
"unknownProvenance": ["
|
|
30
|
+
"changedFiles": ["docs/cli.mdx"],
|
|
31
|
+
"affected": ["WEB-flow", "console-compose", "deploy-journey", "verify-route"],
|
|
32
|
+
"unknownProvenance": ["WEB-flow", "console-compose", "deploy-journey", "verify-route"]
|
|
33
33
|
}
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
+
The real run named 47 flows in each list. The CLI prints this as a single line of JSON; it is pretty-printed here to be readable.
|
|
37
|
+
|
|
36
38
|
| Field | Meaning |
|
|
37
39
|
| --- | --- |
|
|
38
40
|
| `changedFiles` | The resolved file set: your positional arguments plus whatever `--since` added |
|
package/docs/cli/capsules.mdx
CHANGED
|
@@ -14,25 +14,26 @@ No flags.
|
|
|
14
14
|
|
|
15
15
|
## What it prints
|
|
16
16
|
|
|
17
|
-
One `reticle_capsules` line: a `count` and an array. Real capture from this repository, trimmed to three of the
|
|
17
|
+
One `reticle_capsules` line: a `count` and an array. Real capture from this repository, trimmed to three of the seventy-nine entries and pretty-printed (the CLI prints it as a single line):
|
|
18
18
|
|
|
19
19
|
```json
|
|
20
20
|
{
|
|
21
|
+
"t": "2026-08-15T18:42:48.790Z",
|
|
21
22
|
"event": "reticle_capsules",
|
|
22
|
-
"count":
|
|
23
|
+
"count": 79,
|
|
23
24
|
"capsules": [
|
|
24
25
|
{
|
|
25
|
-
"id": "
|
|
26
|
+
"id": "1786793143459-e5",
|
|
26
27
|
"origin": "failed-assert",
|
|
27
|
-
"expected": "
|
|
28
|
-
"observed": "
|
|
28
|
+
"expected": "signal auth:granted",
|
|
29
|
+
"observed": "signal \"auth:granted\" never fired",
|
|
29
30
|
"steps": 1
|
|
30
31
|
},
|
|
31
32
|
{
|
|
32
|
-
"id": "
|
|
33
|
+
"id": "1786791565180-e12",
|
|
33
34
|
"origin": "failed-assert",
|
|
34
|
-
"expected": "
|
|
35
|
-
"observed": "
|
|
35
|
+
"expected": "declared consequence",
|
|
36
|
+
"observed": "route is '/actions', expected '/server-actions'",
|
|
36
37
|
"steps": 1
|
|
37
38
|
},
|
|
38
39
|
{
|
package/docs/cli/cloud.mdx
CHANGED
|
@@ -56,7 +56,13 @@ The one call to make when you do not know your state. Real capture:
|
|
|
56
56
|
}
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
-
An unattached repo also gets a next-step nudge on stderr, telling you to run `reticle link
|
|
59
|
+
An unattached repo also gets a next-step nudge on stderr, telling you to run `reticle link`:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
→ this repo is not attached ... run `reticle link`
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`whoami` exits `0` either way. Throughout this page, the punctuation joining the two halves of a message is shown as `...`.
|
|
60
66
|
|
|
61
67
|
### `reticle link`
|
|
62
68
|
|
|
@@ -75,7 +81,11 @@ npx @reticlehq/server project rename <projectId> "New name"
|
|
|
75
81
|
npx @reticlehq/server project rm <projectId>
|
|
76
82
|
```
|
|
77
83
|
|
|
78
|
-
`rename` and `rm` work but are
|
|
84
|
+
`rename` and `rm` work but are missing from the top-level `reticle help` block, which lists only `<ls|create <name>>`. The command's own usage error names all four. Missing or malformed arguments exit `2`:
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
reticle: usage: reticle project <ls|create <name>|rename <id> <name>|rm <id>>
|
|
88
|
+
```
|
|
79
89
|
|
|
80
90
|
### `reticle config`
|
|
81
91
|
|
|
@@ -83,7 +93,11 @@ npx @reticlehq/server project rm <projectId>
|
|
|
83
93
|
npx @reticlehq/server config [--runs on|off] [--memory on|off] [--flows on|off] [--verify local|server]
|
|
84
94
|
```
|
|
85
95
|
|
|
86
|
-
Edits `.reticle/cloud.json` in place. Any value other than `on` or `off` (or `local` or `server` for `--verify`) exits `2`. Requires the repo to be linked
|
|
96
|
+
Edits `.reticle/cloud.json` in place. Any value other than `on` or `off` (or `local` or `server` for `--verify`) exits `2`. Requires the repo to be linked; run in an unlinked repo it exits `2` before it looks at the flags at all:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
reticle: no .reticle/cloud.json here ... run `reticle link` first
|
|
100
|
+
```
|
|
87
101
|
|
|
88
102
|
### `reticle push`
|
|
89
103
|
|
|
@@ -103,7 +117,19 @@ The CI gate: which flows broke relative to before. **Exits `3`** when any flow r
|
|
|
103
117
|
npx @reticlehq/server share <runId>
|
|
104
118
|
```
|
|
105
119
|
|
|
106
|
-
Mints a public proof link for one run. A missing `runId` exits `2
|
|
120
|
+
Mints a public proof link for one run. A missing `runId` exits `2`:
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
reticle: usage: reticle share <runId>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## When the repo is not attached
|
|
127
|
+
|
|
128
|
+
`push`, `runs` and `regression` all need a project to talk to. Without one they exit `1` with the same line on stderr, measured:
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
reticle: cloud not attached here ... run `reticle link` (or set RETICLE_CLOUD_URL/KEY)
|
|
132
|
+
```
|
|
107
133
|
|
|
108
134
|
## Exit codes
|
|
109
135
|
|