@kungfu-tech/buildchain 3.0.4-alpha.2 → 3.0.4-alpha.3
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 +126 -72
- package/bin/internal/trust-release-cli.mjs +15 -537
- package/bin/internal/trust-release-command-handlers.mjs +14 -0
- package/bin/internal/trust-release-inspection-handlers.mjs +175 -0
- package/bin/internal/trust-release-release-handlers.mjs +317 -0
- package/bin/internal/trust-release-verification-handlers.mjs +306 -0
- package/dist/site/buildchain-contract.json +35 -24
- package/dist/site/buildchain-site.json +22 -10
- package/dist/site/controller-registry.json +16 -3
- package/dist/site/kfd-claims.json +9 -7
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/manual-registry.json +2 -2
- package/dist/site/node-api-registry.json +7 -7
- package/dist/site/page-registry.json +9 -4
- package/dist/site/public-surface-audit.json +56 -8
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/release-model.json +7 -0
- package/dist/site/site-manifest.json +6 -6
- package/dist/site/workflow-registry.json +13 -5
- package/docs/MAP.md +1 -1
- package/docs/release-propagation.md +166 -8
- package/package.json +1 -1
- package/packages/core/buildchain-kfd-claims.js +1 -1
- package/packages/core/controller-evidence.js +8 -1
- package/packages/core/index.js +1 -13
- package/packages/core/paper-npm-bootstrap.js +492 -0
- package/packages/core/paper.js +271 -669
- package/packages/core/public-surface-cli.js +12 -1
- package/packages/core/release-passport.js +67 -71
- package/packages/core/release-propagation-common.js +64 -0
- package/packages/core/release-propagation-execution-profile.js +59 -0
- package/packages/core/release-propagation-release.js +196 -0
- package/packages/core/release-propagation-stage-evidence.js +364 -0
- package/packages/core/release-propagation-work-capture.js +64 -0
- package/packages/core/release-propagation-work-constants.js +34 -0
- package/packages/core/release-propagation-work-control.js +203 -0
- package/packages/core/release-propagation-work-transitions.js +145 -0
- package/packages/core/release-propagation-work.js +517 -0
- package/packages/core/release-propagation.js +34 -158
- package/scripts/aws-windows-jit-controller-core.mjs +269 -0
- package/scripts/aws-windows-jit-controller.mjs +502 -0
- package/scripts/check-internal-architecture.mjs +178 -52
- package/scripts/check-maintainability.mjs +76 -17
- package/scripts/generate-site-bundle.mjs +16 -7
- package/scripts/maintainability-metrics.mjs +24 -4
- package/scripts/release-propagation.mjs +126 -0
- package/scripts/resolve-artifact-transfer-mode.mjs +117 -0
- package/scripts/web-surface-core.mjs +46 -207
- package/scripts/web-surface-routing.mjs +286 -0
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { spawnSync } from "node:child_process";
|
|
4
|
+
import { verifyInfraContractEvidenceBundle } from "../../scripts/infra-contract-core.mjs";
|
|
5
|
+
import { verifyBuildchainLogEvents } from "../../packages/core/logging.js";
|
|
6
|
+
import {
|
|
7
|
+
explainReleaseLineDryRun,
|
|
8
|
+
formatReleaseLineDryRun,
|
|
9
|
+
} from "../../packages/core/release-line-dry-run.js";
|
|
10
|
+
import {
|
|
11
|
+
planReleaseLineBootstrap,
|
|
12
|
+
writeReleaseLineBootstrapVersionState,
|
|
13
|
+
} from "../../packages/core/release-line-bootstrap.js";
|
|
14
|
+
import {
|
|
15
|
+
collectGitHubReleasePassport,
|
|
16
|
+
explainReleasePassport,
|
|
17
|
+
verifyReleasePassport,
|
|
18
|
+
} from "../../packages/core/release-passport.js";
|
|
19
|
+
import {
|
|
20
|
+
createPublicationAdmission,
|
|
21
|
+
createRunnerProvenance,
|
|
22
|
+
verifyPublicationAdmission,
|
|
23
|
+
} from "../../packages/core/publication-authority.js";
|
|
24
|
+
import {
|
|
25
|
+
createGitHubArtifactAttestationPolicy,
|
|
26
|
+
createGitHubArtifactAttestationVerificationPlan,
|
|
27
|
+
verifyGitHubArtifactAttestationEvidence,
|
|
28
|
+
} from "../../packages/core/github-artifact-attestation.js";
|
|
29
|
+
import {
|
|
30
|
+
explainArtifactPassport,
|
|
31
|
+
verifyArtifactPassport,
|
|
32
|
+
} from "../../packages/core/artifact-passport.js";
|
|
33
|
+
import {
|
|
34
|
+
projectArtifactVerificationEnvelopeToKfx,
|
|
35
|
+
verifyArtifactVerificationEnvelope,
|
|
36
|
+
} from "../../packages/core/artifact-verification-envelope.js";
|
|
37
|
+
import {
|
|
38
|
+
artifactEnvelopeOptions,
|
|
39
|
+
printJson,
|
|
40
|
+
readBooleanFlag,
|
|
41
|
+
readFlag,
|
|
42
|
+
readJsonInput,
|
|
43
|
+
readRepeatedFlag,
|
|
44
|
+
writeJsonFile,
|
|
45
|
+
} from "./cli-options.mjs";
|
|
46
|
+
|
|
47
|
+
async function verifyGitHubArtifactAttestationCommand({
|
|
48
|
+
location,
|
|
49
|
+
verifyArgs,
|
|
50
|
+
}) {
|
|
51
|
+
if (!location) {
|
|
52
|
+
throw new Error(
|
|
53
|
+
"usage: buildchain verify github-artifact-attestation <artifact> --evidence <file> --bundle <file> --platform-manifest <file> --release-passport <file>",
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
const requiredPath = (name) => {
|
|
57
|
+
const value = readFlag(verifyArgs, name, "");
|
|
58
|
+
if (!value) {
|
|
59
|
+
throw new Error(
|
|
60
|
+
`buildchain verify github-artifact-attestation requires --${name} <file>`,
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
return path.resolve(value);
|
|
64
|
+
};
|
|
65
|
+
const evidencePath = requiredPath("evidence");
|
|
66
|
+
const bundlePath = requiredPath("bundle");
|
|
67
|
+
const platformManifestPath = requiredPath("platform-manifest");
|
|
68
|
+
const releasePassportPath = requiredPath("release-passport");
|
|
69
|
+
const evidence = readJsonInput(evidencePath, { label: "evidence" });
|
|
70
|
+
const plan = createGitHubArtifactAttestationVerificationPlan({
|
|
71
|
+
artifactPath: location,
|
|
72
|
+
bundlePath,
|
|
73
|
+
evidence,
|
|
74
|
+
});
|
|
75
|
+
const verified = spawnSync(plan.command, plan.args, {
|
|
76
|
+
cwd: process.cwd(),
|
|
77
|
+
encoding: "utf8",
|
|
78
|
+
maxBuffer: 32 * 1024 * 1024,
|
|
79
|
+
});
|
|
80
|
+
if (verified.error) throw verified.error;
|
|
81
|
+
if (verified.status !== 0) {
|
|
82
|
+
throw new Error(
|
|
83
|
+
`gh attestation verify failed: ${(verified.stderr || verified.stdout || "unknown error").trim()}`,
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
let verificationResults;
|
|
87
|
+
try {
|
|
88
|
+
verificationResults = JSON.parse(verified.stdout);
|
|
89
|
+
} catch (error) {
|
|
90
|
+
throw new Error(
|
|
91
|
+
`gh attestation verify returned invalid JSON: ${error.message}`,
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
const report = verifyGitHubArtifactAttestationEvidence({
|
|
95
|
+
artifactPath: path.resolve(location),
|
|
96
|
+
platformManifestPath,
|
|
97
|
+
releasePassportPath,
|
|
98
|
+
bundlePath,
|
|
99
|
+
evidence,
|
|
100
|
+
verificationResults,
|
|
101
|
+
});
|
|
102
|
+
if (readBooleanFlag(verifyArgs, "json")) {
|
|
103
|
+
printJson(report);
|
|
104
|
+
} else {
|
|
105
|
+
process.stdout.write(`GitHub artifact attestation: ${report.outcome}\n`);
|
|
106
|
+
for (const entry of report.issues) {
|
|
107
|
+
process.stdout.write(`- ${entry.code}: ${entry.message}\n`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
process.exitCode = report.ok ? 0 : 1;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function verifyPublicationAdmissionCommand({ location, verifyArgs }) {
|
|
115
|
+
if (!location) {
|
|
116
|
+
throw new Error(
|
|
117
|
+
"usage: buildchain verify publication-admission <file-or-json> --registry-json <file-or-json> --runner-json <file-or-json> --control-plane-audit-json <file-or-json> --publication-evidence-json <file-or-json>",
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
const requiredInput = (name) => {
|
|
121
|
+
const value = readFlag(verifyArgs, name, "");
|
|
122
|
+
if (!value)
|
|
123
|
+
throw new Error(
|
|
124
|
+
`buildchain verify publication-admission requires --${name} <file-or-json>`,
|
|
125
|
+
);
|
|
126
|
+
return readJsonInput(value, { label: name });
|
|
127
|
+
};
|
|
128
|
+
const expectedInput = readFlag(verifyArgs, "expected-json", "");
|
|
129
|
+
const capability = verifyPublicationAdmission({
|
|
130
|
+
admission: readJsonInput(location, { label: "publication admission" }),
|
|
131
|
+
registry: requiredInput("registry-json"),
|
|
132
|
+
runnerProvenance: requiredInput("runner-json"),
|
|
133
|
+
controlPlaneAudit: requiredInput("control-plane-audit-json"),
|
|
134
|
+
publicationEvidence: requiredInput("publication-evidence-json"),
|
|
135
|
+
expected: expectedInput
|
|
136
|
+
? readJsonInput(expectedInput, { label: "expected-json" })
|
|
137
|
+
: {},
|
|
138
|
+
usedNonces: readRepeatedFlag(verifyArgs, "used-nonce"),
|
|
139
|
+
});
|
|
140
|
+
if (readBooleanFlag(verifyArgs, "json")) {
|
|
141
|
+
printJson(capability);
|
|
142
|
+
} else {
|
|
143
|
+
process.stdout.write(`publication admission: ${capability.decision}\n`);
|
|
144
|
+
process.stdout.write(`capability digest: ${capability.capabilityDigest}\n`);
|
|
145
|
+
process.stdout.write(`expires at: ${capability.expiresAt}\n`);
|
|
146
|
+
}
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async function verifyArtifactCommand({ location, verifyArgs }) {
|
|
151
|
+
if (!location) {
|
|
152
|
+
throw new Error("usage: buildchain verify artifact <subject>");
|
|
153
|
+
}
|
|
154
|
+
const report = await verifyArtifactPassport({
|
|
155
|
+
subject: location,
|
|
156
|
+
cwd: process.cwd(),
|
|
157
|
+
passportLocation: readFlag(verifyArgs, "passport", ""),
|
|
158
|
+
locatorConfig: readFlag(verifyArgs, "locator-config", ""),
|
|
159
|
+
repository: readFlag(verifyArgs, "repository", ""),
|
|
160
|
+
tag: readFlag(verifyArgs, "tag", ""),
|
|
161
|
+
githubReleaseBaseUrl: readFlag(verifyArgs, "github-release-base-url", ""),
|
|
162
|
+
subjectDigest: readFlag(verifyArgs, "subject-digest", ""),
|
|
163
|
+
subjectKind: readFlag(verifyArgs, "subject-kind", ""),
|
|
164
|
+
npmRegistryBaseUrl: readFlag(verifyArgs, "npm-registry", ""),
|
|
165
|
+
});
|
|
166
|
+
if (readBooleanFlag(verifyArgs, "json")) {
|
|
167
|
+
printJson(report);
|
|
168
|
+
} else {
|
|
169
|
+
process.stdout.write(`artifact: ${report.outcome}\n`);
|
|
170
|
+
process.stdout.write(`subject: ${report.subject?.name || location}\n`);
|
|
171
|
+
process.stdout.write(
|
|
172
|
+
`passport: ${report.passport?.location || report.discovery?.passportLocation || "unresolved"}\n`,
|
|
173
|
+
);
|
|
174
|
+
for (const entry of report.issues) {
|
|
175
|
+
process.stdout.write(
|
|
176
|
+
`- ${entry.level}: ${entry.code}: ${entry.message}\n`,
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
process.exitCode = report.ok ? 0 : 1;
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
async function verifyArtifactEnvelopeCommand({ location, verifyArgs }) {
|
|
185
|
+
if (!location) {
|
|
186
|
+
throw new Error(
|
|
187
|
+
"usage: buildchain verify artifact-envelope <file-or-json>",
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
const report = verifyArtifactVerificationEnvelope({
|
|
191
|
+
envelope: readJsonInput(location, {
|
|
192
|
+
label: "artifact verification envelope",
|
|
193
|
+
}),
|
|
194
|
+
...artifactEnvelopeOptions(verifyArgs),
|
|
195
|
+
});
|
|
196
|
+
if (readBooleanFlag(verifyArgs, "json")) {
|
|
197
|
+
printJson(report);
|
|
198
|
+
} else {
|
|
199
|
+
process.stdout.write(`artifact verification envelope: ${report.outcome}\n`);
|
|
200
|
+
process.stdout.write(`root: ${report.envelopeRoot || "unresolved"}\n`);
|
|
201
|
+
for (const entry of report.issues) {
|
|
202
|
+
process.stdout.write(
|
|
203
|
+
`- ${entry.level}: ${entry.code}: ${entry.message}\n`,
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
process.exitCode = report.ok ? 0 : 1;
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
async function verifyObservabilityLogCommand({ location, verifyArgs }) {
|
|
212
|
+
if (!location) {
|
|
213
|
+
throw new Error("usage: buildchain verify observability-log <jsonl>");
|
|
214
|
+
}
|
|
215
|
+
const report = verifyBuildchainLogEvents({
|
|
216
|
+
path: location,
|
|
217
|
+
minEvents: Number(readFlag(verifyArgs, "min-events", "1")),
|
|
218
|
+
allowErrors: readBooleanFlag(verifyArgs, "allow-errors"),
|
|
219
|
+
requirePhases: readRepeatedFlag(verifyArgs, "require-phase"),
|
|
220
|
+
requireComponents: readRepeatedFlag(verifyArgs, "require-component"),
|
|
221
|
+
requireEvents: readRepeatedFlag(verifyArgs, "require-event"),
|
|
222
|
+
});
|
|
223
|
+
if (readBooleanFlag(verifyArgs, "json")) {
|
|
224
|
+
printJson(report);
|
|
225
|
+
} else {
|
|
226
|
+
process.stdout.write(`observability log: ${report.ok ? "ok" : "failed"}\n`);
|
|
227
|
+
process.stdout.write(`events: ${report.summary.eventCount}\n`);
|
|
228
|
+
for (const entry of report.issues) {
|
|
229
|
+
process.stdout.write(
|
|
230
|
+
`- ${entry.level}: ${entry.code}: ${entry.message}\n`,
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
process.exitCode = report.ok ? 0 : 1;
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
async function verifyInfraContractEvidenceBundleCommand({
|
|
239
|
+
location,
|
|
240
|
+
verifyArgs,
|
|
241
|
+
}) {
|
|
242
|
+
if (!location) {
|
|
243
|
+
throw new Error(
|
|
244
|
+
"usage: buildchain verify infra-contract-evidence-bundle <file>",
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
const bundle = JSON.parse(fs.readFileSync(path.resolve(location), "utf8"));
|
|
248
|
+
const report = verifyInfraContractEvidenceBundle(bundle);
|
|
249
|
+
if (readBooleanFlag(verifyArgs, "json")) {
|
|
250
|
+
printJson(report);
|
|
251
|
+
} else {
|
|
252
|
+
process.stdout.write(
|
|
253
|
+
`infra contract evidence bundle: ${report.ok ? "ok" : "failed"}\n`,
|
|
254
|
+
);
|
|
255
|
+
process.stdout.write(`artifact: ${report.artifactHash || "unknown"}\n`);
|
|
256
|
+
for (const entry of report.issues) {
|
|
257
|
+
process.stdout.write(
|
|
258
|
+
`- ${entry.level}: ${entry.code}: ${entry.message}\n`,
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
process.exitCode = report.ok ? 0 : 1;
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
async function verifyReleasePassportCommand({ location, verifyArgs }) {
|
|
267
|
+
if (!location)
|
|
268
|
+
throw new Error("usage: buildchain verify release-passport <file-or-url>");
|
|
269
|
+
const report = await verifyReleasePassport({ passportLocation: location });
|
|
270
|
+
if (readBooleanFlag(verifyArgs, "json")) {
|
|
271
|
+
printJson(report);
|
|
272
|
+
} else {
|
|
273
|
+
process.stdout.write(`release passport: ${report.ok ? "ok" : "failed"}\n`);
|
|
274
|
+
process.stdout.write(`artifacts: ${report.completeness.artifactCount}\n`);
|
|
275
|
+
for (const entry of report.issues) {
|
|
276
|
+
process.stdout.write(
|
|
277
|
+
`- ${entry.level}: ${entry.code}: ${entry.message}\n`,
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
process.exitCode = report.ok ? 0 : 1;
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const VERIFY_COMMAND_HANDLERS = Object.freeze({
|
|
286
|
+
"github-artifact-attestation": verifyGitHubArtifactAttestationCommand,
|
|
287
|
+
"publication-admission": verifyPublicationAdmissionCommand,
|
|
288
|
+
artifact: verifyArtifactCommand,
|
|
289
|
+
"artifact-envelope": verifyArtifactEnvelopeCommand,
|
|
290
|
+
"observability-log": verifyObservabilityLogCommand,
|
|
291
|
+
"infra-contract-evidence-bundle": verifyInfraContractEvidenceBundleCommand,
|
|
292
|
+
"release-passport": verifyReleasePassportCommand,
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
async function handleVerifyCommand({ args }) {
|
|
296
|
+
const [subcommand = "", location = "", ...verifyArgs] = args;
|
|
297
|
+
const handler = VERIFY_COMMAND_HANDLERS[subcommand];
|
|
298
|
+
if (!handler) {
|
|
299
|
+
throw new Error(
|
|
300
|
+
"usage: buildchain verify <github-artifact-attestation|publication-admission|artifact|artifact-envelope|observability-log|infra-contract-evidence-bundle|release-passport> ...",
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
return handler({ location, verifyArgs });
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
export { handleVerifyCommand };
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"product": {
|
|
5
5
|
"name": "Buildchain",
|
|
6
6
|
"package": "@kungfu-tech/buildchain",
|
|
7
|
-
"version": "3.0.4-alpha.
|
|
7
|
+
"version": "3.0.4-alpha.3",
|
|
8
8
|
"repository": "https://github.com/kungfu-systems/buildchain"
|
|
9
9
|
},
|
|
10
10
|
"majorLine": "v3",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"retryable GitHub fallback fetches use a bounded attempt budget before exact source SHA and tree verification"
|
|
53
53
|
],
|
|
54
54
|
"breakingDigest": "sha256:dfbedd543ae0c067982b5c8c02d98dd2f7f7df88752be97fb330da6b0ba30faa",
|
|
55
|
-
"auditDigest": "sha256:
|
|
55
|
+
"auditDigest": "sha256:1fff20be18b0ed638a02c2ae00258ee5a0052f466dd2338fe6f4935a31f94dfe"
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
"contractVersion": 1,
|
|
@@ -510,7 +510,7 @@
|
|
|
510
510
|
"release-state SHA is recorded as a durable audit entrance"
|
|
511
511
|
],
|
|
512
512
|
"breakingDigest": "sha256:b627e1b2ece9b6049517a942c5139e342e6077cdd3d8962d61cef8481b1f70ad",
|
|
513
|
-
"auditDigest": "sha256:
|
|
513
|
+
"auditDigest": "sha256:7d91592c518277646154ef5c7fde27d7101c87a0d7f69c90911ac0c7583c20ec"
|
|
514
514
|
},
|
|
515
515
|
{
|
|
516
516
|
"contractVersion": 1,
|
|
@@ -559,7 +559,7 @@
|
|
|
559
559
|
"prose-only public claims downgrade the release trust passport audit"
|
|
560
560
|
],
|
|
561
561
|
"breakingDigest": "sha256:f0b636eb925ddbf45ff1a8872454ab7b4dd98857cac12bb75217830130e62a16",
|
|
562
|
-
"auditDigest": "sha256:
|
|
562
|
+
"auditDigest": "sha256:7d91592c518277646154ef5c7fde27d7101c87a0d7f69c90911ac0c7583c20ec"
|
|
563
563
|
},
|
|
564
564
|
{
|
|
565
565
|
"contractVersion": 1,
|
|
@@ -619,7 +619,7 @@
|
|
|
619
619
|
"README badge block checks and writes are generated from machine-readable repository facts"
|
|
620
620
|
],
|
|
621
621
|
"breakingDigest": "sha256:90a73892b2d6c214048448d5f45df75639bdf7b7e8fefd9c596e04b087407bcc",
|
|
622
|
-
"auditDigest": "sha256:
|
|
622
|
+
"auditDigest": "sha256:2011241d29b5636c751a0a03c5be0fd43e90e7f5d246f651975cab2d7ebcead3"
|
|
623
623
|
},
|
|
624
624
|
{
|
|
625
625
|
"contractVersion": 1,
|
|
@@ -709,7 +709,7 @@
|
|
|
709
709
|
"manual entries carry source file digests so downstream sites and agents can detect stale hand-written documentation"
|
|
710
710
|
],
|
|
711
711
|
"breakingDigest": "sha256:7d0d2819e3a3e72989d9c57b5efe9d0bc0a79bc0f2c82a0c7b9d6c5a211a91f2",
|
|
712
|
-
"auditDigest": "sha256:
|
|
712
|
+
"auditDigest": "sha256:e6948b309515f693f4a264500184bcf2670b025e8e5d45e0b999d305483bd3bd"
|
|
713
713
|
},
|
|
714
714
|
{
|
|
715
715
|
"contractVersion": 1,
|
|
@@ -731,7 +731,7 @@
|
|
|
731
731
|
"agents can discover supported Node APIs without importing internal file paths"
|
|
732
732
|
],
|
|
733
733
|
"breakingDigest": "sha256:48f925608d3e2131d90936b07dc2a30341204cae3e6e785c0f77d61ad755c945",
|
|
734
|
-
"auditDigest": "sha256:
|
|
734
|
+
"auditDigest": "sha256:b7862559002c267b6ab56df3e45cb15248e4179db9a04cd0963117c312a73069"
|
|
735
735
|
},
|
|
736
736
|
{
|
|
737
737
|
"contractVersion": 1,
|
|
@@ -782,7 +782,7 @@
|
|
|
782
782
|
"controllerDescriptor": {
|
|
783
783
|
"contract": "buildchain.controller-descriptor/v1",
|
|
784
784
|
"digest": "sha256:373723a73d188194d389dee04c394d3b79cb0c016a370f2f5d0f60979a02ed48",
|
|
785
|
-
"registryDigest": "sha256:
|
|
785
|
+
"registryDigest": "sha256:365541ae05fb807ed5ca3e80662ea5fa3b1d0cd13db5b56e444a4596b7b899f2",
|
|
786
786
|
"inputClassifications": {
|
|
787
787
|
"buildchain-ref": {
|
|
788
788
|
"classification": "included",
|
|
@@ -961,7 +961,7 @@
|
|
|
961
961
|
"controllerDescriptor": {
|
|
962
962
|
"contract": "buildchain.controller-descriptor/v1",
|
|
963
963
|
"digest": "sha256:2e4c9e9af2162de2333c9b57bffcff77a76e9ed384b9f001ab8ef63d527197f9",
|
|
964
|
-
"registryDigest": "sha256:
|
|
964
|
+
"registryDigest": "sha256:365541ae05fb807ed5ca3e80662ea5fa3b1d0cd13db5b56e444a4596b7b899f2",
|
|
965
965
|
"inputClassifications": {
|
|
966
966
|
"BUILDCHAIN_ARTIFACT_RELAY_S3_DOWNLOAD_ROLE_ARN": {
|
|
967
967
|
"classification": "redacted",
|
|
@@ -1340,7 +1340,7 @@
|
|
|
1340
1340
|
"missing receipts are non-qualifying and must not be represented as a successful controller run"
|
|
1341
1341
|
],
|
|
1342
1342
|
"breakingDigest": "sha256:6b8d38e92b2c67b5bc83fae0a3fd95bfa47582fbc176e6cdeebe7630a57534cb",
|
|
1343
|
-
"auditDigest": "sha256:
|
|
1343
|
+
"auditDigest": "sha256:1fff20be18b0ed638a02c2ae00258ee5a0052f466dd2338fe6f4935a31f94dfe"
|
|
1344
1344
|
},
|
|
1345
1345
|
{
|
|
1346
1346
|
"contractVersion": 1,
|
|
@@ -1476,7 +1476,7 @@
|
|
|
1476
1476
|
"controllerDescriptor": {
|
|
1477
1477
|
"contract": "buildchain.controller-descriptor/v1",
|
|
1478
1478
|
"digest": "sha256:105eed3eb8f772d4ed93d43e7da404d849b92eafab1b461c7a9b7cb94a8a6b3b",
|
|
1479
|
-
"registryDigest": "sha256:
|
|
1479
|
+
"registryDigest": "sha256:365541ae05fb807ed5ca3e80662ea5fa3b1d0cd13db5b56e444a4596b7b899f2",
|
|
1480
1480
|
"inputClassifications": {
|
|
1481
1481
|
"BUILDCHAIN_ARTIFACT_RELAY_S3_DOWNLOAD_ROLE_ARN": {
|
|
1482
1482
|
"classification": "redacted",
|
|
@@ -1933,7 +1933,7 @@
|
|
|
1933
1933
|
"controllerDescriptor": {
|
|
1934
1934
|
"contract": "buildchain.controller-descriptor/v1",
|
|
1935
1935
|
"digest": "sha256:8e42956a2c10fa109500e72b97994f06b3d22a19cc63a46f66410b2e81706e9d",
|
|
1936
|
-
"registryDigest": "sha256:
|
|
1936
|
+
"registryDigest": "sha256:365541ae05fb807ed5ca3e80662ea5fa3b1d0cd13db5b56e444a4596b7b899f2",
|
|
1937
1937
|
"inputClassifications": {
|
|
1938
1938
|
"artifact-name": {
|
|
1939
1939
|
"classification": "included",
|
|
@@ -2150,7 +2150,7 @@
|
|
|
2150
2150
|
"controllerDescriptor": {
|
|
2151
2151
|
"contract": "buildchain.controller-descriptor/v1",
|
|
2152
2152
|
"digest": "sha256:c5274b37f04d0054559fdc8698c51bd0f0d8ae470baf163e9caa7699aa970575",
|
|
2153
|
-
"registryDigest": "sha256:
|
|
2153
|
+
"registryDigest": "sha256:365541ae05fb807ed5ca3e80662ea5fa3b1d0cd13db5b56e444a4596b7b899f2",
|
|
2154
2154
|
"inputClassifications": {
|
|
2155
2155
|
"artifact-path": {
|
|
2156
2156
|
"classification": "digest-only",
|
|
@@ -2394,7 +2394,7 @@
|
|
|
2394
2394
|
"controllerDescriptor": {
|
|
2395
2395
|
"contract": "buildchain.controller-descriptor/v1",
|
|
2396
2396
|
"digest": "sha256:6b132790b9798e8a5dfbe095701d8e024c160a08bc7c4bd477ee79feef7a9cfd",
|
|
2397
|
-
"registryDigest": "sha256:
|
|
2397
|
+
"registryDigest": "sha256:365541ae05fb807ed5ca3e80662ea5fa3b1d0cd13db5b56e444a4596b7b899f2",
|
|
2398
2398
|
"inputClassifications": {
|
|
2399
2399
|
"artifact-name": {
|
|
2400
2400
|
"classification": "included",
|
|
@@ -2576,7 +2576,7 @@
|
|
|
2576
2576
|
"controllerDescriptor": {
|
|
2577
2577
|
"contract": "buildchain.controller-descriptor/v1",
|
|
2578
2578
|
"digest": "sha256:6d71409659fbf8543c7e520b0c493d8afe86bdf60286b860bb917f0041ebc173",
|
|
2579
|
-
"registryDigest": "sha256:
|
|
2579
|
+
"registryDigest": "sha256:365541ae05fb807ed5ca3e80662ea5fa3b1d0cd13db5b56e444a4596b7b899f2",
|
|
2580
2580
|
"inputClassifications": {
|
|
2581
2581
|
"artifact-name": {
|
|
2582
2582
|
"classification": "included",
|
|
@@ -2892,7 +2892,7 @@
|
|
|
2892
2892
|
"controllerDescriptor": {
|
|
2893
2893
|
"contract": "buildchain.controller-descriptor/v1",
|
|
2894
2894
|
"digest": "sha256:f54bccee97644d190b450e4ed810b516af64ed5d265ea76cd541a11cbbd51cdb",
|
|
2895
|
-
"registryDigest": "sha256:
|
|
2895
|
+
"registryDigest": "sha256:365541ae05fb807ed5ca3e80662ea5fa3b1d0cd13db5b56e444a4596b7b899f2",
|
|
2896
2896
|
"inputClassifications": {
|
|
2897
2897
|
"BUILDCHAIN_ISSUE_APP_ID": {
|
|
2898
2898
|
"classification": "redacted",
|
|
@@ -3349,7 +3349,8 @@
|
|
|
3349
3349
|
"capabilities": [
|
|
3350
3350
|
"release-propagation-plan",
|
|
3351
3351
|
"downstream-lock",
|
|
3352
|
-
"
|
|
3352
|
+
"agent-native-work-envelope",
|
|
3353
|
+
"resumable-production-handoff"
|
|
3353
3354
|
],
|
|
3354
3355
|
"evidenceRequirements": [
|
|
3355
3356
|
"propagation-plan",
|
|
@@ -3359,6 +3360,8 @@
|
|
|
3359
3360
|
"inputClassificationPolicy": "buildchain-controller-input-policy/v1"
|
|
3360
3361
|
},
|
|
3361
3362
|
"optionalInputs": [
|
|
3363
|
+
"agent-work-context-json",
|
|
3364
|
+
"agent-work-mode",
|
|
3362
3365
|
"buildchain-ref",
|
|
3363
3366
|
"buildchain-repository",
|
|
3364
3367
|
"downstream-base-ref",
|
|
@@ -3380,9 +3383,17 @@
|
|
|
3380
3383
|
],
|
|
3381
3384
|
"controllerDescriptor": {
|
|
3382
3385
|
"contract": "buildchain.controller-descriptor/v1",
|
|
3383
|
-
"digest": "sha256:
|
|
3384
|
-
"registryDigest": "sha256:
|
|
3386
|
+
"digest": "sha256:660579b5561e8e33375a3f3b1fefbb8a5bd8241a55ba43374d786fb772c24a12",
|
|
3387
|
+
"registryDigest": "sha256:365541ae05fb807ed5ca3e80662ea5fa3b1d0cd13db5b56e444a4596b7b899f2",
|
|
3385
3388
|
"inputClassifications": {
|
|
3389
|
+
"agent-work-context-json": {
|
|
3390
|
+
"classification": "digest-only",
|
|
3391
|
+
"source": "workflow-call-input"
|
|
3392
|
+
},
|
|
3393
|
+
"agent-work-mode": {
|
|
3394
|
+
"classification": "included",
|
|
3395
|
+
"source": "workflow-call-input"
|
|
3396
|
+
},
|
|
3386
3397
|
"buildchain-ref": {
|
|
3387
3398
|
"classification": "included",
|
|
3388
3399
|
"source": "workflow-call-input"
|
|
@@ -3463,8 +3474,8 @@
|
|
|
3463
3474
|
"redacted input values are never serialized and digest-only input values are never emitted in plaintext",
|
|
3464
3475
|
"missing receipts are non-qualifying and must not be represented as a successful controller run"
|
|
3465
3476
|
],
|
|
3466
|
-
"breakingDigest": "sha256:
|
|
3467
|
-
"auditDigest": "sha256:
|
|
3477
|
+
"breakingDigest": "sha256:b873ceb65618972bea615afcb9c616c138ce834b3246ec7237ef87c1618d68bd",
|
|
3478
|
+
"auditDigest": "sha256:ef845b25978cd63c0fc6cbc83271e30b245f9d8605c2c25ae7e87c13a35b1302"
|
|
3468
3479
|
},
|
|
3469
3480
|
{
|
|
3470
3481
|
"contractVersion": 1,
|
|
@@ -3508,7 +3519,7 @@
|
|
|
3508
3519
|
"controllerDescriptor": {
|
|
3509
3520
|
"contract": "buildchain.controller-descriptor/v1",
|
|
3510
3521
|
"digest": "sha256:b6f53563c0adc859bc586c05fce560a5094d7d9666438d63c5fd3e1fc4774555",
|
|
3511
|
-
"registryDigest": "sha256:
|
|
3522
|
+
"registryDigest": "sha256:365541ae05fb807ed5ca3e80662ea5fa3b1d0cd13db5b56e444a4596b7b899f2",
|
|
3512
3523
|
"inputClassifications": {}
|
|
3513
3524
|
},
|
|
3514
3525
|
"guarantees": [
|
|
@@ -3521,6 +3532,6 @@
|
|
|
3521
3532
|
"auditDigest": "sha256:d07482cd66413a2fb3781a3b76f960b8151b6231841799647fe237820de2fde6"
|
|
3522
3533
|
}
|
|
3523
3534
|
],
|
|
3524
|
-
"compatibilityDigest": "sha256:
|
|
3525
|
-
"contractDigest": "sha256:
|
|
3535
|
+
"compatibilityDigest": "sha256:3bbcaf835844260ed98414d3bd176667245d12131e13fc748e4c2fae12399691",
|
|
3536
|
+
"contractDigest": "sha256:3f17015215af1c964187e535ffd1b332ddc54808198104703397c5a7bd908fbd"
|
|
3526
3537
|
}
|