glamsterdam-compat-lab 0.2.2 → 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.
Files changed (83) hide show
  1. package/CONTRIBUTING.md +1 -1
  2. package/README.md +44 -5
  3. package/ROADMAP.md +8 -2
  4. package/data/client-compat/clients.example.json +15 -0
  5. package/datasets/public-seed/README.md +26 -0
  6. package/datasets/public-seed/comparisons/bytecode-storage-heavy--default-vs-research.json +168 -0
  7. package/datasets/public-seed/comparisons/traces-besu-debug-structlogs--default-vs-research.json +91 -0
  8. package/datasets/public-seed/comparisons/traces-besu-mainnet-tracoor-debug-structlogs--default-vs-research.json +140 -0
  9. package/datasets/public-seed/comparisons/traces-call-tracer-tree--default-vs-research.json +121 -0
  10. package/datasets/public-seed/comparisons/traces-drpc-call-tracer-real--default-vs-research.json +123 -0
  11. package/datasets/public-seed/comparisons/traces-erigon-action-trace--default-vs-research.json +121 -0
  12. package/datasets/public-seed/comparisons/traces-foundry-json-trace--default-vs-research.json +124 -0
  13. package/datasets/public-seed/comparisons/traces-geth-json-rpc-structlogs--default-vs-research.json +108 -0
  14. package/datasets/public-seed/comparisons/traces-hardhat-debug-trace--default-vs-research.json +108 -0
  15. package/datasets/public-seed/comparisons/traces-nethermind-debug-structlogs--default-vs-research.json +153 -0
  16. package/datasets/public-seed/comparisons/traces-nethermind-mainnet-tracoor-debug-structlogs--default-vs-research.json +140 -0
  17. package/datasets/public-seed/comparisons/traces-storage-heavy-trace--default-vs-research.json +155 -0
  18. package/datasets/public-seed/manifest.json +552 -0
  19. package/datasets/public-seed/reports/bytecode-storage-heavy--default.json +172 -0
  20. package/datasets/public-seed/reports/bytecode-storage-heavy--research.json +172 -0
  21. package/datasets/public-seed/reports/indexers-balance-diff-indexer--default.json +63 -0
  22. package/datasets/public-seed/reports/indexers-explorer-replay-indexer--default.json +45 -0
  23. package/datasets/public-seed/reports/indexers-subgraph--default.json +123 -0
  24. package/datasets/public-seed/reports/traces-besu-debug-structlogs--default.json +54 -0
  25. package/datasets/public-seed/reports/traces-besu-debug-structlogs--research.json +54 -0
  26. package/datasets/public-seed/reports/traces-besu-mainnet-tracoor-debug-structlogs--default.json +131 -0
  27. package/datasets/public-seed/reports/traces-besu-mainnet-tracoor-debug-structlogs--research.json +131 -0
  28. package/datasets/public-seed/reports/traces-call-tracer-tree--default.json +99 -0
  29. package/datasets/public-seed/reports/traces-call-tracer-tree--research.json +99 -0
  30. package/datasets/public-seed/reports/traces-drpc-call-tracer-real--default.json +103 -0
  31. package/datasets/public-seed/reports/traces-drpc-call-tracer-real--research.json +103 -0
  32. package/datasets/public-seed/reports/traces-erigon-action-trace--default.json +99 -0
  33. package/datasets/public-seed/reports/traces-erigon-action-trace--research.json +99 -0
  34. package/datasets/public-seed/reports/traces-foundry-json-trace--default.json +76 -0
  35. package/datasets/public-seed/reports/traces-foundry-json-trace--research.json +104 -0
  36. package/datasets/public-seed/reports/traces-geth-json-rpc-structlogs--default.json +78 -0
  37. package/datasets/public-seed/reports/traces-geth-json-rpc-structlogs--research.json +78 -0
  38. package/datasets/public-seed/reports/traces-hardhat-debug-trace--default.json +78 -0
  39. package/datasets/public-seed/reports/traces-hardhat-debug-trace--research.json +78 -0
  40. package/datasets/public-seed/reports/traces-nethermind-debug-structlogs--default.json +100 -0
  41. package/datasets/public-seed/reports/traces-nethermind-debug-structlogs--research.json +100 -0
  42. package/datasets/public-seed/reports/traces-nethermind-mainnet-tracoor-debug-structlogs--default.json +131 -0
  43. package/datasets/public-seed/reports/traces-nethermind-mainnet-tracoor-debug-structlogs--research.json +131 -0
  44. package/datasets/public-seed/reports/traces-storage-heavy-trace--default.json +151 -0
  45. package/datasets/public-seed/reports/traces-storage-heavy-trace--research.json +151 -0
  46. package/datasets/public-seed/reports/validator-operator-config--default.json +154 -0
  47. package/datasets/public-seed/reports/validator-operator-config-builder-gap--default.json +91 -0
  48. package/datasets/public-seed/reports/validator-operator-config-complete--default.json +27 -0
  49. package/dist/cli.js +17 -1
  50. package/dist/cli.js.map +1 -1
  51. package/dist/fixtures/provenance.d.ts +139 -0
  52. package/dist/fixtures/provenance.js +79 -0
  53. package/dist/fixtures/provenance.js.map +1 -0
  54. package/dist/index.d.ts +7 -4
  55. package/dist/index.js +5 -3
  56. package/dist/index.js.map +1 -1
  57. package/dist/reports/compareReports.d.ts +2 -0
  58. package/dist/reports/compareReports.js +201 -0
  59. package/dist/reports/compareReports.js.map +1 -0
  60. package/dist/reports/jsonReporter.d.ts +2 -1
  61. package/dist/reports/jsonReporter.js +4 -1
  62. package/dist/reports/jsonReporter.js.map +1 -1
  63. package/dist/reports/markdownReporter.d.ts +2 -1
  64. package/dist/reports/markdownReporter.js +74 -0
  65. package/dist/reports/markdownReporter.js.map +1 -1
  66. package/dist/reports/reportTypes.d.ts +517 -1
  67. package/dist/reports/reportTypes.js +86 -1
  68. package/dist/reports/reportTypes.js.map +1 -1
  69. package/dist/scanners/validatorScanner.d.ts +1 -1
  70. package/dist/scanners/validatorScanner.js +4 -2
  71. package/dist/scanners/validatorScanner.js.map +1 -1
  72. package/docs/fixtures.md +34 -0
  73. package/docs/release.md +26 -20
  74. package/examples/baseline-comparison.md +76 -0
  75. package/fixtures/indexers/explorer-replay-indexer.json +64 -0
  76. package/fixtures/provenance.json +697 -0
  77. package/fixtures/reports/baseline-default-report.json +68 -0
  78. package/fixtures/reports/candidate-research-report.json +68 -0
  79. package/fixtures/traces/besu-mainnet-tracoor-debug-structlogs.json +4217 -0
  80. package/fixtures/traces/nethermind-mainnet-tracoor-debug-structlogs.json +5419 -0
  81. package/fixtures/validator/operator-config-builder-gap.yaml +22 -0
  82. package/fixtures/validator/operator-config-complete.yaml +28 -0
  83. package/package.json +4 -2
package/CONTRIBUTING.md CHANGED
@@ -22,7 +22,7 @@ pnpm test:update
22
22
 
23
23
  Releases are published from semver tags. After CI is green on `main`, create the GitHub release tag, then run the manual `Publish npm` workflow from `main` with the release tag as `release_tag`.
24
24
 
25
- Start with `dry_run=true`. For a real publish, prefer npm Trusted Publishing: configure `glamsterdam-compat-lab` on npm with the GitHub repository `CruzMolina/glamsterdam-compat-lab` and workflow file `npm-publish.yml`, then rerun the workflow with `dry_run=false`. If Trusted Publishing is not available yet, configure the repository `NPM_TOKEN` secret with an npm token that can publish `glamsterdam-compat-lab`.
25
+ Start with `dry_run=true` for a new, unpublished release version. Real publishes use npm Trusted Publishing for `glamsterdam-compat-lab` with repository `CruzMolina/glamsterdam-compat-lab`, workflow file `npm-publish.yml`, and environment `npm-publish`. Do not configure `NPM_TOKEN` for the normal release path; use a short-lived token only as an emergency fallback, remove the GitHub secret immediately afterward, and revoke the npm token.
26
26
 
27
27
  The workflow checks out the requested semver tag, verifies that `package.json` matches the tag, installs dependencies, runs tests, builds, and then runs `npm publish --provenance`.
28
28
 
package/README.md CHANGED
@@ -33,13 +33,20 @@ pnpm glamsterdam eips
33
33
  pnpm glamsterdam scan-bytecode fixtures/bytecode/storage-heavy.hex
34
34
  ```
35
35
 
36
- The package is configured as `glamsterdam-compat-lab` in `package.json`, but npm registry publication is still pending package-owner authentication. Until npm shows `glamsterdam-compat-lab@0.2.2`, the current installable release artifact is the v0.2.2 GitHub release tarball:
36
+ Install the published CLI from npm:
37
37
 
38
38
  ```sh
39
- npm install -g https://github.com/CruzMolina/glamsterdam-compat-lab/releases/download/v0.2.2/glamsterdam-compat-lab-0.2.2.tgz
39
+ npm install -g glamsterdam-compat-lab@0.3.1
40
+ glamsterdam eips
40
41
  ```
41
42
 
42
- See [docs/release.md](docs/release.md) for npm publication status and maintainer release checks.
43
+ The v0.3.1 GitHub release tarball remains available as a reproducible release artifact:
44
+
45
+ ```sh
46
+ npm install -g https://github.com/CruzMolina/glamsterdam-compat-lab/releases/download/v0.3.1/glamsterdam-compat-lab-0.3.1.tgz
47
+ ```
48
+
49
+ See [docs/release.md](docs/release.md) for maintainer release checks and npm publishing notes.
43
50
 
44
51
  The default output format is Markdown. Use `--format json` for machine-readable reports.
45
52
 
@@ -53,10 +60,26 @@ ETH_RPC_URL=https://your-execution-rpc.example pnpm glamsterdam scan-tx --tx 0x0
53
60
  pnpm glamsterdam scan-indexer fixtures/indexers/subgraph.yaml --format markdown
54
61
  pnpm glamsterdam scan-validator --config fixtures/validator/operator-config.yaml --format markdown
55
62
  pnpm glamsterdam report report-a.json report-b.json --format markdown
63
+ pnpm glamsterdam compare-reports baseline-report.json candidate-report.json --format markdown
56
64
  ```
57
65
 
58
66
  Each scanner accepts `--registry <path>` and `--thresholds <path>` so EIP metadata and detector thresholds can be updated without editing detector code.
59
67
 
68
+ ## Examples
69
+
70
+ - [Storage-heavy bytecode report](examples/storage-heavy-bytecode.md)
71
+ - [Baseline comparison reports](examples/baseline-comparison.md)
72
+
73
+ ## Public dataset seed
74
+
75
+ Fixture provenance lives in [fixtures/provenance.json](fixtures/provenance.json). The first deterministic dataset seed lives in [datasets/public-seed](datasets/public-seed) and includes generated JSON reports plus default-vs-research threshold comparisons for bytecode and trace fixtures.
76
+
77
+ Regenerate it with:
78
+
79
+ ```sh
80
+ pnpm dataset:generate
81
+ ```
82
+
60
83
  ## What the scanners can detect
61
84
 
62
85
  `scan-bytecode` normalizes EVM bytecode, disassembles opcodes while skipping PUSH data, counts relevant opcodes, and reports conservative risks around contract size, storage/account access, CREATE/CREATE2 usage, calldata copying, logs, and manual-review limits.
@@ -100,13 +123,15 @@ Use `--trace-out <path>` to save the fetched JSON-RPC trace response while also
100
123
 
101
124
  `scan-validator` parses JSON and YAML operator configs. It checks for execution, consensus, validator, builder/API, monitoring, and testnet/devnet metadata. It compares client names and versions against `data/client-compat/clients.example.json` or a user-provided matrix, but it does not guess compatibility.
102
125
 
126
+ `compare-reports` accepts two saved JSON compatibility reports and emits deterministic JSON or Markdown deltas. It compares findings by stable finding ID, reports findings added, removed, changed, and unchanged, and highlights severity and confidence changes. It does not invent exact gas deltas; those must come from explicit input data or future client outputs.
127
+
103
128
  ## Report model
104
129
 
105
130
  Each scanner returns a `CompatibilityReport`:
106
131
 
107
132
  ```json
108
133
  {
109
- "toolVersion": "0.2.2",
134
+ "toolVersion": "0.3.1",
110
135
  "fork": "glamsterdam",
111
136
  "target": {
112
137
  "kind": "bytecode",
@@ -139,6 +164,20 @@ Confidence means:
139
164
  - `medium`: strong heuristic
140
165
  - `low`: weak heuristic or incomplete input
141
166
 
167
+ Comparison reports include baseline and candidate report references, risk and finding-count deltas, added/removed/changed/unchanged finding lists, and comparison assumptions and limitations. This supports workflows such as comparing default, research, and CI threshold-profile outputs:
168
+
169
+ ```sh
170
+ pnpm glamsterdam scan-traces fixtures/traces/storage-heavy-trace.json \
171
+ --thresholds data/detectors/thresholds.json \
172
+ --format json > default-report.json
173
+
174
+ pnpm glamsterdam scan-traces fixtures/traces/storage-heavy-trace.json \
175
+ --thresholds data/detectors/thresholds.research.json \
176
+ --format json > research-report.json
177
+
178
+ pnpm glamsterdam compare-reports default-report.json research-report.json --format markdown
179
+ ```
180
+
142
181
  ## Updating the EIP registry
143
182
 
144
183
  Edit `data/eips/glamsterdam.json`.
@@ -180,7 +219,7 @@ Release publishing notes live in [docs/release.md](docs/release.md).
180
219
 
181
220
  ## Roadmap
182
221
 
183
- See [ROADMAP.md](ROADMAP.md) for planned phases. Phase 0 is released as `v0.1.0`; `v0.2.0` starts Phase 1 with RPC transaction trace ingestion and broader trace fixture coverage.
222
+ See [ROADMAP.md](ROADMAP.md) for planned phases. Phase 0 is released as `v0.1.0`; `v0.2.0` starts Phase 1 with RPC transaction trace ingestion and broader trace fixture coverage; `v0.3.0` adds baseline comparison reports; `v0.3.1` expands public-safe fixture and dataset coverage.
184
223
 
185
224
  ## Disclaimer
186
225
 
package/ROADMAP.md CHANGED
@@ -44,15 +44,21 @@ Target release: `v0.3.0`.
44
44
 
45
45
  Goal: compare compatibility reports across profiles and, later, across current-client and Glamsterdam-aware traces.
46
46
 
47
+ - Add `compare-reports` for deterministic JSON and Markdown report comparisons
47
48
  - Compare one trace against multiple threshold profiles
48
- - Emit report deltas for findings added, removed, or changed in severity
49
- - Keep comparisons deterministic and JSON-friendly
49
+ - Emit report deltas for findings added, removed, or changed in severity or confidence
50
+ - Keep comparisons deterministic and JSON-friendly with golden fixtures and snapshots
50
51
  - Defer fork-specific gas deltas until they are present in explicit data files or client configs
51
52
 
52
53
  ## Phase 2: Public Dataset
53
54
 
55
+ Status: seeded after `v0.3.0`; expanded with public-safe trace, indexer, and validator fixture coverage in `v0.3.1`.
56
+
54
57
  Goal: publish reproducible compatibility research.
55
58
 
59
+ - Track fixture provenance, source type, redaction posture, expected scanner signals, and known metadata gaps
60
+ - Generate a deterministic public seed dataset from safe-to-publish fixtures
61
+ - Compare default and research threshold profiles for bytecode and trace fixtures
56
62
  - Scan popular contracts and protocol surfaces
57
63
  - Publish deterministic report artifacts
58
64
  - Generate aggregate risk statistics
@@ -13,6 +13,11 @@
13
13
  "version": "0.0.0-example",
14
14
  "status": "unknown",
15
15
  "notes": "Placeholder only. Replace with a sourced compatibility statement before relying on this matrix."
16
+ },
17
+ {
18
+ "version": "1.0.0-compatible",
19
+ "status": "compatible",
20
+ "notes": "Synthetic compatible status used by safe fixture variants; do not treat as a real client release."
16
21
  }
17
22
  ]
18
23
  },
@@ -24,6 +29,11 @@
24
29
  "version": "0.0.0-example",
25
30
  "status": "unknown",
26
31
  "notes": "Placeholder only. Replace with a sourced compatibility statement before relying on this matrix."
32
+ },
33
+ {
34
+ "version": "1.0.0-compatible",
35
+ "status": "compatible",
36
+ "notes": "Synthetic compatible status used by safe fixture variants; do not treat as a real client release."
27
37
  }
28
38
  ]
29
39
  },
@@ -35,6 +45,11 @@
35
45
  "version": "0.0.0-example",
36
46
  "status": "unknown",
37
47
  "notes": "Placeholder only. Replace with a sourced compatibility statement before relying on this matrix."
48
+ },
49
+ {
50
+ "version": "1.0.0-compatible",
51
+ "status": "compatible",
52
+ "notes": "Synthetic compatible status used by safe fixture variants; do not treat as a real client release."
38
53
  }
39
54
  ]
40
55
  }
@@ -0,0 +1,26 @@
1
+ # Public Seed Dataset
2
+
3
+ This directory contains the first deterministic dataset seed for Glamsterdam Compatibility Lab. It is generated from safe-to-publish fixtures documented in `fixtures/provenance.json`.
4
+
5
+ The seed is intentionally small. It is meant to prove the dataset workflow, not to measure aggregate public-chain readiness.
6
+
7
+ ## Contents
8
+
9
+ - `manifest.json`: index of generated reports, comparisons, source fixtures, threshold profiles, and limitations.
10
+ - `reports/`: JSON compatibility reports generated from source fixtures.
11
+ - `comparisons/`: JSON comparison reports for default-vs-research threshold profiles on bytecode and trace fixtures.
12
+
13
+ ## Regenerate
14
+
15
+ ```sh
16
+ pnpm dataset:generate
17
+ ```
18
+
19
+ Then run:
20
+
21
+ ```sh
22
+ pnpm test
23
+ pnpm build
24
+ ```
25
+
26
+ Review generated changes before publishing. Dataset comparisons are structural report differences only; they do not infer final Glamsterdam gas deltas or client behavior.
@@ -0,0 +1,168 @@
1
+ {
2
+ "toolVersion": "0.3.1",
3
+ "fork": "glamsterdam",
4
+ "comparison": {
5
+ "baseline": {
6
+ "toolVersion": "0.3.1",
7
+ "fork": "glamsterdam",
8
+ "target": {
9
+ "kind": "bytecode",
10
+ "name": "fixtures/bytecode/storage-heavy.hex"
11
+ },
12
+ "summary": {
13
+ "risk": "medium",
14
+ "findingCount": 6,
15
+ "highCount": 0,
16
+ "mediumCount": 3,
17
+ "lowCount": 2,
18
+ "unknownCount": 1
19
+ }
20
+ },
21
+ "candidate": {
22
+ "toolVersion": "0.3.1",
23
+ "fork": "glamsterdam",
24
+ "target": {
25
+ "kind": "bytecode",
26
+ "name": "fixtures/bytecode/storage-heavy.hex"
27
+ },
28
+ "summary": {
29
+ "risk": "medium",
30
+ "findingCount": 6,
31
+ "highCount": 0,
32
+ "mediumCount": 3,
33
+ "lowCount": 2,
34
+ "unknownCount": 1
35
+ }
36
+ }
37
+ },
38
+ "summary": {
39
+ "riskChange": {
40
+ "from": "medium",
41
+ "to": "medium",
42
+ "direction": "unchanged"
43
+ },
44
+ "findingCount": {
45
+ "baseline": 6,
46
+ "candidate": 6,
47
+ "delta": 0
48
+ },
49
+ "addedCount": 0,
50
+ "removedCount": 0,
51
+ "changedCount": 0,
52
+ "unchangedCount": 6,
53
+ "severityIncreasedCount": 0,
54
+ "severityDecreasedCount": 0,
55
+ "severityChangedCount": 0,
56
+ "confidenceIncreasedCount": 0,
57
+ "confidenceDecreasedCount": 0,
58
+ "confidenceChangedCount": 0
59
+ },
60
+ "changes": {
61
+ "added": [],
62
+ "removed": [],
63
+ "changed": [],
64
+ "unchanged": [
65
+ {
66
+ "key": "bytecode.calldata-copy-exposure",
67
+ "id": "bytecode.calldata-copy-exposure",
68
+ "title": "Calldata copy opcode is present",
69
+ "severity": "low",
70
+ "confidence": "medium",
71
+ "domain": [
72
+ "contracts",
73
+ "execution"
74
+ ],
75
+ "relatedEips": [
76
+ "GAS-REPRICING",
77
+ "EIP-7976",
78
+ "EIP-7904",
79
+ "EIP-8038"
80
+ ]
81
+ },
82
+ {
83
+ "key": "bytecode.contract-creation-opcodes",
84
+ "id": "bytecode.contract-creation-opcodes",
85
+ "title": "Contract creation opcodes are present",
86
+ "severity": "medium",
87
+ "confidence": "high",
88
+ "domain": [
89
+ "contracts",
90
+ "execution"
91
+ ],
92
+ "relatedEips": [
93
+ "GAS-REPRICING",
94
+ "EIP-8037"
95
+ ]
96
+ },
97
+ {
98
+ "key": "bytecode.log-opcodes-present",
99
+ "id": "bytecode.log-opcodes-present",
100
+ "title": "Log opcodes are present",
101
+ "severity": "low",
102
+ "confidence": "medium",
103
+ "domain": [
104
+ "contracts",
105
+ "indexer",
106
+ "monitoring"
107
+ ],
108
+ "relatedEips": [
109
+ "EIP-7708"
110
+ ]
111
+ },
112
+ {
113
+ "key": "bytecode.manual-review-required",
114
+ "id": "bytecode.manual-review-required",
115
+ "title": "Manual review is still required for runtime behavior",
116
+ "severity": "unknown",
117
+ "confidence": "low",
118
+ "domain": [
119
+ "contracts",
120
+ "execution"
121
+ ],
122
+ "relatedEips": [
123
+ "GAS-REPRICING"
124
+ ]
125
+ },
126
+ {
127
+ "key": "bytecode.state-account-opcode-exposure",
128
+ "id": "bytecode.state-account-opcode-exposure",
129
+ "title": "State and account access opcodes are prominent in bytecode",
130
+ "severity": "medium",
131
+ "confidence": "medium",
132
+ "domain": [
133
+ "contracts",
134
+ "execution"
135
+ ],
136
+ "relatedEips": [
137
+ "GAS-REPRICING",
138
+ "EIP-7904",
139
+ "EIP-8038",
140
+ "EIP-7976"
141
+ ]
142
+ },
143
+ {
144
+ "key": "bytecode.storage-heavy-pattern",
145
+ "id": "bytecode.storage-heavy-pattern",
146
+ "title": "Storage-related opcodes appear frequently",
147
+ "severity": "medium",
148
+ "confidence": "medium",
149
+ "domain": [
150
+ "contracts",
151
+ "execution"
152
+ ],
153
+ "relatedEips": [
154
+ "GAS-REPRICING",
155
+ "EIP-8038"
156
+ ]
157
+ }
158
+ ]
159
+ },
160
+ "assumptions": [
161
+ "Reports were compared by finding id. Repeated finding ids are disambiguated with deterministic occurrence suffixes.",
162
+ "Severity and confidence changes are structural report changes, not protocol gas estimates."
163
+ ],
164
+ "limitations": [
165
+ "The comparison does not infer exact gas deltas, final Glamsterdam parameters, or current-vs-Glamsterdam client behavior unless those values are already present in the input reports.",
166
+ "Added and removed findings can reflect threshold profile differences, fixture coverage changes, registry updates, or detector changes; review the source reports before treating a diff as a protocol risk change."
167
+ ]
168
+ }
@@ -0,0 +1,91 @@
1
+ {
2
+ "toolVersion": "0.3.1",
3
+ "fork": "glamsterdam",
4
+ "comparison": {
5
+ "baseline": {
6
+ "toolVersion": "0.3.1",
7
+ "fork": "glamsterdam",
8
+ "target": {
9
+ "kind": "trace",
10
+ "name": "fixtures/traces/besu-debug-structlogs.json"
11
+ },
12
+ "summary": {
13
+ "risk": "low",
14
+ "findingCount": 1,
15
+ "highCount": 0,
16
+ "mediumCount": 0,
17
+ "lowCount": 1,
18
+ "unknownCount": 0
19
+ }
20
+ },
21
+ "candidate": {
22
+ "toolVersion": "0.3.1",
23
+ "fork": "glamsterdam",
24
+ "target": {
25
+ "kind": "trace",
26
+ "name": "fixtures/traces/besu-debug-structlogs.json"
27
+ },
28
+ "summary": {
29
+ "risk": "low",
30
+ "findingCount": 1,
31
+ "highCount": 0,
32
+ "mediumCount": 0,
33
+ "lowCount": 1,
34
+ "unknownCount": 0
35
+ }
36
+ }
37
+ },
38
+ "summary": {
39
+ "riskChange": {
40
+ "from": "low",
41
+ "to": "low",
42
+ "direction": "unchanged"
43
+ },
44
+ "findingCount": {
45
+ "baseline": 1,
46
+ "candidate": 1,
47
+ "delta": 0
48
+ },
49
+ "addedCount": 0,
50
+ "removedCount": 0,
51
+ "changedCount": 0,
52
+ "unchangedCount": 1,
53
+ "severityIncreasedCount": 0,
54
+ "severityDecreasedCount": 0,
55
+ "severityChangedCount": 0,
56
+ "confidenceIncreasedCount": 0,
57
+ "confidenceDecreasedCount": 0,
58
+ "confidenceChangedCount": 0
59
+ },
60
+ "changes": {
61
+ "added": [],
62
+ "removed": [],
63
+ "changed": [],
64
+ "unchanged": [
65
+ {
66
+ "key": "trace.logs-calls-visible",
67
+ "id": "trace.logs-calls-visible",
68
+ "title": "Trace includes logs or external calls",
69
+ "severity": "low",
70
+ "confidence": "high",
71
+ "domain": [
72
+ "contracts",
73
+ "indexer",
74
+ "monitoring"
75
+ ],
76
+ "relatedEips": [
77
+ "EIP-7708",
78
+ "EIP-7928"
79
+ ]
80
+ }
81
+ ]
82
+ },
83
+ "assumptions": [
84
+ "Reports were compared by finding id. Repeated finding ids are disambiguated with deterministic occurrence suffixes.",
85
+ "Severity and confidence changes are structural report changes, not protocol gas estimates."
86
+ ],
87
+ "limitations": [
88
+ "The comparison does not infer exact gas deltas, final Glamsterdam parameters, or current-vs-Glamsterdam client behavior unless those values are already present in the input reports.",
89
+ "Added and removed findings can reflect threshold profile differences, fixture coverage changes, registry updates, or detector changes; review the source reports before treating a diff as a protocol risk change."
90
+ ]
91
+ }
@@ -0,0 +1,140 @@
1
+ {
2
+ "toolVersion": "0.3.1",
3
+ "fork": "glamsterdam",
4
+ "comparison": {
5
+ "baseline": {
6
+ "toolVersion": "0.3.1",
7
+ "fork": "glamsterdam",
8
+ "target": {
9
+ "kind": "trace",
10
+ "name": "fixtures/traces/besu-mainnet-tracoor-debug-structlogs.json"
11
+ },
12
+ "summary": {
13
+ "risk": "medium",
14
+ "findingCount": 4,
15
+ "highCount": 0,
16
+ "mediumCount": 1,
17
+ "lowCount": 2,
18
+ "unknownCount": 1
19
+ }
20
+ },
21
+ "candidate": {
22
+ "toolVersion": "0.3.1",
23
+ "fork": "glamsterdam",
24
+ "target": {
25
+ "kind": "trace",
26
+ "name": "fixtures/traces/besu-mainnet-tracoor-debug-structlogs.json"
27
+ },
28
+ "summary": {
29
+ "risk": "medium",
30
+ "findingCount": 4,
31
+ "highCount": 0,
32
+ "mediumCount": 1,
33
+ "lowCount": 2,
34
+ "unknownCount": 1
35
+ }
36
+ }
37
+ },
38
+ "summary": {
39
+ "riskChange": {
40
+ "from": "medium",
41
+ "to": "medium",
42
+ "direction": "unchanged"
43
+ },
44
+ "findingCount": {
45
+ "baseline": 4,
46
+ "candidate": 4,
47
+ "delta": 0
48
+ },
49
+ "addedCount": 0,
50
+ "removedCount": 0,
51
+ "changedCount": 0,
52
+ "unchangedCount": 4,
53
+ "severityIncreasedCount": 0,
54
+ "severityDecreasedCount": 0,
55
+ "severityChangedCount": 0,
56
+ "confidenceIncreasedCount": 0,
57
+ "confidenceDecreasedCount": 0,
58
+ "confidenceChangedCount": 0
59
+ },
60
+ "changes": {
61
+ "added": [],
62
+ "removed": [],
63
+ "changed": [],
64
+ "unchanged": [
65
+ {
66
+ "key": "trace.calldata-heavy-execution",
67
+ "id": "trace.calldata-heavy-execution",
68
+ "title": "Trace includes visible calldata-heavy execution",
69
+ "severity": "low",
70
+ "confidence": "medium",
71
+ "domain": [
72
+ "contracts",
73
+ "execution"
74
+ ],
75
+ "relatedEips": [
76
+ "GAS-REPRICING",
77
+ "EIP-7976",
78
+ "EIP-7904",
79
+ "EIP-8038"
80
+ ]
81
+ },
82
+ {
83
+ "key": "trace.logs-calls-visible",
84
+ "id": "trace.logs-calls-visible",
85
+ "title": "Trace includes logs or external calls",
86
+ "severity": "low",
87
+ "confidence": "high",
88
+ "domain": [
89
+ "contracts",
90
+ "indexer",
91
+ "monitoring"
92
+ ],
93
+ "relatedEips": [
94
+ "EIP-7708",
95
+ "EIP-7928"
96
+ ]
97
+ },
98
+ {
99
+ "key": "trace.partial-evidence",
100
+ "id": "trace.partial-evidence",
101
+ "title": "Trace omits some useful compatibility evidence",
102
+ "severity": "unknown",
103
+ "confidence": "low",
104
+ "domain": [
105
+ "contracts",
106
+ "execution"
107
+ ],
108
+ "relatedEips": [
109
+ "GAS-REPRICING",
110
+ "EIP-7976"
111
+ ]
112
+ },
113
+ {
114
+ "key": "trace.state-heavy-execution-medium",
115
+ "id": "trace.state-heavy-execution-medium",
116
+ "title": "Trace shows state-heavy execution",
117
+ "severity": "medium",
118
+ "confidence": "high",
119
+ "domain": [
120
+ "contracts",
121
+ "execution"
122
+ ],
123
+ "relatedEips": [
124
+ "GAS-REPRICING",
125
+ "EIP-7904",
126
+ "EIP-8038",
127
+ "EIP-7976"
128
+ ]
129
+ }
130
+ ]
131
+ },
132
+ "assumptions": [
133
+ "Reports were compared by finding id. Repeated finding ids are disambiguated with deterministic occurrence suffixes.",
134
+ "Severity and confidence changes are structural report changes, not protocol gas estimates."
135
+ ],
136
+ "limitations": [
137
+ "The comparison does not infer exact gas deltas, final Glamsterdam parameters, or current-vs-Glamsterdam client behavior unless those values are already present in the input reports.",
138
+ "Added and removed findings can reflect threshold profile differences, fixture coverage changes, registry updates, or detector changes; review the source reports before treating a diff as a protocol risk change."
139
+ ]
140
+ }