@intentius/chant 0.124.17 → 0.124.18

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 (115) hide show
  1. package/dist/__golden__/wave-loop/fan-out-applied.json +511 -0
  2. package/dist/__golden__/wave-loop/fan-out-apply-fails.json +406 -0
  3. package/dist/__golden__/wave-loop/fan-out-gated.json +707 -0
  4. package/dist/__golden__/wave-loop/fan-out-no-members.json +898 -0
  5. package/dist/__golden__/wave-loop/fan-out-only.json +514 -0
  6. package/dist/__golden__/wave-loop/fan-out-plan-fails.json +359 -0
  7. package/dist/__golden__/wave-loop/fan-out-same-root.json +311 -0
  8. package/dist/__golden__/wave-loop/op-by-apply-after-fails.json +401 -0
  9. package/dist/__golden__/wave-loop/op-by-apply-hold.json +756 -0
  10. package/dist/__golden__/wave-loop/op-by-apply-ignored.json +340 -0
  11. package/dist/__golden__/wave-loop/op-by-apply-pass.json +400 -0
  12. package/dist/__golden__/wave-loop/op-by-apply-skip.json +404 -0
  13. package/dist/__golden__/wave-loop/op-cost-member-clash.json +62 -0
  14. package/dist/__golden__/wave-loop/op-cost-member.json +191 -0
  15. package/dist/__golden__/wave-loop/op-denied-source.json +407 -0
  16. package/dist/__golden__/wave-loop/op-denied.json +399 -0
  17. package/dist/__golden__/wave-loop/op-discover-rest-short.json +92 -0
  18. package/dist/__golden__/wave-loop/op-discover-rest-stops.json +340 -0
  19. package/dist/__golden__/wave-loop/op-discover-rest.json +659 -0
  20. package/dist/__golden__/wave-loop/op-discover-wide.json +290 -0
  21. package/dist/__golden__/wave-loop/op-held-on-again.json +176 -0
  22. package/dist/__golden__/wave-loop/op-held-on-before-apply.json +689 -0
  23. package/dist/__golden__/wave-loop/op-held-on.json +1455 -0
  24. package/dist/__golden__/wave-loop/op-hooks-apply-fails.json +673 -0
  25. package/dist/__golden__/wave-loop/op-hooks-fail-after-apply.json +737 -0
  26. package/dist/__golden__/wave-loop/op-hooks-fail-before-apply.json +450 -0
  27. package/dist/__golden__/wave-loop/op-hooks-fail-before-plan.json +97 -0
  28. package/dist/__golden__/wave-loop/op-hooks-held.json +1059 -0
  29. package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +693 -0
  30. package/dist/__golden__/wave-loop/op-hooks-pass.json +735 -0
  31. package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +148 -0
  32. package/dist/__golden__/wave-loop/op-hooks-share.json +1225 -0
  33. package/dist/__golden__/wave-loop/op-outcome-held.json +202 -0
  34. package/dist/__golden__/wave-loop/op-outcome-replan-approved.json +286 -0
  35. package/dist/__golden__/wave-loop/op-outcome-replan-forever.json +823 -0
  36. package/dist/__golden__/wave-loop/op-outcome-replan.json +259 -0
  37. package/dist/__golden__/wave-loop/op-outcome-stood-down.json +196 -0
  38. package/dist/__golden__/wave-loop/op-outcome-unreadable.json +193 -0
  39. package/dist/__golden__/wave-loop/op-overridden.json +508 -0
  40. package/dist/__golden__/wave-loop/op-per-run.json +518 -0
  41. package/dist/__golden__/wave-loop/op-point.json +495 -0
  42. package/dist/__golden__/wave-loop/op-pr-review.json +397 -0
  43. package/dist/__golden__/wave-loop/op-sealed.json +125 -0
  44. package/dist/__golden__/wave-loop/op-spend-change-only.json +168 -0
  45. package/dist/__golden__/wave-loop/op-spend.json +328 -0
  46. package/dist/__golden__/wave-loop/op-wave-commands.json +1808 -0
  47. package/dist/__golden__/wave-loop/op-wide-refused.json +291 -0
  48. package/dist/__golden__/wave-loop/op-wide-waiting.json +231 -0
  49. package/dist/__golden__/wave-loop/op-wide.json +440 -0
  50. package/dist/components/fan-out-run.d.ts +4 -3
  51. package/dist/components/fan-out-run.d.ts.map +1 -1
  52. package/dist/components/fan-out-run.js +138 -123
  53. package/dist/op/op-waves-run.d.ts +7 -1
  54. package/dist/op/op-waves-run.d.ts.map +1 -1
  55. package/dist/op/op-waves-run.js +129 -72
  56. package/dist/wave-engine.d.ts +74 -5
  57. package/dist/wave-engine.d.ts.map +1 -1
  58. package/dist/wave-engine.js +47 -5
  59. package/dist/wave-runtime.mjs +202 -202
  60. package/package.json +1 -1
  61. package/src/__golden__/wave-loop/fan-out-applied.json +511 -0
  62. package/src/__golden__/wave-loop/fan-out-apply-fails.json +406 -0
  63. package/src/__golden__/wave-loop/fan-out-gated.json +707 -0
  64. package/src/__golden__/wave-loop/fan-out-no-members.json +898 -0
  65. package/src/__golden__/wave-loop/fan-out-only.json +514 -0
  66. package/src/__golden__/wave-loop/fan-out-plan-fails.json +359 -0
  67. package/src/__golden__/wave-loop/fan-out-same-root.json +311 -0
  68. package/src/__golden__/wave-loop/op-by-apply-after-fails.json +401 -0
  69. package/src/__golden__/wave-loop/op-by-apply-hold.json +756 -0
  70. package/src/__golden__/wave-loop/op-by-apply-ignored.json +340 -0
  71. package/src/__golden__/wave-loop/op-by-apply-pass.json +400 -0
  72. package/src/__golden__/wave-loop/op-by-apply-skip.json +404 -0
  73. package/src/__golden__/wave-loop/op-cost-member-clash.json +62 -0
  74. package/src/__golden__/wave-loop/op-cost-member.json +191 -0
  75. package/src/__golden__/wave-loop/op-denied-source.json +407 -0
  76. package/src/__golden__/wave-loop/op-denied.json +399 -0
  77. package/src/__golden__/wave-loop/op-discover-rest-short.json +92 -0
  78. package/src/__golden__/wave-loop/op-discover-rest-stops.json +340 -0
  79. package/src/__golden__/wave-loop/op-discover-rest.json +659 -0
  80. package/src/__golden__/wave-loop/op-discover-wide.json +290 -0
  81. package/src/__golden__/wave-loop/op-held-on-again.json +176 -0
  82. package/src/__golden__/wave-loop/op-held-on-before-apply.json +689 -0
  83. package/src/__golden__/wave-loop/op-held-on.json +1455 -0
  84. package/src/__golden__/wave-loop/op-hooks-apply-fails.json +673 -0
  85. package/src/__golden__/wave-loop/op-hooks-fail-after-apply.json +737 -0
  86. package/src/__golden__/wave-loop/op-hooks-fail-before-apply.json +450 -0
  87. package/src/__golden__/wave-loop/op-hooks-fail-before-plan.json +97 -0
  88. package/src/__golden__/wave-loop/op-hooks-held.json +1059 -0
  89. package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +693 -0
  90. package/src/__golden__/wave-loop/op-hooks-pass.json +735 -0
  91. package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +148 -0
  92. package/src/__golden__/wave-loop/op-hooks-share.json +1225 -0
  93. package/src/__golden__/wave-loop/op-outcome-held.json +202 -0
  94. package/src/__golden__/wave-loop/op-outcome-replan-approved.json +286 -0
  95. package/src/__golden__/wave-loop/op-outcome-replan-forever.json +823 -0
  96. package/src/__golden__/wave-loop/op-outcome-replan.json +259 -0
  97. package/src/__golden__/wave-loop/op-outcome-stood-down.json +196 -0
  98. package/src/__golden__/wave-loop/op-outcome-unreadable.json +193 -0
  99. package/src/__golden__/wave-loop/op-overridden.json +508 -0
  100. package/src/__golden__/wave-loop/op-per-run.json +518 -0
  101. package/src/__golden__/wave-loop/op-point.json +495 -0
  102. package/src/__golden__/wave-loop/op-pr-review.json +397 -0
  103. package/src/__golden__/wave-loop/op-sealed.json +125 -0
  104. package/src/__golden__/wave-loop/op-spend-change-only.json +168 -0
  105. package/src/__golden__/wave-loop/op-spend.json +328 -0
  106. package/src/__golden__/wave-loop/op-wave-commands.json +1808 -0
  107. package/src/__golden__/wave-loop/op-wide-refused.json +291 -0
  108. package/src/__golden__/wave-loop/op-wide-waiting.json +231 -0
  109. package/src/__golden__/wave-loop/op-wide.json +440 -0
  110. package/src/components/fan-out-run.ts +156 -128
  111. package/src/meta/peer-deps.test.ts +39 -0
  112. package/src/op/op-waves-run.ts +184 -68
  113. package/src/wave-engine.test.ts +38 -1
  114. package/src/wave-engine.ts +101 -5
  115. package/src/wave-loop-golden.test.ts +627 -0
@@ -0,0 +1,756 @@
1
+ {
2
+ "jobs": [
3
+ {
4
+ "label": "waits",
5
+ "job": {
6
+ "wave": 1
7
+ },
8
+ "result": {
9
+ "exitCode": 3,
10
+ "applied": [],
11
+ "failed": [],
12
+ "moved": [],
13
+ "hooks": [
14
+ {
15
+ "moment": "before-plan",
16
+ "name": "lint",
17
+ "exit": 0,
18
+ "outcome": "passed"
19
+ },
20
+ {
21
+ "moment": "before-apply",
22
+ "name": "lag",
23
+ "target": "t1",
24
+ "exit": 1,
25
+ "outcome": "held"
26
+ }
27
+ ],
28
+ "decision": {
29
+ "wave": 1,
30
+ "name": "prod",
31
+ "op": "migrations",
32
+ "gate": "migrations-wave-1",
33
+ "policy": "never",
34
+ "approval": "ledger",
35
+ "policySource": "base",
36
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
37
+ "digest": "jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e",
38
+ "members": [
39
+ {
40
+ "member": "t1",
41
+ "planDigest": "sha256:tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt",
42
+ "op": "migrate"
43
+ }
44
+ ],
45
+ "status": "waiting",
46
+ "hooks": {
47
+ "before-plan": [
48
+ {
49
+ "name": "lint",
50
+ "command": [
51
+ "hook",
52
+ "lint"
53
+ ]
54
+ }
55
+ ],
56
+ "before-apply": [
57
+ {
58
+ "name": "lag",
59
+ "command": [
60
+ "hook",
61
+ "lag",
62
+ "{target}"
63
+ ],
64
+ "perRun": true,
65
+ "onFailure": "approve"
66
+ }
67
+ ],
68
+ "after-apply": [
69
+ {
70
+ "name": "smoke",
71
+ "command": [
72
+ "hook",
73
+ "smoke",
74
+ "{wave}"
75
+ ]
76
+ }
77
+ ]
78
+ },
79
+ "applyHooksRunBy": "apply",
80
+ "outcomes": [
81
+ {
82
+ "moment": "before-plan",
83
+ "name": "lint",
84
+ "exit": 0,
85
+ "outcome": "passed"
86
+ },
87
+ {
88
+ "moment": "before-apply",
89
+ "name": "lag",
90
+ "target": "t1",
91
+ "exit": 1,
92
+ "outcome": "held"
93
+ }
94
+ ],
95
+ "heldBy": [
96
+ "before-apply hook lag (t1)"
97
+ ],
98
+ "pendingFact": {
99
+ "version": 1,
100
+ "kind": "pending",
101
+ "approvalMode": "ledger",
102
+ "op": "migrations",
103
+ "gate": "migrations-wave-1",
104
+ "timestamp": "2026-10-11T00:00:00.000Z",
105
+ "expiresAt": "2026-10-13T00:00:00.000Z",
106
+ "description": "wave 1 (prod): 1 run, gate never, approval ledger, held by before-apply hook lag (t1)",
107
+ "planDigest": "jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e"
108
+ },
109
+ "recorded": true,
110
+ "waitingSince": "2026-10-11T00:00:00.000Z",
111
+ "approve": "chant approve migrations migrations-wave-1 --plan jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e"
112
+ }
113
+ },
114
+ "ledger": {
115
+ "appended": [
116
+ {
117
+ "version": 1,
118
+ "kind": "pending",
119
+ "approvalMode": "ledger",
120
+ "op": "migrations",
121
+ "gate": "migrations-wave-1",
122
+ "timestamp": "2026-10-11T00:00:00.000Z",
123
+ "expiresAt": "2026-10-13T00:00:00.000Z",
124
+ "description": "wave 1 (prod): 1 run, gate never, approval ledger, held by before-apply hook lag (t1)",
125
+ "planDigest": "jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e"
126
+ }
127
+ ],
128
+ "resolved": [],
129
+ "applied": []
130
+ },
131
+ "calls": 3,
132
+ "logs": 2
133
+ },
134
+ {
135
+ "label": "approved",
136
+ "job": {
137
+ "wave": 1
138
+ },
139
+ "result": {
140
+ "exitCode": 0,
141
+ "applied": [
142
+ "t1"
143
+ ],
144
+ "failed": [],
145
+ "moved": [],
146
+ "hooks": [
147
+ {
148
+ "moment": "before-plan",
149
+ "name": "lint",
150
+ "exit": 0,
151
+ "outcome": "passed"
152
+ },
153
+ {
154
+ "moment": "before-apply",
155
+ "name": "lag",
156
+ "target": "t1",
157
+ "exit": 1,
158
+ "outcome": "held"
159
+ },
160
+ {
161
+ "moment": "before-apply",
162
+ "name": "lag",
163
+ "target": "t1",
164
+ "exit": 1,
165
+ "outcome": "held"
166
+ },
167
+ {
168
+ "moment": "after-apply",
169
+ "name": "smoke",
170
+ "exit": 0,
171
+ "outcome": "passed"
172
+ }
173
+ ],
174
+ "decision": {
175
+ "wave": 1,
176
+ "name": "prod",
177
+ "op": "migrations",
178
+ "gate": "migrations-wave-1",
179
+ "policy": "never",
180
+ "approval": "ledger",
181
+ "policySource": "base",
182
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
183
+ "digest": "jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e",
184
+ "members": [
185
+ {
186
+ "member": "t1",
187
+ "planDigest": "sha256:tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt",
188
+ "op": "migrate"
189
+ }
190
+ ],
191
+ "status": "approved",
192
+ "hooks": {
193
+ "before-plan": [
194
+ {
195
+ "name": "lint",
196
+ "command": [
197
+ "hook",
198
+ "lint"
199
+ ]
200
+ }
201
+ ],
202
+ "before-apply": [
203
+ {
204
+ "name": "lag",
205
+ "command": [
206
+ "hook",
207
+ "lag",
208
+ "{target}"
209
+ ],
210
+ "perRun": true,
211
+ "onFailure": "approve"
212
+ }
213
+ ],
214
+ "after-apply": [
215
+ {
216
+ "name": "smoke",
217
+ "command": [
218
+ "hook",
219
+ "smoke",
220
+ "{wave}"
221
+ ]
222
+ }
223
+ ]
224
+ },
225
+ "applyHooksRunBy": "apply",
226
+ "outcomes": [
227
+ {
228
+ "moment": "before-plan",
229
+ "name": "lint",
230
+ "exit": 0,
231
+ "outcome": "passed"
232
+ },
233
+ {
234
+ "moment": "before-apply",
235
+ "name": "lag",
236
+ "target": "t1",
237
+ "exit": 1,
238
+ "outcome": "held"
239
+ },
240
+ {
241
+ "moment": "before-apply",
242
+ "name": "lag",
243
+ "target": "t1",
244
+ "exit": 1,
245
+ "outcome": "held"
246
+ },
247
+ {
248
+ "moment": "after-apply",
249
+ "name": "smoke",
250
+ "exit": 0,
251
+ "outcome": "passed"
252
+ }
253
+ ],
254
+ "heldBy": [
255
+ "before-apply hook lag (t1)"
256
+ ],
257
+ "via": "ledger",
258
+ "approvedBy": "alice",
259
+ "approvedAt": "2026-10-10T00:00:00Z"
260
+ }
261
+ },
262
+ "ledger": {
263
+ "appended": [],
264
+ "resolved": [],
265
+ "applied": []
266
+ },
267
+ "calls": 4,
268
+ "logs": 2
269
+ }
270
+ ],
271
+ "calls": [
272
+ {
273
+ "argv": [
274
+ "hook",
275
+ "lint"
276
+ ],
277
+ "env": {
278
+ "CHANT_OP_WAVES": "migrations",
279
+ "CHANT_WAVE": "prod",
280
+ "CHANT_WAVE_NUMBER": "1",
281
+ "CHANT_HOOK": "before-plan",
282
+ "CHANT_RUNS": ".chant/op-waves/migrations/wave-1/runs.json",
283
+ "CHANT_HOLD": ".chant/op-waves/migrations/wave-1/hold.json"
284
+ },
285
+ "read": {
286
+ "CHANT_RUNS": {
287
+ "wave": "prod",
288
+ "number": 1,
289
+ "runs": [
290
+ {
291
+ "target": "t1",
292
+ "op": "migrate"
293
+ }
294
+ ]
295
+ }
296
+ }
297
+ },
298
+ {
299
+ "argv": [
300
+ "tool",
301
+ "plan",
302
+ "t1",
303
+ ".chant/op-waves/migrations/wave-1/t1.plan.json"
304
+ ]
305
+ },
306
+ {
307
+ "argv": [
308
+ "tool",
309
+ "apply",
310
+ "t1",
311
+ ".chant/op-waves/migrations/wave-1/t1.plan.json"
312
+ ],
313
+ "env": {
314
+ "CHANT_HOOKS": ".chant/op-waves/migrations/wave-1/t1.hooks.json",
315
+ "CHANT_APPLY_OUTCOME": ".chant/op-waves/migrations/wave-1/t1.hooks-outcome.json",
316
+ "CHANT_HOOKS_RESULT": ".chant/op-waves/migrations/wave-1/t1.hooks-result.json"
317
+ },
318
+ "read": {
319
+ "CHANT_HOOKS": {
320
+ "version": 1,
321
+ "opWaves": "migrations",
322
+ "op": "migrate",
323
+ "wave": "prod",
324
+ "number": 1,
325
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
326
+ "digest": "jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e",
327
+ "approved": false,
328
+ "runBy": "apply",
329
+ "runs": [
330
+ {
331
+ "target": "t1",
332
+ "op": "migrate",
333
+ "plan": ".chant/op-waves/migrations/wave-1/t1.plan.json"
334
+ }
335
+ ],
336
+ "runsFile": ".chant/op-waves/migrations/wave-1/t1.runs.json",
337
+ "hooks": {
338
+ "before-apply": [
339
+ {
340
+ "name": "lag",
341
+ "command": [
342
+ "hook",
343
+ "lag",
344
+ "{target}"
345
+ ],
346
+ "perRun": true,
347
+ "onFailure": "approve"
348
+ }
349
+ ],
350
+ "after-apply": [
351
+ {
352
+ "name": "smoke",
353
+ "command": [
354
+ "hook",
355
+ "smoke",
356
+ "{wave}"
357
+ ]
358
+ }
359
+ ]
360
+ },
361
+ "outcomes": [
362
+ {
363
+ "moment": "before-plan",
364
+ "name": "lint",
365
+ "exit": 0,
366
+ "outcome": "passed"
367
+ }
368
+ ],
369
+ "result": ".chant/op-waves/migrations/wave-1/t1.hooks-result.json"
370
+ }
371
+ }
372
+ },
373
+ {
374
+ "argv": [
375
+ "hook",
376
+ "lint"
377
+ ],
378
+ "env": {
379
+ "CHANT_OP_WAVES": "migrations",
380
+ "CHANT_WAVE": "prod",
381
+ "CHANT_WAVE_NUMBER": "1",
382
+ "CHANT_HOOK": "before-plan",
383
+ "CHANT_RUNS": ".chant/op-waves/migrations/wave-1/runs.json",
384
+ "CHANT_HOLD": ".chant/op-waves/migrations/wave-1/hold.json"
385
+ },
386
+ "read": {
387
+ "CHANT_RUNS": {
388
+ "wave": "prod",
389
+ "number": 1,
390
+ "runs": [
391
+ {
392
+ "target": "t1",
393
+ "op": "migrate"
394
+ }
395
+ ]
396
+ }
397
+ }
398
+ },
399
+ {
400
+ "argv": [
401
+ "tool",
402
+ "plan",
403
+ "t1",
404
+ ".chant/op-waves/migrations/wave-1/t1.plan.json"
405
+ ]
406
+ },
407
+ {
408
+ "argv": [
409
+ "tool",
410
+ "apply",
411
+ "t1",
412
+ ".chant/op-waves/migrations/wave-1/t1.plan.json"
413
+ ],
414
+ "env": {
415
+ "CHANT_HOOKS": ".chant/op-waves/migrations/wave-1/t1.hooks.json",
416
+ "CHANT_APPLY_OUTCOME": ".chant/op-waves/migrations/wave-1/t1.hooks-outcome.json",
417
+ "CHANT_HOOKS_RESULT": ".chant/op-waves/migrations/wave-1/t1.hooks-result.json"
418
+ },
419
+ "read": {
420
+ "CHANT_HOOKS": {
421
+ "version": 1,
422
+ "opWaves": "migrations",
423
+ "op": "migrate",
424
+ "wave": "prod",
425
+ "number": 1,
426
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
427
+ "digest": "jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e",
428
+ "approved": false,
429
+ "runBy": "apply",
430
+ "runs": [
431
+ {
432
+ "target": "t1",
433
+ "op": "migrate",
434
+ "plan": ".chant/op-waves/migrations/wave-1/t1.plan.json"
435
+ }
436
+ ],
437
+ "runsFile": ".chant/op-waves/migrations/wave-1/t1.runs.json",
438
+ "hooks": {
439
+ "before-apply": [
440
+ {
441
+ "name": "lag",
442
+ "command": [
443
+ "hook",
444
+ "lag",
445
+ "{target}"
446
+ ],
447
+ "perRun": true,
448
+ "onFailure": "approve"
449
+ }
450
+ ],
451
+ "after-apply": [
452
+ {
453
+ "name": "smoke",
454
+ "command": [
455
+ "hook",
456
+ "smoke",
457
+ "{wave}"
458
+ ]
459
+ }
460
+ ]
461
+ },
462
+ "outcomes": [
463
+ {
464
+ "moment": "before-plan",
465
+ "name": "lint",
466
+ "exit": 0,
467
+ "outcome": "passed"
468
+ }
469
+ ],
470
+ "result": ".chant/op-waves/migrations/wave-1/t1.hooks-result.json"
471
+ }
472
+ }
473
+ },
474
+ {
475
+ "argv": [
476
+ "tool",
477
+ "apply",
478
+ "t1",
479
+ ".chant/op-waves/migrations/wave-1/t1.plan.json"
480
+ ],
481
+ "env": {
482
+ "CHANT_HOOKS": ".chant/op-waves/migrations/wave-1/t1.hooks.json",
483
+ "CHANT_APPLY_OUTCOME": ".chant/op-waves/migrations/wave-1/t1.hooks-outcome.json",
484
+ "CHANT_HOOKS_RESULT": ".chant/op-waves/migrations/wave-1/t1.hooks-result.json"
485
+ },
486
+ "read": {
487
+ "CHANT_HOOKS": {
488
+ "version": 1,
489
+ "opWaves": "migrations",
490
+ "op": "migrate",
491
+ "wave": "prod",
492
+ "number": 1,
493
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
494
+ "digest": "jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e",
495
+ "approved": true,
496
+ "heldBy": [
497
+ "before-apply hook lag (t1)"
498
+ ],
499
+ "runBy": "apply",
500
+ "runs": [
501
+ {
502
+ "target": "t1",
503
+ "op": "migrate",
504
+ "plan": ".chant/op-waves/migrations/wave-1/t1.plan.json"
505
+ }
506
+ ],
507
+ "runsFile": ".chant/op-waves/migrations/wave-1/t1.runs.json",
508
+ "hooks": {
509
+ "before-apply": [
510
+ {
511
+ "name": "lag",
512
+ "command": [
513
+ "hook",
514
+ "lag",
515
+ "{target}"
516
+ ],
517
+ "perRun": true,
518
+ "onFailure": "approve"
519
+ }
520
+ ],
521
+ "after-apply": [
522
+ {
523
+ "name": "smoke",
524
+ "command": [
525
+ "hook",
526
+ "smoke",
527
+ "{wave}"
528
+ ]
529
+ }
530
+ ]
531
+ },
532
+ "outcomes": [
533
+ {
534
+ "moment": "before-plan",
535
+ "name": "lint",
536
+ "exit": 0,
537
+ "outcome": "passed"
538
+ },
539
+ {
540
+ "moment": "before-apply",
541
+ "name": "lag",
542
+ "target": "t1",
543
+ "exit": 1,
544
+ "outcome": "held"
545
+ }
546
+ ],
547
+ "result": ".chant/op-waves/migrations/wave-1/t1.hooks-result.json"
548
+ }
549
+ }
550
+ }
551
+ ],
552
+ "logs": [
553
+ "wave 1 (prod): gate never (read at bbbbbbbbbbbb), digest jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e: not-required",
554
+ "wave 1 (prod) is held by before-apply hook lag (t1), and nobody approved jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e; nothing applied. Approve: chant approve migrations migrations-wave-1 --plan jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e",
555
+ "wave 1 (prod): gate never (read at bbbbbbbbbbbb), digest jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e: not-required",
556
+ "wave 1 (prod) is held by before-apply hook lag (t1), and alice approved its digest"
557
+ ],
558
+ "files": {
559
+ ".chant/op-waves/migrations/wave-1/runs.json": {
560
+ "wave": "prod",
561
+ "number": 1,
562
+ "runs": [
563
+ {
564
+ "target": "t1",
565
+ "op": "migrate"
566
+ }
567
+ ]
568
+ },
569
+ ".chant/op-waves/migrations/wave-1/t1.hooks-result.json": {
570
+ "version": 1,
571
+ "moments": [
572
+ "before-apply",
573
+ "after-apply"
574
+ ],
575
+ "outcomes": [
576
+ {
577
+ "moment": "before-apply",
578
+ "name": "lag",
579
+ "target": "t1",
580
+ "exit": 1,
581
+ "outcome": "held"
582
+ },
583
+ {
584
+ "moment": "after-apply",
585
+ "name": "smoke",
586
+ "exit": 0,
587
+ "outcome": "passed"
588
+ }
589
+ ]
590
+ },
591
+ ".chant/op-waves/migrations/wave-1/t1.hooks.json": {
592
+ "version": 1,
593
+ "opWaves": "migrations",
594
+ "op": "migrate",
595
+ "wave": "prod",
596
+ "number": 1,
597
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
598
+ "digest": "jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e",
599
+ "approved": true,
600
+ "heldBy": [
601
+ "before-apply hook lag (t1)"
602
+ ],
603
+ "runBy": "apply",
604
+ "runs": [
605
+ {
606
+ "target": "t1",
607
+ "op": "migrate",
608
+ "plan": ".chant/op-waves/migrations/wave-1/t1.plan.json"
609
+ }
610
+ ],
611
+ "runsFile": ".chant/op-waves/migrations/wave-1/t1.runs.json",
612
+ "hooks": {
613
+ "before-apply": [
614
+ {
615
+ "name": "lag",
616
+ "command": [
617
+ "hook",
618
+ "lag",
619
+ "{target}"
620
+ ],
621
+ "perRun": true,
622
+ "onFailure": "approve"
623
+ }
624
+ ],
625
+ "after-apply": [
626
+ {
627
+ "name": "smoke",
628
+ "command": [
629
+ "hook",
630
+ "smoke",
631
+ "{wave}"
632
+ ]
633
+ }
634
+ ]
635
+ },
636
+ "outcomes": [
637
+ {
638
+ "moment": "before-plan",
639
+ "name": "lint",
640
+ "exit": 0,
641
+ "outcome": "passed"
642
+ },
643
+ {
644
+ "moment": "before-apply",
645
+ "name": "lag",
646
+ "target": "t1",
647
+ "exit": 1,
648
+ "outcome": "held"
649
+ }
650
+ ],
651
+ "result": ".chant/op-waves/migrations/wave-1/t1.hooks-result.json"
652
+ },
653
+ ".chant/op-waves/migrations/wave-1/t1.plan.json": {
654
+ "planDigest": "sha256:tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt"
655
+ },
656
+ ".chant/op-waves/migrations/wave-1/t1.runs.json": {
657
+ "wave": "prod",
658
+ "number": 1,
659
+ "digest": "jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e",
660
+ "runs": [
661
+ {
662
+ "target": "t1",
663
+ "op": "migrate",
664
+ "planDigest": "sha256:tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt"
665
+ }
666
+ ]
667
+ },
668
+ ".chant/op-waves/migrations/wave-1.json": {
669
+ "wave": 1,
670
+ "name": "prod",
671
+ "op": "migrations",
672
+ "gate": "migrations-wave-1",
673
+ "policy": "never",
674
+ "approval": "ledger",
675
+ "policySource": "base",
676
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
677
+ "digest": "jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e",
678
+ "members": [
679
+ {
680
+ "member": "t1",
681
+ "planDigest": "sha256:tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt",
682
+ "op": "migrate"
683
+ }
684
+ ],
685
+ "status": "approved",
686
+ "hooks": {
687
+ "before-plan": [
688
+ {
689
+ "name": "lint",
690
+ "command": [
691
+ "hook",
692
+ "lint"
693
+ ]
694
+ }
695
+ ],
696
+ "before-apply": [
697
+ {
698
+ "name": "lag",
699
+ "command": [
700
+ "hook",
701
+ "lag",
702
+ "{target}"
703
+ ],
704
+ "perRun": true,
705
+ "onFailure": "approve"
706
+ }
707
+ ],
708
+ "after-apply": [
709
+ {
710
+ "name": "smoke",
711
+ "command": [
712
+ "hook",
713
+ "smoke",
714
+ "{wave}"
715
+ ]
716
+ }
717
+ ]
718
+ },
719
+ "applyHooksRunBy": "apply",
720
+ "outcomes": [
721
+ {
722
+ "moment": "before-plan",
723
+ "name": "lint",
724
+ "exit": 0,
725
+ "outcome": "passed"
726
+ },
727
+ {
728
+ "moment": "before-apply",
729
+ "name": "lag",
730
+ "target": "t1",
731
+ "exit": 1,
732
+ "outcome": "held"
733
+ },
734
+ {
735
+ "moment": "before-apply",
736
+ "name": "lag",
737
+ "target": "t1",
738
+ "exit": 1,
739
+ "outcome": "held"
740
+ },
741
+ {
742
+ "moment": "after-apply",
743
+ "name": "smoke",
744
+ "exit": 0,
745
+ "outcome": "passed"
746
+ }
747
+ ],
748
+ "heldBy": [
749
+ "before-apply hook lag (t1)"
750
+ ],
751
+ "via": "ledger",
752
+ "approvedBy": "alice",
753
+ "approvedAt": "2026-10-10T00:00:00Z"
754
+ }
755
+ }
756
+ }