tracegrove 0.3.0 → 0.3.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.
@@ -0,0 +1,21 @@
1
+ # Agent and CI command guide
2
+
3
+ Use the installed binary through `npx --no-install tracegrove` so CI never fetches an unrelated package. Pass `--json` and check both exit status and report fields; do not classify a run from prose alone.
4
+
5
+ | Command | Effect | Result |
6
+ | --- | --- | --- |
7
+ | `status --json` | Reads the current project and run state | `tracegrove.status/v1` and ordered `next` commands |
8
+ | `discover --json` | Compares discovered routes and authored flows | Coverage suggestions, no app launch |
9
+ | `check --json` | Compiles authoring files | `ok` and located issues; may evaluate trusted TypeScript authoring modules |
10
+ | `doctor --dir . --json` | Checks the native plan without app launch | `tracegrove.doctor/v1`, `checks`, `errors`, `blocked`, `execution: not_started` |
11
+ | `test --json` | Starts the selected app and executes scenarios | `tracegrove.run-summary/v1`, `outcome`, `cases`, `blockers`, `runDir`, `bundleVerified` |
12
+ | `verify-bundle --bundle <dir> --json` | Checks existing evidence | `ok`, `problems`, `outcome`, `receipts`; no app launch |
13
+ | `draft --intent '<goal>'` | Starts a coding agent to edit drafts | Review changed files and compile/run afterward |
14
+ | `heal --dry-run` | Runs and diagnoses the suite | Findings without retained agent edits |
15
+ | `heal` | May retain bounded setup/flow edits | `tracegrove.heal/v1`; inspect saved diff and backups |
16
+
17
+ Exit codes: 0 clean/passed; 1 assertion failure; 2 blocked/inconclusive; 3 infrastructure failure; 4 cancellation. A top-level JSON error uses `tracegrove.cli-error/v1`, with a public class, bounded reason codes and recovery actions. Normal reports and artifacts may contain application data; protect them with your usual workspace access controls. `--json=false` selects prose errors, while `--jsonl` keeps its event stream.
18
+
19
+ Agent drafting uses the configured Claude Code or Codex CLI and its existing permissions. Tracegrove's prompt is not a filesystem sandbox. The default models are explicit in the adapter, and one Claude model-alias retry is recorded when used. A requested `maxBudgetUsd` is supported by the Claude adapter; the Codex adapter blocks it rather than ignoring a spending limit. Commit or stash work before drafting or healing, review proposed changes, and preserve the original failed run. A passing compiled flow is not proof of intended behavior.
20
+
21
+ The same short flows compile into the strict `workflow.*/v1` corpus. The browser, native jobs, MCP, evidence and recovery guides are shipped in this package. General portable profiles are reference-only; they cannot be passed to the present CLI as an executable target.
@@ -2,29 +2,27 @@
2
2
 
3
3
  `BrowserDriver` runs real Chromium in a fresh, nonpersistent context. It does
4
4
  not connect to an existing browser profile. Install its pinned browser before
5
- running browser tests or using the driver:
5
+ running browser tests or using the driver in a project with Tracegrove installed:
6
6
 
7
7
  ```sh
8
- npm ci
9
- PLAYWRIGHT_SKIP_BROWSER_GC=1 npx --no-install playwright install chromium
10
- npm test -- tests/browser-driver.test.ts
8
+ npx --no-install playwright install chromium
11
9
  ```
12
10
 
13
11
  Linux CI uses `playwright install --with-deps chromium` to install the browser
14
12
  and its system libraries.
15
13
 
16
- Run the packaged browser sample through the same low-level CLI as an API case:
14
+ Run the packaged browser sample through the same low-level CLI as an API case,
15
+ from a directory where Tracegrove is installed:
17
16
 
18
17
  ```sh
19
- npm run build
20
- node dist/cli/main.js sample-config --sample notes-browser --output /tmp/notes-browser
21
- node dist/cli/main.js plan --config /tmp/notes-browser/verification/workflow.yaml --output /tmp/notes-browser-request.json
22
- node dist/cli/main.js run --request /tmp/notes-browser-request.json
18
+ npx --no-install tracegrove sample-config --sample notes-browser --output "$PWD/notes-browser"
19
+ npx --no-install tracegrove plan --config "$PWD/notes-browser/verification/workflow.yaml" --output "$PWD/notes-browser-request.json"
20
+ npx --no-install tracegrove run --request "$PWD/notes-browser-request.json"
23
21
  ```
24
22
 
25
23
  Use fresh output paths: sample generation refuses to overwrite a project. The
26
24
  run prints its execution ID and bundle path. Pass that path to
27
- `node dist/cli/main.js verify-bundle --bundle <path>` for independent verification.
25
+ `npx --no-install tracegrove verify-bundle --bundle <path>` for independent verification.
28
26
  The sample shares its real app, personas, fixture recipes, and cleanup with
29
27
  `notes-api`; only its browser runner, binding, and case differ.
30
28
 
@@ -94,11 +92,11 @@ controller-death browser cleanup remain open; no production qualification is cla
94
92
 
95
93
  ## Short flows and Grove
96
94
 
97
- The packaged sample also includes a short browser flow. From the repository root:
95
+ The packaged sample also includes a short browser flow. From the same installed directory:
98
96
 
99
97
  ```sh
100
- node dist/cli/main.js test --config /tmp/notes-browser/tracegrove.config.yaml --grep notes.browser
101
- node dist/cli/main.js ui --dir /tmp/notes-browser
98
+ npx --no-install tracegrove test --config "$PWD/notes-browser/tracegrove.config.yaml" --grep notes.browser
99
+ npx --no-install tracegrove ui --dir "$PWD/notes-browser"
102
100
  ```
103
101
 
104
102
  Open the printed loopback address and select the browser scenario. Its step
@@ -0,0 +1,13 @@
1
+ # Test an existing app
2
+
3
+ Start with the [npm README](https://www.npmjs.com/package/tracegrove) and its synthetic Notes sample. In your own repository, install `tracegrove@0.3.1` as a development dependency, then run `npx --no-install tracegrove init`. Review the generated config and flow before running them.
4
+
5
+ `tracegrove.config.yaml` names a `project`, an `app` adapter (`node`, `fastapi`, or `django`), its entry point and health route, source paths to digest, and test personas. Put flows at `tracegrove/<area>/<behavior>.flow.yaml`; their case IDs use `<area>.<behavior>`. A flow contains named steps with methods, paths, expected statuses and optional independent read requests (`observe: true`). Put reusable fixtures at `tracegrove/fixtures/<name>.fixture.yaml`. Steps can `save` a response value and refer to it later as `{name}`; inspect the generated starter flow or packaged Notes sample for a complete example. `npx --no-install tracegrove check --json` compiles these files without starting the app. `doctor --dir . --json` checks the selected native plan; it can probe an interpreter version but does not run your app.
6
+
7
+ The local adapter assigns a loopback port and owned data directory. Your app must consume the injected port and `TRACEGROVE_DATA_DIR` and recognize the per-run synthetic `TRACEGROVE_TOKENS` in test mode. Keep the test token path disabled in production. The Django adapter invokes migration before start: verify that Django's configured database lives in the injected data directory. Do not point a test run at a shared or production database.
8
+
9
+ Run `npx --no-install tracegrove test --json`. A passing JSON summary names `runDir`, `executionId`, per-case outcomes, and `bundleVerified`. The run folder contains readable summaries, JUnit and `bundle/`. Run `npx --no-install tracegrove verify-bundle --bundle <runDir>/bundle --json` to independently check the stored files and verdict. Verification does not rerun your app or establish who produced an unsigned bundle.
10
+
11
+ If a prerequisite blocks, read `blockers[]` and the suggested recovery before retrying. A nonzero assertion result is a finding about the app or test, not a setup failure. For a single interrupt, wait for the owned cleanup and inspect its receipts. Keep the run folder until you have exported any evidence you need. `recovery-status` reads an existing checkpoint but cannot clear ownership or restart work.
12
+
13
+ Browser tests need the pinned Playwright Chromium installed through your environment's approved dependency path. The browser and native job guides are in this npm package. External staging, a general cloud runner and arbitrary shell launchers are not available through the current CLI.
@@ -61,7 +61,7 @@ name the requested job, and submitted results must retain the requested key.
61
61
 
62
62
  ## Application protocol
63
63
 
64
- Schemas are exported through `workflow-verify/protocol` and JSON Schema:
64
+ Schemas are exported through `tracegrove/protocol` and JSON Schema:
65
65
  `workflow.native-job-{action,request,response,ready,observation}/v1`.
66
66
  The supervisor opens IPC only for an opted-in Node application and sets
67
67
  `TRACEGROVE_NATIVE_JOBS=node_ipc/v1`. After its worker/provider is ready, the
@@ -82,6 +82,6 @@ labels, including `WORKFLOW_VERIFY_OWNER`, do not authenticate a remote tenant.
82
82
 
83
83
  This sink verifies integrity and record consistency. It does not authenticate an
84
84
  issuer, approve a source plan, provision qualification leases, activate coverage,
85
- or publish an OrgX AWR record. Hosted receiver authentication, tenant delivery,
86
- and scoped OrgX projection require their own trusted adapters. A storage receipt
85
+ or publish a third-party work receipt. Hosted receiver authentication, tenant delivery,
86
+ and scoped downstream projections require their own trusted adapters. A storage receipt
87
87
  cannot stand in for those acceptance gates.
package/package.json CHANGED
@@ -1,22 +1,57 @@
1
1
  {
2
2
  "name": "tracegrove",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "private": false,
5
- "description": "tracegrove: behaviour tests against your real app, drafted by Claude Code or Codex, sealed as re-verifiable evidence.",
5
+ "description": "Verify app behavior with real requests, independent readback and inspectable evidence.",
6
6
  "license": "Apache-2.0",
7
7
  "type": "module",
8
- "engines": { "node": ">=22.22.0 <23" },
9
- "bin": { "tracegrove": "./dist/cli/main.js", "workflow-verify": "./dist/cli/main.js" },
8
+ "engines": {
9
+ "node": ">=22.22.0 <23"
10
+ },
11
+ "bin": {
12
+ "tracegrove": "./dist/cli/main.js",
13
+ "workflow-verify": "./dist/cli/main.js"
14
+ },
10
15
  "main": "./dist/index.js",
11
16
  "types": "./dist/index.d.ts",
12
17
  "exports": {
13
- "./integrations/awr": { "types": "./dist/integrations/awr/index.d.ts", "default": "./dist/integrations/awr/index.js" },
14
- "./authoring": { "types": "./dist/authoring/index.d.ts", "default": "./dist/authoring/index.js" },
15
- ".": { "types": "./dist/index.d.ts", "default": "./dist/index.js" },
16
- "./protocol": { "types": "./dist/protocol/index.d.ts", "default": "./dist/protocol/index.js" },
17
- "./coordination": { "types": "./dist/core/coordination.d.ts", "default": "./dist/core/coordination.js" }
18
+ "./integrations/awr": {
19
+ "types": "./dist/integrations/awr/index.d.ts",
20
+ "default": "./dist/integrations/awr/index.js"
21
+ },
22
+ "./authoring": {
23
+ "types": "./dist/authoring/index.d.ts",
24
+ "default": "./dist/authoring/index.js"
25
+ },
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "default": "./dist/index.js"
29
+ },
30
+ "./protocol": {
31
+ "types": "./dist/protocol/index.d.ts",
32
+ "default": "./dist/protocol/index.js"
33
+ },
34
+ "./coordination": {
35
+ "types": "./dist/core/coordination.d.ts",
36
+ "default": "./dist/core/coordination.js"
37
+ }
18
38
  },
19
- "files": ["dist", "schema", "samples", "docs/cleanup-followups.md", "docs/source-review.md", "docs/source-promotion.md", "docs/git-source-resolution.md", "docs/git-object-proof.md", "docs/local-review-store.md", "docs/local-scenario-store.md", "docs/local-execution-recovery.md", "docs/qualification-registration.md", "docs/qualification-results.md", "docs/replay-assessment.md", "docs/scenario-activation.md", "docs/scenario-structure.md", "docs/verified-bundles.md", "docs/developer-ux.md", "docs/architecture.md", "docs/browser-driver.md", "docs/portable-environments.md", "docs/examples/portable-environments", "docs/native-jobs.md", "docs/result-sink.md", "docs/awr-delivery.md", "docs/work-report-attachment.md", "docs/mcp-driver.md", "conformance/coordination-vectors.json", "LICENSE", "README.md", "docs/images/ui-run.png"],
39
+ "files": [
40
+ "dist",
41
+ "schema",
42
+ "samples",
43
+ "docs/getting-started.md",
44
+ "docs/agent-guide.md",
45
+ "docs/local-execution-recovery.md",
46
+ "docs/verified-bundles.md",
47
+ "docs/browser-driver.md",
48
+ "docs/native-jobs.md",
49
+ "docs/mcp-driver.md",
50
+ "LICENSE",
51
+ "README.md",
52
+ "docs/result-sink.md",
53
+ "docs/git-object-proof.md"
54
+ ],
20
55
  "scripts": {
21
56
  "build": "tsc --project tsconfig.build.json && node scripts/copy-samples.mjs",
22
57
  "typecheck": "tsc --project tsconfig.json --noEmit && tsc --project tsconfig.container.json --noEmit",
@@ -34,8 +69,18 @@
34
69
  "yaml": "2.9.1",
35
70
  "zod": "4.6.5"
36
71
  },
37
- "peerDependencies": { "@modelcontextprotocol/sdk": "1.32.1", "@useorgx/agent-work-receipt": "0.3.0" },
38
- "peerDependenciesMeta": { "@modelcontextprotocol/sdk": { "optional": true }, "@useorgx/agent-work-receipt": { "optional": true } },
72
+ "peerDependencies": {
73
+ "@modelcontextprotocol/sdk": "1.32.1",
74
+ "@useorgx/agent-work-receipt": "0.3.0"
75
+ },
76
+ "peerDependenciesMeta": {
77
+ "@modelcontextprotocol/sdk": {
78
+ "optional": true
79
+ },
80
+ "@useorgx/agent-work-receipt": {
81
+ "optional": true
82
+ }
83
+ },
39
84
  "devDependencies": {
40
85
  "@modelcontextprotocol/sdk": "1.32.1",
41
86
  "@useorgx/agent-work-receipt": "0.3.0",
@@ -43,5 +88,13 @@
43
88
  "tsx": "4.23.15",
44
89
  "typescript": "5.9.3",
45
90
  "vitest": "5.0.3"
46
- }
91
+ },
92
+ "keywords": [
93
+ "testing",
94
+ "workflow",
95
+ "verification",
96
+ "cli",
97
+ "evidence"
98
+ ],
99
+ "homepage": "https://www.npmjs.com/package/tracegrove"
47
100
  }
@@ -1,377 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "vectors": [
4
- {
5
- "id": "reserve",
6
- "before": {
7
- "scopeId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
8
- "version": 1,
9
- "generation": 0,
10
- "budgetCents": 500,
11
- "leases": []
12
- },
13
- "command": {
14
- "type": "reserve",
15
- "attemptId": "attempt:1",
16
- "workerId": "worker:1",
17
- "personaId": "persona:1",
18
- "reservedCents": 300,
19
- "ttlMs": 300000
20
- },
21
- "observedAt": 1000,
22
- "after": {
23
- "scopeId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
24
- "version": 2,
25
- "generation": 1,
26
- "budgetCents": 500,
27
- "leases": [
28
- {
29
- "attemptId": "attempt:1",
30
- "workerId": "worker:1",
31
- "personaId": "persona:1",
32
- "generation": 1,
33
- "expiresAt": 301000,
34
- "reservedCents": 300,
35
- "state": "active",
36
- "effectIds": [],
37
- "cleanupProof": null
38
- }
39
- ]
40
- },
41
- "clockUpdatedAttempts": [
42
- "attempt:1"
43
- ]
44
- },
45
- {
46
- "id": "effect",
47
- "before": {
48
- "scopeId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
49
- "version": 2,
50
- "generation": 1,
51
- "budgetCents": 500,
52
- "leases": [
53
- {
54
- "attemptId": "attempt:1",
55
- "workerId": "worker:1",
56
- "personaId": "persona:1",
57
- "generation": 1,
58
- "expiresAt": 301000,
59
- "reservedCents": 300,
60
- "state": "active",
61
- "effectIds": [],
62
- "cleanupProof": null
63
- }
64
- ]
65
- },
66
- "command": {
67
- "type": "effect",
68
- "attemptId": "attempt:1",
69
- "workerId": "worker:1",
70
- "generation": 1,
71
- "effectId": "effect:1"
72
- },
73
- "observedAt": 2000,
74
- "after": {
75
- "scopeId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
76
- "version": 3,
77
- "generation": 1,
78
- "budgetCents": 500,
79
- "leases": [
80
- {
81
- "attemptId": "attempt:1",
82
- "workerId": "worker:1",
83
- "personaId": "persona:1",
84
- "generation": 1,
85
- "expiresAt": 301000,
86
- "reservedCents": 300,
87
- "state": "active",
88
- "effectIds": [
89
- "effect:1"
90
- ],
91
- "cleanupProof": null
92
- }
93
- ]
94
- },
95
- "clockUpdatedAttempts": []
96
- },
97
- {
98
- "id": "heartbeat",
99
- "before": {
100
- "scopeId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
101
- "version": 3,
102
- "generation": 1,
103
- "budgetCents": 500,
104
- "leases": [
105
- {
106
- "attemptId": "attempt:1",
107
- "workerId": "worker:1",
108
- "personaId": "persona:1",
109
- "generation": 1,
110
- "expiresAt": 301000,
111
- "reservedCents": 300,
112
- "state": "active",
113
- "effectIds": [
114
- "effect:1"
115
- ],
116
- "cleanupProof": null
117
- }
118
- ]
119
- },
120
- "command": {
121
- "type": "heartbeat",
122
- "attemptId": "attempt:1",
123
- "workerId": "worker:1",
124
- "generation": 1,
125
- "ttlMs": 300000
126
- },
127
- "observedAt": 3000,
128
- "after": {
129
- "scopeId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
130
- "version": 4,
131
- "generation": 1,
132
- "budgetCents": 500,
133
- "leases": [
134
- {
135
- "attemptId": "attempt:1",
136
- "workerId": "worker:1",
137
- "personaId": "persona:1",
138
- "generation": 1,
139
- "expiresAt": 303000,
140
- "reservedCents": 300,
141
- "state": "active",
142
- "effectIds": [
143
- "effect:1"
144
- ],
145
- "cleanupProof": null
146
- }
147
- ]
148
- },
149
- "clockUpdatedAttempts": [
150
- "attempt:1"
151
- ]
152
- },
153
- {
154
- "id": "shared_budget",
155
- "before": {
156
- "scopeId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
157
- "version": 4,
158
- "generation": 1,
159
- "budgetCents": 500,
160
- "leases": [
161
- {
162
- "attemptId": "attempt:1",
163
- "workerId": "worker:1",
164
- "personaId": "persona:1",
165
- "generation": 1,
166
- "expiresAt": 303000,
167
- "reservedCents": 300,
168
- "state": "active",
169
- "effectIds": [
170
- "effect:1"
171
- ],
172
- "cleanupProof": null
173
- }
174
- ]
175
- },
176
- "command": {
177
- "type": "reserve",
178
- "attemptId": "attempt:2",
179
- "workerId": "worker:1",
180
- "personaId": "persona:2",
181
- "reservedCents": 200,
182
- "ttlMs": 300000
183
- },
184
- "observedAt": 4000,
185
- "after": {
186
- "scopeId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
187
- "version": 5,
188
- "generation": 2,
189
- "budgetCents": 500,
190
- "leases": [
191
- {
192
- "attemptId": "attempt:1",
193
- "workerId": "worker:1",
194
- "personaId": "persona:1",
195
- "generation": 1,
196
- "expiresAt": 303000,
197
- "reservedCents": 300,
198
- "state": "active",
199
- "effectIds": [
200
- "effect:1"
201
- ],
202
- "cleanupProof": null
203
- },
204
- {
205
- "attemptId": "attempt:2",
206
- "workerId": "worker:1",
207
- "personaId": "persona:2",
208
- "generation": 2,
209
- "expiresAt": 304000,
210
- "reservedCents": 200,
211
- "state": "active",
212
- "effectIds": [],
213
- "cleanupProof": null
214
- }
215
- ]
216
- },
217
- "clockUpdatedAttempts": [
218
- "attempt:2"
219
- ]
220
- },
221
- {
222
- "id": "recover",
223
- "before": {
224
- "scopeId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
225
- "version": 5,
226
- "generation": 2,
227
- "budgetCents": 500,
228
- "leases": [
229
- {
230
- "attemptId": "attempt:1",
231
- "workerId": "worker:1",
232
- "personaId": "persona:1",
233
- "generation": 1,
234
- "expiresAt": 303000,
235
- "reservedCents": 300,
236
- "state": "active",
237
- "effectIds": [
238
- "effect:1"
239
- ],
240
- "cleanupProof": null
241
- },
242
- {
243
- "attemptId": "attempt:2",
244
- "workerId": "worker:1",
245
- "personaId": "persona:2",
246
- "generation": 2,
247
- "expiresAt": 304000,
248
- "reservedCents": 200,
249
- "state": "active",
250
- "effectIds": [],
251
- "cleanupProof": null
252
- }
253
- ]
254
- },
255
- "command": {
256
- "type": "recover",
257
- "attemptId": "attempt:1",
258
- "workerId": "worker:2",
259
- "ttlMs": 300000
260
- },
261
- "observedAt": 303000,
262
- "after": {
263
- "scopeId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
264
- "version": 6,
265
- "generation": 3,
266
- "budgetCents": 500,
267
- "leases": [
268
- {
269
- "attemptId": "attempt:1",
270
- "workerId": "worker:2",
271
- "personaId": "persona:1",
272
- "generation": 3,
273
- "expiresAt": 603000,
274
- "reservedCents": 300,
275
- "state": "reconciling",
276
- "effectIds": [
277
- "effect:1"
278
- ],
279
- "cleanupProof": null
280
- },
281
- {
282
- "attemptId": "attempt:2",
283
- "workerId": "worker:1",
284
- "personaId": "persona:2",
285
- "generation": 2,
286
- "expiresAt": 304000,
287
- "reservedCents": 200,
288
- "state": "active",
289
- "effectIds": [],
290
- "cleanupProof": null
291
- }
292
- ]
293
- },
294
- "clockUpdatedAttempts": [
295
- "attempt:1"
296
- ]
297
- },
298
- {
299
- "id": "reconcile_heartbeat",
300
- "before": {
301
- "scopeId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
302
- "version": 6,
303
- "generation": 3,
304
- "budgetCents": 500,
305
- "leases": [
306
- {
307
- "attemptId": "attempt:1",
308
- "workerId": "worker:2",
309
- "personaId": "persona:1",
310
- "generation": 3,
311
- "expiresAt": 603000,
312
- "reservedCents": 300,
313
- "state": "reconciling",
314
- "effectIds": [
315
- "effect:1"
316
- ],
317
- "cleanupProof": null
318
- },
319
- {
320
- "attemptId": "attempt:2",
321
- "workerId": "worker:1",
322
- "personaId": "persona:2",
323
- "generation": 2,
324
- "expiresAt": 304000,
325
- "reservedCents": 200,
326
- "state": "active",
327
- "effectIds": [],
328
- "cleanupProof": null
329
- }
330
- ]
331
- },
332
- "command": {
333
- "type": "heartbeat",
334
- "attemptId": "attempt:1",
335
- "workerId": "worker:2",
336
- "generation": 3,
337
- "ttlMs": 300000
338
- },
339
- "observedAt": 303100,
340
- "after": {
341
- "scopeId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
342
- "version": 7,
343
- "generation": 3,
344
- "budgetCents": 500,
345
- "leases": [
346
- {
347
- "attemptId": "attempt:1",
348
- "workerId": "worker:2",
349
- "personaId": "persona:1",
350
- "generation": 3,
351
- "expiresAt": 603100,
352
- "reservedCents": 300,
353
- "state": "reconciling",
354
- "effectIds": [
355
- "effect:1"
356
- ],
357
- "cleanupProof": null
358
- },
359
- {
360
- "attemptId": "attempt:2",
361
- "workerId": "worker:1",
362
- "personaId": "persona:2",
363
- "generation": 2,
364
- "expiresAt": 304000,
365
- "reservedCents": 200,
366
- "state": "active",
367
- "effectIds": [],
368
- "cleanupProof": null
369
- }
370
- ]
371
- },
372
- "clockUpdatedAttempts": [
373
- "attempt:1"
374
- ]
375
- }
376
- ]
377
- }