@kungfu-tech/buildchain 4.0.1-alpha.9 → 4.0.2-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -6
- package/actions/v4-release-candidate-promote/README.md +3 -0
- package/architecture/agent-change-map.md +1017 -0
- package/architecture/ci-lane-change-budget.json +70 -1
- package/architecture/decisions/0004-v4-declarative-release-tail.md +47 -0
- package/architecture/internal-capabilities.json +159 -11
- package/architecture/maintainability-debt.json +3229 -0
- package/architecture/maintainability-policy.json +480 -129
- package/architecture/v3-core-mechanism-inventory.json +6 -3
- package/architecture/v3-v4-capability-closure.md +59 -0
- package/architecture/v3-v4-live-capability-inventory.json +102404 -0
- package/architecture/v4-cross-platform-adopter-qualification.json +52 -0
- package/architecture/v4-delivery-warrant-shadow-fixtures.json +3 -3
- package/architecture/v4-runtime-semantic-closure.json +710 -0
- package/bin/internal/trust-release-release-handlers.mjs +5 -0
- package/contracts/fixtures/v4-tail-reseal-v1/valid.json +1 -1
- package/contracts/v4-publication-qualification-v1.schema.json +51 -0
- package/dist/site/agent-index.json +1 -0
- package/dist/site/artifact-schemas.json +2 -0
- package/dist/site/buildchain-contract.json +123 -32
- package/dist/site/buildchain-site.json +96 -28
- package/dist/site/capability-registry.json +6 -6
- package/dist/site/cli-registry.json +5 -2
- package/dist/site/controller-registry.json +41 -5
- package/dist/site/kfd-claims.json +172 -23
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/manual-registry.json +6 -6
- package/dist/site/node-api-registry.json +1474 -215
- package/dist/site/page-registry.json +85 -17
- package/dist/site/public-surface-audit.json +91 -21
- package/dist/site/publication-authority-registry.json +28 -1
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/release-provenance.json +5 -0
- package/dist/site/schemas/v4-publication-qualification-v1.schema.json +51 -0
- package/dist/site/site-manifest.json +10 -10
- package/dist/site/workflow-registry.json +94 -18
- package/docs/MAP.md +1 -1
- package/docs/cli-reference.md +4 -4
- package/docs/dev-delivery-warrant.md +33 -9
- package/docs/node-api-reference.md +291 -206
- package/docs/publish-transaction.md +11 -4
- package/docs/release-candidate.md +7 -0
- package/docs/v4-adopter-delivery.md +23 -4
- package/docs/v4-declarative-release-tail-migration.md +43 -0
- package/package.json +8 -3
- package/packages/core/adopter-delivery-passport.js +36 -0
- package/packages/core/buildchain-contract.js +31 -1
- package/packages/core/buildchain-publication-authority.js +1 -0
- package/packages/core/dev-delivery-warrant-legacy-recovery.js +246 -0
- package/packages/core/dev-delivery-warrant-settlement.js +239 -3
- package/packages/core/dev-delivery-warrant-state.js +15 -2
- package/packages/core/dev-delivery-warrant.js +21 -4
- package/packages/core/github-governance-authority.js +4 -4
- package/packages/core/index.js +1 -0
- package/packages/core/paper-scaffold-content.js +401 -0
- package/packages/core/paper.js +12 -378
- package/packages/core/publication-control-plane-audit.js +135 -111
- package/packages/core/publication-rehearsal-projection.js +104 -0
- package/packages/core/publication-rehearsal-runtime.js +190 -0
- package/packages/core/release-candidate-recovery.js +6 -5
- package/packages/core/release-passport.js +82 -184
- package/packages/core/v4-cross-platform-adopter-qualification.js +343 -0
- package/packages/core/v4-floating-consumer-policy.js +3 -2
- package/packages/core/v4-floating-consumer-release-passport.js +134 -15
- package/packages/core/v4-publication-qualification.js +222 -0
- package/scripts/artifact-signing-controller-core.mjs +1 -1
- package/scripts/audit-publication-control-plane.mjs +17 -17
- package/scripts/buildchain-cli-help.mjs +3 -0
- package/scripts/check-internal-architecture.mjs +23 -3
- package/scripts/check-inventory.mjs +23 -5
- package/scripts/check-maintainability.mjs +145 -4
- package/scripts/check-project-cut-merge-queue-admission.mjs +87 -0
- package/scripts/check-v3-v4-capability-inventory.mjs +574 -0
- package/scripts/check-v4-floating-consumer-policy-contract.mjs +10 -3
- package/scripts/check-v4-runtime-semantic-closure.mjs +266 -0
- package/scripts/dev-delivery-warrant-options.mjs +42 -15
- package/scripts/dev-delivery-warrant.mjs +59 -6
- package/scripts/dev-pr-auto-merge.mjs +25 -11
- package/scripts/dev-pr-delivery-warrant.mjs +44 -0
- package/scripts/dev-pr-prequeue-guard.mjs +0 -18
- package/scripts/dispatch-artifact-signing-authority.mjs +1 -1
- package/scripts/generate-agent-change-map.mjs +118 -0
- package/scripts/generate-release-candidate-passport.mjs +26 -1
- package/scripts/generate-site-bundle.mjs +6 -0
- package/scripts/maintainability-domain-metrics.mjs +237 -0
- package/scripts/maintainability-governance.mjs +473 -0
- package/scripts/maintainability-metrics.mjs +28 -6
- package/scripts/project-cut-merge-queue-admission.mjs +394 -0
- package/scripts/promotion-routing-evidence.mjs +35 -6
- package/scripts/release-candidate-resolver.mjs +44 -0
- package/scripts/release-line-policy.mjs +25 -15
- package/scripts/release-tail.mjs +19 -2
- package/scripts/resume-from-candidate-run.mjs +106 -103
- package/scripts/run-lifecycle-core.mjs +341 -376
- package/scripts/site-capability-metadata.mjs +4 -0
- package/scripts/stable-candidate-qualification.mjs +9 -10
- package/scripts/v3-v4-capability-catalog.mjs +439 -0
- package/scripts/v4-cross-platform-adopter-qualification.mjs +228 -0
- package/scripts/v4-declarative-promotion-admission.mjs +42 -0
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
|
+
devDeliveryClone as clone,
|
|
2
3
|
devDeliveryContentRoot,
|
|
3
4
|
devDeliveryExactRoot as exactRoot,
|
|
4
5
|
devDeliveryExactSha as exactSha,
|
|
5
6
|
devDeliveryPositiveInteger as positiveInteger,
|
|
6
7
|
devDeliveryText as text,
|
|
8
|
+
devDeliveryTimestamp as timestamp,
|
|
7
9
|
} from "./dev-delivery-common.js";
|
|
10
|
+
import { verifyIntegrationDeliveryProof } from "./dev-delivery-proof.js";
|
|
8
11
|
|
|
9
12
|
export const DEV_DELIVERY_SETTLEMENT_RECEIPT_SCHEMA =
|
|
10
13
|
"kungfu.buildchain.dev-delivery-settlement-receipt/v1";
|
|
14
|
+
export const DEV_DELIVERY_TERMINAL_EVIDENCE_CORRECTION_SCHEMA =
|
|
15
|
+
"kungfu.buildchain.dev-delivery-terminal-evidence-correction/v1";
|
|
11
16
|
|
|
12
17
|
const PROVIDER_FAILURE_FIELDS = [
|
|
13
18
|
"transferRoot",
|
|
@@ -16,6 +21,233 @@ const PROVIDER_FAILURE_FIELDS = [
|
|
|
16
21
|
"sealJobId",
|
|
17
22
|
];
|
|
18
23
|
|
|
24
|
+
function correctionBody(input) {
|
|
25
|
+
const body = clone(input || {});
|
|
26
|
+
delete body.correctionRoot;
|
|
27
|
+
return body;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function normalizeTerminalEvidenceCorrection(
|
|
31
|
+
input,
|
|
32
|
+
{ candidate, repository, protectedBase } = {},
|
|
33
|
+
) {
|
|
34
|
+
const correction = correctionBody(input);
|
|
35
|
+
if (correction.schema !== DEV_DELIVERY_TERMINAL_EVIDENCE_CORRECTION_SCHEMA) {
|
|
36
|
+
throw new Error("unsupported terminal evidence correction schema");
|
|
37
|
+
}
|
|
38
|
+
correction.candidateId = exactRoot(
|
|
39
|
+
correction.candidateId,
|
|
40
|
+
"terminal evidence correction candidateId",
|
|
41
|
+
);
|
|
42
|
+
correction.pullRequestNumber = positiveInteger(
|
|
43
|
+
correction.pullRequestNumber,
|
|
44
|
+
"terminal evidence correction pullRequestNumber",
|
|
45
|
+
);
|
|
46
|
+
correction.sourceHead = exactSha(
|
|
47
|
+
correction.sourceHead,
|
|
48
|
+
"terminal evidence correction sourceHead",
|
|
49
|
+
);
|
|
50
|
+
correction.outcome = text(correction.outcome);
|
|
51
|
+
correction.priorEvidenceRoot = exactRoot(
|
|
52
|
+
correction.priorEvidenceRoot,
|
|
53
|
+
"terminal evidence correction priorEvidenceRoot",
|
|
54
|
+
);
|
|
55
|
+
correction.correctedAt = timestamp(
|
|
56
|
+
correction.correctedAt,
|
|
57
|
+
"terminal evidence correction correctedAt",
|
|
58
|
+
);
|
|
59
|
+
correction.reason = text(correction.reason);
|
|
60
|
+
if (!correction.reason) {
|
|
61
|
+
throw new Error("terminal evidence correction reason is required");
|
|
62
|
+
}
|
|
63
|
+
const verification = verifyIntegrationDeliveryProof(
|
|
64
|
+
correction.integrationProof,
|
|
65
|
+
);
|
|
66
|
+
if (!verification.ok) {
|
|
67
|
+
throw new Error(
|
|
68
|
+
`terminal evidence correction requires an exact integration proof: ${verification.reason}`,
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
if (
|
|
72
|
+
correction.integrationProof.currentBase !==
|
|
73
|
+
correction.integrationProof.mergeGroupHead ||
|
|
74
|
+
correction.integrationProof.replayTree !==
|
|
75
|
+
correction.integrationProof.mergeGroupTree
|
|
76
|
+
) {
|
|
77
|
+
throw new Error(
|
|
78
|
+
"terminal evidence correction requires exact merge-group commit and tree continuity",
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
if (candidate) {
|
|
82
|
+
const checks = {
|
|
83
|
+
candidateId: correction.candidateId === candidate.candidateId,
|
|
84
|
+
pullRequestNumber:
|
|
85
|
+
correction.pullRequestNumber === candidate.pullRequestNumber,
|
|
86
|
+
sourceHead: correction.sourceHead === candidate.sourceHead,
|
|
87
|
+
outcome:
|
|
88
|
+
correction.outcome === candidate.status &&
|
|
89
|
+
correction.outcome === candidate.terminal?.outcome,
|
|
90
|
+
priorEvidenceRoot:
|
|
91
|
+
correction.priorEvidenceRoot === candidate.terminal?.evidenceRoot,
|
|
92
|
+
repository: correction.integrationProof.repository === repository,
|
|
93
|
+
protectedBase:
|
|
94
|
+
correction.integrationProof.protectedBase === protectedBase,
|
|
95
|
+
sourceProofRoot:
|
|
96
|
+
correction.integrationProof.sourceProofRoot ===
|
|
97
|
+
candidate.sourceProofRoot,
|
|
98
|
+
warrantCandidateId:
|
|
99
|
+
correction.integrationProof.warrantCandidateId ===
|
|
100
|
+
candidate.candidateId,
|
|
101
|
+
warrantFencingToken:
|
|
102
|
+
correction.integrationProof.warrantFencingToken ===
|
|
103
|
+
candidate.terminal?.fencingToken,
|
|
104
|
+
warrantGeneration:
|
|
105
|
+
correction.integrationProof.warrantGeneration ===
|
|
106
|
+
candidate.terminal?.leaseGeneration,
|
|
107
|
+
};
|
|
108
|
+
const failed = Object.entries(checks)
|
|
109
|
+
.filter(([, matches]) => !matches)
|
|
110
|
+
.map(([field]) => field);
|
|
111
|
+
if (failed.length > 0) {
|
|
112
|
+
throw new Error(
|
|
113
|
+
`terminal evidence correction identity drift: ${failed.join(", ")}`,
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const correctionRoot = devDeliveryContentRoot(correction);
|
|
118
|
+
if (input?.correctionRoot && input.correctionRoot !== correctionRoot) {
|
|
119
|
+
throw new Error("terminal evidence correction root drift");
|
|
120
|
+
}
|
|
121
|
+
return { ...correction, correctionRoot };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function effectiveTerminalEvidenceRoot(candidate) {
|
|
125
|
+
return (
|
|
126
|
+
candidate?.terminal?.integrationEvidenceCorrection?.integrationProof
|
|
127
|
+
?.proofRoot ||
|
|
128
|
+
candidate?.terminal?.evidenceRoot ||
|
|
129
|
+
""
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export function createTerminalEvidenceCorrection(
|
|
134
|
+
candidate,
|
|
135
|
+
input,
|
|
136
|
+
{ repository, protectedBase, now } = {},
|
|
137
|
+
) {
|
|
138
|
+
return normalizeTerminalEvidenceCorrection(
|
|
139
|
+
{
|
|
140
|
+
schema: DEV_DELIVERY_TERMINAL_EVIDENCE_CORRECTION_SCHEMA,
|
|
141
|
+
candidateId: candidate?.candidateId,
|
|
142
|
+
pullRequestNumber: candidate?.pullRequestNumber,
|
|
143
|
+
sourceHead: candidate?.sourceHead,
|
|
144
|
+
outcome: candidate?.status,
|
|
145
|
+
priorEvidenceRoot: input?.expectedPriorEvidenceRoot,
|
|
146
|
+
integrationProof: input?.integrationProof,
|
|
147
|
+
correctedAt: now,
|
|
148
|
+
reason: input?.reason,
|
|
149
|
+
},
|
|
150
|
+
{ candidate, repository, protectedBase },
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function createDevDeliveryTerminalEvidenceReconciler({
|
|
155
|
+
normalizeQueue,
|
|
156
|
+
transition,
|
|
157
|
+
}) {
|
|
158
|
+
return function reconcileDevDeliveryTerminalEvidence(
|
|
159
|
+
queueInput,
|
|
160
|
+
input,
|
|
161
|
+
{ now = new Date().toISOString() } = {},
|
|
162
|
+
) {
|
|
163
|
+
const before = normalizeQueue(queueInput);
|
|
164
|
+
const candidate = before.candidates.find(
|
|
165
|
+
(entry) =>
|
|
166
|
+
entry.candidateId === exactRoot(input?.candidateId, "candidateId"),
|
|
167
|
+
);
|
|
168
|
+
if (!candidate)
|
|
169
|
+
throw new Error("terminal evidence candidate does not exist");
|
|
170
|
+
if (candidate.status !== "merged") {
|
|
171
|
+
throw new Error(
|
|
172
|
+
"integration evidence correction requires a merged candidate",
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
const existing = candidate.terminal?.integrationEvidenceCorrection;
|
|
176
|
+
const correction = createTerminalEvidenceCorrection(candidate, input, {
|
|
177
|
+
repository: before.repository,
|
|
178
|
+
protectedBase: before.protectedBase,
|
|
179
|
+
now: existing?.correctedAt || timestamp(now, "now"),
|
|
180
|
+
});
|
|
181
|
+
if (existing) {
|
|
182
|
+
if (existing.correctionRoot !== correction.correctionRoot) {
|
|
183
|
+
throw new Error(
|
|
184
|
+
"terminal evidence correction already exists with different evidence",
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
const receipt = {
|
|
188
|
+
schema: DEV_DELIVERY_SETTLEMENT_RECEIPT_SCHEMA,
|
|
189
|
+
action: "duplicate-terminal-evidence-correction-noop",
|
|
190
|
+
applicable: true,
|
|
191
|
+
repository: before.repository,
|
|
192
|
+
protectedBase: before.protectedBase,
|
|
193
|
+
candidateId: candidate.candidateId,
|
|
194
|
+
pullRequestNumber: candidate.pullRequestNumber,
|
|
195
|
+
sourceHead: candidate.sourceHead,
|
|
196
|
+
outcome: candidate.status,
|
|
197
|
+
priorEvidenceRoot: candidate.terminal.evidenceRoot,
|
|
198
|
+
evidenceRoot: correction.integrationProof.proofRoot,
|
|
199
|
+
correctionRoot: correction.correctionRoot,
|
|
200
|
+
expectedOldStateRoot: before.stateRoot,
|
|
201
|
+
nextStateRoot: before.stateRoot,
|
|
202
|
+
nextAction:
|
|
203
|
+
"Retain the exact verified integration evidence correction.",
|
|
204
|
+
};
|
|
205
|
+
return {
|
|
206
|
+
queue: before,
|
|
207
|
+
receipt,
|
|
208
|
+
receiptRoot: devDeliveryContentRoot(receipt),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
const transaction = transition(
|
|
212
|
+
before,
|
|
213
|
+
(queue) => {
|
|
214
|
+
const mutable = queue.candidates.find(
|
|
215
|
+
(entry) => entry.candidateId === candidate.candidateId,
|
|
216
|
+
);
|
|
217
|
+
mutable.terminal = {
|
|
218
|
+
...mutable.terminal,
|
|
219
|
+
integrationEvidenceCorrection: correction,
|
|
220
|
+
};
|
|
221
|
+
return { candidate: mutable };
|
|
222
|
+
},
|
|
223
|
+
correction.correctedAt,
|
|
224
|
+
);
|
|
225
|
+
const receipt = {
|
|
226
|
+
schema: DEV_DELIVERY_SETTLEMENT_RECEIPT_SCHEMA,
|
|
227
|
+
action: "terminal-evidence-corrected",
|
|
228
|
+
applicable: true,
|
|
229
|
+
repository: transaction.after.repository,
|
|
230
|
+
protectedBase: transaction.after.protectedBase,
|
|
231
|
+
candidateId: candidate.candidateId,
|
|
232
|
+
pullRequestNumber: candidate.pullRequestNumber,
|
|
233
|
+
sourceHead: candidate.sourceHead,
|
|
234
|
+
outcome: candidate.status,
|
|
235
|
+
priorEvidenceRoot: candidate.terminal.evidenceRoot,
|
|
236
|
+
evidenceRoot: correction.integrationProof.proofRoot,
|
|
237
|
+
correctionRoot: correction.correctionRoot,
|
|
238
|
+
expectedOldStateRoot: transaction.expectedOldStateRoot,
|
|
239
|
+
nextStateRoot: transaction.after.stateRoot,
|
|
240
|
+
nextAction:
|
|
241
|
+
"Read back the corrected terminal candidate and repeat settlement idempotently.",
|
|
242
|
+
};
|
|
243
|
+
return {
|
|
244
|
+
queue: transaction.after,
|
|
245
|
+
receipt,
|
|
246
|
+
receiptRoot: devDeliveryContentRoot(receipt),
|
|
247
|
+
};
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
|
|
19
251
|
export function normalizeProviderFailureAuthorityBinding(
|
|
20
252
|
input = {},
|
|
21
253
|
{ required = false } = {},
|
|
@@ -56,7 +288,7 @@ function noopReceipt(queue, identity, candidate, action, details = {}) {
|
|
|
56
288
|
outcome: identity.outcome,
|
|
57
289
|
candidateId: candidate?.candidateId || null,
|
|
58
290
|
evidenceRoot:
|
|
59
|
-
candidate
|
|
291
|
+
effectiveTerminalEvidenceRoot(candidate) || identity.evidenceRoot || null,
|
|
60
292
|
expectedOldStateRoot: queue.stateRoot,
|
|
61
293
|
nextStateRoot: queue.stateRoot,
|
|
62
294
|
nextAction: "No fenced delivery state remains for this terminal event.",
|
|
@@ -95,7 +327,7 @@ function settleTerminalCandidate(queue, identity, candidate) {
|
|
|
95
327
|
"duplicate terminal event provider failure authority drift",
|
|
96
328
|
);
|
|
97
329
|
}
|
|
98
|
-
if (candidate
|
|
330
|
+
if (effectiveTerminalEvidenceRoot(candidate) !== identity.evidenceRoot) {
|
|
99
331
|
throw new Error("duplicate terminal event evidenceRoot drift");
|
|
100
332
|
}
|
|
101
333
|
const receipt = noopReceipt(
|
|
@@ -103,6 +335,7 @@ function settleTerminalCandidate(queue, identity, candidate) {
|
|
|
103
335
|
identity,
|
|
104
336
|
candidate,
|
|
105
337
|
"duplicate-terminal-event-noop",
|
|
338
|
+
{ successorWake: candidate.terminal?.successorWake || null },
|
|
106
339
|
);
|
|
107
340
|
return { queue, receipt, receiptRoot: devDeliveryContentRoot(receipt) };
|
|
108
341
|
}
|
|
@@ -207,7 +440,10 @@ export function createDevDeliveryTerminalSettler({
|
|
|
207
440
|
throw new Error("stale fencing token");
|
|
208
441
|
if (leaseGeneration !== queue.activeWarrant.generation)
|
|
209
442
|
throw new Error("stale lease generation");
|
|
210
|
-
if (
|
|
443
|
+
if (
|
|
444
|
+
identity.outcome === "dequeued" &&
|
|
445
|
+
queue.activeWarrant.phase === "provisional"
|
|
446
|
+
) {
|
|
211
447
|
return retainDequeuedWarrant(
|
|
212
448
|
queue,
|
|
213
449
|
identity,
|
|
@@ -19,7 +19,10 @@ import {
|
|
|
19
19
|
normalizeNativeCommandContract,
|
|
20
20
|
validateActiveDevDeliveryWarrant,
|
|
21
21
|
} from "./dev-delivery-native-proof.js";
|
|
22
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
normalizeProviderFailureAuthorityBinding,
|
|
24
|
+
normalizeTerminalEvidenceCorrection,
|
|
25
|
+
} from "./dev-delivery-warrant-settlement.js";
|
|
23
26
|
import {
|
|
24
27
|
compareReleaseBlockerPriority,
|
|
25
28
|
normalizeReleaseBlockerPriorityClaim,
|
|
@@ -244,8 +247,18 @@ function normalizeCandidate(input, expected) {
|
|
|
244
247
|
"provider failure authority can exist only on terminal-failure state",
|
|
245
248
|
);
|
|
246
249
|
}
|
|
247
|
-
if (failureAuthority)
|
|
250
|
+
if (failureAuthority)
|
|
248
251
|
candidate.terminal = { ...candidate.terminal, ...failureAuthority };
|
|
252
|
+
if (candidate.terminal.integrationEvidenceCorrection) {
|
|
253
|
+
candidate.terminal.integrationEvidenceCorrection =
|
|
254
|
+
normalizeTerminalEvidenceCorrection(
|
|
255
|
+
candidate.terminal.integrationEvidenceCorrection,
|
|
256
|
+
{
|
|
257
|
+
candidate,
|
|
258
|
+
repository: expected.repository,
|
|
259
|
+
protectedBase: expected.protectedBase,
|
|
260
|
+
},
|
|
261
|
+
);
|
|
249
262
|
}
|
|
250
263
|
}
|
|
251
264
|
if (Object.hasOwn(input, "affectedPaths")) {
|
|
@@ -11,7 +11,9 @@ import {
|
|
|
11
11
|
createCancelQueuedDevDeliveryCandidate,
|
|
12
12
|
} from "./dev-delivery-warrant-cancellation.js";
|
|
13
13
|
import {
|
|
14
|
+
createDevDeliveryTerminalEvidenceReconciler,
|
|
14
15
|
DEV_DELIVERY_SETTLEMENT_RECEIPT_SCHEMA,
|
|
16
|
+
DEV_DELIVERY_TERMINAL_EVIDENCE_CORRECTION_SCHEMA,
|
|
15
17
|
createDevDeliveryTerminalSettler,
|
|
16
18
|
normalizeProviderFailureAuthorityBinding,
|
|
17
19
|
} from "./dev-delivery-warrant-settlement.js";
|
|
@@ -91,6 +93,7 @@ export {
|
|
|
91
93
|
};
|
|
92
94
|
export { DEV_DELIVERY_CANCELLATION_RECEIPT_SCHEMA };
|
|
93
95
|
export { DEV_DELIVERY_SETTLEMENT_RECEIPT_SCHEMA };
|
|
96
|
+
export { DEV_DELIVERY_TERMINAL_EVIDENCE_CORRECTION_SCHEMA };
|
|
94
97
|
|
|
95
98
|
export function selectDevDeliveryWarrant(
|
|
96
99
|
queueInput,
|
|
@@ -437,6 +440,10 @@ export function closeDevDeliveryWarrant(
|
|
|
437
440
|
...(failureAuthority || {}),
|
|
438
441
|
};
|
|
439
442
|
queue.activeWarrant = null;
|
|
443
|
+
candidate.terminal.successorWake = createDevDeliverySuccessorWake(
|
|
444
|
+
queue,
|
|
445
|
+
currentTime,
|
|
446
|
+
);
|
|
440
447
|
return { candidate, active };
|
|
441
448
|
},
|
|
442
449
|
currentTime,
|
|
@@ -453,10 +460,7 @@ export function closeDevDeliveryWarrant(
|
|
|
453
460
|
...(failureAuthority || {}),
|
|
454
461
|
expectedOldStateRoot: transaction.expectedOldStateRoot,
|
|
455
462
|
nextStateRoot: transaction.after.stateRoot,
|
|
456
|
-
successorWake:
|
|
457
|
-
transaction.after,
|
|
458
|
-
currentTime,
|
|
459
|
-
),
|
|
463
|
+
successorWake: transaction.result.candidate.terminal.successorWake,
|
|
460
464
|
nextAction: "Select the next queued candidate, if any.",
|
|
461
465
|
};
|
|
462
466
|
return {
|
|
@@ -514,6 +518,11 @@ export const settleDevDeliveryTerminalEvent = createDevDeliveryTerminalSettler({
|
|
|
514
518
|
cancelQueued: cancelQueuedDevDeliveryCandidate,
|
|
515
519
|
terminalStates: TERMINAL_STATES,
|
|
516
520
|
});
|
|
521
|
+
export const reconcileDevDeliveryTerminalEvidence =
|
|
522
|
+
createDevDeliveryTerminalEvidenceReconciler({
|
|
523
|
+
normalizeQueue: normalizeDevDeliveryQueue,
|
|
524
|
+
transition,
|
|
525
|
+
});
|
|
517
526
|
export function observeDevDeliveryQueue(
|
|
518
527
|
queueInput,
|
|
519
528
|
{ now = new Date().toISOString(), allowLegacyV3Readback = false } = {},
|
|
@@ -543,6 +552,14 @@ export function observeDevDeliveryQueue(
|
|
|
543
552
|
) || null
|
|
544
553
|
: null,
|
|
545
554
|
states,
|
|
555
|
+
pendingSuccessorWakes: queue.candidates
|
|
556
|
+
.filter((candidate) => candidate.terminal?.successorWake)
|
|
557
|
+
.map((candidate) => ({
|
|
558
|
+
pullRequestNumber: candidate.pullRequestNumber,
|
|
559
|
+
sourceHead: candidate.sourceHead,
|
|
560
|
+
outcome: candidate.status,
|
|
561
|
+
successorWake: candidate.terminal.successorWake,
|
|
562
|
+
})),
|
|
546
563
|
queued: queued.map((entry, index) => ({
|
|
547
564
|
position: index + 1,
|
|
548
565
|
candidateId: entry.candidate.candidateId,
|
|
@@ -110,6 +110,8 @@ const PUBLIC_REPOSITORY_TARGETS = Object.freeze({
|
|
|
110
110
|
"site-libkungfu-dev": [
|
|
111
111
|
target("main", [check("web-surface / Record web-surface controller receipt")], false),
|
|
112
112
|
],
|
|
113
|
+
taolu: ["dev", "alpha", "release"].map((family) => target(`${family}/v1/v1.0`,
|
|
114
|
+
[check("build / Summarize build contract"), check("stage-capsule / Reconcile exact three-platform evidence")], false)),
|
|
113
115
|
});
|
|
114
116
|
const PUBLIC_REPOSITORIES = Object.freeze(Object.keys(PUBLIC_REPOSITORY_TARGETS).sort());
|
|
115
117
|
const PROTECTED_AUTHORITY_PATHS = Object.freeze([
|
|
@@ -497,10 +499,8 @@ export function createBuildchainGithubGovernanceAuthority() {
|
|
|
497
499
|
privateRepositoryPolicy: "excluded-from-managed-zone",
|
|
498
500
|
unknownRepositoryPolicy: "non-authoritative-until-explicit-admission",
|
|
499
501
|
baseline: {
|
|
500
|
-
observedOn: "2026-
|
|
501
|
-
|
|
502
|
-
publicCount: 16,
|
|
503
|
-
privateCount: 0,
|
|
502
|
+
observedOn: "2026-08-28", repositoryCount: 17,
|
|
503
|
+
publicCount: 17, privateCount: 0,
|
|
504
504
|
authoritativePublicTargetCount: Object.values(PUBLIC_REPOSITORY_TARGETS)
|
|
505
505
|
.reduce((count, targets) => count + targets.length, 0),
|
|
506
506
|
},
|
package/packages/core/index.js
CHANGED
|
@@ -646,6 +646,7 @@ export {
|
|
|
646
646
|
export * from "./release-propagation.js";
|
|
647
647
|
export * from "./v4-floating-consumer-policy.js";
|
|
648
648
|
export * from "./v4-runtime-ref-resume-authority.js";
|
|
649
|
+
export * from "./v4-publication-qualification.js";
|
|
649
650
|
|
|
650
651
|
export {
|
|
651
652
|
RELEASE_ACTIVATION_CONTRACT,
|