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.
- package/README.md +27 -554
- package/docs/agent-guide.md +21 -0
- package/docs/browser-driver.md +11 -13
- package/docs/getting-started.md +13 -0
- package/docs/native-jobs.md +1 -1
- package/docs/result-sink.md +2 -2
- package/package.json +66 -13
- package/conformance/coordination-vectors.json +0 -377
- package/docs/architecture.md +0 -126
- package/docs/awr-delivery.md +0 -102
- package/docs/cleanup-followups.md +0 -74
- package/docs/developer-ux.md +0 -315
- package/docs/examples/portable-environments/alongside_runner.json +0 -199
- package/docs/examples/portable-environments/external_staging.json +0 -183
- package/docs/git-source-resolution.md +0 -133
- package/docs/images/ui-run.png +0 -0
- package/docs/local-review-store.md +0 -13
- package/docs/local-scenario-store.md +0 -91
- package/docs/portable-environments.md +0 -155
- package/docs/qualification-registration.md +0 -58
- package/docs/qualification-results.md +0 -59
- package/docs/replay-assessment.md +0 -17
- package/docs/scenario-activation.md +0 -54
- package/docs/scenario-structure.md +0 -58
- package/docs/source-promotion.md +0 -104
- package/docs/source-review.md +0 -21
- package/docs/work-report-attachment.md +0 -127
|
@@ -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.
|
package/docs/browser-driver.md
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
`
|
|
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
|
|
95
|
+
The packaged sample also includes a short browser flow. From the same installed directory:
|
|
98
96
|
|
|
99
97
|
```sh
|
|
100
|
-
|
|
101
|
-
|
|
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.
|
package/docs/native-jobs.md
CHANGED
|
@@ -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 `
|
|
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
|
package/docs/result-sink.md
CHANGED
|
@@ -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
|
|
86
|
-
and scoped
|
|
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.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"private": false,
|
|
5
|
-
"description": "
|
|
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": {
|
|
9
|
-
|
|
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": {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"./
|
|
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": [
|
|
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": {
|
|
38
|
-
|
|
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
|
-
}
|