@kungfu-tech/buildchain 4.0.2-alpha.9 → 4.0.2

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 (157) hide show
  1. package/AGENTS.md +10 -1
  2. package/CONTRIBUTING.md +24 -0
  3. package/README.md +2 -2
  4. package/actions/promote-buildchain-ref/README.md +1 -1
  5. package/actions/v4-release-candidate-promote/README.md +28 -0
  6. package/architecture/agent-change-map.md +64 -7
  7. package/architecture/ci-lane-change-budget.json +366 -0
  8. package/architecture/internal-capabilities.json +53 -8
  9. package/architecture/maintainability-debt.json +147 -93
  10. package/architecture/maintainability-policy.json +32 -28
  11. package/architecture/release-tail-contract-inventory.json +6 -6
  12. package/architecture/v4-architecture-constitution.md +23 -20
  13. package/architecture/v4-cross-platform-adopter-qualification.json +1 -1
  14. package/architecture/v4-delivery-authority-parity.json +2 -2
  15. package/architecture/v4-delivery-warrant-shadow-bootstrap-plan.json +1 -1
  16. package/architecture/v4-floating-consumer-policy.json +2 -2
  17. package/architecture/v4-next-development-parity.json +5 -5
  18. package/architecture/v4-partial-mutation-recovery-qualification.json +4 -1
  19. package/architecture/v4-platform-stage-checkpoints.json +1 -1
  20. package/architecture/v4-provider-operation-journal-contract.json +5 -2
  21. package/architecture/v4-publication-facade-patches.json +64 -0
  22. package/architecture/v4-release-activation-shadow-domain.json +5 -2
  23. package/architecture/v4-release-topology.json +74 -39
  24. package/architecture/v4-rust-wasm-production-authority.json +58 -0
  25. package/architecture/v4-stable-publication-fence.json +5 -2
  26. package/architecture/v4-stage-capsule-qualification.json +2 -2
  27. package/architecture/v4-tail-reseal-parity.json +8 -6
  28. package/architecture/v4-universal-workflow-bootstrap.json +171 -0
  29. package/architecture/v4-universal-workflow-fault-campaign.json +72 -0
  30. package/architecture/v4-universal-workflow-train-admission.json +40 -0
  31. package/architecture/workflow-taxonomy.json +1451 -0
  32. package/bin/buildchain.mjs +7 -7
  33. package/contracts/buildchain-v2-residuals-v1.json +57 -48
  34. package/contracts/dev-delivery-authority-v2.schema.json +16 -2
  35. package/contracts/fixtures/v4-tail-reseal-v1/valid.json +1 -1
  36. package/contracts/v4-canonical-contracts-v1.schema.json +1 -0
  37. package/dist/site/buildchain-contract.json +93 -48
  38. package/dist/site/buildchain-site.json +222 -69
  39. package/dist/site/capability-registry.json +4 -4
  40. package/dist/site/controller-registry.json +50 -13
  41. package/dist/site/kfd-claims.json +2585 -1000
  42. package/dist/site/kfd-upstream-aggregate.json +1 -1
  43. package/dist/site/manual-registry.json +13 -13
  44. package/dist/site/node-api-registry.json +120 -115
  45. package/dist/site/page-registry.json +204 -51
  46. package/dist/site/public-surface-audit.json +3205 -1219
  47. package/dist/site/publication-authority-registry.json +1124 -362
  48. package/dist/site/publication-registry.json +4 -4
  49. package/dist/site/schemas/dev-delivery-authority-v2.schema.json +16 -2
  50. package/dist/site/site-manifest.json +17 -17
  51. package/dist/site/workflow-registry.json +5061 -1659
  52. package/docs/MAP.md +1 -0
  53. package/docs/auditable-demo.md +1 -1
  54. package/docs/cli.md +21 -8
  55. package/docs/dev-delivery-warrant.md +1 -1
  56. package/docs/engineering-housekeeper.md +3 -3
  57. package/docs/kfd-support.md +26 -2
  58. package/docs/next-development-transition.md +2 -2
  59. package/docs/node-api-reference.md +190 -190
  60. package/docs/publication-authority.md +2 -2
  61. package/docs/release-candidate.md +3 -3
  62. package/docs/release-flow.md +67 -19
  63. package/docs/release-governance.md +8 -8
  64. package/docs/release-passport.md +27 -2
  65. package/docs/reusable-build-surface.md +16 -0
  66. package/docs/v4-adopter-delivery.md +2 -2
  67. package/docs/v4-production-release.md +71 -8
  68. package/docs/v4-rust-wasm-production-authority.md +58 -0
  69. package/docs/v4-stage-capsule.md +2 -2
  70. package/docs/v4-tail-reseal.md +1 -1
  71. package/docs/workflow-catalog.md +154 -0
  72. package/docs/workflow-path-migration.md +109 -0
  73. package/package.json +10 -6
  74. package/packages/core/artifact-verification-envelope.js +5 -5
  75. package/packages/core/buildchain-contract.js +1 -1
  76. package/packages/core/buildchain-kfd-claims.js +2 -2
  77. package/packages/core/buildchain-publication-authority.js +42 -26
  78. package/packages/core/buildchain-v4-domain.wasm +0 -0
  79. package/packages/core/ci-lane-change-budget.js +14 -1
  80. package/packages/core/controller-evidence.js +4 -1
  81. package/packages/core/dev-delivery-candidate-identity.js +40 -6
  82. package/packages/core/dev-delivery-warrant-state.js +3 -4
  83. package/packages/core/dev-delivery-warrant.js +12 -2
  84. package/packages/core/github-governance-authority.js +4 -4
  85. package/packages/core/kfd-adopter-manifest.js +46 -47
  86. package/packages/core/next-development-projection.js +2 -2
  87. package/packages/core/paper-agent-entry.js +30 -4
  88. package/packages/core/paper-fleet.js +1 -1
  89. package/packages/core/paper-runtime-channels.js +348 -0
  90. package/packages/core/paper-scaffold-content.js +10 -0
  91. package/packages/core/paper.js +37 -71
  92. package/packages/core/release-line-dry-run.js +1 -1
  93. package/packages/core/release-passport-contract.js +5 -5
  94. package/packages/core/release-passport.js +5 -4
  95. package/packages/core/release-tail-provider-plane.js +68 -1048
  96. package/packages/core/v4-canonical-contracts.js +10 -75
  97. package/packages/core/v4-domain-wasm-artifact.js +7 -0
  98. package/packages/core/v4-domain-wasm.js +216 -0
  99. package/packages/core/v4-floating-consumer-evidence.js +1 -1
  100. package/packages/core/v4-floating-consumer-policy.js +1 -1
  101. package/packages/core/v4-partial-mutation-recovery-qualification.js +9 -386
  102. package/packages/core/v4-product-publication.js +19 -349
  103. package/packages/core/v4-protected-publication-source.js +19 -21
  104. package/packages/core/v4-provider-operation-journal.js +18 -487
  105. package/packages/core/v4-provider-readback-idempotency.js +12 -97
  106. package/packages/core/v4-release-activation-shadow.js +13 -500
  107. package/packages/core/v4-release-invocation.js +28 -389
  108. package/packages/core/v4-stable-publication-fence.js +13 -342
  109. package/packages/core/v4-universal-workflow-bootstrap.js +586 -0
  110. package/scripts/binary-publication-evidence.mjs +135 -0
  111. package/scripts/build-contract-core.mjs +1 -14
  112. package/scripts/build-v4-domain-wasm.mjs +189 -0
  113. package/scripts/check-action-bundles.mjs +12 -2
  114. package/scripts/check-ci-lane-change-budget.mjs +4 -1
  115. package/scripts/check-core-mechanism-inventory.mjs +4 -3
  116. package/scripts/check-inventory.mjs +35 -44
  117. package/scripts/check-maintainability.mjs +16 -113
  118. package/scripts/check-v4-floating-consumer-policy-contract.mjs +2 -2
  119. package/scripts/check-v4-public-dogfood-contract.mjs +22 -9
  120. package/scripts/check-v4-release-topology.mjs +90 -33
  121. package/scripts/check-v4-runtime-semantic-closure.mjs +4 -1
  122. package/scripts/check-v4-universal-workflow-bootstrap.mjs +266 -0
  123. package/scripts/check-workflow-taxonomy.mjs +6 -0
  124. package/scripts/copy-v4-domain-wasm.mjs +14 -0
  125. package/scripts/dev-delivery-authority-command-adapters.mjs +1 -1
  126. package/scripts/dev-delivery-authority.mjs +8 -8
  127. package/scripts/dev-delivery-source-proof-reuse.mjs +2 -1
  128. package/scripts/dev-delivery-warrant-options.mjs +14 -9
  129. package/scripts/dev-delivery-warrant-store.mjs +73 -7
  130. package/scripts/dev-delivery-warrant-transition.mjs +109 -0
  131. package/scripts/dev-delivery-warrant.mjs +76 -99
  132. package/scripts/dev-pr-auto-merge.mjs +15 -15
  133. package/scripts/generate-channel-build-workflow.mjs +7 -2
  134. package/scripts/generate-channel-promotion-workflow.mjs +7 -5
  135. package/scripts/generate-site-bundle.mjs +11 -11
  136. package/scripts/generate-v4-universal-workflow-facades.mjs +458 -0
  137. package/scripts/generate-workflow-taxonomy.mjs +25 -0
  138. package/scripts/github-output.mjs +31 -0
  139. package/scripts/maintainability-metrics.mjs +16 -5
  140. package/scripts/maintainability-public-surface.mjs +115 -0
  141. package/scripts/next-development-review.mjs +307 -0
  142. package/scripts/paper-work-fleet-cli.mjs +2 -0
  143. package/scripts/release-asset-client.mjs +91 -0
  144. package/scripts/release-candidate-resolver.mjs +9 -9
  145. package/scripts/source-verification-evidence.mjs +344 -0
  146. package/scripts/stable-candidate-qualification.mjs +1 -1
  147. package/scripts/universal-facade-maintainability.mjs +82 -0
  148. package/scripts/v4-product-publication-intent.mjs +13 -6
  149. package/scripts/v4-publication-settlement.mjs +211 -0
  150. package/scripts/v4-universal-workflow-backflow.mjs +212 -0
  151. package/scripts/v4-universal-workflow-engine.mjs +618 -0
  152. package/scripts/v4-universal-workflow-self-dogfood.mjs +205 -0
  153. package/scripts/verify-version-state-delta.mjs +173 -0
  154. package/scripts/workflow-taxonomy.mjs +507 -0
  155. package/templates/native-dev-delivery.yml +4 -7
  156. package/templates/universal-buildchain-bootstrap-recovery.yml +282 -0
  157. package/templates/universal-buildchain-bootstrap.yml +28 -0
@@ -1,395 +1,18 @@
1
- import {
2
- V4ContractFault,
3
- v4ContentRoot,
4
- validateV4Clock,
5
- validateV4Root,
6
- } from "./v4-canonical-contracts.js";
1
+ import { V4ContractFault } from "./v4-canonical-contracts.js";
2
+ import { V4DomainWasmFault, invokeV4DomainWasm } from "./v4-domain-wasm.js";
7
3
 
8
4
  export const V4_PARTIAL_MUTATION_RECOVERY_REQUEST_CONTRACT =
9
5
  "buildchain-v4-partial-mutation-recovery-request/v1";
10
6
  export const V4_PARTIAL_MUTATION_RECOVERY_PLAN_CONTRACT =
11
7
  "buildchain-v4-partial-mutation-recovery-plan/v1";
12
8
 
13
- const TOKEN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u;
14
- const PHASES = new Set([
15
- "planned",
16
- "intended",
17
- "attempting",
18
- "observed",
19
- "confirmable",
20
- "retryable",
21
- "confirmed",
22
- "rejected",
23
- "terminal",
24
- ]);
25
- const PRIORITY = new Map(
26
- ["escalate", "compensate", "reconcile", "wait", "retry"].map(
27
- (value, index) => [value, index],
28
- ),
29
- );
30
-
31
- function fault(code, path, message) {
32
- throw new V4ContractFault(code, path, message);
33
- }
34
-
35
- function exactKeys(value, expected, path) {
36
- if (!value || typeof value !== "object" || Array.isArray(value))
37
- fault("invalid-partial-mutation-recovery-shape", path, "object required");
38
- const actual = Object.keys(value).sort();
39
- const canonical = [...expected].sort();
40
- if (
41
- actual.length !== canonical.length ||
42
- actual.some((key, index) => key !== canonical[index])
43
- )
44
- fault(
45
- "invalid-partial-mutation-recovery-shape",
46
- path,
47
- "keys do not match the closed recovery contract",
48
- );
49
- }
50
-
51
- function token(value, path) {
52
- if (typeof value !== "string" || !TOKEN.test(value))
53
- fault(
54
- "invalid-partial-mutation-recovery-token",
55
- path,
56
- "recovery identifiers must be ASCII tokens",
57
- );
58
- }
59
-
60
- function sortedUnique(values, path, validate) {
61
- if (!Array.isArray(values))
62
- fault("invalid-partial-mutation-recovery-shape", path, "array required");
63
- let prior = null;
64
- for (const [index, value] of values.entries()) {
65
- validate(value, `${path}/${index}`);
66
- if (prior !== null && value <= prior)
67
- fault(
68
- "unordered-partial-mutation-recovery-evidence",
69
- `${path}/${index}`,
70
- "values must be unique and byte-sorted",
71
- );
72
- prior = value;
73
- }
74
- }
75
-
76
- function validateStageResume(value, request) {
77
- exactKeys(
78
- value,
79
- [
80
- "schema",
81
- "planRoot",
82
- "sourceRoot",
83
- "policyRoot",
84
- "platformRoot",
85
- "qualificationRoots",
86
- "decisions",
87
- ],
88
- "$/stageResume",
89
- );
90
- if (value.schema !== "buildchain-v4-stage-capsule-resume-evidence/v1")
91
- fault(
92
- "unsupported-partial-mutation-recovery-version",
93
- "$/stageResume/schema",
94
- "unsupported Stage Capsule resume evidence",
95
- );
96
- for (const [field, expected] of [
97
- ["sourceRoot", request.sourceRoot],
98
- ["policyRoot", request.policyRoot],
99
- ["platformRoot", request.platformRoot],
100
- ]) {
101
- validateV4Root(value[field], `$/stageResume/${field}`);
102
- if (value[field] !== expected)
103
- fault(
104
- "partial-mutation-recovery-binding-mismatch",
105
- `$/stageResume/${field}`,
106
- `Stage Capsule ${field} drifted from the recovery request`,
107
- );
108
- }
109
- validateV4Root(value.planRoot, "$/stageResume/planRoot");
110
- sortedUnique(
111
- value.qualificationRoots,
112
- "$/stageResume/qualificationRoots",
113
- validateV4Root,
114
- );
115
- if (value.qualificationRoots.length === 0)
116
- fault(
117
- "missing-partial-mutation-recovery-evidence",
118
- "$/stageResume/qualificationRoots",
119
- "Stage Capsule qualification roots are required",
120
- );
121
- if (!Array.isArray(value.decisions) || value.decisions.length === 0)
122
- fault(
123
- "missing-partial-mutation-recovery-evidence",
124
- "$/stageResume/decisions",
125
- "Stage Capsule decisions are required",
126
- );
127
- let prior = null;
128
- for (const [index, decision] of value.decisions.entries()) {
129
- const path = `$/stageResume/decisions/${index}`;
130
- exactKeys(decision, ["stageKey", "decision", "reasonCode"], path);
131
- token(decision.stageKey, `${path}/stageKey`);
132
- token(decision.reasonCode, `${path}/reasonCode`);
133
- if (!new Set(["reuse", "rebuild", "reject"]).has(decision.decision))
134
- fault(
135
- "invalid-partial-mutation-recovery-stage-decision",
136
- `${path}/decision`,
137
- "unsupported Stage Capsule decision",
138
- );
139
- if (prior !== null && decision.stageKey <= prior)
140
- fault(
141
- "unordered-partial-mutation-recovery-evidence",
142
- `${path}/stageKey`,
143
- "stage decisions must be unique and byte-sorted",
144
- );
145
- prior = decision.stageKey;
146
- }
147
- }
148
-
149
- function validateActivation(value, request) {
150
- exactKeys(
151
- value,
152
- [
153
- "schema",
154
- "planRoot",
155
- "stateRoot",
156
- "qualificationRoot",
157
- "policyRoot",
158
- "steps",
159
- ],
160
- "$/activation",
161
- );
162
- if (value.schema !== "buildchain-v4-release-activation-recovery-evidence/v1")
163
- fault(
164
- "unsupported-partial-mutation-recovery-version",
165
- "$/activation/schema",
166
- "unsupported release activation evidence",
167
- );
168
- for (const field of [
169
- "planRoot",
170
- "stateRoot",
171
- "qualificationRoot",
172
- "policyRoot",
173
- ])
174
- validateV4Root(value[field], `$/activation/${field}`);
175
- if (
176
- value.qualificationRoot !== request.qualificationRoot ||
177
- value.policyRoot !== request.policyRoot
178
- )
179
- fault(
180
- "partial-mutation-recovery-binding-mismatch",
181
- "$/activation",
182
- "activation qualification or policy root drifted",
183
- );
184
- if (!Array.isArray(value.steps) || value.steps.length === 0)
185
- fault(
186
- "missing-partial-mutation-recovery-evidence",
187
- "$/activation/steps",
188
- "activation steps are required",
189
- );
190
- let prior = null;
191
- const operationRoots = new Set();
192
- for (const [index, step] of value.steps.entries()) {
193
- const path = `$/activation/steps/${index}`;
194
- exactKeys(
195
- step,
196
- [
197
- "stepId",
198
- "operationRoot",
199
- "phase",
200
- "journalRoot",
201
- "journalStateRoot",
202
- "compensationBoundaryRoot",
203
- "attemptCount",
204
- ],
205
- path,
206
- );
207
- token(step.stepId, `${path}/stepId`);
208
- for (const field of ["operationRoot", "compensationBoundaryRoot"])
209
- validateV4Root(step[field], `${path}/${field}`);
210
- if (operationRoots.has(step.operationRoot))
211
- fault(
212
- "conflicting-partial-mutation-recovery-evidence",
213
- `${path}/operationRoot`,
214
- "activation steps must bind unique provider operations",
215
- );
216
- operationRoots.add(step.operationRoot);
217
- if (!PHASES.has(step.phase))
218
- fault(
219
- "unknown-partial-mutation-recovery-phase",
220
- `${path}/phase`,
221
- "operation phase is not in the closed recovery state set",
222
- );
223
- if (!Number.isSafeInteger(step.attemptCount) || step.attemptCount < 0)
224
- fault(
225
- "invalid-partial-mutation-recovery-attempt-count",
226
- `${path}/attemptCount`,
227
- "attempt count must be a non-negative safe integer",
228
- );
229
- const rootsRequired = step.phase !== "planned";
230
- for (const field of ["journalRoot", "journalStateRoot"])
231
- if (rootsRequired) validateV4Root(step[field], `${path}/${field}`);
232
- else if (step[field] !== null)
233
- fault(
234
- "conflicting-partial-mutation-recovery-evidence",
235
- `${path}/${field}`,
236
- "planned operations cannot claim retained journal roots",
237
- );
238
- if (step.phase === "attempting" && step.attemptCount === 0)
239
- fault(
240
- "conflicting-partial-mutation-recovery-evidence",
241
- `${path}/attemptCount`,
242
- "attempting requires a retained attempt",
243
- );
244
- if (prior !== null && step.stepId <= prior)
245
- fault(
246
- "unordered-partial-mutation-recovery-evidence",
247
- `${path}/stepId`,
248
- "activation steps must be unique and byte-sorted",
249
- );
250
- prior = step.stepId;
251
- }
252
- }
253
-
254
- function validateRequest(request) {
255
- exactKeys(
256
- request,
257
- [
258
- "schema",
259
- "evaluatedAt",
260
- "sourceRoot",
261
- "policyRoot",
262
- "platformRoot",
263
- "qualificationRoot",
264
- "maxAttempts",
265
- "compensableBoundaryRoots",
266
- "stageResume",
267
- "activation",
268
- ],
269
- "$",
270
- );
271
- if (request.schema !== V4_PARTIAL_MUTATION_RECOVERY_REQUEST_CONTRACT)
272
- fault(
273
- "unsupported-partial-mutation-recovery-version",
274
- "$/schema",
275
- "unsupported partial-mutation recovery request",
276
- );
277
- validateV4Clock(request.evaluatedAt, "$/evaluatedAt");
278
- for (const field of [
279
- "sourceRoot",
280
- "policyRoot",
281
- "platformRoot",
282
- "qualificationRoot",
283
- ])
284
- validateV4Root(request[field], `$/` + field);
285
- if (!Number.isSafeInteger(request.maxAttempts) || request.maxAttempts < 1)
286
- fault(
287
- "invalid-partial-mutation-recovery-attempt-budget",
288
- "$/maxAttempts",
289
- "maxAttempts must be a positive safe integer",
290
- );
291
- sortedUnique(
292
- request.compensableBoundaryRoots,
293
- "$/compensableBoundaryRoots",
294
- validateV4Root,
295
- );
296
- validateStageResume(request.stageResume, request);
297
- validateActivation(request.activation, request);
298
- }
299
-
300
- function checkpoint(kind, id, root) {
301
- const payload = { kind, id, root };
302
- return {
303
- ...payload,
304
- checkpointRoot: v4ContentRoot(
305
- "partial-mutation-recovery-checkpoint",
306
- payload,
307
- ),
308
- };
309
- }
310
-
311
- function operationDecision(step, request) {
312
- if (step.phase === "confirmed") return null;
313
- let action;
314
- if (["rejected", "terminal"].includes(step.phase))
315
- action = request.compensableBoundaryRoots.includes(
316
- step.compensationBoundaryRoot,
317
- )
318
- ? "compensate"
319
- : "escalate";
320
- else if (step.attemptCount >= request.maxAttempts) action = "escalate";
321
- else if (["observed", "confirmable"].includes(step.phase))
322
- action = "reconcile";
323
- else if (step.phase === "attempting") action = "wait";
324
- else action = "retry";
325
- const retainedRoot = step.journalStateRoot ?? step.operationRoot;
326
- return {
327
- stepId: step.stepId,
328
- operationRoot: step.operationRoot,
329
- action,
330
- checkpoint: checkpoint("provider-operation", step.stepId, retainedRoot),
331
- };
332
- }
333
-
334
9
  export function planV4PartialMutationRecovery(request) {
335
- validateRequest(request);
336
- const stageFailures = request.stageResume.decisions.filter(
337
- ({ decision }) => decision !== "reuse",
338
- );
339
- let nextOperations = request.activation.steps
340
- .map((step) => operationDecision(step, request))
341
- .filter(Boolean);
342
- if (stageFailures.length > 0) {
343
- const first = stageFailures[0];
344
- nextOperations = [
345
- {
346
- stepId: first.stageKey,
347
- operationRoot: null,
348
- action: "escalate",
349
- checkpoint: checkpoint(
350
- "stage-capsule",
351
- first.stageKey,
352
- request.stageResume.planRoot,
353
- ),
354
- },
355
- ];
10
+ try {
11
+ return invokeV4DomainWasm("partial-mutation-recovery", request);
12
+ } catch (error) {
13
+ if (error instanceof V4DomainWasmFault) {
14
+ throw new V4ContractFault(error.code, error.path, error.message);
15
+ }
16
+ throw error;
356
17
  }
357
- nextOperations.sort((left, right) => {
358
- const priority = PRIORITY.get(left.action) - PRIORITY.get(right.action);
359
- if (priority !== 0) return priority;
360
- return left.stepId < right.stepId ? -1 : left.stepId > right.stepId ? 1 : 0;
361
- });
362
- const classification = nextOperations[0]?.action ?? "terminal-noop";
363
- const terminalOperationRoots = request.activation.steps
364
- .filter(({ phase }) => phase === "confirmed")
365
- .map(({ operationRoot }) => operationRoot)
366
- .sort();
367
- const payload = {
368
- schema: V4_PARTIAL_MUTATION_RECOVERY_PLAN_CONTRACT,
369
- mode: "production",
370
- productionAuthority: "v4",
371
- evaluatedAt: request.evaluatedAt,
372
- sourceRoot: request.sourceRoot,
373
- policyRoot: request.policyRoot,
374
- platformRoot: request.platformRoot,
375
- qualificationRoot: request.qualificationRoot,
376
- stageResumePlanRoot: request.stageResume.planRoot,
377
- activationPlanRoot: request.activation.planRoot,
378
- activationStateRoot: request.activation.stateRoot,
379
- classification,
380
- unresolvedCheckpoint: nextOperations[0]?.checkpoint ?? null,
381
- nextOperations,
382
- terminalOperationRoots,
383
- zeroExternalMutations: true,
384
- complexity: {
385
- stageDecisionCount: request.stageResume.decisions.length,
386
- operationCount: request.activation.steps.length,
387
- nextOperationCount: nextOperations.length,
388
- externalMutationCount: 0,
389
- },
390
- };
391
- return {
392
- ...payload,
393
- planRoot: v4ContentRoot("partial-mutation-recovery-plan", payload),
394
- };
395
18
  }