@kungfu-tech/buildchain 3.0.9-alpha.7 → 3.0.9-alpha.9
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/bin/buildchain.mjs +5 -1
- package/contracts/dev-delivery-authority-v2.schema.json +253 -0
- package/dist/site/agent-index.json +1 -0
- package/dist/site/artifact-schemas.json +2 -0
- package/dist/site/buildchain-contract.json +7 -7
- package/dist/site/buildchain-site.json +135 -19
- package/dist/site/capability-registry.json +2 -2
- package/dist/site/cli-registry.json +23 -0
- package/dist/site/kfd-claims.json +33 -8
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/manual-registry.json +4 -4
- package/dist/site/node-api-registry.json +907 -143
- package/dist/site/page-registry.json +127 -11
- package/dist/site/public-surface-audit.json +228 -7
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/release-provenance.json +2 -0
- package/dist/site/schemas/dev-delivery-authority-v2.schema.json +442 -0
- package/dist/site/site-manifest.json +8 -8
- package/dist/site/workflow-registry.json +8 -6
- package/docs/MAP.md +1 -0
- package/docs/cli-reference.md +121 -0
- package/docs/dev-delivery-qualification-landing-adr.md +137 -0
- package/docs/dev-delivery-warrant.md +106 -13
- package/docs/node-api-reference.md +51 -20
- package/docs/versioning.md +2 -0
- package/package.json +4 -2
- package/packages/core/buildchain-channel-identity.js +2 -3
- package/packages/core/dev-delivery-authority.js +996 -0
- package/packages/core/dev-delivery-native-proof.js +89 -4
- package/packages/core/dev-delivery-warrant-settlement.js +65 -22
- package/packages/core/dev-delivery-warrant.js +92 -44
- package/scripts/buildchain-cli-help.mjs +3 -0
- package/scripts/check-inventory.mjs +1 -1
- package/scripts/dev-delivery-authority.mjs +368 -0
- package/scripts/dev-delivery-native-run.mjs +52 -4
- package/scripts/dev-delivery-proof.mjs +10 -0
- package/scripts/dev-delivery-two-phase-resume.mjs +90 -0
- package/scripts/dev-delivery-two-phase.mjs +31 -52
- package/scripts/dev-delivery-warrant.mjs +9 -2
- package/scripts/generate-site-bundle.mjs +6 -3
- package/scripts/site-capability-metadata.mjs +13 -1
- package/scripts/workflow-call-contract.mjs +1 -1
- package/templates/native-dev-delivery.yml +17 -13
|
@@ -4,11 +4,15 @@ import fs from "node:fs";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
|
-
createNativeProofReuseDecision,
|
|
8
7
|
createNativeQualificationProof,
|
|
9
8
|
devDeliveryContentRoot,
|
|
10
9
|
} from "../packages/core/dev-delivery-warrant.js";
|
|
11
10
|
import { runNativeWithHeartbeat } from "./dev-delivery-native-run.mjs";
|
|
11
|
+
import {
|
|
12
|
+
attributedGitHubBaseDelta,
|
|
13
|
+
classifyNativeProofAgainstCurrent,
|
|
14
|
+
replayQualifiedNativeWarrant,
|
|
15
|
+
} from "./dev-delivery-two-phase-resume.mjs";
|
|
12
16
|
import { runDevDeliveryCommand } from "./dev-delivery-warrant.mjs";
|
|
13
17
|
|
|
14
18
|
function flag(args, name, fallback = "") {
|
|
@@ -111,31 +115,17 @@ export class GitHubTwoPhaseClient {
|
|
|
111
115
|
|
|
112
116
|
async baseDelta(previousBase, currentBase) {
|
|
113
117
|
if (previousBase === currentBase) {
|
|
114
|
-
return {
|
|
118
|
+
return {
|
|
119
|
+
graphKnown: true,
|
|
120
|
+
attributionComplete: true,
|
|
121
|
+
changedPaths: [],
|
|
122
|
+
renames: [],
|
|
123
|
+
};
|
|
115
124
|
}
|
|
116
125
|
const data = await this.request(
|
|
117
126
|
`/repos/${this.repository}/compare/${previousBase}...${currentBase}`,
|
|
118
127
|
);
|
|
119
|
-
|
|
120
|
-
const graphKnown =
|
|
121
|
-
data.status === "ahead" &&
|
|
122
|
-
data.merge_base_commit?.sha === previousBase &&
|
|
123
|
-
files.length < 300;
|
|
124
|
-
return {
|
|
125
|
-
graphKnown,
|
|
126
|
-
changedPaths: graphKnown
|
|
127
|
-
? [
|
|
128
|
-
...new Set(
|
|
129
|
-
files
|
|
130
|
-
.flatMap((entry) => [
|
|
131
|
-
String(entry.filename || ""),
|
|
132
|
-
String(entry.previous_filename || ""),
|
|
133
|
-
])
|
|
134
|
-
.filter(Boolean),
|
|
135
|
-
),
|
|
136
|
-
].sort()
|
|
137
|
-
: [],
|
|
138
|
-
};
|
|
128
|
+
return attributedGitHubBaseDelta(data, previousBase);
|
|
139
129
|
}
|
|
140
130
|
|
|
141
131
|
async wake(eventType, candidate) {
|
|
@@ -143,26 +133,13 @@ export class GitHubTwoPhaseClient {
|
|
|
143
133
|
method: "POST",
|
|
144
134
|
body: {
|
|
145
135
|
event_type: eventType,
|
|
146
|
-
|
|
136
|
+
// Preserve every binding in one property under GitHub's ten-property limit.
|
|
137
|
+
client_payload: { candidate },
|
|
147
138
|
},
|
|
148
139
|
});
|
|
149
140
|
}
|
|
150
141
|
}
|
|
151
142
|
|
|
152
|
-
function semanticCurrent(options, currentBase, delta) {
|
|
153
|
-
return {
|
|
154
|
-
sourceIdentityRoot: options.sourceIdentityRoot,
|
|
155
|
-
sourcePatchRoot: options.sourcePatchRoot,
|
|
156
|
-
planRoot: options.planRoot,
|
|
157
|
-
closureRoot: options.closureRoot,
|
|
158
|
-
dependencyRoot: options.dependencyRoot,
|
|
159
|
-
toolchainRoot: options.toolchainRoot,
|
|
160
|
-
currentBase,
|
|
161
|
-
graphKnown: delta.graphKnown,
|
|
162
|
-
changedPaths: delta.changedPaths,
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
|
|
166
143
|
export function composeCandidate(candidateDirectory, expectedHead, baseSha) {
|
|
167
144
|
try {
|
|
168
145
|
execFileSync("git", ["-C", candidateDirectory, "merge", "--abort"], {
|
|
@@ -193,16 +170,6 @@ export function composeCandidate(candidateDirectory, expectedHead, baseSha) {
|
|
|
193
170
|
);
|
|
194
171
|
}
|
|
195
172
|
|
|
196
|
-
async function classifyAgainstCurrent(proof, options, client) {
|
|
197
|
-
const currentBase = await client.baseSha(options.branch);
|
|
198
|
-
const delta = await client.baseDelta(proof.qualifiedBase, currentBase);
|
|
199
|
-
const current = semanticCurrent(options, currentBase, delta);
|
|
200
|
-
return {
|
|
201
|
-
current,
|
|
202
|
-
decision: createNativeProofReuseDecision({ proof, current }),
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
|
|
206
173
|
async function releaseFailedAttempt({
|
|
207
174
|
error,
|
|
208
175
|
options,
|
|
@@ -290,9 +257,9 @@ export async function runTwoPhaseDelivery(options, dependencies = {}) {
|
|
|
290
257
|
const warrantResult = readJson(options.warrantResultPath, "Warrant result");
|
|
291
258
|
const warrant =
|
|
292
259
|
warrantResult.observation?.activeWarrant || warrantResult.warrant;
|
|
293
|
-
if (!warrant || warrant.phase
|
|
260
|
+
if (!warrant || !["provisional", "qualified"].includes(warrant.phase)) {
|
|
294
261
|
throw new Error(
|
|
295
|
-
"two-phase delivery requires an active provisional Warrant",
|
|
262
|
+
"two-phase delivery requires an active provisional or qualified Warrant",
|
|
296
263
|
);
|
|
297
264
|
}
|
|
298
265
|
if (
|
|
@@ -303,11 +270,13 @@ export async function runTwoPhaseDelivery(options, dependencies = {}) {
|
|
|
303
270
|
}
|
|
304
271
|
const evidenceDirectory = path.resolve(options.evidenceDirectory);
|
|
305
272
|
fs.mkdirSync(evidenceDirectory, { recursive: true });
|
|
273
|
+
const qualifiedReplay = await replayQualifiedNativeWarrant({ warrant, pullRequestNumber: options.pullRequestNumber, expectedHead: options.expectedHead, exactPullRequestHead: (...args) => client.exactPullRequestHead(...args) });
|
|
274
|
+
if (qualifiedReplay) return qualifiedReplay;
|
|
306
275
|
let proof = options.nativeProofPath
|
|
307
276
|
? readJson(options.nativeProofPath, "native proof")
|
|
308
277
|
: null;
|
|
309
278
|
let classified = proof
|
|
310
|
-
? await
|
|
279
|
+
? await classifyNativeProofAgainstCurrent(proof, options, client)
|
|
311
280
|
: null;
|
|
312
281
|
let nativeAttempts = 0;
|
|
313
282
|
|
|
@@ -318,7 +287,7 @@ export async function runTwoPhaseDelivery(options, dependencies = {}) {
|
|
|
318
287
|
options.pullRequestNumber,
|
|
319
288
|
options.expectedHead,
|
|
320
289
|
);
|
|
321
|
-
classified = await
|
|
290
|
+
classified = await classifyNativeProofAgainstCurrent(proof, options, client);
|
|
322
291
|
if (classified.decision.reusable) break;
|
|
323
292
|
}
|
|
324
293
|
if (nativeAttempts >= 2) break;
|
|
@@ -383,6 +352,7 @@ export async function runTwoPhaseDelivery(options, dependencies = {}) {
|
|
|
383
352
|
closureRoot: options.closureRoot,
|
|
384
353
|
dependencyRoot: options.dependencyRoot,
|
|
385
354
|
toolchainRoot: options.toolchainRoot,
|
|
355
|
+
environmentRoot: options.environmentRoot,
|
|
386
356
|
qualifiedBase,
|
|
387
357
|
affectedPaths: options.affectedPaths,
|
|
388
358
|
shardEvidenceRoots: [
|
|
@@ -391,7 +361,8 @@ export async function runTwoPhaseDelivery(options, dependencies = {}) {
|
|
|
391
361
|
],
|
|
392
362
|
qualifiedAt: new Date().toISOString(),
|
|
393
363
|
});
|
|
394
|
-
|
|
364
|
+
writeJson(path.join(evidenceDirectory, "native-proof.json"), proof);
|
|
365
|
+
classified = await classifyNativeProofAgainstCurrent(proof, options, client);
|
|
395
366
|
}
|
|
396
367
|
|
|
397
368
|
if (!classified?.decision.reusable) {
|
|
@@ -417,7 +388,9 @@ export async function runTwoPhaseDelivery(options, dependencies = {}) {
|
|
|
417
388
|
),
|
|
418
389
|
currentBase: classified.current.currentBase,
|
|
419
390
|
graphKnown: classified.current.graphKnown,
|
|
391
|
+
attributionComplete: classified.current.attributionComplete,
|
|
420
392
|
changedPaths: JSON.stringify(classified.current.changedPaths),
|
|
393
|
+
renames: JSON.stringify(classified.current.renames),
|
|
421
394
|
execute: true,
|
|
422
395
|
token: options.token,
|
|
423
396
|
apiUrl: options.apiUrl,
|
|
@@ -434,6 +407,7 @@ export async function runTwoPhaseDelivery(options, dependencies = {}) {
|
|
|
434
407
|
nativeProofRoot: proof.proofRoot,
|
|
435
408
|
nativeReuseDecisionRoot: classified.decision.decisionRoot,
|
|
436
409
|
qualificationReceiptRoot: qualified.receiptRoot,
|
|
410
|
+
landingAuthority: false,
|
|
437
411
|
qualifiedWarrant: qualified.observation.activeWarrant,
|
|
438
412
|
};
|
|
439
413
|
} catch (error) {
|
|
@@ -521,6 +495,11 @@ function cliOptions(args, environment = process.env) {
|
|
|
521
495
|
"toolchain-root",
|
|
522
496
|
environment.BUILDCHAIN_DEV_DELIVERY_TOOLCHAIN_ROOT,
|
|
523
497
|
),
|
|
498
|
+
environmentRoot: flag(
|
|
499
|
+
args,
|
|
500
|
+
"environment-root",
|
|
501
|
+
environment.BUILDCHAIN_DEV_DELIVERY_ENVIRONMENT_ROOT,
|
|
502
|
+
),
|
|
524
503
|
affectedPaths: jsonList(
|
|
525
504
|
flag(
|
|
526
505
|
args,
|
|
@@ -73,13 +73,14 @@ function decodeBlob(blob) {
|
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
export class GitHubDevDeliveryStore {
|
|
76
|
-
constructor({ repository, token, apiUrl = "https://api.github.com", fetchImpl = globalThis.fetch } = {}) {
|
|
76
|
+
constructor({ repository, token, apiUrl = "https://api.github.com", fetchImpl = globalThis.fetch, createInitialState = createDevDeliveryQueue } = {}) {
|
|
77
77
|
this.repository = normalizeRepository(repository);
|
|
78
78
|
if (!fetchImpl) throw new Error("fetch is required");
|
|
79
79
|
if (!token) throw new Error("GITHUB_TOKEN is required for the GitHub dev delivery store");
|
|
80
80
|
this.token = token;
|
|
81
81
|
this.apiUrl = apiUrl.replace(/\/+$/, "");
|
|
82
82
|
this.fetch = fetchImpl;
|
|
83
|
+
this.createInitialState = createInitialState;
|
|
83
84
|
}
|
|
84
85
|
|
|
85
86
|
async request(method, requestPath, body) {
|
|
@@ -113,7 +114,7 @@ export class GitHubDevDeliveryStore {
|
|
|
113
114
|
return {
|
|
114
115
|
exists: false,
|
|
115
116
|
commitSha: "",
|
|
116
|
-
queue:
|
|
117
|
+
queue: this.createInitialState({
|
|
117
118
|
repository: this.repository.fullName,
|
|
118
119
|
protectedBase,
|
|
119
120
|
now,
|
|
@@ -206,6 +207,7 @@ function transitionFor(command, queue, options) {
|
|
|
206
207
|
closureRoot: exactRoot(options.closureRoot, "closureRoot"),
|
|
207
208
|
dependencyRoot: exactRoot(options.dependencyRoot, "dependencyRoot"),
|
|
208
209
|
toolchainRoot: exactRoot(options.toolchainRoot, "toolchainRoot"),
|
|
210
|
+
...(options.environmentRoot ? { environmentRoot: exactRoot(options.environmentRoot, "environmentRoot") } : {}),
|
|
209
211
|
affectedPaths: jsonList(options.affectedPaths, "affected paths"),
|
|
210
212
|
sourceWorkflowRunId: options.sourceWorkflowRunId ? positiveInteger(options.sourceWorkflowRunId, "sourceWorkflowRunId") : 0,
|
|
211
213
|
deliveryClass: options.deliveryClass,
|
|
@@ -233,7 +235,9 @@ function transitionFor(command, queue, options) {
|
|
|
233
235
|
current: {
|
|
234
236
|
currentBase: options.currentBase,
|
|
235
237
|
graphKnown: options.graphKnown,
|
|
238
|
+
attributionComplete: options.attributionComplete,
|
|
236
239
|
changedPaths: jsonList(options.changedPaths, "changed paths"),
|
|
240
|
+
renames: jsonList(options.renames, "renames"),
|
|
237
241
|
},
|
|
238
242
|
now: options.now,
|
|
239
243
|
});
|
|
@@ -426,10 +430,13 @@ export function devDeliveryCliOptions(args = [], environment = process.env) {
|
|
|
426
430
|
currentBase: flag(rest, "current-base", environment.BUILDCHAIN_DEV_DELIVERY_CURRENT_BASE),
|
|
427
431
|
changedPaths: flag(rest, "changed-paths-json", environment.BUILDCHAIN_DEV_DELIVERY_CHANGED_PATHS || "[]"),
|
|
428
432
|
graphKnown: ["1", "true", "yes", "on"].includes(flag(rest, "graph-known", environment.BUILDCHAIN_DEV_DELIVERY_GRAPH_KNOWN).trim().toLowerCase()),
|
|
433
|
+
attributionComplete: ["1", "true", "yes", "on"].includes(flag(rest, "attribution-complete", environment.BUILDCHAIN_DEV_DELIVERY_ATTRIBUTION_COMPLETE).trim().toLowerCase()),
|
|
434
|
+
renames: flag(rest, "renames-json", environment.BUILDCHAIN_DEV_DELIVERY_RENAMES || "[]"),
|
|
429
435
|
planRoot: flag(rest, "plan-root", environment.BUILDCHAIN_DEV_DELIVERY_PLAN_ROOT),
|
|
430
436
|
closureRoot: flag(rest, "closure-root", environment.BUILDCHAIN_DEV_DELIVERY_CLOSURE_ROOT),
|
|
431
437
|
dependencyRoot: flag(rest, "dependency-root", environment.BUILDCHAIN_DEV_DELIVERY_DEPENDENCY_ROOT),
|
|
432
438
|
toolchainRoot: flag(rest, "toolchain-root", environment.BUILDCHAIN_DEV_DELIVERY_TOOLCHAIN_ROOT),
|
|
439
|
+
environmentRoot: flag(rest, "environment-root", environment.BUILDCHAIN_DEV_DELIVERY_ENVIRONMENT_ROOT),
|
|
433
440
|
deliveryClass: flag(rest, "delivery-class", environment.BUILDCHAIN_DEV_DELIVERY_CLASS),
|
|
434
441
|
priority: flag(rest, "priority", environment.BUILDCHAIN_DEV_DELIVERY_PRIORITY || "ordinary"),
|
|
435
442
|
fencingToken: flag(rest, "fencing-token", environment.BUILDCHAIN_DEV_DELIVERY_FENCING_TOKEN),
|
|
@@ -931,7 +931,7 @@ function buildSiteBundle() {
|
|
|
931
931
|
"schemas/release-tail-capabilities-v1.schema.json",
|
|
932
932
|
"schemas/release-tail-provider-bindings-v1.schema.json",
|
|
933
933
|
"schemas/kfd-agent-hub-adoption.schema.json",
|
|
934
|
-
"schemas/kfd-product-gate-input-v1.schema.json",
|
|
934
|
+
"schemas/kfd-product-gate-input-v1.schema.json", "schemas/dev-delivery-authority-v2.schema.json",
|
|
935
935
|
"kfd-support.json",
|
|
936
936
|
"artifact-evidence.json",
|
|
937
937
|
"product-mechanism.json",
|
|
@@ -968,7 +968,7 @@ function buildSiteBundle() {
|
|
|
968
968
|
"schemas/release-tail-capabilities-v1.schema.json",
|
|
969
969
|
"schemas/release-tail-provider-bindings-v1.schema.json",
|
|
970
970
|
"schemas/kfd-agent-hub-adoption.schema.json",
|
|
971
|
-
"schemas/kfd-product-gate-input-v1.schema.json",
|
|
971
|
+
"schemas/kfd-product-gate-input-v1.schema.json", "schemas/dev-delivery-authority-v2.schema.json",
|
|
972
972
|
"buildchain-contract.json",
|
|
973
973
|
"kfd-claims.json",
|
|
974
974
|
"product-mechanism.json",
|
|
@@ -1101,7 +1101,7 @@ function buildSiteBundle() {
|
|
|
1101
1101
|
"schemas/release-tail-capabilities-v1.schema.json",
|
|
1102
1102
|
"schemas/release-tail-provider-bindings-v1.schema.json",
|
|
1103
1103
|
"schemas/kfd-agent-hub-adoption.schema.json",
|
|
1104
|
-
"schemas/kfd-product-gate-input-v1.schema.json",
|
|
1104
|
+
"schemas/kfd-product-gate-input-v1.schema.json", "schemas/dev-delivery-authority-v2.schema.json",
|
|
1105
1105
|
"buildchain-contract.json",
|
|
1106
1106
|
"kfd-upstream-aggregate.json",
|
|
1107
1107
|
"kfd-claims.json",
|
|
@@ -1285,6 +1285,9 @@ function buildSiteBundle() {
|
|
|
1285
1285
|
),
|
|
1286
1286
|
"schemas/kfd-agent-hub-adoption.schema.json": KFD_AGENT_HUB_ADOPTION_SCHEMA,
|
|
1287
1287
|
"schemas/kfd-product-gate-input-v1.schema.json": KFD_PRODUCT_GATE_INPUT_SCHEMA,
|
|
1288
|
+
"schemas/dev-delivery-authority-v2.schema.json": readJson(
|
|
1289
|
+
"contracts/dev-delivery-authority-v2.schema.json",
|
|
1290
|
+
),
|
|
1288
1291
|
"badge-endpoint-registry.json": badgeEndpointRegistry,
|
|
1289
1292
|
"publication-registry.json": publicationRegistry,
|
|
1290
1293
|
"buildchain-contract.json": createBuildchainContractWorld({ root, controllerRegistry }),
|
|
@@ -92,6 +92,17 @@ export function cliCommandMeta(id) {
|
|
|
92
92
|
"kfd-upstream-roles": { group: "kfd-trust", purpose: "List Buildchain-managed KFD upstream role values and inference policy." },
|
|
93
93
|
lifecycle: { group: "reusable-build", purpose: "Run configured lifecycle commands and write deterministic artifact manifests." },
|
|
94
94
|
dev: { group: "governance-versioning", purpose: "Inspect protected development-channel governance command families." },
|
|
95
|
+
"dev-authority-admit-merge-group": { group: "governance-versioning", purpose: "Verify that one exact candidate holds the exclusive Landing Warrant before merge_group admission." },
|
|
96
|
+
"dev-authority-complete-qualification": { group: "governance-versioning", purpose: "Bind qualification evidence and release one bounded Qualification Lease without granting landing authority." },
|
|
97
|
+
"dev-authority-heartbeat-landing": { group: "governance-versioning", purpose: "Extend the exact fenced Landing Warrant while final landing work remains live." },
|
|
98
|
+
"dev-authority-heartbeat-qualification": { group: "governance-versioning", purpose: "Extend one exact fenced Qualification Lease while qualification work remains live." },
|
|
99
|
+
"dev-authority-lease-landing": { group: "governance-versioning", purpose: "Issue or retain the single exclusive Landing Warrant for a qualified candidate." },
|
|
100
|
+
"dev-authority-lease-qualification": { group: "governance-versioning", purpose: "Issue one qualification-only lease within the configured bounded lane count." },
|
|
101
|
+
"dev-authority-migrate": { group: "governance-versioning", purpose: "Migrate one exact v1 Warrant state into v2 without rewriting candidate or fencing evidence." },
|
|
102
|
+
"dev-authority-observe": { group: "governance-versioning", purpose: "Read bounded Qualification Leases and the exclusive Landing Warrant without mutating authority." },
|
|
103
|
+
"dev-authority-recover": { group: "governance-versioning", purpose: "Recover expired qualification or Landing authority and emit one rooted wake instruction." },
|
|
104
|
+
"dev-authority-settle": { group: "governance-versioning", purpose: "Settle terminal candidate evidence idempotently and release held qualification or Landing authority immediately." },
|
|
105
|
+
"dev-authority-submit": { group: "governance-versioning", purpose: "Submit an exact candidate to the opt-in bounded-qualification authority state." },
|
|
95
106
|
"dev-proof-classify": { group: "governance-versioning", purpose: "Classify source-qualified candidate changes against a current integration base." },
|
|
96
107
|
"dev-proof-integration": { group: "governance-versioning", purpose: "Seal final exact integration delivery proof for a warranted candidate." },
|
|
97
108
|
"dev-proof-replay": { group: "governance-versioning", purpose: "Replay source qualification against a Project Cut without rewriting candidate source." },
|
|
@@ -174,7 +185,8 @@ export function nodeApiMeta(exportName) {
|
|
|
174
185
|
"./build-facts": { group: "observability-diagnostics", summary: "Git source, version, module output, product artifact, and legacy Kungfu build fact APIs." },
|
|
175
186
|
"./candidate-timeline": { group: "observability-diagnostics", summary: "Source-bound candidate event normalization, per-attempt critical-path-safe aggregation, and compact reporting APIs." },
|
|
176
187
|
"./channel-candidate": { group: "governance-versioning", summary: "Exact-source channel candidate decisions, same-SHA workflow evidence validation, and deterministic source-lock reference APIs." },
|
|
177
|
-
"./dev-delivery-
|
|
188
|
+
"./dev-delivery-authority": { group: "governance-versioning", summary: "Opt-in bounded Qualification Lease, exclusive Landing Warrant, exact v1 migration, admission, and terminal settlement APIs." },
|
|
189
|
+
"./dev-delivery-warrant": { group: "governance-versioning", summary: "Durable single-flight Warrant queue, fenced lease, and split source and integration proof APIs." },
|
|
178
190
|
"./cache-evidence": { group: "observability-diagnostics", summary: "Content-addressed cache operation receipts and source/platform-bound evidence-set verification APIs." },
|
|
179
191
|
"./diagnostics": { group: "observability-diagnostics", summary: "Native diagnostics collection, summarization, cache, compiler, and process-sampler APIs." },
|
|
180
192
|
"./logging": { group: "observability-diagnostics", summary: "Buildchain JSONL logging, span, summary, and verification APIs." },
|
|
@@ -6,7 +6,7 @@ import { pathToFileURL } from "node:url";
|
|
|
6
6
|
import { evaluateWorkflowCallContract } from "../packages/core/workflow-call-contract.js";
|
|
7
7
|
import { parseWorkflowDocument } from "../packages/core/workflow-yaml-contract.js";
|
|
8
8
|
|
|
9
|
-
export const SELF_RELEASE_REF = "
|
|
9
|
+
export const SELF_RELEASE_REF = "cc6c32845ab5779009aeb48cc34efe65e229fe30";
|
|
10
10
|
export const SELF_RELEASE_PUBLIC_WORKFLOW = `kungfu-systems/buildchain/.github/workflows/release-candidate-promote.yml@${SELF_RELEASE_REF}`;
|
|
11
11
|
|
|
12
12
|
function parityFailure(message) {
|
|
@@ -39,6 +39,9 @@ on:
|
|
|
39
39
|
toolchain-root:
|
|
40
40
|
description: "Native toolchain root"
|
|
41
41
|
required: true
|
|
42
|
+
environment-root:
|
|
43
|
+
description: "Native execution environment contract root"
|
|
44
|
+
required: true
|
|
42
45
|
affected-paths-json:
|
|
43
46
|
description: "JSON array representing the affected closure"
|
|
44
47
|
required: true
|
|
@@ -58,20 +61,21 @@ jobs:
|
|
|
58
61
|
deliver:
|
|
59
62
|
uses: kungfu-systems/buildchain/.github/workflows/dev-pr-auto-merge.yml@v3
|
|
60
63
|
with:
|
|
61
|
-
target-branch: ${{ github.event.client_payload.targetBranch || inputs.target-branch }}
|
|
62
|
-
expected-pr-number: ${{ github.event.client_payload.pullRequestNumber || inputs.expected-pr-number }}
|
|
63
|
-
expected-head-sha: ${{ github.event.client_payload.sourceHead || inputs.expected-head-sha }}
|
|
64
|
-
source-workflow-run-id: ${{ github.event.client_payload.sourceWorkflowRunId || github.run_id }}
|
|
64
|
+
target-branch: ${{ github.event.client_payload.candidate.targetBranch || inputs.target-branch }}
|
|
65
|
+
expected-pr-number: ${{ github.event.client_payload.candidate.pullRequestNumber || inputs.expected-pr-number }}
|
|
66
|
+
expected-head-sha: ${{ github.event.client_payload.candidate.sourceHead || inputs.expected-head-sha }}
|
|
67
|
+
source-workflow-run-id: ${{ github.event.client_payload.candidate.sourceWorkflowRunId || github.run_id }}
|
|
65
68
|
delivery-warrant-mode: required
|
|
66
|
-
assignment-root: ${{ github.event.client_payload.assignmentRoot || inputs.assignment-root }}
|
|
67
|
-
initiative-root: ${{ github.event.client_payload.initiativeRoot || inputs.initiative-root }}
|
|
68
|
-
source-identity-root: ${{ github.event.client_payload.sourceIdentityRoot || inputs.source-identity-root }}
|
|
69
|
-
source-patch-root: ${{ github.event.client_payload.sourcePatchRoot || inputs.source-patch-root }}
|
|
70
|
-
plan-root: ${{ github.event.client_payload.planRoot || inputs.plan-root }}
|
|
71
|
-
closure-root: ${{ github.event.client_payload.closureRoot || inputs.closure-root }}
|
|
72
|
-
dependency-root: ${{ github.event.client_payload.dependencyRoot || inputs.dependency-root }}
|
|
73
|
-
toolchain-root: ${{ github.event.client_payload.toolchainRoot || inputs.toolchain-root }}
|
|
74
|
-
|
|
69
|
+
assignment-root: ${{ github.event.client_payload.candidate.assignmentRoot || inputs.assignment-root }}
|
|
70
|
+
initiative-root: ${{ github.event.client_payload.candidate.initiativeRoot || inputs.initiative-root }}
|
|
71
|
+
source-identity-root: ${{ github.event.client_payload.candidate.sourceIdentityRoot || inputs.source-identity-root }}
|
|
72
|
+
source-patch-root: ${{ github.event.client_payload.candidate.sourcePatchRoot || inputs.source-patch-root }}
|
|
73
|
+
plan-root: ${{ github.event.client_payload.candidate.planRoot || inputs.plan-root }}
|
|
74
|
+
closure-root: ${{ github.event.client_payload.candidate.closureRoot || inputs.closure-root }}
|
|
75
|
+
dependency-root: ${{ github.event.client_payload.candidate.dependencyRoot || inputs.dependency-root }}
|
|
76
|
+
toolchain-root: ${{ github.event.client_payload.candidate.toolchainRoot || inputs.toolchain-root }}
|
|
77
|
+
environment-root: ${{ github.event.client_payload.candidate.environmentRoot || inputs.environment-root }}
|
|
78
|
+
affected-paths-json: ${{ github.event_name == 'repository_dispatch' && toJSON(github.event.client_payload.candidate.affectedPaths) || inputs.affected-paths-json }}
|
|
75
79
|
native-proof-json: ${{ inputs.native-proof-json || '' }}
|
|
76
80
|
native-command: cmake -S . -B build && cmake --build build --parallel && ctest --test-dir build --output-on-failure
|
|
77
81
|
native-heartbeat-seconds: 300
|