opencode-longrun-harness 1.2.22

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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +390 -0
  3. package/docs/V1.2.20_EVIDENCE.md +114 -0
  4. package/docs/V1.2.21_EVIDENCE.md +68 -0
  5. package/docs/V1.2.22_EVIDENCE.md +52 -0
  6. package/harness/commissioning/README.md +16 -0
  7. package/harness/commissioning/inspect-copied-run.mjs +25 -0
  8. package/harness/commissioning/verify-copied-case.mjs +35 -0
  9. package/harness/plugin/longrun.js +677 -0
  10. package/harness/src/cli.mjs +40 -0
  11. package/harness/src/controller.js +1413 -0
  12. package/harness/src/evidence.mjs +135 -0
  13. package/harness/src/execution.mjs +217 -0
  14. package/harness/src/executor.mjs +21 -0
  15. package/harness/src/install.mjs +435 -0
  16. package/harness/src/maintenance.mjs +257 -0
  17. package/harness/src/memory.mjs +472 -0
  18. package/harness/test/candidates.test.mjs +73 -0
  19. package/harness/test/checkpoint.test.mjs +65 -0
  20. package/harness/test/controller.test.mjs +230 -0
  21. package/harness/test/evidence.test.mjs +57 -0
  22. package/harness/test/fixtures/durable-host.mjs +27 -0
  23. package/harness/test/fixtures/example-app-run.json +1375 -0
  24. package/harness/test/fixtures/notes-budget-exhausted-run.json +2070 -0
  25. package/harness/test/fixtures/notes-premature-complete-run.json +1496 -0
  26. package/harness/test/fixtures/notes-recovery-run.json +622 -0
  27. package/harness/test/fixtures/presets-readout-run.json +825 -0
  28. package/harness/test/fixtures/routing-worker.mjs +35 -0
  29. package/harness/test/fixtures/vitest-failed-receipt.json +33 -0
  30. package/harness/test/helper.mjs +41 -0
  31. package/harness/test/install.test.mjs +117 -0
  32. package/harness/test/lifecycle.test.mjs +102 -0
  33. package/harness/test/maintenance.test.mjs +204 -0
  34. package/harness/test/memory.test.mjs +145 -0
  35. package/harness/test/negative-control.test.mjs +91 -0
  36. package/harness/test/plugin.test.mjs +169 -0
  37. package/harness/test/recovery-runner.test.mjs +435 -0
  38. package/harness/test/recovery.test.mjs +68 -0
  39. package/harness/test/repair-mechanics.test.mjs +122 -0
  40. package/harness/test/toolbehavior.test.mjs +75 -0
  41. package/harness/test/v121-commissioning.test.mjs +177 -0
  42. package/harness/test/v1210-deadline.test.mjs +134 -0
  43. package/harness/test/v1211-pause.test.mjs +81 -0
  44. package/harness/test/v1212-maintenance-pause.test.mjs +76 -0
  45. package/harness/test/v1213-readout.test.mjs +82 -0
  46. package/harness/test/v1214-durable.test.mjs +121 -0
  47. package/harness/test/v1215-guidance.test.mjs +57 -0
  48. package/harness/test/v1216-test-summary.test.mjs +39 -0
  49. package/harness/test/v1217-discovery.test.mjs +73 -0
  50. package/harness/test/v1218-completion-review.test.mjs +203 -0
  51. package/harness/test/v1219-budget-pause.test.mjs +134 -0
  52. package/harness/test/v122-lifecycle-resolver.test.mjs +218 -0
  53. package/harness/test/v1220-budget-amendment.test.mjs +343 -0
  54. package/harness/test/v1221-negative-fixture-anchor.test.mjs +65 -0
  55. package/harness/test/v1222-default-evidence-class.test.mjs +75 -0
  56. package/harness/test/v123-plugin-e2e.test.mjs +120 -0
  57. package/harness/test/v123-receipt-model.test.mjs +185 -0
  58. package/harness/test/v124-canonical.test.mjs +147 -0
  59. package/harness/test/v124-installed.test.mjs +48 -0
  60. package/harness/test/v125-stability.test.mjs +183 -0
  61. package/harness/test/v126-execution.test.mjs +183 -0
  62. package/harness/test/v127-reconciliation.test.mjs +139 -0
  63. package/harness/test/v128-compaction.test.mjs +156 -0
  64. package/harness/test/v129-routing.test.mjs +165 -0
  65. package/harness/tools/audit-receipts.mjs +121 -0
  66. package/harness/tools/recovery-runner.mjs +499 -0
  67. package/package.json +49 -0
@@ -0,0 +1,622 @@
1
+ {
2
+ "runId": "lr-00000000a1b2",
3
+ "status": "RECOVERY_REQUIRED",
4
+ "originalRequest": "Example App expansion: implement the requested feature end to end in this copy only, keep every existing subsystem and test intact, and prove the result with the declared checks.",
5
+ "contract": {
6
+ "criteria": [
7
+ {
8
+ "id": "notes-server",
9
+ "required": true,
10
+ "weight": 3,
11
+ "checks": [
12
+ "c-notes-server"
13
+ ],
14
+ "evidenceClass": "INTEGRATION",
15
+ "visual": false,
16
+ "status": "FAIL"
17
+ },
18
+ {
19
+ "id": "notes-gameplay",
20
+ "required": true,
21
+ "weight": 3,
22
+ "checks": [
23
+ "c-notes-e2e"
24
+ ],
25
+ "evidenceClass": "BROWSER",
26
+ "visual": false,
27
+ "status": "FAIL"
28
+ },
29
+ {
30
+ "id": "regression-unit",
31
+ "required": true,
32
+ "weight": 1,
33
+ "checks": [
34
+ "c-default-unit"
35
+ ],
36
+ "evidenceClass": "UNIT",
37
+ "visual": false,
38
+ "status": "FAIL"
39
+ },
40
+ {
41
+ "id": "regression-browser",
42
+ "required": true,
43
+ "weight": 1,
44
+ "checks": [
45
+ "c-default-browser"
46
+ ],
47
+ "evidenceClass": "BROWSER",
48
+ "visual": false,
49
+ "status": "FAIL"
50
+ }
51
+ ],
52
+ "gates": [
53
+ {
54
+ "id": "c-typecheck",
55
+ "required": true,
56
+ "status": "FAIL"
57
+ },
58
+ {
59
+ "id": "c-build",
60
+ "required": true,
61
+ "status": "FAIL"
62
+ }
63
+ ],
64
+ "lossTarget": 0
65
+ },
66
+ "contractHash": "5ff1bad8de4ff627df71a0c2bfef061e38b3eb262089cbca54e842d26d21c2b0",
67
+ "evaluatorHash": null,
68
+ "sourceFingerprint": "227226c09a19c94a3d8bb7a20226bd5dd8b2847dbe463ea892ef92bed00a7b6c",
69
+ "loss": 1,
70
+ "budget": {
71
+ "iterations": 24,
72
+ "activeSeconds": 7200,
73
+ "deadlineSeconds": 28800,
74
+ "sameFailureLimit": 3,
75
+ "noProgressLimit": 5,
76
+ "autoDispatchCap": 40,
77
+ "toolActionCap": 140
78
+ },
79
+ "autoEnabled": false,
80
+ "runMode": "tracked",
81
+ "memoryStatus": "FRESH",
82
+ "state": {
83
+ "iterations": 0,
84
+ "noProgressStreak": 0,
85
+ "sameFailureStreak": 0,
86
+ "candidates": [
87
+ {
88
+ "n": 1,
89
+ "runId": "lr-00000000a1b2",
90
+ "fingerprint": "cd10010000934e59561b9004c978d7f7dd1ecf8d6dbadc9e16eb4943823bda40",
91
+ "ts": 1789934897617,
92
+ "hypothesis": null,
93
+ "receiptIds": [
94
+ "receipt-1-ca3602d2492c"
95
+ ],
96
+ "criteriaChanged": [
97
+ "notes-server"
98
+ ],
99
+ "lossBefore": 1,
100
+ "lossAfter": 1,
101
+ "bestLoss": null,
102
+ "result": "FAIL",
103
+ "diagnosticOnly": false,
104
+ "elapsedMs": 1155,
105
+ "counted": true,
106
+ "reason": "evaluated_new_source_state"
107
+ },
108
+ {
109
+ "n": 2,
110
+ "runId": "lr-00000000a1b2",
111
+ "fingerprint": "6223097690aa0750d4aadcccebd0ee6da8eeaab9a20504092b546a5816f6f31a",
112
+ "ts": 1789934952509,
113
+ "hypothesis": null,
114
+ "receiptIds": [
115
+ "receipt-2-6f43c274634d"
116
+ ],
117
+ "criteriaChanged": [
118
+ "notes-server"
119
+ ],
120
+ "lossBefore": 1,
121
+ "lossAfter": 1,
122
+ "bestLoss": null,
123
+ "result": "FAIL",
124
+ "diagnosticOnly": false,
125
+ "elapsedMs": 827,
126
+ "counted": true,
127
+ "reason": "evaluated_new_source_state"
128
+ },
129
+ {
130
+ "n": 3,
131
+ "runId": "lr-00000000a1b2",
132
+ "fingerprint": "3ce79a0e64f47e3413bb578c61e8aba944a6b450134177ba100fb91ae6bd57f4",
133
+ "ts": 1789934970085,
134
+ "hypothesis": null,
135
+ "receiptIds": [
136
+ "receipt-3-16e13ce44f83"
137
+ ],
138
+ "criteriaChanged": [
139
+ "notes-server"
140
+ ],
141
+ "lossBefore": 1,
142
+ "lossAfter": 0.625,
143
+ "bestLoss": null,
144
+ "result": "PASS",
145
+ "diagnosticOnly": false,
146
+ "elapsedMs": 650,
147
+ "counted": true,
148
+ "reason": "evaluated_new_source_state"
149
+ },
150
+ {
151
+ "n": 4,
152
+ "runId": "lr-00000000a1b2",
153
+ "fingerprint": "15a944aca1fb2ba7dddf7f06d2f55eccfe2ee42a131fc7c8d684d0c241d4f0d4",
154
+ "ts": 1789935608384,
155
+ "hypothesis": null,
156
+ "receiptIds": [
157
+ "receipt-4-d653eda7591b"
158
+ ],
159
+ "criteriaChanged": [
160
+ "notes-server"
161
+ ],
162
+ "lossBefore": 1,
163
+ "lossAfter": 0.625,
164
+ "bestLoss": 0.625,
165
+ "result": "PASS",
166
+ "diagnosticOnly": false,
167
+ "elapsedMs": 1241,
168
+ "counted": true,
169
+ "reason": "evaluated_new_source_state"
170
+ },
171
+ {
172
+ "n": 5,
173
+ "runId": "lr-00000000a1b2",
174
+ "fingerprint": "227226c09a19c94a3d8bb7a20226bd5dd8b2847dbe463ea892ef92bed00a7b6c",
175
+ "ts": 1789935717606,
176
+ "hypothesis": null,
177
+ "receiptIds": [
178
+ "receipt-6-0bdc3608449c"
179
+ ],
180
+ "criteriaChanged": [],
181
+ "lossBefore": 1,
182
+ "lossAfter": 1,
183
+ "bestLoss": 0.625,
184
+ "result": "PASS",
185
+ "diagnosticOnly": false,
186
+ "elapsedMs": 1060,
187
+ "counted": true,
188
+ "reason": "evaluated_new_source_state"
189
+ }
190
+ ],
191
+ "lastEvalFingerprint": "227226c09a19c94a3d8bb7a20226bd5dd8b2847dbe463ea892ef92bed00a7b6c",
192
+ "memoryNodes": [
193
+ "AGENTS.md"
194
+ ],
195
+ "current": {
196
+ "n": 5,
197
+ "runId": "lr-00000000a1b2",
198
+ "fingerprint": "227226c09a19c94a3d8bb7a20226bd5dd8b2847dbe463ea892ef92bed00a7b6c",
199
+ "ts": 1789935717606,
200
+ "hypothesis": null,
201
+ "receiptIds": [
202
+ "receipt-6-0bdc3608449c"
203
+ ],
204
+ "criteriaChanged": [],
205
+ "lossBefore": 1,
206
+ "lossAfter": 1,
207
+ "bestLoss": 0.625,
208
+ "result": "PASS",
209
+ "diagnosticOnly": false,
210
+ "elapsedMs": 1060,
211
+ "counted": true,
212
+ "reason": "evaluated_new_source_state"
213
+ },
214
+ "best": {
215
+ "n": 4,
216
+ "runId": "lr-00000000a1b2",
217
+ "fingerprint": "15a944aca1fb2ba7dddf7f06d2f55eccfe2ee42a131fc7c8d684d0c241d4f0d4",
218
+ "ts": 1789935608384,
219
+ "hypothesis": null,
220
+ "receiptIds": [
221
+ "receipt-4-d653eda7591b"
222
+ ],
223
+ "criteriaChanged": [
224
+ "notes-server"
225
+ ],
226
+ "lossBefore": 1,
227
+ "lossAfter": 0.625,
228
+ "bestLoss": 0.625,
229
+ "result": "PASS",
230
+ "diagnosticOnly": false,
231
+ "elapsedMs": 1241,
232
+ "counted": true,
233
+ "reason": "evaluated_new_source_state"
234
+ }
235
+ },
236
+ "receipts": [
237
+ {
238
+ "checkId": "c-notes-server",
239
+ "command": "npx vitest run packages/server/test/notes.test.ts",
240
+ "status": "FAIL",
241
+ "exitCode": 1,
242
+ "testCount": 0,
243
+ "startedAt": 1789934896427,
244
+ "finishedAt": 1789934897582,
245
+ "versions": {
246
+ "node": "v24.21.0"
247
+ },
248
+ "contractHash": "5ff1bad8de4ff627df71a0c2bfef061e38b3eb262089cbca54e842d26d21c2b0",
249
+ "evaluatorHash": null,
250
+ "sourceFingerprint": "cd10010000934e59561b9004c978d7f7dd1ecf8d6dbadc9e16eb4943823bda40",
251
+ "fingerprintSchemaVersion": 2,
252
+ "fpScope": "project",
253
+ "evidenceClass": "INTEGRATION",
254
+ "class": "INTEGRATION",
255
+ "proxyOnly": false,
256
+ "argv": [
257
+ "npx",
258
+ "vitest",
259
+ "run",
260
+ "packages/server/test/notes.test.ts"
261
+ ],
262
+ "outputTail": "command completed; the recorded status and exit code are the evidence.",
263
+ "terminationReason": null,
264
+ "executionError": null,
265
+ "executionToken": "f2c22247-b625-4bc6-841a-07f2eacab20f"
266
+ },
267
+ {
268
+ "checkId": "c-notes-server",
269
+ "command": "npx vitest run packages/server/test/notes.test.ts",
270
+ "status": "FAIL",
271
+ "exitCode": 1,
272
+ "testCount": 0,
273
+ "startedAt": 1789934951646,
274
+ "finishedAt": 1789934952473,
275
+ "versions": {
276
+ "node": "v24.21.0"
277
+ },
278
+ "contractHash": "5ff1bad8de4ff627df71a0c2bfef061e38b3eb262089cbca54e842d26d21c2b0",
279
+ "evaluatorHash": null,
280
+ "sourceFingerprint": "6223097690aa0750d4aadcccebd0ee6da8eeaab9a20504092b546a5816f6f31a",
281
+ "fingerprintSchemaVersion": 2,
282
+ "fpScope": "project",
283
+ "evidenceClass": "INTEGRATION",
284
+ "class": "INTEGRATION",
285
+ "proxyOnly": false,
286
+ "argv": [
287
+ "npx",
288
+ "vitest",
289
+ "run",
290
+ "packages/server/test/notes.test.ts"
291
+ ],
292
+ "outputTail": "command completed; the recorded status and exit code are the evidence.",
293
+ "terminationReason": null,
294
+ "executionError": null,
295
+ "executionToken": "2600fc75-2d2d-40f8-a37a-60c427380a04"
296
+ },
297
+ {
298
+ "checkId": "c-notes-server",
299
+ "command": "npx vitest run packages/server/test/notes.test.ts",
300
+ "status": "PASS",
301
+ "exitCode": 0,
302
+ "testCount": 11,
303
+ "startedAt": 1789934969397,
304
+ "finishedAt": 1789934970047,
305
+ "versions": {
306
+ "node": "v24.21.0"
307
+ },
308
+ "contractHash": "5ff1bad8de4ff627df71a0c2bfef061e38b3eb262089cbca54e842d26d21c2b0",
309
+ "evaluatorHash": null,
310
+ "sourceFingerprint": "3ce79a0e64f47e3413bb578c61e8aba944a6b450134177ba100fb91ae6bd57f4",
311
+ "fingerprintSchemaVersion": 2,
312
+ "fpScope": "project",
313
+ "evidenceClass": "INTEGRATION",
314
+ "class": "INTEGRATION",
315
+ "proxyOnly": false,
316
+ "argv": [
317
+ "npx",
318
+ "vitest",
319
+ "run",
320
+ "packages/server/test/notes.test.ts"
321
+ ],
322
+ "outputTail": "command completed; the recorded status and exit code are the evidence.",
323
+ "terminationReason": null,
324
+ "executionError": null,
325
+ "executionToken": "1d038255-d020-4eb2-a003-78c16c9342c4"
326
+ },
327
+ {
328
+ "checkId": "c-notes-server",
329
+ "command": "npx vitest run packages/server/test/notes.test.ts",
330
+ "status": "PASS",
331
+ "exitCode": 0,
332
+ "testCount": 13,
333
+ "startedAt": 1789935607105,
334
+ "finishedAt": 1789935608346,
335
+ "versions": {
336
+ "node": "v24.21.0"
337
+ },
338
+ "contractHash": "5ff1bad8de4ff627df71a0c2bfef061e38b3eb262089cbca54e842d26d21c2b0",
339
+ "evaluatorHash": null,
340
+ "sourceFingerprint": "15a944aca1fb2ba7dddf7f06d2f55eccfe2ee42a131fc7c8d684d0c241d4f0d4",
341
+ "fingerprintSchemaVersion": 2,
342
+ "fpScope": "project",
343
+ "evidenceClass": "INTEGRATION",
344
+ "class": "INTEGRATION",
345
+ "proxyOnly": false,
346
+ "argv": [
347
+ "npx",
348
+ "vitest",
349
+ "run",
350
+ "packages/server/test/notes.test.ts"
351
+ ],
352
+ "outputTail": "command completed; the recorded status and exit code are the evidence.",
353
+ "terminationReason": null,
354
+ "executionError": null,
355
+ "executionToken": "ee6815f4-1641-4533-b482-ef8d697447ac"
356
+ },
357
+ {
358
+ "checkId": "c-typecheck",
359
+ "command": "npx tsc -p tsconfig.json --noEmit",
360
+ "status": "FAIL",
361
+ "exitCode": 2,
362
+ "testCount": null,
363
+ "startedAt": 1789935626150,
364
+ "finishedAt": 1789935627298,
365
+ "versions": {
366
+ "node": "v24.21.0"
367
+ },
368
+ "contractHash": "5ff1bad8de4ff627df71a0c2bfef061e38b3eb262089cbca54e842d26d21c2b0",
369
+ "evaluatorHash": null,
370
+ "sourceFingerprint": "15a944aca1fb2ba7dddf7f06d2f55eccfe2ee42a131fc7c8d684d0c241d4f0d4",
371
+ "fingerprintSchemaVersion": 2,
372
+ "fpScope": "project",
373
+ "evidenceClass": "STATIC",
374
+ "class": "STATIC",
375
+ "proxyOnly": false,
376
+ "argv": [
377
+ "npx",
378
+ "tsc",
379
+ "-p",
380
+ "tsconfig.json",
381
+ "--noEmit"
382
+ ],
383
+ "outputTail": "command completed; the recorded status and exit code are the evidence.",
384
+ "terminationReason": null,
385
+ "executionError": null,
386
+ "executionToken": "5c1f7852-780b-4c4b-a80f-209990a74f62"
387
+ },
388
+ {
389
+ "checkId": "c-typecheck",
390
+ "command": "npx tsc -p tsconfig.json --noEmit",
391
+ "status": "PASS",
392
+ "exitCode": 0,
393
+ "testCount": null,
394
+ "startedAt": 1789935716512,
395
+ "finishedAt": 1789935717572,
396
+ "versions": {
397
+ "node": "v24.21.0"
398
+ },
399
+ "contractHash": "5ff1bad8de4ff627df71a0c2bfef061e38b3eb262089cbca54e842d26d21c2b0",
400
+ "evaluatorHash": null,
401
+ "sourceFingerprint": "227226c09a19c94a3d8bb7a20226bd5dd8b2847dbe463ea892ef92bed00a7b6c",
402
+ "fingerprintSchemaVersion": 2,
403
+ "fpScope": "project",
404
+ "evidenceClass": "STATIC",
405
+ "class": "STATIC",
406
+ "proxyOnly": false,
407
+ "argv": [
408
+ "npx",
409
+ "tsc",
410
+ "-p",
411
+ "tsconfig.json",
412
+ "--noEmit"
413
+ ],
414
+ "outputTail": "command completed; the recorded status and exit code are the evidence.",
415
+ "terminationReason": null,
416
+ "executionError": null,
417
+ "executionToken": "149d0d71-b16a-40fd-a8e6-4a94cb0f9bf0"
418
+ }
419
+ ],
420
+ "faults": [],
421
+ "execution": {
422
+ "schemaVersion": 1,
423
+ "since": 1789934372883,
424
+ "historicalUsageUnknown": false,
425
+ "verificationMs": 6081,
426
+ "commandAttempts": 6,
427
+ "inFlight": null
428
+ },
429
+ "directory": "/home/example/project",
430
+ "checkCatalogue": {
431
+ "c-notes-server": {
432
+ "command": [
433
+ "npx",
434
+ "vitest",
435
+ "run",
436
+ "packages/server/test/notes.test.ts"
437
+ ],
438
+ "kind": "test",
439
+ "integration": true,
440
+ "negativeControl": true,
441
+ "timeoutMs": 180000
442
+ },
443
+ "c-notes-e2e": {
444
+ "command": [
445
+ "npx",
446
+ "playwright",
447
+ "test",
448
+ "--config",
449
+ "playwright.notes.config.ts"
450
+ ],
451
+ "kind": "test",
452
+ "integration": true,
453
+ "negativeControl": true,
454
+ "visual": true,
455
+ "timeoutMs": 420000
456
+ },
457
+ "c-default-unit": {
458
+ "command": [
459
+ "npx",
460
+ "vitest",
461
+ "run"
462
+ ],
463
+ "kind": "test",
464
+ "timeoutMs": 180000
465
+ },
466
+ "c-default-browser": {
467
+ "command": [
468
+ "npx",
469
+ "playwright",
470
+ "test"
471
+ ],
472
+ "kind": "test",
473
+ "timeoutMs": 600000
474
+ },
475
+ "c-typecheck": {
476
+ "command": [
477
+ "npx",
478
+ "tsc",
479
+ "-p",
480
+ "tsconfig.json",
481
+ "--noEmit"
482
+ ],
483
+ "kind": "cmd",
484
+ "gate": true,
485
+ "timeoutMs": 180000
486
+ },
487
+ "c-build": {
488
+ "command": [
489
+ "npm",
490
+ "run",
491
+ "build",
492
+ "-w",
493
+ "@sb/web"
494
+ ],
495
+ "kind": "cmd",
496
+ "gate": true,
497
+ "timeoutMs": 240000
498
+ }
499
+ },
500
+ "createdAt": 1789934372883,
501
+ "compactionSessionID": "ses_f3f9f0822ffeWuypAPjXEvlUzm",
502
+ "agentProgressHistory": [
503
+ {
504
+ "schemaVersion": 1,
505
+ "revision": 1,
506
+ "at": 1789934384565,
507
+ "sessionID": "ses_f3f9f0822ffeWuypAPjXEvlUzm",
508
+ "sourceFingerprint": "43b42152981c219f21bad5db97c6040b2d6fbbdf1806eb5c70329885060d2c65",
509
+ "fields": {
510
+ "currentSlice": "Implement and verify the requested feature.",
511
+ "nextAction": "Continue the declared checks one at a time and record each with longrun_verify.",
512
+ "decisions": [
513
+ "Wall = terrain wall|pillar from buildMap (layout seed-independent); reject out-of-board + walls, no clamp.",
514
+ "API under /api/notes/v1/{list,create,update,delete}; server ignores any client id/revision.",
515
+ "Restart-persistence proof lives in the INTEGRATION vitest (real HTTP, fixed loopback port, SAME file DB), reload proof in the BROWSER e2e.",
516
+ "Planning is a TacticalGame input mode gated by a flag so it cannot move/shoot/select/endTurn; markers are scene objects rebuilt each sync (no accumulation)."
517
+ ],
518
+ "failedHypotheses": [
519
+ "<example hypothesis redacted>"
520
+ ],
521
+ "memoryNodes": [
522
+ "packages/server/src/index.ts",
523
+ "packages/server/src/leaderboard.ts",
524
+ "packages/server/src/validate.ts",
525
+ "packages/sim/src/map.ts",
526
+ "packages/sim/src/missions.ts",
527
+ "packages/web/src/game/TacticalGame.ts",
528
+ "packages/web/src/scene/World.ts",
529
+ "playwright.config.ts",
530
+ "vitest.config.ts",
531
+ "tsconfig.json"
532
+ ],
533
+ "artifacts": []
534
+ }
535
+ },
536
+ {
537
+ "schemaVersion": 1,
538
+ "revision": 2,
539
+ "at": 1789935030856,
540
+ "sessionID": "ses_f3f9f0822ffeWuypAPjXEvlUzm",
541
+ "sourceFingerprint": "3ce79a0e64f47e3413bb578c61e8aba944a6b450134177ba100fb91ae6bd57f4",
542
+ "fields": {
543
+ "currentSlice": "Implement and verify the requested feature.",
544
+ "nextAction": "Continue the declared checks one at a time and record each with longrun_verify.",
545
+ "decisions": [
546
+ "Keep one input owner: TacticalGame gates tactical actions while planning.active; left-click selects a tile (vis2 only), right/shift-drag still pans (presentation only).",
547
+ "PlanningController owns notes/draft/status, re-renders markers from notes\u2229vis==2 on game.onStateChange, and is disposed on mission unmount (no stale listeners/markers).",
548
+ "Restart-persistence proved in the INTEGRATION test; reload + pointer/keyboard/fog/invariance + screenshots proved in the BROWSER spec."
549
+ ],
550
+ "failedHypotheses": [
551
+ "<example hypothesis redacted>"
552
+ ],
553
+ "memoryNodes": [
554
+ "packages/server/src/notes.ts",
555
+ "packages/server/src/leaderboard.ts",
556
+ "packages/web/src/game/TacticalGame.ts",
557
+ "packages/web/src/scene/World.ts",
558
+ "packages/web/src/GameCanvas.tsx",
559
+ "packages/web/src/HUD.tsx"
560
+ ],
561
+ "artifacts": [
562
+ "packages/server/src/notes.ts",
563
+ "packages/server/src/index.ts",
564
+ "packages/server/test/notes.test.ts"
565
+ ]
566
+ }
567
+ },
568
+ {
569
+ "schemaVersion": 1,
570
+ "revision": 3,
571
+ "at": 1789935752230,
572
+ "sessionID": "ses_f3f9f0822ffeWuypAPjXEvlUzm",
573
+ "sourceFingerprint": "dc33b0f2fa08fe45cefa09c4588065938b0f53e89db28e79e8c99af6a61000e8",
574
+ "fields": {
575
+ "currentSlice": "Implement and verify the requested feature.",
576
+ "nextAction": "Continue the declared checks one at a time and record each with longrun_verify.",
577
+ "decisions": [
578
+ "Process-boundary restart proven with two owned child PIDs, fixed loopback port, port-released proof, exact note fields across boundary.",
579
+ "Readiness belongs to the owned child's own banner, not a foreign /health.",
580
+ "Annotation bodies capped (complete 400); submit's 5MB readBody unchanged."
581
+ ],
582
+ "failedHypotheses": [
583
+ "<example hypothesis redacted>"
584
+ ],
585
+ "memoryNodes": [
586
+ "packages/server/AGENTS.md"
587
+ ],
588
+ "artifacts": [
589
+ "packages/server/src/index.ts",
590
+ "packages/server/test/notes.test.ts"
591
+ ]
592
+ }
593
+ }
594
+ ],
595
+ "agentProgress": {
596
+ "schemaVersion": 1,
597
+ "revision": 3,
598
+ "at": 1789935752230,
599
+ "sessionID": "ses_f3f9f0822ffeWuypAPjXEvlUzm",
600
+ "sourceFingerprint": "dc33b0f2fa08fe45cefa09c4588065938b0f53e89db28e79e8c99af6a61000e8",
601
+ "fields": {
602
+ "currentSlice": "Implement and verify the requested feature.",
603
+ "nextAction": "Continue the declared checks one at a time and record each with longrun_verify.",
604
+ "decisions": [
605
+ "Process-boundary restart proven with two owned child PIDs, fixed loopback port, port-released proof, exact note fields across boundary.",
606
+ "Readiness belongs to the owned child's own banner, not a foreign /health.",
607
+ "Annotation bodies capped (complete 400); submit's 5MB readBody unchanged."
608
+ ],
609
+ "failedHypotheses": [
610
+ "<example hypothesis redacted>"
611
+ ],
612
+ "memoryNodes": [
613
+ "packages/server/AGENTS.md"
614
+ ],
615
+ "artifacts": [
616
+ "packages/server/src/index.ts",
617
+ "packages/server/test/notes.test.ts"
618
+ ]
619
+ }
620
+ },
621
+ "controlGeneration": 3
622
+ }