repro-surgeon 0.1.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.
Files changed (111) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/CODE_OF_CONDUCT.md +7 -0
  3. package/CONTRIBUTING.md +31 -0
  4. package/LICENSE +21 -0
  5. package/README.md +159 -0
  6. package/SECURITY.md +15 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.js +165 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +3 -0
  11. package/dist/config.js +177 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/dependencies.d.ts +37 -0
  14. package/dist/dependencies.js +237 -0
  15. package/dist/dependencies.js.map +1 -0
  16. package/dist/engine.d.ts +25 -0
  17. package/dist/engine.js +327 -0
  18. package/dist/engine.js.map +1 -0
  19. package/dist/export.d.ts +7 -0
  20. package/dist/export.js +520 -0
  21. package/dist/export.js.map +1 -0
  22. package/dist/graph.d.ts +3 -0
  23. package/dist/graph.js +247 -0
  24. package/dist/graph.js.map +1 -0
  25. package/dist/index.d.ts +7 -0
  26. package/dist/index.js +7 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/oracle.d.ts +2 -0
  29. package/dist/oracle.js +81 -0
  30. package/dist/oracle.js.map +1 -0
  31. package/dist/protection.d.ts +2 -0
  32. package/dist/protection.js +6 -0
  33. package/dist/protection.js.map +1 -0
  34. package/dist/report.d.ts +5 -0
  35. package/dist/report.js +539 -0
  36. package/dist/report.js.map +1 -0
  37. package/dist/runner.d.ts +3 -0
  38. package/dist/runner.js +195 -0
  39. package/dist/runner.js.map +1 -0
  40. package/dist/snapshot.d.ts +11 -0
  41. package/dist/snapshot.js +220 -0
  42. package/dist/snapshot.js.map +1 -0
  43. package/dist/state.d.ts +9 -0
  44. package/dist/state.js +143 -0
  45. package/dist/state.js.map +1 -0
  46. package/dist/transforms.d.ts +3 -0
  47. package/dist/transforms.js +188 -0
  48. package/dist/transforms.js.map +1 -0
  49. package/dist/types.d.ts +207 -0
  50. package/dist/types.js +2 -0
  51. package/dist/types.js.map +1 -0
  52. package/docs/architecture.md +91 -0
  53. package/docs/assets/report.png +0 -0
  54. package/docs/configuration.md +73 -0
  55. package/docs/evidence/dependency-removal.json +109 -0
  56. package/docs/evidence/next-frameworks.json +271 -0
  57. package/docs/evidence/next-pages.json +152 -0
  58. package/docs/evidence/rounding.json +46 -0
  59. package/docs/report-surface.md +22 -0
  60. package/docs/troubleshooting.md +47 -0
  61. package/docs/validation.md +103 -0
  62. package/examples/next-container/README.md +7 -0
  63. package/examples/next-container/app/about/page.jsx +1 -0
  64. package/examples/next-container/app/case.css +5 -0
  65. package/examples/next-container/app/layout.jsx +3 -0
  66. package/examples/next-container/app/page.jsx +4 -0
  67. package/examples/next-container/lib/catalog.js +2 -0
  68. package/examples/next-container/next.config.mjs +1 -0
  69. package/examples/next-container/package-lock.json +952 -0
  70. package/examples/next-container/package.json +13 -0
  71. package/examples/next-container/repro-surgeon.json +37 -0
  72. package/examples/next-css-bom/README.md +7 -0
  73. package/examples/next-css-bom/app/about/page.jsx +1 -0
  74. package/examples/next-css-bom/app/case.css +3 -0
  75. package/examples/next-css-bom/app/layout.jsx +3 -0
  76. package/examples/next-css-bom/app/page.jsx +4 -0
  77. package/examples/next-css-bom/lib/catalog.js +2 -0
  78. package/examples/next-css-bom/next.config.mjs +1 -0
  79. package/examples/next-css-bom/package-lock.json +952 -0
  80. package/examples/next-css-bom/package.json +13 -0
  81. package/examples/next-css-bom/repro-surgeon.json +36 -0
  82. package/examples/next-pages/README.md +14 -0
  83. package/examples/next-pages/lib/unused-catalog.js +5 -0
  84. package/examples/next-pages/next.config.mjs +1 -0
  85. package/examples/next-pages/package-lock.json +952 -0
  86. package/examples/next-pages/package.json +11 -0
  87. package/examples/next-pages/pages/health.jsx +3 -0
  88. package/examples/next-pages/pages/index.jsx +9 -0
  89. package/examples/next-pages/repro-surgeon.json +18 -0
  90. package/examples/next-root-param/README.md +7 -0
  91. package/examples/next-root-param/app/[lang-country]/about/page.jsx +1 -0
  92. package/examples/next-root-param/app/[lang-country]/layout.tsx +4 -0
  93. package/examples/next-root-param/app/[lang-country]/page.tsx +3 -0
  94. package/examples/next-root-param/lib/catalog.js +2 -0
  95. package/examples/next-root-param/next-env.d.ts +2 -0
  96. package/examples/next-root-param/next.config.mjs +1 -0
  97. package/examples/next-root-param/package-lock.json +1016 -0
  98. package/examples/next-root-param/package.json +19 -0
  99. package/examples/next-root-param/repro-surgeon.json +37 -0
  100. package/examples/next-root-param/tsconfig.json +35 -0
  101. package/examples/rounding/README.md +16 -0
  102. package/examples/rounding/check.mjs +6 -0
  103. package/examples/rounding/config/store.json +7 -0
  104. package/examples/rounding/fixtures/invoice.json +11 -0
  105. package/examples/rounding/package-lock.json +7 -0
  106. package/examples/rounding/package.json +7 -0
  107. package/examples/rounding/repro-surgeon.json +12 -0
  108. package/examples/rounding/src/catalog.mjs +9 -0
  109. package/examples/rounding/src/shipping.mjs +7 -0
  110. package/examples/rounding/src/totals.mjs +11 -0
  111. package/package.json +29 -0
@@ -0,0 +1,109 @@
1
+ {
2
+ "date": "2026-09-06",
3
+ "kind": "owned-public-dependency-removal",
4
+ "fixtureGenerator": "scripts/validate-dependency.mjs",
5
+ "package": "picomatch",
6
+ "installedVersion": "4.0.7",
7
+ "runtime": {
8
+ "node": "v24.7.0",
9
+ "npm": "11.5.1",
10
+ "platform": "darwin",
11
+ "arch": "arm64",
12
+ "tool": "0.1.0"
13
+ },
14
+ "settings": {
15
+ "command": [
16
+ "node",
17
+ "check.cjs"
18
+ ],
19
+ "oracle": {
20
+ "exitCode": 1,
21
+ "allOf": [
22
+ "OWNED_DEPENDENCY_TOTAL_MISMATCH: expected 12, got 13"
23
+ ],
24
+ "noneOf": [
25
+ "UNRELATED_DEPENDENCY_FAILURE",
26
+ "Cannot find module"
27
+ ]
28
+ },
29
+ "budget": {
30
+ "maxEvaluations": 8,
31
+ "maxSeconds": 120
32
+ },
33
+ "runs": {
34
+ "baseline": 3,
35
+ "candidate": 2,
36
+ "final": 3
37
+ },
38
+ "allowInstallScripts": false,
39
+ "reduce": {
40
+ "files": false,
41
+ "syntax": false,
42
+ "json": false,
43
+ "dependencies": true
44
+ }
45
+ },
46
+ "sourceHash": "2b68d61aaf59c75ef98252db282721903063db57e668ee6b655cc21831cdbc13",
47
+ "sourceUnchanged": true,
48
+ "initial": {
49
+ "files": 4,
50
+ "bytes": 1139,
51
+ "sourceBytes": 310,
52
+ "dependencies": 1
53
+ },
54
+ "current": {
55
+ "files": 4,
56
+ "bytes": 625,
57
+ "sourceBytes": 310,
58
+ "dependencies": 0
59
+ },
60
+ "baseline": [
61
+ "reproduced",
62
+ "reproduced",
63
+ "reproduced"
64
+ ],
65
+ "evaluations": 2,
66
+ "totalMs": 2474,
67
+ "verification": {
68
+ "status": "verified",
69
+ "runs": 3,
70
+ "snapshotHash": "5849b96b1d4751a2f431a8dc2dcf0dfc4752c3b59460d0abc3f9ec604ed4a2fe",
71
+ "environment": "fresh-directory"
72
+ },
73
+ "controls": [
74
+ {
75
+ "kind": "trigger-removed",
76
+ "exitCode": 0,
77
+ "status": "absent"
78
+ },
79
+ {
80
+ "kind": "different-failure",
81
+ "exitCode": 1,
82
+ "status": "absent"
83
+ }
84
+ ],
85
+ "manifestDependencyRemoved": true,
86
+ "lockDependencyRemoved": true,
87
+ "exportedMetadataMatchesAccepted": true,
88
+ "acceptedChanges": [
89
+ {
90
+ "kind": "dependencies",
91
+ "paths": [
92
+ "package.json",
93
+ "package-lock.json"
94
+ ],
95
+ "confirmations": 2
96
+ }
97
+ ],
98
+ "standalone": {
99
+ "exitCode": 0
100
+ },
101
+ "timingScope": {
102
+ "totalMs": "Reduction, export verification and standalone verification; excludes fixture lock generation, installation proof and controls."
103
+ },
104
+ "limits": [
105
+ "The pinned public package was unused by the locally authored failure command.",
106
+ "Source bytes and file count did not decrease; this validates the dependency pass and exact exported npm metadata.",
107
+ "One macOS ARM64 environment; not general package-manager, platform or performance coverage."
108
+ ]
109
+ }
@@ -0,0 +1,271 @@
1
+ {
2
+ "date": "2026-09-06",
3
+ "kind": "independent-next-report-reconstructions",
4
+ "runtime": {
5
+ "node": "v24.7.0",
6
+ "npm": "11.5.1",
7
+ "platform": "darwin",
8
+ "arch": "arm64",
9
+ "tool": "0.1.0"
10
+ },
11
+ "validationScript": "scripts/validate-next.mjs",
12
+ "provenance": "Independently authored reconstructions of reported triggers; the original reproduction repositories were not copied or executed.",
13
+ "cases": [
14
+ {
15
+ "name": "next-container",
16
+ "fixture": "examples/next-container",
17
+ "upstreamIssue": "https://github.com/vercel/next.js/issues/98261",
18
+ "nextVersion": "16.3.4",
19
+ "settings": {
20
+ "command": [
21
+ "npm",
22
+ "run",
23
+ "build"
24
+ ],
25
+ "oracle": {
26
+ "exitCode": 1,
27
+ "allOf": [
28
+ "Parsing CSS source code failed",
29
+ "@container scroll-content",
30
+ "Unexpected end of input"
31
+ ],
32
+ "noneOf": [
33
+ "Module not found",
34
+ "Cannot find module",
35
+ "Failed to fetch"
36
+ ]
37
+ },
38
+ "budget": {
39
+ "maxEvaluations": 80,
40
+ "maxSeconds": 900
41
+ },
42
+ "runs": {
43
+ "baseline": 3,
44
+ "candidate": 2,
45
+ "final": 3
46
+ },
47
+ "allowInstallScripts": false,
48
+ "reduce": {
49
+ "files": true,
50
+ "syntax": true,
51
+ "json": true,
52
+ "dependencies": false
53
+ }
54
+ },
55
+ "sourceHash": "779ebdbe72d3ca4e1da159cf28634c761aed3b838d8a81f492ff38d1b06d644f",
56
+ "sourceUnchanged": true,
57
+ "initial": {
58
+ "files": 10,
59
+ "bytes": 33310,
60
+ "sourceBytes": 2116,
61
+ "dependencies": 3
62
+ },
63
+ "current": {
64
+ "files": 7,
65
+ "bytes": 31389,
66
+ "sourceBytes": 195,
67
+ "dependencies": 3
68
+ },
69
+ "baseline": [
70
+ "reproduced",
71
+ "reproduced",
72
+ "reproduced"
73
+ ],
74
+ "evaluations": 26,
75
+ "searchMs": 237328.937125,
76
+ "totalMs": 289801,
77
+ "verification": {
78
+ "status": "verified",
79
+ "runs": 3,
80
+ "snapshotHash": "edcd4a94f38488bf6864afec1178eb44d1a653ae605875f709f31cc992d0996b",
81
+ "environment": "fresh-directory"
82
+ },
83
+ "controls": [
84
+ {
85
+ "kind": "trigger-removed",
86
+ "exitCode": 0,
87
+ "status": "absent"
88
+ },
89
+ {
90
+ "kind": "different-failure",
91
+ "exitCode": 1,
92
+ "status": "absent"
93
+ }
94
+ ]
95
+ },
96
+ {
97
+ "name": "next-root-param",
98
+ "fixture": "examples/next-root-param",
99
+ "upstreamIssue": "https://github.com/vercel/next.js/issues/97927",
100
+ "nextVersion": "16.3.3",
101
+ "settings": {
102
+ "command": [
103
+ "npm",
104
+ "run",
105
+ "build"
106
+ ],
107
+ "oracle": {
108
+ "exitCode": 1,
109
+ "allOf": [
110
+ ".next/types/root-params.d.ts(4,23): error TS1005: '(' expected.",
111
+ ".next/types/root-params.d.ts(4,33): error TS1005: ';' expected.",
112
+ "Failed to type check."
113
+ ],
114
+ "noneOf": [
115
+ "Module not found",
116
+ "Cannot find module",
117
+ "Failed to fetch"
118
+ ]
119
+ },
120
+ "budget": {
121
+ "maxEvaluations": 80,
122
+ "maxSeconds": 900
123
+ },
124
+ "runs": {
125
+ "baseline": 3,
126
+ "candidate": 2,
127
+ "final": 3
128
+ },
129
+ "allowInstallScripts": false,
130
+ "reduce": {
131
+ "files": true,
132
+ "syntax": true,
133
+ "json": true,
134
+ "dependencies": false
135
+ }
136
+ },
137
+ "sourceHash": "8f71fa4567549db642f9096d43fa67f9ef4c463583c5b373e98daa846cccf5a4",
138
+ "sourceUnchanged": true,
139
+ "initial": {
140
+ "files": 11,
141
+ "bytes": 36521,
142
+ "sourceBytes": 2794,
143
+ "dependencies": 7
144
+ },
145
+ "current": {
146
+ "files": 6,
147
+ "bytes": 33777,
148
+ "sourceBytes": 50,
149
+ "dependencies": 7
150
+ },
151
+ "baseline": [
152
+ "reproduced",
153
+ "reproduced",
154
+ "reproduced"
155
+ ],
156
+ "evaluations": 12,
157
+ "searchMs": 256606.08345800004,
158
+ "totalMs": 330056,
159
+ "verification": {
160
+ "status": "verified",
161
+ "runs": 3,
162
+ "snapshotHash": "a20b644dd14aa32d50ab79e07ddeb63b77ff805c5b857e592acbf20b24c20c58",
163
+ "environment": "fresh-directory"
164
+ },
165
+ "controls": [
166
+ {
167
+ "kind": "trigger-removed",
168
+ "exitCode": 0,
169
+ "status": "absent"
170
+ },
171
+ {
172
+ "kind": "different-failure",
173
+ "exitCode": 1,
174
+ "status": "absent"
175
+ }
176
+ ]
177
+ },
178
+ {
179
+ "name": "next-css-bom",
180
+ "fixture": "examples/next-css-bom",
181
+ "upstreamIssue": "https://github.com/vercel/next.js/issues/96374",
182
+ "nextVersion": "16.3.0-canary.103",
183
+ "settings": {
184
+ "command": [
185
+ "npm",
186
+ "run",
187
+ "build"
188
+ ],
189
+ "oracle": {
190
+ "exitCode": 1,
191
+ "allOf": [
192
+ "Parsing CSS source code failed",
193
+ "AtKeyword(\"layer\")"
194
+ ],
195
+ "noneOf": [
196
+ "Module not found",
197
+ "Cannot find module",
198
+ "Failed to fetch"
199
+ ]
200
+ },
201
+ "budget": {
202
+ "maxEvaluations": 80,
203
+ "maxSeconds": 900
204
+ },
205
+ "runs": {
206
+ "baseline": 3,
207
+ "candidate": 2,
208
+ "final": 3
209
+ },
210
+ "allowInstallScripts": false,
211
+ "reduce": {
212
+ "files": true,
213
+ "syntax": true,
214
+ "json": true,
215
+ "dependencies": false
216
+ }
217
+ },
218
+ "sourceHash": "51de138f74a3518ddf6c4404d6db333c200b4067bb59d20dda480b3ee4c3f5f0",
219
+ "sourceUnchanged": true,
220
+ "initial": {
221
+ "files": 10,
222
+ "bytes": 33544,
223
+ "sourceBytes": 2015,
224
+ "dependencies": 3
225
+ },
226
+ "current": {
227
+ "files": 7,
228
+ "bytes": 31654,
229
+ "sourceBytes": 125,
230
+ "dependencies": 3
231
+ },
232
+ "baseline": [
233
+ "reproduced",
234
+ "reproduced",
235
+ "reproduced"
236
+ ],
237
+ "evaluations": 26,
238
+ "searchMs": 191995.6436249999,
239
+ "totalMs": 218977,
240
+ "verification": {
241
+ "status": "verified",
242
+ "runs": 3,
243
+ "snapshotHash": "dabfe035b15992d774c667c70d7fc027abc9367fb8acfad41b173133dc424d43",
244
+ "environment": "fresh-directory"
245
+ },
246
+ "controls": [
247
+ {
248
+ "kind": "trigger-removed",
249
+ "exitCode": 0,
250
+ "status": "absent"
251
+ },
252
+ {
253
+ "kind": "different-failure",
254
+ "exitCode": 1,
255
+ "status": "absent"
256
+ }
257
+ ]
258
+ }
259
+ ],
260
+ "timingScope": {
261
+ "searchMs": "Recorded calibration and search elapsed time.",
262
+ "totalMs": "Reduction plus export verification; excludes preceding controls and their dependency setup."
263
+ },
264
+ "limits": [
265
+ "One macOS ARM64 environment; fresh directories on the same host, not framework container or OS-matrix coverage.",
266
+ "Dependency reduction disabled at the pinned framework versions.",
267
+ "Source bytes include fixture documentation and configuration but exclude package metadata and generated verification files.",
268
+ "Preserving an early diagnostic does not establish later build validity or identical semantic root cause.",
269
+ "These are local observations, not competitive performance benchmarks or current-version bug claims."
270
+ ]
271
+ }
@@ -0,0 +1,152 @@
1
+ {
2
+ "date": "2026-09-06",
3
+ "kind": "owned-seeded-next-pages-failure",
4
+ "fixture": "examples/next-pages",
5
+ "validationScript": "scripts/validate-pages.mjs",
6
+ "provenance": "Independently authored seeded application failure; no external reproduction source",
7
+ "runtime": {
8
+ "node": "v24.7.0",
9
+ "npm": "11.5.1",
10
+ "platform": "darwin",
11
+ "arch": "arm64",
12
+ "tool": "0.1.0"
13
+ },
14
+ "adapter": {
15
+ "name": "next",
16
+ "version": "16.3.4",
17
+ "router": "pages"
18
+ },
19
+ "settings": {
20
+ "command": [
21
+ "npm",
22
+ "run",
23
+ "build"
24
+ ],
25
+ "oracle": {
26
+ "exitCode": 1,
27
+ "allOf": [
28
+ "OWNED_PAGES_TOTAL_MISMATCH: expected 12, got 13",
29
+ "Error occurred prerendering page \"/\""
30
+ ],
31
+ "noneOf": [
32
+ "Module not found",
33
+ "Cannot find module",
34
+ "UNRELATED_PAGES_FAILURE",
35
+ "Failed to fetch"
36
+ ]
37
+ },
38
+ "budget": {
39
+ "maxEvaluations": 24,
40
+ "maxSeconds": 600
41
+ },
42
+ "runs": {
43
+ "baseline": 3,
44
+ "candidate": 2,
45
+ "final": 3
46
+ },
47
+ "allowInstallScripts": false,
48
+ "reduce": {
49
+ "files": true,
50
+ "syntax": true,
51
+ "json": false,
52
+ "dependencies": false
53
+ }
54
+ },
55
+ "sourceHash": "fa9695f4025ad1be39c96e5c7a7abad0775dfa93db820378b75943743f277c1b",
56
+ "sourceUnchanged": true,
57
+ "initial": {
58
+ "files": 8,
59
+ "bytes": 33618,
60
+ "sourceBytes": 2424,
61
+ "dependencies": 3
62
+ },
63
+ "current": {
64
+ "files": 5,
65
+ "bytes": 31465,
66
+ "sourceBytes": 271,
67
+ "dependencies": 3
68
+ },
69
+ "baseline": [
70
+ "reproduced",
71
+ "reproduced",
72
+ "reproduced"
73
+ ],
74
+ "evaluations": 24,
75
+ "searchMs": 395901.142542,
76
+ "totalMs": 451370,
77
+ "verification": {
78
+ "status": "verified",
79
+ "runs": 3,
80
+ "snapshotHash": "5d4207f5df01aad0c69bd3d4929a1764f0e6a4008e660b7da9eb02ea6881665d",
81
+ "environment": "fresh-directory"
82
+ },
83
+ "controls": [
84
+ {
85
+ "kind": "trigger-removed",
86
+ "exitCode": 0,
87
+ "status": "absent"
88
+ },
89
+ {
90
+ "kind": "different-failure",
91
+ "exitCode": 1,
92
+ "status": "absent"
93
+ }
94
+ ],
95
+ "acceptedChanges": [
96
+ {
97
+ "kind": "files",
98
+ "paths": [
99
+ "README.md",
100
+ "lib/unused-catalog.js",
101
+ "repro-surgeon.json"
102
+ ],
103
+ "confirmations": 2
104
+ },
105
+ {
106
+ "kind": "syntax",
107
+ "paths": [
108
+ "pages/health.jsx"
109
+ ],
110
+ "confirmations": 2
111
+ },
112
+ {
113
+ "kind": "syntax",
114
+ "paths": [
115
+ "pages/index.jsx"
116
+ ],
117
+ "confirmations": 2
118
+ },
119
+ {
120
+ "kind": "syntax",
121
+ "paths": [
122
+ "pages/index.jsx"
123
+ ],
124
+ "confirmations": 2
125
+ },
126
+ {
127
+ "kind": "syntax",
128
+ "paths": [
129
+ "pages/index.jsx"
130
+ ],
131
+ "confirmations": 2
132
+ },
133
+ {
134
+ "kind": "syntax",
135
+ "paths": [
136
+ "pages/index.jsx"
137
+ ],
138
+ "confirmations": 2
139
+ }
140
+ ],
141
+ "timingScope": {
142
+ "searchMs": "Recorded calibration and search elapsed time.",
143
+ "totalMs": "Reduction plus export verification; excludes preceding controls and their dependency setup."
144
+ },
145
+ "limits": [
146
+ "Independently authored application exception in getStaticProps; not an upstream Next.js bug.",
147
+ "One macOS ARM64 environment; three fresh-directory export checks, with no separate standalone Pages verifier run claimed.",
148
+ "Search stopped at 24 candidate evaluations; dependency reduction was disabled.",
149
+ "Source-byte reduction includes unused fixture documentation and configuration.",
150
+ "A local validation result, not a speed or minimality benchmark."
151
+ ]
152
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "date": "2026-09-06",
3
+ "kind": "seeded-example-and-ablation",
4
+ "runtime": {
5
+ "node": "v24.7.0",
6
+ "npm": "11.5.1",
7
+ "platform": "darwin",
8
+ "arch": "arm64",
9
+ "tool": "0.1.0"
10
+ },
11
+ "full": {
12
+ "initial": {
13
+ "files": 10,
14
+ "bytes": 3498,
15
+ "sourceBytes": 3173,
16
+ "dependencies": 0
17
+ },
18
+ "current": {
19
+ "files": 5,
20
+ "bytes": 845,
21
+ "sourceBytes": 520,
22
+ "dependencies": 0
23
+ },
24
+ "evaluations": 115,
25
+ "searchMs": 6561.4935829999995,
26
+ "verifiedRuns": 3
27
+ },
28
+ "filesOnly": {
29
+ "initial": {
30
+ "files": 10,
31
+ "bytes": 3498,
32
+ "sourceBytes": 3173,
33
+ "dependencies": 0
34
+ },
35
+ "current": {
36
+ "files": 5,
37
+ "bytes": 1453,
38
+ "sourceBytes": 1128,
39
+ "dependencies": 0
40
+ },
41
+ "evaluations": 20,
42
+ "searchMs": 1927.597042,
43
+ "verifiedRuns": 3
44
+ },
45
+ "limits": "One local run per setting, same source and failure check; no external competitor or independent human benchmark."
46
+ }
@@ -0,0 +1,22 @@
1
+ # Offline report surface
2
+
3
+ The report is the review surface for one `RunReport`. It answers three questions in order: did the exported snapshot reproduce under fresh verification, how much was removed while preserving the configured failure, and what evidence should a developer inspect before sharing it?
4
+
5
+ The visual direction is **The Evidence Signal Sheet**. A continuous route connects baseline, reduction, and fresh verification. One compact branch marker and count summarize discarded trials beneath the reduction stage, while the full trial list keeps each decision inspectable and the retained-file list shows what reached the verified endpoint. This is functional process navigation; it does not use literal transit imagery.
6
+
7
+ The first viewport combines run identity with the highest-contrast verification block, then exposes the complete evidence path and a large before-to-after source result. Detailed sections follow in this order:
8
+
9
+ 1. Reduction decisions with local text search, accepted/rejected/invalid filters, and expandable decision evidence.
10
+ 2. Retained files with local path search, exact byte counts, and within-run size bars.
11
+ 3. Runtime and adapter metadata.
12
+ 4. Findings, warnings, and excluded paths that need review before sharing.
13
+
14
+ Every value in the document comes from the supplied report or a transparent calculation over its recorded metrics. The report uses honest empty and interrupted states: pending or failed verification, a paused or failed run, no accepted reduction, no trials, no retained files, and no review findings all receive explicit labels.
15
+
16
+ The HTML is a single offline file with inline CSS and JavaScript, system fonts, and no remote assets. Search, filters, native details controls, and command copy work without a server. The copy action includes a legacy local fallback and reports its result in a polite live region. Responsive layouts preserve the reading sequence, focus is conspicuous, and print output exposes evidence hidden by interactive filters. The report authors no motion effects, so it does not need a global reduced-motion reset.
17
+
18
+ All report strings are HTML-escaped before insertion. Exact user-configured oracle strings and filenames remain visible because they are essential review evidence. A shared public-data projection removes raw trial diagnostics and replaces private setup/verification errors with generic failure summaries before both HTML and JSON output, including direct API calls. Baseline labels use explicit completed/required observation counts rather than inferring evidence from the overall run status. Keep detailed errors in the private checkpoint and logs.
19
+
20
+ The implementation deliberately avoids a generalized dashboard, comparative benchmark claims, and inferred confidence scores. It does not imply that completion equals verification: run state and fresh-verification state remain separate and can disagree visibly.
21
+
22
+ Browser QA should confirm the route at desktop and narrow widths, filter counts and zero-result behavior, keyboard focus order, copy success and fallback messaging, details expansion, print output, and every failed/paused/empty state with actual engine-produced reports.
@@ -0,0 +1,47 @@
1
+ # Troubleshooting
2
+
3
+ ## The baseline does not reproduce
4
+
5
+ Inspect the private run logs and the inventory from `doctor --json`. Check that the command is finite, the exact exit code matches, and required fragments survive ANSI normalization. A `.gitignore` rule may hide a needed fixture; use `include` for ordinary ignored source. Hard-excluded credential/environment files cannot be included. Supply required environment variable names explicitly. Do not weaken a useful oracle merely to get a green result.
6
+
7
+ Many application builds need external services, environment configuration or generated assets. Arrange those dependencies in a reproducible, trusted command, or select a smaller standalone project before reducing. The CLI does not start databases or record browser interactions.
8
+
9
+ ## npm setup fails
10
+
11
+ Use one npm package with a current `package-lock.json` version 2 or 3. npm must be able to install its public registry dependencies without local paths or credentials. Workspaces, Git dependencies, private registries, alternative package managers and `npm-shrinkwrap.json` are diagnosed as unsupported. Keep using the original application's package manager there; prepare a separate portable reproduction input when necessary.
12
+
13
+ Install scripts are disabled by default. Some native packages require them. For trusted source, explicitly set `execution.allowInstallScripts` to true and retry with a new run. Inspect setup errors before changing this setting. A package that rewrites exported source during installation will fail integrity verification.
14
+
15
+ If the tool reports ancestor `node_modules` in the temporary directory, select a normal OS temporary location outside any repository or dependency tree. Dependency isolation depends on keeping execution directories away from ancestor packages.
16
+
17
+ ## A run stops before finishing
18
+
19
+ Normal search budget exhaustion proceeds to verification of the best accepted source. An interrupted or budget-limited incomplete baseline stays paused. Resume with larger **total** budgets, not an additional allowance:
20
+
21
+ ```sh
22
+ repro-surgeon resume ./my-app-repro --max-evaluations 500 --max-seconds 1800
23
+ ```
24
+
25
+ If a single command needs more time, change `execution.timeoutMs` in the input configuration and start a new run. Editing saved checkpoint configuration is refused. Runtime versions are part of a checkpoint: return to the recorded tool, Node, npm and platform, or start over in the new environment.
26
+
27
+ ## A crash left a lock
28
+
29
+ Normal Ctrl-C releases the run lock after checkpointing. A hard kill or machine crash may leave `run.lock`. The tool deliberately refuses automatic stale-lock deletion because concurrent recovery can give two processes ownership of the same run.
30
+
31
+ Stop all processes using that run directory and verify that none still owns it. Then remove only the `run.lock` file named in the error and retry `resume`. Do not remove a lock while a run or export is active. If a checkpoint or blob checksum is corrupt, retain the directory for diagnosis and start a new run; bypassing the integrity check is unsafe.
32
+
33
+ ## The export fails independent verification
34
+
35
+ The accepted observation may depend on nondeterminism, an undeclared dependency, a side effect, external state or a broad error match. Inspect the verification result and private logs. Fix those assumptions and start a new reduction. A failed independent check is not a verified reproduction.
36
+
37
+ If exported files were edited, hashes will no longer match. Keep the original export for comparison. To reduce a modified project, use it as a new input with a newly authored configuration; do not manually relabel it verified.
38
+
39
+ ## The result is larger than expected
40
+
41
+ The reducer reports the best candidate found by enabled passes within its budget. Try a larger budget, review pinned paths, or isolate a project with fewer environmental dependencies. Framework paths are conservatively protected; source contents can still be simplified. An opaque binary or stylesheet can be removed as a file but is not structurally rewritten. License notices stay with the source.
42
+
43
+ File counts include package metadata. Source bytes omit package metadata; total snapshot bytes include it. Installed dependencies and generated verification metadata are separate from those reduction metrics.
44
+
45
+ ## Sharing or reporting a problem
46
+
47
+ Review the reduced source, report, diagnostic strings and metadata before posting. Share the `repro/` directory and any selected evidence you have inspected. Keep the original snapshots and private logs in the parent run directory private. For tool bugs, include versions, the command, oracle and a small licensed case. Use the [security policy](../SECURITY.md) for sensitive reports.