@intentius/chant 0.124.17 → 0.124.19

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 (154) 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/cli/commands/import.d.ts +2 -0
  51. package/dist/cli/commands/import.d.ts.map +1 -1
  52. package/dist/cli/commands/import.js +6 -2
  53. package/dist/cli/handlers/graph.js +24 -1
  54. package/dist/cli/handlers/misc.d.ts.map +1 -1
  55. package/dist/cli/handlers/misc.js +2 -1
  56. package/dist/cli/parse-args.d.ts.map +1 -1
  57. package/dist/cli/parse-args.js +4 -0
  58. package/dist/cli/registry.d.ts +2 -0
  59. package/dist/cli/registry.d.ts.map +1 -1
  60. package/dist/components/fan-out-run.d.ts +4 -3
  61. package/dist/components/fan-out-run.d.ts.map +1 -1
  62. package/dist/components/fan-out-run.js +138 -123
  63. package/dist/graph-detail.d.ts.map +1 -1
  64. package/dist/graph-detail.js +9 -3
  65. package/dist/graph-dot.d.ts.map +1 -1
  66. package/dist/graph-dot.js +36 -2
  67. package/dist/graph-ir.d.ts +98 -3
  68. package/dist/graph-ir.d.ts.map +1 -1
  69. package/dist/graph-ir.js +71 -0
  70. package/dist/graph-lens.js +12 -1
  71. package/dist/graph-mermaid.d.ts +5 -1
  72. package/dist/graph-mermaid.d.ts.map +1 -1
  73. package/dist/graph-mermaid.js +46 -2
  74. package/dist/lexicon.d.ts +22 -1
  75. package/dist/lexicon.d.ts.map +1 -1
  76. package/dist/op/op-waves-run.d.ts +7 -1
  77. package/dist/op/op-waves-run.d.ts.map +1 -1
  78. package/dist/op/op-waves-run.js +129 -72
  79. package/dist/wave-engine.d.ts +74 -5
  80. package/dist/wave-engine.d.ts.map +1 -1
  81. package/dist/wave-engine.js +47 -5
  82. package/dist/wave-runtime.mjs +215 -215
  83. package/package.json +1 -1
  84. package/src/__golden__/wave-loop/fan-out-applied.json +511 -0
  85. package/src/__golden__/wave-loop/fan-out-apply-fails.json +406 -0
  86. package/src/__golden__/wave-loop/fan-out-gated.json +707 -0
  87. package/src/__golden__/wave-loop/fan-out-no-members.json +898 -0
  88. package/src/__golden__/wave-loop/fan-out-only.json +514 -0
  89. package/src/__golden__/wave-loop/fan-out-plan-fails.json +359 -0
  90. package/src/__golden__/wave-loop/fan-out-same-root.json +311 -0
  91. package/src/__golden__/wave-loop/op-by-apply-after-fails.json +401 -0
  92. package/src/__golden__/wave-loop/op-by-apply-hold.json +756 -0
  93. package/src/__golden__/wave-loop/op-by-apply-ignored.json +340 -0
  94. package/src/__golden__/wave-loop/op-by-apply-pass.json +400 -0
  95. package/src/__golden__/wave-loop/op-by-apply-skip.json +404 -0
  96. package/src/__golden__/wave-loop/op-cost-member-clash.json +62 -0
  97. package/src/__golden__/wave-loop/op-cost-member.json +191 -0
  98. package/src/__golden__/wave-loop/op-denied-source.json +407 -0
  99. package/src/__golden__/wave-loop/op-denied.json +399 -0
  100. package/src/__golden__/wave-loop/op-discover-rest-short.json +92 -0
  101. package/src/__golden__/wave-loop/op-discover-rest-stops.json +340 -0
  102. package/src/__golden__/wave-loop/op-discover-rest.json +659 -0
  103. package/src/__golden__/wave-loop/op-discover-wide.json +290 -0
  104. package/src/__golden__/wave-loop/op-held-on-again.json +176 -0
  105. package/src/__golden__/wave-loop/op-held-on-before-apply.json +689 -0
  106. package/src/__golden__/wave-loop/op-held-on.json +1455 -0
  107. package/src/__golden__/wave-loop/op-hooks-apply-fails.json +673 -0
  108. package/src/__golden__/wave-loop/op-hooks-fail-after-apply.json +737 -0
  109. package/src/__golden__/wave-loop/op-hooks-fail-before-apply.json +450 -0
  110. package/src/__golden__/wave-loop/op-hooks-fail-before-plan.json +97 -0
  111. package/src/__golden__/wave-loop/op-hooks-held.json +1059 -0
  112. package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +693 -0
  113. package/src/__golden__/wave-loop/op-hooks-pass.json +735 -0
  114. package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +148 -0
  115. package/src/__golden__/wave-loop/op-hooks-share.json +1225 -0
  116. package/src/__golden__/wave-loop/op-outcome-held.json +202 -0
  117. package/src/__golden__/wave-loop/op-outcome-replan-approved.json +286 -0
  118. package/src/__golden__/wave-loop/op-outcome-replan-forever.json +823 -0
  119. package/src/__golden__/wave-loop/op-outcome-replan.json +259 -0
  120. package/src/__golden__/wave-loop/op-outcome-stood-down.json +196 -0
  121. package/src/__golden__/wave-loop/op-outcome-unreadable.json +193 -0
  122. package/src/__golden__/wave-loop/op-overridden.json +508 -0
  123. package/src/__golden__/wave-loop/op-per-run.json +518 -0
  124. package/src/__golden__/wave-loop/op-point.json +495 -0
  125. package/src/__golden__/wave-loop/op-pr-review.json +397 -0
  126. package/src/__golden__/wave-loop/op-sealed.json +125 -0
  127. package/src/__golden__/wave-loop/op-spend-change-only.json +168 -0
  128. package/src/__golden__/wave-loop/op-spend.json +328 -0
  129. package/src/__golden__/wave-loop/op-wave-commands.json +1808 -0
  130. package/src/__golden__/wave-loop/op-wide-refused.json +291 -0
  131. package/src/__golden__/wave-loop/op-wide-waiting.json +231 -0
  132. package/src/__golden__/wave-loop/op-wide.json +440 -0
  133. package/src/cli/commands/import-live.test.ts +24 -0
  134. package/src/cli/commands/import.ts +8 -2
  135. package/src/cli/handlers/graph.test.ts +23 -0
  136. package/src/cli/handlers/graph.ts +22 -1
  137. package/src/cli/handlers/misc.ts +2 -1
  138. package/src/cli/main.test.ts +5 -0
  139. package/src/cli/parse-args.ts +3 -0
  140. package/src/cli/registry.ts +2 -0
  141. package/src/codegen/publish-order.test.ts +118 -4
  142. package/src/components/fan-out-run.ts +156 -128
  143. package/src/graph-ci-edges.test.ts +97 -0
  144. package/src/graph-detail.ts +9 -3
  145. package/src/graph-dot.ts +34 -2
  146. package/src/graph-ir.ts +156 -3
  147. package/src/graph-lens.ts +10 -1
  148. package/src/graph-mermaid.ts +44 -2
  149. package/src/lexicon.ts +23 -1
  150. package/src/meta/peer-deps.test.ts +39 -0
  151. package/src/op/op-waves-run.ts +184 -68
  152. package/src/wave-engine.test.ts +38 -1
  153. package/src/wave-engine.ts +101 -5
  154. package/src/wave-loop-golden.test.ts +627 -0
@@ -0,0 +1,1808 @@
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": "after-gate",
16
+ "name": "report",
17
+ "exit": 0,
18
+ "outcome": "passed"
19
+ }
20
+ ],
21
+ "decision": {
22
+ "wave": 1,
23
+ "name": "net",
24
+ "op": "tf-apply",
25
+ "gate": "wave-1",
26
+ "policy": "always",
27
+ "approval": "ledger",
28
+ "policySource": "base",
29
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
30
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
31
+ "members": [
32
+ {
33
+ "member": "vpc",
34
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
35
+ "op": "tf-apply",
36
+ "destructive": true
37
+ },
38
+ {
39
+ "member": "dns",
40
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
41
+ "op": "tf-apply",
42
+ "empty": true
43
+ },
44
+ {
45
+ "member": "nat",
46
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333",
47
+ "op": "tf-apply"
48
+ }
49
+ ],
50
+ "status": "waiting",
51
+ "hooks": {
52
+ "after-gate": [
53
+ {
54
+ "name": "report",
55
+ "command": [
56
+ "hook",
57
+ "report",
58
+ "{runs}"
59
+ ]
60
+ }
61
+ ]
62
+ },
63
+ "digestOver": "changing",
64
+ "neverOverMcp": true,
65
+ "extras": [
66
+ {
67
+ "member": "cost",
68
+ "planDigest": "usd:12.00"
69
+ }
70
+ ],
71
+ "pending": {
72
+ "description": "net layer",
73
+ "commit": "c0ffee"
74
+ },
75
+ "pendingFact": {
76
+ "version": 1,
77
+ "kind": "pending",
78
+ "description": "net layer",
79
+ "commit": "c0ffee",
80
+ "approvalMode": "ledger",
81
+ "op": "tf-apply",
82
+ "gate": "wave-1",
83
+ "timestamp": "2026-10-11T00:00:00.000Z",
84
+ "expiresAt": "2026-10-13T00:00:00.000Z",
85
+ "planDigest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
86
+ "neverOverMcp": true
87
+ },
88
+ "recorded": true,
89
+ "waitingSince": "2026-10-11T00:00:00.000Z",
90
+ "approve": "chant approve tf-apply wave-1 --plan jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
91
+ "outcomes": [
92
+ {
93
+ "moment": "after-gate",
94
+ "name": "report",
95
+ "exit": 0,
96
+ "outcome": "passed"
97
+ }
98
+ ]
99
+ }
100
+ },
101
+ "ledger": {
102
+ "appended": [
103
+ {
104
+ "version": 1,
105
+ "kind": "pending",
106
+ "description": "net layer",
107
+ "commit": "c0ffee",
108
+ "approvalMode": "ledger",
109
+ "op": "tf-apply",
110
+ "gate": "wave-1",
111
+ "timestamp": "2026-10-11T00:00:00.000Z",
112
+ "expiresAt": "2026-10-13T00:00:00.000Z",
113
+ "planDigest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
114
+ "neverOverMcp": true
115
+ }
116
+ ],
117
+ "resolved": [],
118
+ "applied": []
119
+ },
120
+ "calls": 2,
121
+ "logs": 1
122
+ },
123
+ {
124
+ "label": "approved",
125
+ "job": {
126
+ "wave": 1
127
+ },
128
+ "result": {
129
+ "exitCode": 0,
130
+ "applied": [
131
+ "vpc",
132
+ "dns",
133
+ "nat"
134
+ ],
135
+ "failed": [],
136
+ "moved": [],
137
+ "hooks": [
138
+ {
139
+ "moment": "after-gate",
140
+ "name": "report",
141
+ "exit": 0,
142
+ "outcome": "passed"
143
+ }
144
+ ],
145
+ "decision": {
146
+ "wave": 1,
147
+ "name": "net",
148
+ "op": "tf-apply",
149
+ "gate": "wave-1",
150
+ "policy": "always",
151
+ "approval": "ledger",
152
+ "policySource": "base",
153
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
154
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
155
+ "members": [
156
+ {
157
+ "member": "vpc",
158
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
159
+ "op": "tf-apply",
160
+ "destructive": true
161
+ },
162
+ {
163
+ "member": "dns",
164
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
165
+ "op": "tf-apply",
166
+ "empty": true
167
+ },
168
+ {
169
+ "member": "nat",
170
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333",
171
+ "op": "tf-apply"
172
+ }
173
+ ],
174
+ "status": "approved",
175
+ "hooks": {
176
+ "after-gate": [
177
+ {
178
+ "name": "report",
179
+ "command": [
180
+ "hook",
181
+ "report",
182
+ "{runs}"
183
+ ]
184
+ }
185
+ ]
186
+ },
187
+ "digestOver": "changing",
188
+ "neverOverMcp": true,
189
+ "extras": [
190
+ {
191
+ "member": "cost",
192
+ "planDigest": "usd:12.00"
193
+ }
194
+ ],
195
+ "pending": {
196
+ "description": "net layer",
197
+ "commit": "c0ffee"
198
+ },
199
+ "via": "ledger",
200
+ "approvedBy": "alice",
201
+ "approvedAt": "2026-10-10T00:00:00Z",
202
+ "outcomes": [
203
+ {
204
+ "moment": "after-gate",
205
+ "name": "report",
206
+ "exit": 0,
207
+ "outcome": "passed"
208
+ }
209
+ ]
210
+ }
211
+ },
212
+ "ledger": {
213
+ "appended": [],
214
+ "resolved": [],
215
+ "applied": []
216
+ },
217
+ "calls": 3,
218
+ "logs": 1
219
+ },
220
+ {
221
+ "label": "another digest approved",
222
+ "job": {
223
+ "wave": 1
224
+ },
225
+ "result": {
226
+ "exitCode": 3,
227
+ "applied": [],
228
+ "failed": [],
229
+ "moved": [],
230
+ "hooks": [
231
+ {
232
+ "moment": "after-gate",
233
+ "name": "report",
234
+ "exit": 0,
235
+ "outcome": "passed"
236
+ }
237
+ ],
238
+ "decision": {
239
+ "wave": 1,
240
+ "name": "net",
241
+ "op": "tf-apply",
242
+ "gate": "wave-1",
243
+ "policy": "always",
244
+ "approval": "ledger",
245
+ "policySource": "base",
246
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
247
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
248
+ "members": [
249
+ {
250
+ "member": "vpc",
251
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
252
+ "op": "tf-apply",
253
+ "destructive": true
254
+ },
255
+ {
256
+ "member": "dns",
257
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
258
+ "op": "tf-apply",
259
+ "empty": true
260
+ },
261
+ {
262
+ "member": "nat",
263
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333",
264
+ "op": "tf-apply"
265
+ }
266
+ ],
267
+ "status": "waiting",
268
+ "hooks": {
269
+ "after-gate": [
270
+ {
271
+ "name": "report",
272
+ "command": [
273
+ "hook",
274
+ "report",
275
+ "{runs}"
276
+ ]
277
+ }
278
+ ]
279
+ },
280
+ "digestOver": "changing",
281
+ "neverOverMcp": true,
282
+ "extras": [
283
+ {
284
+ "member": "cost",
285
+ "planDigest": "usd:12.00"
286
+ }
287
+ ],
288
+ "pending": {
289
+ "description": "net layer",
290
+ "commit": "c0ffee"
291
+ },
292
+ "pendingFact": {
293
+ "version": 1,
294
+ "kind": "pending",
295
+ "description": "net layer",
296
+ "commit": "c0ffee",
297
+ "approvalMode": "ledger",
298
+ "op": "tf-apply",
299
+ "gate": "wave-1",
300
+ "timestamp": "2026-10-11T00:00:00.000Z",
301
+ "expiresAt": "2026-10-13T00:00:00.000Z",
302
+ "planDigest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
303
+ "neverOverMcp": true
304
+ },
305
+ "recorded": true,
306
+ "waitingSince": "2026-10-11T00:00:00.000Z",
307
+ "mismatch": {
308
+ "approved": "sha256:9999999999999999999999999999999999999999999999999999999999999999",
309
+ "planned": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
310
+ "resolvedBy": "alice",
311
+ "timestamp": "2026-10-10T00:00:00Z"
312
+ },
313
+ "approve": "chant approve tf-apply wave-1 --plan jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
314
+ "outcomes": [
315
+ {
316
+ "moment": "after-gate",
317
+ "name": "report",
318
+ "exit": 0,
319
+ "outcome": "passed"
320
+ }
321
+ ]
322
+ }
323
+ },
324
+ "ledger": {
325
+ "appended": [
326
+ {
327
+ "version": 1,
328
+ "kind": "pending",
329
+ "description": "net layer",
330
+ "commit": "c0ffee",
331
+ "approvalMode": "ledger",
332
+ "op": "tf-apply",
333
+ "gate": "wave-1",
334
+ "timestamp": "2026-10-11T00:00:00.000Z",
335
+ "expiresAt": "2026-10-13T00:00:00.000Z",
336
+ "planDigest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
337
+ "neverOverMcp": true
338
+ }
339
+ ],
340
+ "resolved": [],
341
+ "applied": []
342
+ },
343
+ "calls": 2,
344
+ "logs": 1
345
+ },
346
+ {
347
+ "label": "decide a wide never wave",
348
+ "job": {
349
+ "wave": 2,
350
+ "decide": true
351
+ },
352
+ "result": {
353
+ "exitCode": 0,
354
+ "applied": [],
355
+ "failed": [],
356
+ "moved": [],
357
+ "hooks": [
358
+ {
359
+ "moment": "after-gate",
360
+ "name": "report",
361
+ "exit": 0,
362
+ "outcome": "passed"
363
+ }
364
+ ],
365
+ "decision": {
366
+ "wave": 2,
367
+ "name": "apps",
368
+ "op": "tf-apply",
369
+ "gate": "wave-2",
370
+ "policy": "never",
371
+ "approval": "ledger",
372
+ "policySource": "base",
373
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
374
+ "digest": "jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3",
375
+ "members": [
376
+ {
377
+ "member": "a1",
378
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
379
+ "op": "tf-apply"
380
+ },
381
+ {
382
+ "member": "a2",
383
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
384
+ "op": "tf-apply"
385
+ },
386
+ {
387
+ "member": "a3",
388
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
389
+ "op": "tf-apply"
390
+ }
391
+ ],
392
+ "status": "not-required",
393
+ "hooks": {
394
+ "after-gate": [
395
+ {
396
+ "name": "report",
397
+ "command": [
398
+ "hook",
399
+ "report",
400
+ "{runs}"
401
+ ]
402
+ }
403
+ ]
404
+ },
405
+ "digestOver": "changing",
406
+ "neverOverMcp": true,
407
+ "extras": [
408
+ {
409
+ "member": "cost",
410
+ "planDigest": "usd:12.00"
411
+ }
412
+ ],
413
+ "pending": {
414
+ "description": "net layer",
415
+ "commit": "c0ffee"
416
+ },
417
+ "outcomes": [
418
+ {
419
+ "moment": "after-gate",
420
+ "name": "report",
421
+ "exit": 0,
422
+ "outcome": "passed"
423
+ }
424
+ ]
425
+ }
426
+ },
427
+ "ledger": {
428
+ "appended": [],
429
+ "resolved": [],
430
+ "applied": []
431
+ },
432
+ "calls": 2,
433
+ "logs": 1
434
+ },
435
+ {
436
+ "label": "share 1",
437
+ "job": {
438
+ "wave": 2,
439
+ "share": 1
440
+ },
441
+ "result": {
442
+ "exitCode": 0,
443
+ "applied": [
444
+ "a1",
445
+ "a2"
446
+ ],
447
+ "failed": [],
448
+ "moved": [],
449
+ "hooks": [],
450
+ "decision": {
451
+ "wave": 2,
452
+ "name": "apps",
453
+ "op": "tf-apply",
454
+ "gate": "wave-2",
455
+ "policy": "never",
456
+ "approval": "ledger",
457
+ "policySource": "base",
458
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
459
+ "digest": "jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3",
460
+ "members": [
461
+ {
462
+ "member": "a1",
463
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
464
+ "op": "tf-apply"
465
+ },
466
+ {
467
+ "member": "a2",
468
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
469
+ "op": "tf-apply"
470
+ },
471
+ {
472
+ "member": "a3",
473
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
474
+ "op": "tf-apply"
475
+ }
476
+ ],
477
+ "status": "not-required",
478
+ "hooks": {
479
+ "after-gate": [
480
+ {
481
+ "name": "report",
482
+ "command": [
483
+ "hook",
484
+ "report",
485
+ "{runs}"
486
+ ]
487
+ }
488
+ ]
489
+ },
490
+ "digestOver": "changing",
491
+ "neverOverMcp": true,
492
+ "extras": [
493
+ {
494
+ "member": "cost",
495
+ "planDigest": "usd:12.00"
496
+ }
497
+ ],
498
+ "pending": {
499
+ "description": "net layer",
500
+ "commit": "c0ffee"
501
+ },
502
+ "outcomes": [
503
+ {
504
+ "moment": "after-gate",
505
+ "name": "report",
506
+ "exit": 0,
507
+ "outcome": "passed"
508
+ }
509
+ ]
510
+ }
511
+ },
512
+ "ledger": {
513
+ "appended": [],
514
+ "resolved": [],
515
+ "applied": []
516
+ },
517
+ "calls": 2,
518
+ "logs": 0
519
+ },
520
+ {
521
+ "label": "share 2",
522
+ "job": {
523
+ "wave": 2,
524
+ "share": 2
525
+ },
526
+ "result": {
527
+ "exitCode": 0,
528
+ "applied": [
529
+ "a3"
530
+ ],
531
+ "failed": [],
532
+ "moved": [],
533
+ "hooks": [],
534
+ "decision": {
535
+ "wave": 2,
536
+ "name": "apps",
537
+ "op": "tf-apply",
538
+ "gate": "wave-2",
539
+ "policy": "never",
540
+ "approval": "ledger",
541
+ "policySource": "base",
542
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
543
+ "digest": "jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3",
544
+ "members": [
545
+ {
546
+ "member": "a1",
547
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
548
+ "op": "tf-apply"
549
+ },
550
+ {
551
+ "member": "a2",
552
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
553
+ "op": "tf-apply"
554
+ },
555
+ {
556
+ "member": "a3",
557
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
558
+ "op": "tf-apply"
559
+ }
560
+ ],
561
+ "status": "not-required",
562
+ "hooks": {
563
+ "after-gate": [
564
+ {
565
+ "name": "report",
566
+ "command": [
567
+ "hook",
568
+ "report",
569
+ "{runs}"
570
+ ]
571
+ }
572
+ ]
573
+ },
574
+ "digestOver": "changing",
575
+ "neverOverMcp": true,
576
+ "extras": [
577
+ {
578
+ "member": "cost",
579
+ "planDigest": "usd:12.00"
580
+ }
581
+ ],
582
+ "pending": {
583
+ "description": "net layer",
584
+ "commit": "c0ffee"
585
+ },
586
+ "outcomes": [
587
+ {
588
+ "moment": "after-gate",
589
+ "name": "report",
590
+ "exit": 0,
591
+ "outcome": "passed"
592
+ }
593
+ ]
594
+ }
595
+ },
596
+ "ledger": {
597
+ "appended": [],
598
+ "resolved": [],
599
+ "applied": []
600
+ },
601
+ "calls": 2,
602
+ "logs": 0
603
+ }
604
+ ],
605
+ "calls": [
606
+ {
607
+ "argv": [
608
+ "tg",
609
+ "plan",
610
+ "net",
611
+ ".chant/op-waves/tf-apply/wave-1/runs.json",
612
+ ".chant/op-waves/tf-apply/wave-1/plans.json"
613
+ ],
614
+ "read": {
615
+ ".chant/op-waves/tf-apply/wave-1/runs.json": {
616
+ "wave": "net",
617
+ "number": 1,
618
+ "runs": [
619
+ {
620
+ "target": "vpc",
621
+ "op": "tf-apply"
622
+ },
623
+ {
624
+ "target": "dns",
625
+ "op": "tf-apply"
626
+ },
627
+ {
628
+ "target": "nat",
629
+ "op": "tf-apply"
630
+ }
631
+ ]
632
+ }
633
+ }
634
+ },
635
+ {
636
+ "argv": [
637
+ "hook",
638
+ "report",
639
+ ".chant/op-waves/tf-apply/wave-1/runs.json"
640
+ ],
641
+ "env": {
642
+ "CHANT_OP_WAVES": "tf-apply",
643
+ "CHANT_WAVE": "net",
644
+ "CHANT_WAVE_NUMBER": "1",
645
+ "CHANT_HOOK": "after-gate",
646
+ "CHANT_RUNS": ".chant/op-waves/tf-apply/wave-1/runs.json",
647
+ "CHANT_HOLD": ".chant/op-waves/tf-apply/wave-1/hold.json",
648
+ "CHANT_GATE_STATUS": "waiting",
649
+ "CHANT_GATE_OP": "tf-apply",
650
+ "CHANT_GATE": "wave-1",
651
+ "CHANT_GATE_DIGEST": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
652
+ "CHANT_DECISION": ".chant/op-waves/tf-apply/wave-1.json",
653
+ "CHANT_GATE_APPROVE": "chant approve tf-apply wave-1 --plan jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
654
+ "CHANT_GATE_WAITING_SINCE": "2026-10-11T00:00:00.000Z",
655
+ "CHANT_GATE_RECORDED": "true"
656
+ },
657
+ "read": {
658
+ "CHANT_RUNS": {
659
+ "wave": "net",
660
+ "number": 1,
661
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
662
+ "runs": [
663
+ {
664
+ "target": "vpc",
665
+ "op": "tf-apply",
666
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
667
+ "destructive": true
668
+ },
669
+ {
670
+ "target": "dns",
671
+ "op": "tf-apply",
672
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
673
+ "empty": true
674
+ },
675
+ {
676
+ "target": "nat",
677
+ "op": "tf-apply",
678
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333"
679
+ }
680
+ ]
681
+ },
682
+ "CHANT_DECISION": {
683
+ "wave": 1,
684
+ "name": "net",
685
+ "op": "tf-apply",
686
+ "gate": "wave-1",
687
+ "policy": "always",
688
+ "approval": "ledger",
689
+ "policySource": "base",
690
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
691
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
692
+ "members": [
693
+ {
694
+ "member": "vpc",
695
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
696
+ "op": "tf-apply",
697
+ "destructive": true
698
+ },
699
+ {
700
+ "member": "dns",
701
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
702
+ "op": "tf-apply",
703
+ "empty": true
704
+ },
705
+ {
706
+ "member": "nat",
707
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333",
708
+ "op": "tf-apply"
709
+ }
710
+ ],
711
+ "status": "waiting",
712
+ "hooks": {
713
+ "after-gate": [
714
+ {
715
+ "name": "report",
716
+ "command": [
717
+ "hook",
718
+ "report",
719
+ "{runs}"
720
+ ]
721
+ }
722
+ ]
723
+ },
724
+ "digestOver": "changing",
725
+ "neverOverMcp": true,
726
+ "extras": [
727
+ {
728
+ "member": "cost",
729
+ "planDigest": "usd:12.00"
730
+ }
731
+ ],
732
+ "pending": {
733
+ "description": "net layer",
734
+ "commit": "c0ffee"
735
+ },
736
+ "pendingFact": {
737
+ "version": 1,
738
+ "kind": "pending",
739
+ "description": "net layer",
740
+ "commit": "c0ffee",
741
+ "approvalMode": "ledger",
742
+ "op": "tf-apply",
743
+ "gate": "wave-1",
744
+ "timestamp": "2026-10-11T00:00:00.000Z",
745
+ "expiresAt": "2026-10-13T00:00:00.000Z",
746
+ "planDigest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
747
+ "neverOverMcp": true
748
+ },
749
+ "recorded": true,
750
+ "waitingSince": "2026-10-11T00:00:00.000Z",
751
+ "approve": "chant approve tf-apply wave-1 --plan jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853"
752
+ },
753
+ ".chant/op-waves/tf-apply/wave-1/runs.json": {
754
+ "wave": "net",
755
+ "number": 1,
756
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
757
+ "runs": [
758
+ {
759
+ "target": "vpc",
760
+ "op": "tf-apply",
761
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
762
+ "destructive": true
763
+ },
764
+ {
765
+ "target": "dns",
766
+ "op": "tf-apply",
767
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
768
+ "empty": true
769
+ },
770
+ {
771
+ "target": "nat",
772
+ "op": "tf-apply",
773
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333"
774
+ }
775
+ ]
776
+ }
777
+ }
778
+ },
779
+ {
780
+ "argv": [
781
+ "tg",
782
+ "plan",
783
+ "net",
784
+ ".chant/op-waves/tf-apply/wave-1/runs.json",
785
+ ".chant/op-waves/tf-apply/wave-1/plans.json"
786
+ ],
787
+ "read": {
788
+ ".chant/op-waves/tf-apply/wave-1/runs.json": {
789
+ "wave": "net",
790
+ "number": 1,
791
+ "runs": [
792
+ {
793
+ "target": "vpc",
794
+ "op": "tf-apply"
795
+ },
796
+ {
797
+ "target": "dns",
798
+ "op": "tf-apply"
799
+ },
800
+ {
801
+ "target": "nat",
802
+ "op": "tf-apply"
803
+ }
804
+ ]
805
+ }
806
+ }
807
+ },
808
+ {
809
+ "argv": [
810
+ "hook",
811
+ "report",
812
+ ".chant/op-waves/tf-apply/wave-1/runs.json"
813
+ ],
814
+ "env": {
815
+ "CHANT_OP_WAVES": "tf-apply",
816
+ "CHANT_WAVE": "net",
817
+ "CHANT_WAVE_NUMBER": "1",
818
+ "CHANT_HOOK": "after-gate",
819
+ "CHANT_RUNS": ".chant/op-waves/tf-apply/wave-1/runs.json",
820
+ "CHANT_HOLD": ".chant/op-waves/tf-apply/wave-1/hold.json",
821
+ "CHANT_GATE_STATUS": "approved",
822
+ "CHANT_GATE_OP": "tf-apply",
823
+ "CHANT_GATE": "wave-1",
824
+ "CHANT_GATE_DIGEST": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
825
+ "CHANT_DECISION": ".chant/op-waves/tf-apply/wave-1.json"
826
+ },
827
+ "read": {
828
+ "CHANT_RUNS": {
829
+ "wave": "net",
830
+ "number": 1,
831
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
832
+ "runs": [
833
+ {
834
+ "target": "vpc",
835
+ "op": "tf-apply",
836
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
837
+ "destructive": true
838
+ },
839
+ {
840
+ "target": "dns",
841
+ "op": "tf-apply",
842
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
843
+ "empty": true
844
+ },
845
+ {
846
+ "target": "nat",
847
+ "op": "tf-apply",
848
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333"
849
+ }
850
+ ]
851
+ },
852
+ "CHANT_DECISION": {
853
+ "wave": 1,
854
+ "name": "net",
855
+ "op": "tf-apply",
856
+ "gate": "wave-1",
857
+ "policy": "always",
858
+ "approval": "ledger",
859
+ "policySource": "base",
860
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
861
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
862
+ "members": [
863
+ {
864
+ "member": "vpc",
865
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
866
+ "op": "tf-apply",
867
+ "destructive": true
868
+ },
869
+ {
870
+ "member": "dns",
871
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
872
+ "op": "tf-apply",
873
+ "empty": true
874
+ },
875
+ {
876
+ "member": "nat",
877
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333",
878
+ "op": "tf-apply"
879
+ }
880
+ ],
881
+ "status": "approved",
882
+ "hooks": {
883
+ "after-gate": [
884
+ {
885
+ "name": "report",
886
+ "command": [
887
+ "hook",
888
+ "report",
889
+ "{runs}"
890
+ ]
891
+ }
892
+ ]
893
+ },
894
+ "digestOver": "changing",
895
+ "neverOverMcp": true,
896
+ "extras": [
897
+ {
898
+ "member": "cost",
899
+ "planDigest": "usd:12.00"
900
+ }
901
+ ],
902
+ "pending": {
903
+ "description": "net layer",
904
+ "commit": "c0ffee"
905
+ },
906
+ "via": "ledger",
907
+ "approvedBy": "alice",
908
+ "approvedAt": "2026-10-10T00:00:00Z"
909
+ },
910
+ ".chant/op-waves/tf-apply/wave-1/runs.json": {
911
+ "wave": "net",
912
+ "number": 1,
913
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
914
+ "runs": [
915
+ {
916
+ "target": "vpc",
917
+ "op": "tf-apply",
918
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
919
+ "destructive": true
920
+ },
921
+ {
922
+ "target": "dns",
923
+ "op": "tf-apply",
924
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
925
+ "empty": true
926
+ },
927
+ {
928
+ "target": "nat",
929
+ "op": "tf-apply",
930
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333"
931
+ }
932
+ ]
933
+ }
934
+ }
935
+ },
936
+ {
937
+ "argv": [
938
+ "tg",
939
+ "apply",
940
+ "net",
941
+ ".chant/op-waves/tf-apply/wave-1/runs.json",
942
+ ".chant/op-waves/tf-apply/wave-1/plans.json"
943
+ ],
944
+ "env": {
945
+ "CHANT_HOOKS": ".chant/op-waves/tf-apply/wave-1/hooks.json",
946
+ "CHANT_APPLY_OUTCOME": ".chant/op-waves/tf-apply/wave-1/hooks-outcome.json"
947
+ },
948
+ "read": {
949
+ "CHANT_HOOKS": {
950
+ "version": 1,
951
+ "opWaves": "tf-apply",
952
+ "op": "tf-apply",
953
+ "wave": "net",
954
+ "number": 1,
955
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
956
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
957
+ "approved": true,
958
+ "runBy": "chant",
959
+ "runs": [
960
+ {
961
+ "target": "vpc",
962
+ "op": "tf-apply",
963
+ "plan": ".chant/op-waves/tf-apply/wave-1/vpc.plan.json"
964
+ },
965
+ {
966
+ "target": "dns",
967
+ "op": "tf-apply",
968
+ "plan": ".chant/op-waves/tf-apply/wave-1/dns.plan.json"
969
+ },
970
+ {
971
+ "target": "nat",
972
+ "op": "tf-apply",
973
+ "plan": ".chant/op-waves/tf-apply/wave-1/nat.plan.json"
974
+ }
975
+ ],
976
+ "runsFile": ".chant/op-waves/tf-apply/wave-1/runs.json",
977
+ "hooks": {},
978
+ "outcomes": [
979
+ {
980
+ "moment": "after-gate",
981
+ "name": "report",
982
+ "exit": 0,
983
+ "outcome": "passed"
984
+ }
985
+ ]
986
+ },
987
+ ".chant/op-waves/tf-apply/wave-1/runs.json": {
988
+ "wave": "net",
989
+ "number": 1,
990
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
991
+ "runs": [
992
+ {
993
+ "target": "vpc",
994
+ "op": "tf-apply",
995
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
996
+ "destructive": true
997
+ },
998
+ {
999
+ "target": "dns",
1000
+ "op": "tf-apply",
1001
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
1002
+ "empty": true
1003
+ },
1004
+ {
1005
+ "target": "nat",
1006
+ "op": "tf-apply",
1007
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333"
1008
+ }
1009
+ ]
1010
+ }
1011
+ }
1012
+ },
1013
+ {
1014
+ "argv": [
1015
+ "tg",
1016
+ "plan",
1017
+ "net",
1018
+ ".chant/op-waves/tf-apply/wave-1/runs.json",
1019
+ ".chant/op-waves/tf-apply/wave-1/plans.json"
1020
+ ],
1021
+ "read": {
1022
+ ".chant/op-waves/tf-apply/wave-1/runs.json": {
1023
+ "wave": "net",
1024
+ "number": 1,
1025
+ "runs": [
1026
+ {
1027
+ "target": "vpc",
1028
+ "op": "tf-apply"
1029
+ },
1030
+ {
1031
+ "target": "dns",
1032
+ "op": "tf-apply"
1033
+ },
1034
+ {
1035
+ "target": "nat",
1036
+ "op": "tf-apply"
1037
+ }
1038
+ ]
1039
+ }
1040
+ }
1041
+ },
1042
+ {
1043
+ "argv": [
1044
+ "hook",
1045
+ "report",
1046
+ ".chant/op-waves/tf-apply/wave-1/runs.json"
1047
+ ],
1048
+ "env": {
1049
+ "CHANT_OP_WAVES": "tf-apply",
1050
+ "CHANT_WAVE": "net",
1051
+ "CHANT_WAVE_NUMBER": "1",
1052
+ "CHANT_HOOK": "after-gate",
1053
+ "CHANT_RUNS": ".chant/op-waves/tf-apply/wave-1/runs.json",
1054
+ "CHANT_HOLD": ".chant/op-waves/tf-apply/wave-1/hold.json",
1055
+ "CHANT_GATE_STATUS": "waiting",
1056
+ "CHANT_GATE_OP": "tf-apply",
1057
+ "CHANT_GATE": "wave-1",
1058
+ "CHANT_GATE_DIGEST": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
1059
+ "CHANT_DECISION": ".chant/op-waves/tf-apply/wave-1.json",
1060
+ "CHANT_GATE_APPROVE": "chant approve tf-apply wave-1 --plan jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
1061
+ "CHANT_GATE_WAITING_SINCE": "2026-10-11T00:00:00.000Z",
1062
+ "CHANT_GATE_RECORDED": "true"
1063
+ },
1064
+ "read": {
1065
+ "CHANT_RUNS": {
1066
+ "wave": "net",
1067
+ "number": 1,
1068
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
1069
+ "runs": [
1070
+ {
1071
+ "target": "vpc",
1072
+ "op": "tf-apply",
1073
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
1074
+ "destructive": true
1075
+ },
1076
+ {
1077
+ "target": "dns",
1078
+ "op": "tf-apply",
1079
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
1080
+ "empty": true
1081
+ },
1082
+ {
1083
+ "target": "nat",
1084
+ "op": "tf-apply",
1085
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333"
1086
+ }
1087
+ ]
1088
+ },
1089
+ "CHANT_DECISION": {
1090
+ "wave": 1,
1091
+ "name": "net",
1092
+ "op": "tf-apply",
1093
+ "gate": "wave-1",
1094
+ "policy": "always",
1095
+ "approval": "ledger",
1096
+ "policySource": "base",
1097
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
1098
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
1099
+ "members": [
1100
+ {
1101
+ "member": "vpc",
1102
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
1103
+ "op": "tf-apply",
1104
+ "destructive": true
1105
+ },
1106
+ {
1107
+ "member": "dns",
1108
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
1109
+ "op": "tf-apply",
1110
+ "empty": true
1111
+ },
1112
+ {
1113
+ "member": "nat",
1114
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333",
1115
+ "op": "tf-apply"
1116
+ }
1117
+ ],
1118
+ "status": "waiting",
1119
+ "hooks": {
1120
+ "after-gate": [
1121
+ {
1122
+ "name": "report",
1123
+ "command": [
1124
+ "hook",
1125
+ "report",
1126
+ "{runs}"
1127
+ ]
1128
+ }
1129
+ ]
1130
+ },
1131
+ "digestOver": "changing",
1132
+ "neverOverMcp": true,
1133
+ "extras": [
1134
+ {
1135
+ "member": "cost",
1136
+ "planDigest": "usd:12.00"
1137
+ }
1138
+ ],
1139
+ "pending": {
1140
+ "description": "net layer",
1141
+ "commit": "c0ffee"
1142
+ },
1143
+ "pendingFact": {
1144
+ "version": 1,
1145
+ "kind": "pending",
1146
+ "description": "net layer",
1147
+ "commit": "c0ffee",
1148
+ "approvalMode": "ledger",
1149
+ "op": "tf-apply",
1150
+ "gate": "wave-1",
1151
+ "timestamp": "2026-10-11T00:00:00.000Z",
1152
+ "expiresAt": "2026-10-13T00:00:00.000Z",
1153
+ "planDigest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
1154
+ "neverOverMcp": true
1155
+ },
1156
+ "recorded": true,
1157
+ "waitingSince": "2026-10-11T00:00:00.000Z",
1158
+ "mismatch": {
1159
+ "approved": "sha256:9999999999999999999999999999999999999999999999999999999999999999",
1160
+ "planned": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
1161
+ "resolvedBy": "alice",
1162
+ "timestamp": "2026-10-10T00:00:00Z"
1163
+ },
1164
+ "approve": "chant approve tf-apply wave-1 --plan jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853"
1165
+ },
1166
+ ".chant/op-waves/tf-apply/wave-1/runs.json": {
1167
+ "wave": "net",
1168
+ "number": 1,
1169
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
1170
+ "runs": [
1171
+ {
1172
+ "target": "vpc",
1173
+ "op": "tf-apply",
1174
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
1175
+ "destructive": true
1176
+ },
1177
+ {
1178
+ "target": "dns",
1179
+ "op": "tf-apply",
1180
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
1181
+ "empty": true
1182
+ },
1183
+ {
1184
+ "target": "nat",
1185
+ "op": "tf-apply",
1186
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333"
1187
+ }
1188
+ ]
1189
+ }
1190
+ }
1191
+ },
1192
+ {
1193
+ "argv": [
1194
+ "tg",
1195
+ "plan",
1196
+ "apps",
1197
+ ".chant/op-waves/tf-apply/wave-2/runs.json",
1198
+ ".chant/op-waves/tf-apply/wave-2/plans.json"
1199
+ ],
1200
+ "read": {
1201
+ ".chant/op-waves/tf-apply/wave-2/runs.json": {
1202
+ "wave": "apps",
1203
+ "number": 2,
1204
+ "runs": [
1205
+ {
1206
+ "target": "a1",
1207
+ "op": "tf-apply"
1208
+ },
1209
+ {
1210
+ "target": "a2",
1211
+ "op": "tf-apply"
1212
+ },
1213
+ {
1214
+ "target": "a3",
1215
+ "op": "tf-apply"
1216
+ }
1217
+ ]
1218
+ }
1219
+ }
1220
+ },
1221
+ {
1222
+ "argv": [
1223
+ "hook",
1224
+ "report",
1225
+ ".chant/op-waves/tf-apply/wave-2/runs.json"
1226
+ ],
1227
+ "env": {
1228
+ "CHANT_OP_WAVES": "tf-apply",
1229
+ "CHANT_WAVE": "apps",
1230
+ "CHANT_WAVE_NUMBER": "2",
1231
+ "CHANT_HOOK": "after-gate",
1232
+ "CHANT_RUNS": ".chant/op-waves/tf-apply/wave-2/runs.json",
1233
+ "CHANT_HOLD": ".chant/op-waves/tf-apply/wave-2/hold.json",
1234
+ "CHANT_GATE_STATUS": "not-required",
1235
+ "CHANT_GATE_OP": "tf-apply",
1236
+ "CHANT_GATE": "wave-2",
1237
+ "CHANT_GATE_DIGEST": "jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3",
1238
+ "CHANT_DECISION": ".chant/op-waves/tf-apply/wave-2.json"
1239
+ },
1240
+ "read": {
1241
+ "CHANT_RUNS": {
1242
+ "wave": "apps",
1243
+ "number": 2,
1244
+ "digest": "jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3",
1245
+ "runs": [
1246
+ {
1247
+ "target": "a1",
1248
+ "op": "tf-apply",
1249
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1250
+ },
1251
+ {
1252
+ "target": "a2",
1253
+ "op": "tf-apply",
1254
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1255
+ },
1256
+ {
1257
+ "target": "a3",
1258
+ "op": "tf-apply",
1259
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1260
+ }
1261
+ ]
1262
+ },
1263
+ "CHANT_DECISION": {
1264
+ "wave": 2,
1265
+ "name": "apps",
1266
+ "op": "tf-apply",
1267
+ "gate": "wave-2",
1268
+ "policy": "never",
1269
+ "approval": "ledger",
1270
+ "policySource": "base",
1271
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
1272
+ "digest": "jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3",
1273
+ "members": [
1274
+ {
1275
+ "member": "a1",
1276
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1277
+ "op": "tf-apply"
1278
+ },
1279
+ {
1280
+ "member": "a2",
1281
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1282
+ "op": "tf-apply"
1283
+ },
1284
+ {
1285
+ "member": "a3",
1286
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1287
+ "op": "tf-apply"
1288
+ }
1289
+ ],
1290
+ "status": "not-required",
1291
+ "hooks": {
1292
+ "after-gate": [
1293
+ {
1294
+ "name": "report",
1295
+ "command": [
1296
+ "hook",
1297
+ "report",
1298
+ "{runs}"
1299
+ ]
1300
+ }
1301
+ ]
1302
+ },
1303
+ "digestOver": "changing",
1304
+ "neverOverMcp": true,
1305
+ "extras": [
1306
+ {
1307
+ "member": "cost",
1308
+ "planDigest": "usd:12.00"
1309
+ }
1310
+ ],
1311
+ "pending": {
1312
+ "description": "net layer",
1313
+ "commit": "c0ffee"
1314
+ }
1315
+ },
1316
+ ".chant/op-waves/tf-apply/wave-2/runs.json": {
1317
+ "wave": "apps",
1318
+ "number": 2,
1319
+ "digest": "jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3",
1320
+ "runs": [
1321
+ {
1322
+ "target": "a1",
1323
+ "op": "tf-apply",
1324
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1325
+ },
1326
+ {
1327
+ "target": "a2",
1328
+ "op": "tf-apply",
1329
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1330
+ },
1331
+ {
1332
+ "target": "a3",
1333
+ "op": "tf-apply",
1334
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1335
+ }
1336
+ ]
1337
+ }
1338
+ }
1339
+ },
1340
+ {
1341
+ "argv": [
1342
+ "tg",
1343
+ "plan",
1344
+ "apps",
1345
+ ".chant/op-waves/tf-apply/wave-2/runs.json",
1346
+ ".chant/op-waves/tf-apply/wave-2/plans.json"
1347
+ ],
1348
+ "read": {
1349
+ ".chant/op-waves/tf-apply/wave-2/runs.json": {
1350
+ "wave": "apps",
1351
+ "number": 2,
1352
+ "runs": [
1353
+ {
1354
+ "target": "a1",
1355
+ "op": "tf-apply"
1356
+ },
1357
+ {
1358
+ "target": "a2",
1359
+ "op": "tf-apply"
1360
+ }
1361
+ ]
1362
+ }
1363
+ }
1364
+ },
1365
+ {
1366
+ "argv": [
1367
+ "tg",
1368
+ "apply",
1369
+ "apps",
1370
+ ".chant/op-waves/tf-apply/wave-2/runs.json",
1371
+ ".chant/op-waves/tf-apply/wave-2/plans.json"
1372
+ ],
1373
+ "env": {
1374
+ "CHANT_HOOKS": ".chant/op-waves/tf-apply/wave-2/hooks.json",
1375
+ "CHANT_APPLY_OUTCOME": ".chant/op-waves/tf-apply/wave-2/hooks-outcome.json"
1376
+ },
1377
+ "read": {
1378
+ "CHANT_HOOKS": {
1379
+ "version": 1,
1380
+ "opWaves": "tf-apply",
1381
+ "op": "tf-apply",
1382
+ "wave": "apps",
1383
+ "number": 2,
1384
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
1385
+ "digest": "jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3",
1386
+ "approved": false,
1387
+ "runBy": "chant",
1388
+ "runs": [
1389
+ {
1390
+ "target": "a1",
1391
+ "op": "tf-apply",
1392
+ "plan": ".chant/op-waves/tf-apply/wave-2/a1.plan.json"
1393
+ },
1394
+ {
1395
+ "target": "a2",
1396
+ "op": "tf-apply",
1397
+ "plan": ".chant/op-waves/tf-apply/wave-2/a2.plan.json"
1398
+ }
1399
+ ],
1400
+ "runsFile": ".chant/op-waves/tf-apply/wave-2/runs.json",
1401
+ "hooks": {},
1402
+ "outcomes": []
1403
+ },
1404
+ ".chant/op-waves/tf-apply/wave-2/runs.json": {
1405
+ "wave": "apps",
1406
+ "number": 2,
1407
+ "digest": "jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3",
1408
+ "runs": [
1409
+ {
1410
+ "target": "a1",
1411
+ "op": "tf-apply",
1412
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1413
+ },
1414
+ {
1415
+ "target": "a2",
1416
+ "op": "tf-apply",
1417
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1418
+ }
1419
+ ]
1420
+ }
1421
+ }
1422
+ },
1423
+ {
1424
+ "argv": [
1425
+ "tg",
1426
+ "plan",
1427
+ "apps",
1428
+ ".chant/op-waves/tf-apply/wave-2/runs.json",
1429
+ ".chant/op-waves/tf-apply/wave-2/plans.json"
1430
+ ],
1431
+ "read": {
1432
+ ".chant/op-waves/tf-apply/wave-2/runs.json": {
1433
+ "wave": "apps",
1434
+ "number": 2,
1435
+ "runs": [
1436
+ {
1437
+ "target": "a3",
1438
+ "op": "tf-apply"
1439
+ }
1440
+ ]
1441
+ }
1442
+ }
1443
+ },
1444
+ {
1445
+ "argv": [
1446
+ "tg",
1447
+ "apply",
1448
+ "apps",
1449
+ ".chant/op-waves/tf-apply/wave-2/runs.json",
1450
+ ".chant/op-waves/tf-apply/wave-2/plans.json"
1451
+ ],
1452
+ "env": {
1453
+ "CHANT_HOOKS": ".chant/op-waves/tf-apply/wave-2/hooks.json",
1454
+ "CHANT_APPLY_OUTCOME": ".chant/op-waves/tf-apply/wave-2/hooks-outcome.json"
1455
+ },
1456
+ "read": {
1457
+ "CHANT_HOOKS": {
1458
+ "version": 1,
1459
+ "opWaves": "tf-apply",
1460
+ "op": "tf-apply",
1461
+ "wave": "apps",
1462
+ "number": 2,
1463
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
1464
+ "digest": "jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3",
1465
+ "approved": false,
1466
+ "runBy": "chant",
1467
+ "runs": [
1468
+ {
1469
+ "target": "a3",
1470
+ "op": "tf-apply",
1471
+ "plan": ".chant/op-waves/tf-apply/wave-2/a3.plan.json"
1472
+ }
1473
+ ],
1474
+ "runsFile": ".chant/op-waves/tf-apply/wave-2/runs.json",
1475
+ "hooks": {},
1476
+ "outcomes": []
1477
+ },
1478
+ ".chant/op-waves/tf-apply/wave-2/runs.json": {
1479
+ "wave": "apps",
1480
+ "number": 2,
1481
+ "digest": "jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3",
1482
+ "runs": [
1483
+ {
1484
+ "target": "a3",
1485
+ "op": "tf-apply",
1486
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1487
+ }
1488
+ ]
1489
+ }
1490
+ }
1491
+ }
1492
+ ],
1493
+ "logs": [
1494
+ "Nothing in wave 1 or after it ran. Read the plans, then approve: chant approve tf-apply wave-1 --plan jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853 (with --resume, the approval also starts this job again)",
1495
+ "wave 1 (net): gate always (read at bbbbbbbbbbbb), digest jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853: approved by alice",
1496
+ "Nothing in wave 1 or after it ran. Read the plans, then approve: chant approve tf-apply wave-1 --plan jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853 (with --resume, the approval also starts this job again)",
1497
+ "wave 2 (apps): gate never (read at bbbbbbbbbbbb), digest jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3: not-required"
1498
+ ],
1499
+ "files": {
1500
+ ".chant/op-waves/tf-apply/wave-1/dns.plan.json": {
1501
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
1502
+ "empty": true
1503
+ },
1504
+ ".chant/op-waves/tf-apply/wave-1/hooks.json": {
1505
+ "version": 1,
1506
+ "opWaves": "tf-apply",
1507
+ "op": "tf-apply",
1508
+ "wave": "net",
1509
+ "number": 1,
1510
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
1511
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
1512
+ "approved": true,
1513
+ "runBy": "chant",
1514
+ "runs": [
1515
+ {
1516
+ "target": "vpc",
1517
+ "op": "tf-apply",
1518
+ "plan": ".chant/op-waves/tf-apply/wave-1/vpc.plan.json"
1519
+ },
1520
+ {
1521
+ "target": "dns",
1522
+ "op": "tf-apply",
1523
+ "plan": ".chant/op-waves/tf-apply/wave-1/dns.plan.json"
1524
+ },
1525
+ {
1526
+ "target": "nat",
1527
+ "op": "tf-apply",
1528
+ "plan": ".chant/op-waves/tf-apply/wave-1/nat.plan.json"
1529
+ }
1530
+ ],
1531
+ "runsFile": ".chant/op-waves/tf-apply/wave-1/runs.json",
1532
+ "hooks": {},
1533
+ "outcomes": [
1534
+ {
1535
+ "moment": "after-gate",
1536
+ "name": "report",
1537
+ "exit": 0,
1538
+ "outcome": "passed"
1539
+ }
1540
+ ]
1541
+ },
1542
+ ".chant/op-waves/tf-apply/wave-1/nat.plan.json": {
1543
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333"
1544
+ },
1545
+ ".chant/op-waves/tf-apply/wave-1/plans.json": {
1546
+ "runs": [
1547
+ {
1548
+ "target": "vpc",
1549
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
1550
+ "destructive": true
1551
+ },
1552
+ {
1553
+ "target": "dns",
1554
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
1555
+ "empty": true
1556
+ },
1557
+ {
1558
+ "target": "nat",
1559
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333"
1560
+ }
1561
+ ],
1562
+ "pending": {
1563
+ "description": "net layer",
1564
+ "commit": "c0ffee"
1565
+ },
1566
+ "members": [
1567
+ {
1568
+ "member": "cost",
1569
+ "planDigest": "usd:12.00"
1570
+ }
1571
+ ]
1572
+ },
1573
+ ".chant/op-waves/tf-apply/wave-1/runs.json": {
1574
+ "wave": "net",
1575
+ "number": 1,
1576
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
1577
+ "runs": [
1578
+ {
1579
+ "target": "vpc",
1580
+ "op": "tf-apply",
1581
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
1582
+ "destructive": true
1583
+ },
1584
+ {
1585
+ "target": "dns",
1586
+ "op": "tf-apply",
1587
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
1588
+ "empty": true
1589
+ },
1590
+ {
1591
+ "target": "nat",
1592
+ "op": "tf-apply",
1593
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333"
1594
+ }
1595
+ ]
1596
+ },
1597
+ ".chant/op-waves/tf-apply/wave-1/vpc.plan.json": {
1598
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
1599
+ "destructive": true
1600
+ },
1601
+ ".chant/op-waves/tf-apply/wave-1.json": {
1602
+ "wave": 1,
1603
+ "name": "net",
1604
+ "op": "tf-apply",
1605
+ "gate": "wave-1",
1606
+ "policy": "always",
1607
+ "approval": "ledger",
1608
+ "policySource": "base",
1609
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
1610
+ "digest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
1611
+ "members": [
1612
+ {
1613
+ "member": "vpc",
1614
+ "planDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
1615
+ "op": "tf-apply",
1616
+ "destructive": true
1617
+ },
1618
+ {
1619
+ "member": "dns",
1620
+ "planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
1621
+ "op": "tf-apply",
1622
+ "empty": true
1623
+ },
1624
+ {
1625
+ "member": "nat",
1626
+ "planDigest": "sha256:3333333333333333333333333333333333333333333333333333333333333333",
1627
+ "op": "tf-apply"
1628
+ }
1629
+ ],
1630
+ "status": "waiting",
1631
+ "hooks": {
1632
+ "after-gate": [
1633
+ {
1634
+ "name": "report",
1635
+ "command": [
1636
+ "hook",
1637
+ "report",
1638
+ "{runs}"
1639
+ ]
1640
+ }
1641
+ ]
1642
+ },
1643
+ "digestOver": "changing",
1644
+ "neverOverMcp": true,
1645
+ "extras": [
1646
+ {
1647
+ "member": "cost",
1648
+ "planDigest": "usd:12.00"
1649
+ }
1650
+ ],
1651
+ "pending": {
1652
+ "description": "net layer",
1653
+ "commit": "c0ffee"
1654
+ },
1655
+ "pendingFact": {
1656
+ "version": 1,
1657
+ "kind": "pending",
1658
+ "description": "net layer",
1659
+ "commit": "c0ffee",
1660
+ "approvalMode": "ledger",
1661
+ "op": "tf-apply",
1662
+ "gate": "wave-1",
1663
+ "timestamp": "2026-10-11T00:00:00.000Z",
1664
+ "expiresAt": "2026-10-13T00:00:00.000Z",
1665
+ "planDigest": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
1666
+ "neverOverMcp": true
1667
+ },
1668
+ "recorded": true,
1669
+ "waitingSince": "2026-10-11T00:00:00.000Z",
1670
+ "mismatch": {
1671
+ "approved": "sha256:9999999999999999999999999999999999999999999999999999999999999999",
1672
+ "planned": "jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
1673
+ "resolvedBy": "alice",
1674
+ "timestamp": "2026-10-10T00:00:00Z"
1675
+ },
1676
+ "approve": "chant approve tf-apply wave-1 --plan jcs1-sha256:e8c434b396fbbce2b501a5fb746548ad4db81a26543b4dc2c757ec148379f853",
1677
+ "outcomes": [
1678
+ {
1679
+ "moment": "after-gate",
1680
+ "name": "report",
1681
+ "exit": 0,
1682
+ "outcome": "passed"
1683
+ }
1684
+ ]
1685
+ },
1686
+ ".chant/op-waves/tf-apply/wave-2/a1.plan.json": {
1687
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1688
+ },
1689
+ ".chant/op-waves/tf-apply/wave-2/a2.plan.json": {
1690
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1691
+ },
1692
+ ".chant/op-waves/tf-apply/wave-2/a3.plan.json": {
1693
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1694
+ },
1695
+ ".chant/op-waves/tf-apply/wave-2/hooks.json": {
1696
+ "version": 1,
1697
+ "opWaves": "tf-apply",
1698
+ "op": "tf-apply",
1699
+ "wave": "apps",
1700
+ "number": 2,
1701
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
1702
+ "digest": "jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3",
1703
+ "approved": false,
1704
+ "runBy": "chant",
1705
+ "runs": [
1706
+ {
1707
+ "target": "a3",
1708
+ "op": "tf-apply",
1709
+ "plan": ".chant/op-waves/tf-apply/wave-2/a3.plan.json"
1710
+ }
1711
+ ],
1712
+ "runsFile": ".chant/op-waves/tf-apply/wave-2/runs.json",
1713
+ "hooks": {},
1714
+ "outcomes": []
1715
+ },
1716
+ ".chant/op-waves/tf-apply/wave-2/plans.json": {
1717
+ "runs": [
1718
+ {
1719
+ "target": "a3",
1720
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1721
+ }
1722
+ ],
1723
+ "pending": {
1724
+ "description": "net layer",
1725
+ "commit": "c0ffee"
1726
+ },
1727
+ "members": [
1728
+ {
1729
+ "member": "cost",
1730
+ "planDigest": "usd:12.00"
1731
+ }
1732
+ ]
1733
+ },
1734
+ ".chant/op-waves/tf-apply/wave-2/runs.json": {
1735
+ "wave": "apps",
1736
+ "number": 2,
1737
+ "digest": "jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3",
1738
+ "runs": [
1739
+ {
1740
+ "target": "a3",
1741
+ "op": "tf-apply",
1742
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1743
+ }
1744
+ ]
1745
+ },
1746
+ ".chant/op-waves/tf-apply/wave-2.json": {
1747
+ "wave": 2,
1748
+ "name": "apps",
1749
+ "op": "tf-apply",
1750
+ "gate": "wave-2",
1751
+ "policy": "never",
1752
+ "approval": "ledger",
1753
+ "policySource": "base",
1754
+ "base": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
1755
+ "digest": "jcs1-sha256:528ae61c94cd24622aade0c3b2acbebe58dfa1789f13f71de15b9d5d7519f0d3",
1756
+ "members": [
1757
+ {
1758
+ "member": "a1",
1759
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1760
+ "op": "tf-apply"
1761
+ },
1762
+ {
1763
+ "member": "a2",
1764
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1765
+ "op": "tf-apply"
1766
+ },
1767
+ {
1768
+ "member": "a3",
1769
+ "planDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1770
+ "op": "tf-apply"
1771
+ }
1772
+ ],
1773
+ "status": "not-required",
1774
+ "hooks": {
1775
+ "after-gate": [
1776
+ {
1777
+ "name": "report",
1778
+ "command": [
1779
+ "hook",
1780
+ "report",
1781
+ "{runs}"
1782
+ ]
1783
+ }
1784
+ ]
1785
+ },
1786
+ "digestOver": "changing",
1787
+ "neverOverMcp": true,
1788
+ "extras": [
1789
+ {
1790
+ "member": "cost",
1791
+ "planDigest": "usd:12.00"
1792
+ }
1793
+ ],
1794
+ "pending": {
1795
+ "description": "net layer",
1796
+ "commit": "c0ffee"
1797
+ },
1798
+ "outcomes": [
1799
+ {
1800
+ "moment": "after-gate",
1801
+ "name": "report",
1802
+ "exit": 0,
1803
+ "outcome": "passed"
1804
+ }
1805
+ ]
1806
+ }
1807
+ }
1808
+ }