@kungfu-tech/buildchain 2.14.14-alpha.4 → 2.14.14-alpha.7

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 (87) hide show
  1. package/bin/buildchain.mjs +46 -2
  2. package/dist/site/agent-index.json +1 -0
  3. package/dist/site/artifact-schemas.json +2 -0
  4. package/dist/site/badge-endpoint-registry.json +1120 -0
  5. package/dist/site/badges/v1/kfd-10/aligned.json +14 -0
  6. package/dist/site/badges/v1/kfd-10/declared.json +14 -0
  7. package/dist/site/badges/v1/kfd-10/downgraded.json +14 -0
  8. package/dist/site/badges/v1/kfd-10/draft.json +14 -0
  9. package/dist/site/badges/v1/kfd-10/failed.json +14 -0
  10. package/dist/site/badges/v1/kfd-10/missing.json +14 -0
  11. package/dist/site/badges/v1/kfd-10/passed.json +14 -0
  12. package/dist/site/badges/v1/kfd-10/planned.json +14 -0
  13. package/dist/site/badges/v1/kfd-11/aligned.json +14 -0
  14. package/dist/site/badges/v1/kfd-11/declared.json +14 -0
  15. package/dist/site/badges/v1/kfd-11/downgraded.json +14 -0
  16. package/dist/site/badges/v1/kfd-11/draft.json +14 -0
  17. package/dist/site/badges/v1/kfd-11/failed.json +14 -0
  18. package/dist/site/badges/v1/kfd-11/missing.json +14 -0
  19. package/dist/site/badges/v1/kfd-11/passed.json +14 -0
  20. package/dist/site/badges/v1/kfd-11/planned.json +14 -0
  21. package/dist/site/badges/v1/kfd-12/aligned.json +14 -0
  22. package/dist/site/badges/v1/kfd-12/declared.json +14 -0
  23. package/dist/site/badges/v1/kfd-12/downgraded.json +14 -0
  24. package/dist/site/badges/v1/kfd-12/draft.json +14 -0
  25. package/dist/site/badges/v1/kfd-12/failed.json +14 -0
  26. package/dist/site/badges/v1/kfd-12/missing.json +14 -0
  27. package/dist/site/badges/v1/kfd-12/passed.json +14 -0
  28. package/dist/site/badges/v1/kfd-12/planned.json +14 -0
  29. package/dist/site/badges/v1/kfd-13/aligned.json +14 -0
  30. package/dist/site/badges/v1/kfd-13/declared.json +14 -0
  31. package/dist/site/badges/v1/kfd-13/downgraded.json +14 -0
  32. package/dist/site/badges/v1/kfd-13/draft.json +14 -0
  33. package/dist/site/badges/v1/kfd-13/failed.json +14 -0
  34. package/dist/site/badges/v1/kfd-13/missing.json +14 -0
  35. package/dist/site/badges/v1/kfd-13/passed.json +14 -0
  36. package/dist/site/badges/v1/kfd-13/planned.json +14 -0
  37. package/dist/site/badges/v1/kfd-7/aligned.json +14 -0
  38. package/dist/site/badges/v1/kfd-7/declared.json +14 -0
  39. package/dist/site/badges/v1/kfd-7/downgraded.json +14 -0
  40. package/dist/site/badges/v1/kfd-7/draft.json +14 -0
  41. package/dist/site/badges/v1/kfd-7/failed.json +14 -0
  42. package/dist/site/badges/v1/kfd-7/missing.json +14 -0
  43. package/dist/site/badges/v1/kfd-7/passed.json +14 -0
  44. package/dist/site/badges/v1/kfd-7/planned.json +14 -0
  45. package/dist/site/badges/v1/kfd-8/aligned.json +14 -0
  46. package/dist/site/badges/v1/kfd-8/declared.json +14 -0
  47. package/dist/site/badges/v1/kfd-8/downgraded.json +14 -0
  48. package/dist/site/badges/v1/kfd-8/draft.json +14 -0
  49. package/dist/site/badges/v1/kfd-8/failed.json +14 -0
  50. package/dist/site/badges/v1/kfd-8/missing.json +14 -0
  51. package/dist/site/badges/v1/kfd-8/passed.json +14 -0
  52. package/dist/site/badges/v1/kfd-8/planned.json +14 -0
  53. package/dist/site/badges/v1/kfd-9/aligned.json +14 -0
  54. package/dist/site/badges/v1/kfd-9/declared.json +14 -0
  55. package/dist/site/badges/v1/kfd-9/downgraded.json +14 -0
  56. package/dist/site/badges/v1/kfd-9/draft.json +14 -0
  57. package/dist/site/badges/v1/kfd-9/failed.json +14 -0
  58. package/dist/site/badges/v1/kfd-9/missing.json +14 -0
  59. package/dist/site/badges/v1/kfd-9/passed.json +14 -0
  60. package/dist/site/badges/v1/kfd-9/planned.json +14 -0
  61. package/dist/site/buildchain-contract.json +42 -27
  62. package/dist/site/buildchain-site.json +62 -11
  63. package/dist/site/capability-registry.json +6 -5
  64. package/dist/site/cli-registry.json +12 -0
  65. package/dist/site/controller-registry.json +16 -4
  66. package/dist/site/kfd-claims.json +65 -13
  67. package/dist/site/kfd-upstream-aggregate.json +12 -12
  68. package/dist/site/manual-registry.json +17 -2
  69. package/dist/site/node-api-registry.json +17 -4
  70. package/dist/site/page-registry.json +48 -5
  71. package/dist/site/public-surface-audit.json +53 -10
  72. package/dist/site/publication-registry.json +4 -4
  73. package/dist/site/release-passport-check-manifest.json +28 -2
  74. package/dist/site/release-provenance.json +2 -0
  75. package/dist/site/schemas/kfd-agent-hub-adoption.schema.json +116 -0
  76. package/dist/site/site-manifest.json +14 -6
  77. package/dist/site/workflow-registry.json +8 -4
  78. package/docs/MAP.md +2 -0
  79. package/docs/kfd-agent-hub.md +110 -0
  80. package/docs/release-candidate.md +7 -0
  81. package/package.json +4 -2
  82. package/packages/core/buildchain-kfd-claims.js +1 -0
  83. package/packages/core/index.js +13 -0
  84. package/packages/core/kfd-agent-hub.js +496 -0
  85. package/packages/core/release-passport.js +105 -0
  86. package/scripts/check-inventory.mjs +2 -0
  87. package/scripts/generate-site-bundle.mjs +8 -0
@@ -27,6 +27,7 @@ export const RELEASE_CHECK_REPORT_CONTRACT = "kungfu-buildchain-release-check-re
27
27
  export const KFD2_RELEASE_TRUST_PASSPORT_CONTRACT = "kungfu-buildchain-kfd-2-release-trust-passport-audit";
28
28
  export const KFD2_TRUST_PROOF_CONTRACT = "kungfu-buildchain-kfd-2-trust-proof";
29
29
  export const INVARIANT_PASSPORT_GATE_CONTRACT = "buildchain.invariant-passport-gate/v1";
30
+ export const KFD_AGENT_HUB_RELEASE_EVIDENCE_CONTRACT = "kungfu-buildchain-kfd-agent-hub-release-evidence/v1";
30
31
 
31
32
  const CONTRACTS = new Set([
32
33
  RELEASE_PASSPORT_CONTRACT,
@@ -591,6 +592,49 @@ function normalizeEvidenceDocument(meta, label) {
591
592
  };
592
593
  }
593
594
 
595
+ function normalizeKfdAgentHubEvidence(meta) {
596
+ const value = meta?.value;
597
+ if (!value) return undefined;
598
+ if (value.contract !== "kungfu-buildchain-kfd-agent-hub-evidence/v1") {
599
+ throw new Error("kfdAgentHubEvidence must be kungfu-buildchain-kfd-agent-hub-evidence/v1");
600
+ }
601
+ if (value.qualifying !== false || value.certification !== false) {
602
+ throw new Error("kfdAgentHubEvidence must remain nonqualifying and non-certifying");
603
+ }
604
+ for (const [label, root] of [
605
+ ["report.digest", value.report?.digest],
606
+ ["lock.root", value.lock?.root],
607
+ ["scope.adapterArtifactDigest", value.scope?.adapterArtifactDigest],
608
+ ]) {
609
+ if (!/^sha256:[0-9a-f]{64}$/.test(optionalString(root))) {
610
+ throw new Error(`kfdAgentHubEvidence.${label} must be a sha256 root`);
611
+ }
612
+ }
613
+ if (value.verification?.valid !== true || value.verification?.contract !== "kungfu-buildchain-kfd-agent-hub-verification/v1") {
614
+ throw new Error("kfdAgentHubEvidence.verification must bind a valid Buildchain Agent Hub verification");
615
+ }
616
+ if (value.kfd?.package?.name !== "@kungfu-tech/kfd" || !value.kfd?.package?.version) {
617
+ throw new Error("kfdAgentHubEvidence must bind an exact @kungfu-tech/kfd package version");
618
+ }
619
+ if (value.kfd?.profile?.id !== "kfd-agent-hub-conformance" || value.kfd?.suite?.id !== "kfd-agent-hub-20") {
620
+ throw new Error("kfdAgentHubEvidence must bind the KFD Agent Hub conformance profile and fixed suite");
621
+ }
622
+ const evidenceDigest = `sha256:${sha256Text(stableJson(value))}`;
623
+ return {
624
+ schemaVersion: 1,
625
+ contract: KFD_AGENT_HUB_RELEASE_EVIDENCE_CONTRACT,
626
+ evidenceContract: value.contract,
627
+ evidenceDigest,
628
+ reportDigest: value.report.digest,
629
+ lockRoot: value.lock.root,
630
+ sourceCut: value.kfd,
631
+ scope: value.scope,
632
+ qualifying: false,
633
+ certification: false,
634
+ claimBoundary: optionalString(value.claimBoundary),
635
+ };
636
+ }
637
+
594
638
  function normalizePlatformArtifactManifest(meta, index = 0) {
595
639
  const normalized = normalizeEvidenceDocument(meta, `platformArtifactManifests[${index}]`);
596
640
  if (!normalized) {
@@ -1112,6 +1156,8 @@ export function createReleasePassport({
1112
1156
  kfd2Claims = [],
1113
1157
  kfd3 = undefined,
1114
1158
  invariantPassports = undefined,
1159
+ kfdAgentHubEvidence = undefined,
1160
+ kfdAgentHubEvidencePath = "",
1115
1161
  controllerReceipts = [],
1116
1162
  controllerReceiptReferences = [],
1117
1163
  } = {}) {
@@ -1137,6 +1183,7 @@ export function createReleasePassport({
1137
1183
  const kfd1Metadata = resolveKfd1Metadata();
1138
1184
  const normalizedKfd1 = kfd1?.passportSection ? kfd1 : undefined;
1139
1185
  const normalizedKfd3 = kfd3?.passportSection ? kfd3 : undefined;
1186
+ const normalizedKfdAgentHub = normalizeKfdAgentHubEvidence(kfdAgentHubEvidence);
1140
1187
  const normalizedKfd2 = createKfd2ReleaseTrustPassportAudit({
1141
1188
  explicitClaims: kfd2Claims,
1142
1189
  kfd1Section: normalizedKfd1?.passportSection,
@@ -1279,6 +1326,7 @@ export function createReleasePassport({
1279
1326
  ...(normalizedKfd1 ? { [normalizedKfd1.key || kfd1Metadata.key]: normalizedKfd1.passportSection } : {}),
1280
1327
  ...(normalizedKfd2 ? { "kfd-2": normalizedKfd2 } : {}),
1281
1328
  ...(normalizedKfd3 ? { [normalizedKfd3.key || "kfd-3"]: normalizedKfd3.passportSection } : {}),
1329
+ ...(normalizedKfdAgentHub ? { kfdAgentHub: normalizedKfdAgentHub } : {}),
1282
1330
  ...(invariantPassports ? { invariantPassports } : {}),
1283
1331
  ...(normalizedControllerReceipts.length > 0 ? { controllerReceipts: normalizedControllerReceipts } : {}),
1284
1332
  versionImpact: normalizedImpact.versionImpact,
@@ -1322,6 +1370,7 @@ export function createReleasePassport({
1322
1370
  kfd1: normalizedKfd1 ? `${normalizedKfd1.key || kfd1Metadata.key}` : "",
1323
1371
  kfd2: normalizedKfd2 ? "kfd-2" : "",
1324
1372
  kfd3: normalizedKfd3 ? `${normalizedKfd3.key || "kfd-3"}` : "",
1373
+ kfdAgentHub: normalizedKfdAgentHub ? optionalString(kfdAgentHubEvidencePath || "kfd-agent-hub-evidence.json") : "",
1325
1374
  invariantPassports: invariantPassports ? "invariantPassports" : "",
1326
1375
  impact: impactPath,
1327
1376
  checkReport: checkReportPath,
@@ -1365,6 +1414,7 @@ export function collectGitHubReleasePassport({
1365
1414
  kfd3ArtifactVerifyCommand = "",
1366
1415
  invariantPassportJsons = [],
1367
1416
  invariantPassportCommand = "",
1417
+ kfdAgentHubEvidenceJson = "",
1368
1418
  controllerReceiptReferences = [],
1369
1419
  basePassportJson = "",
1370
1420
  requireBaseKfd = false,
@@ -1428,6 +1478,11 @@ export function collectGitHubReleasePassport({
1428
1478
  });
1429
1479
  if (invariantPassportCommandMeta.value) invariantPassportMetas.push(invariantPassportCommandMeta);
1430
1480
  const invariantPassports = createInvariantPassportGate(invariantPassportMetas);
1481
+ const kfdAgentHubEvidenceMeta = parseJsonInputWithMeta(
1482
+ kfdAgentHubEvidenceJson,
1483
+ undefined,
1484
+ { cwd, label: "kfdAgentHubEvidenceJson" },
1485
+ );
1431
1486
  const kfd3ArtifactWitnesses = [
1432
1487
  ...kfd3ArtifactWitnessMetas.map((meta) => meta.value),
1433
1488
  ...(kfd3ArtifactCommandMeta.value ? [kfd3ArtifactCommandMeta.value] : []),
@@ -1506,6 +1561,10 @@ export function collectGitHubReleasePassport({
1506
1561
  kfd2Claims: kfd2ClaimMetas.map((meta) => meta.value),
1507
1562
  kfd3,
1508
1563
  invariantPassports,
1564
+ kfdAgentHubEvidence: kfdAgentHubEvidenceMeta.value
1565
+ ? { ...kfdAgentHubEvidenceMeta, path: "kfd-agent-hub-evidence.json" }
1566
+ : undefined,
1567
+ kfdAgentHubEvidencePath: kfdAgentHubEvidenceMeta.value ? "kfd-agent-hub-evidence.json" : "",
1509
1568
  controllerReceiptReferences,
1510
1569
  publishEvidencePath: publishEvidenceMeta.path ? path.relative(resolvedOutputDir, publishEvidenceMeta.path).split(path.sep).join("/") : "",
1511
1570
  transactionStatePath: transactionMeta.path ? path.relative(resolvedOutputDir, transactionMeta.path).split(path.sep).join("/") : "",
@@ -1521,6 +1580,7 @@ export function collectGitHubReleasePassport({
1521
1580
  impact,
1522
1581
  agentIndex,
1523
1582
  productMechanism,
1583
+ kfdAgentHubEvidence: kfdAgentHubEvidenceMeta.value,
1524
1584
  checkedAt: nowIso(),
1525
1585
  });
1526
1586
  const files = {
@@ -1529,6 +1589,7 @@ export function collectGitHubReleasePassport({
1529
1589
  ...(publishEvidenceMeta.value ? { [bundledPublishEvidencePath]: publishEvidenceMeta.value } : {}),
1530
1590
  "impact.json": impact,
1531
1591
  "agent-index.json": agentIndex,
1592
+ ...(kfdAgentHubEvidenceMeta.value ? { "kfd-agent-hub-evidence.json": kfdAgentHubEvidenceMeta.value } : {}),
1532
1593
  "buildchain.release.json": passport,
1533
1594
  "check-report.json": checkReport,
1534
1595
  };
@@ -1699,6 +1760,42 @@ function validateKfd2ReleaseTrustPassportAudit(section, issues) {
1699
1760
  }
1700
1761
  }
1701
1762
 
1763
+ function validateKfdAgentHubReleaseEvidence(section, evidence, issues) {
1764
+ if (!section && !evidence) return;
1765
+ if (!section) {
1766
+ issues.push(issue("error", "kfdAgentHub.section.missing", "Agent Hub evidence is present without a release-passport section"));
1767
+ return;
1768
+ }
1769
+ if (!evidence || typeof evidence !== "object" || Array.isArray(evidence)) {
1770
+ issues.push(issue("error", "kfdAgentHub.evidence.missing", "release passport must resolve its Agent Hub evidence asset"));
1771
+ return;
1772
+ }
1773
+ let expected;
1774
+ try {
1775
+ expected = normalizeKfdAgentHubEvidence({ value: evidence });
1776
+ } catch (error) {
1777
+ issues.push(issue("error", "kfdAgentHub.evidence.invalid", error.message));
1778
+ return;
1779
+ }
1780
+ if (section.contract !== KFD_AGENT_HUB_RELEASE_EVIDENCE_CONTRACT) {
1781
+ issues.push(issue("error", "kfdAgentHub.contract", `kfdAgentHub.contract must be ${KFD_AGENT_HUB_RELEASE_EVIDENCE_CONTRACT}`));
1782
+ }
1783
+ for (const field of ["evidenceDigest", "reportDigest", "lockRoot"]) {
1784
+ if (section[field] !== expected[field]) {
1785
+ issues.push(issue("error", `kfdAgentHub.${field}`, `kfdAgentHub.${field} does not match the evidence asset`, {
1786
+ expected: expected[field],
1787
+ actual: section[field],
1788
+ }));
1789
+ }
1790
+ }
1791
+ if (stableJson(section.sourceCut) !== stableJson(expected.sourceCut) || stableJson(section.scope) !== stableJson(expected.scope)) {
1792
+ issues.push(issue("error", "kfdAgentHub.scope", "Agent Hub package cut or adapter scope does not match the evidence asset"));
1793
+ }
1794
+ if (section.qualifying !== false || section.certification !== false) {
1795
+ issues.push(issue("error", "kfdAgentHub.claimBoundary", "Agent Hub evidence must remain nonqualifying and non-certifying"));
1796
+ }
1797
+ }
1798
+
1702
1799
  async function resolveSiblingJson(basePath, relativePath) {
1703
1800
  if (!basePath || !relativePath) {
1704
1801
  return undefined;
@@ -1786,6 +1883,7 @@ export function createReleaseCheckReport({
1786
1883
  impact,
1787
1884
  agentIndex,
1788
1885
  productMechanism,
1886
+ kfdAgentHubEvidence,
1789
1887
  checkedAt = nowIso(),
1790
1888
  } = {}) {
1791
1889
  const issues = [];
@@ -1794,6 +1892,7 @@ export function createReleaseCheckReport({
1794
1892
  validateContract(impact, IMPACT_LEDGER_CONTRACT, "impact", issues);
1795
1893
  validateContract(agentIndex, AGENT_INDEX_CONTRACT, "agentIndex", issues);
1796
1894
  validateContract(productMechanism, PRODUCT_MECHANISM_CONTRACT, "productMechanism", issues);
1895
+ validateKfdAgentHubReleaseEvidence(passport?.kfdAgentHub, kfdAgentHubEvidence, issues);
1797
1896
 
1798
1897
  const tag = passport?.release?.tag || "";
1799
1898
  if (!tag) {
@@ -2243,6 +2342,7 @@ export async function verifyReleasePassport({
2243
2342
  impactLocation = "",
2244
2343
  agentIndexLocation = "",
2245
2344
  productMechanismLocation = "",
2345
+ kfdAgentHubEvidenceLocation = "",
2246
2346
  } = {}) {
2247
2347
  const passport = await readJsonFromLocation(passportLocation);
2248
2348
  const basePath = /^https?:\/\//.test(passportLocation) ? passportLocation : path.resolve(passportLocation);
@@ -2266,6 +2366,10 @@ export async function verifyReleasePassport({
2266
2366
  productMechanismLocation
2267
2367
  ? await readJsonFromLocation(productMechanismLocation)
2268
2368
  : await resolveSiblingJson(basePath, passport.product?.mechanism) || {};
2369
+ const kfdAgentHubEvidence =
2370
+ kfdAgentHubEvidenceLocation
2371
+ ? await readJsonFromLocation(kfdAgentHubEvidenceLocation)
2372
+ : await resolveSiblingJson(basePath, passport.evidence?.kfdAgentHub) || undefined;
2269
2373
  return createReleaseCheckReport({
2270
2374
  passport,
2271
2375
  artifactEvidence,
@@ -2273,6 +2377,7 @@ export async function verifyReleasePassport({
2273
2377
  impact,
2274
2378
  agentIndex,
2275
2379
  productMechanism,
2380
+ kfdAgentHubEvidence,
2276
2381
  });
2277
2382
  }
2278
2383
 
@@ -910,6 +910,8 @@ for (const requiredSnippet of [
910
910
  "if (dryRun) {",
911
911
  "Enforce Buildchain stable release canary gate",
912
912
  "BUILDCHAIN_STABLE_RELEASE_POLICY: .buildchain/stable-release-policy.json",
913
+ "Consumer has no binary-distribution.yml; standalone binary dispatch is not applicable.",
914
+ "gh workflow view binary-distribution.yml",
913
915
  ]) {
914
916
  if (!releaseCandidatePromoteWorkflow.includes(requiredSnippet)) {
915
917
  throw new Error(`release candidate promote workflow missing KFD gate pass-through: ${requiredSnippet}`);
@@ -14,6 +14,7 @@ import {
14
14
  import {
15
15
  collectKfdUpstreamFacts,
16
16
  } from "../packages/core/kfd.js";
17
+ import { KFD_AGENT_HUB_ADOPTION_SCHEMA } from "../packages/core/kfd-agent-hub.js";
17
18
  import {
18
19
  createReadmeBadgeEndpointRegistry,
19
20
  } from "../packages/core/readme-badges.js";
@@ -334,6 +335,7 @@ const manualMetaById = new Map(Object.entries({
334
335
  "lifecycle-protocol": { capabilityGroup: "reusable-build", audience: ["consumer", "developer"], maturity: "stable", order: 210 },
335
336
  "runtime-train-validation": { capabilityGroup: "governance-versioning", audience: ["maintainer", "consumer"], maturity: "stable", order: 220 },
336
337
  "kfd-support": { capabilityGroup: "kfd-trust", audience: ["agent", "maintainer"], maturity: "stable", order: 300 },
338
+ "kfd-agent-hub": { capabilityGroup: "kfd-trust", audience: ["agent", "consumer", "maintainer"], maturity: "preview", order: 305 },
337
339
  "site-bundle-contract": { capabilityGroup: "site-and-propagation", audience: ["site", "agent"], maturity: "stable", order: 400 },
338
340
  "web-surface-deployments": { capabilityGroup: "site-and-propagation", audience: ["site", "release-operator"], maturity: "stable", order: 410 },
339
341
  "release-propagation": { capabilityGroup: "site-and-propagation", audience: ["release-operator", "agent"], maturity: "preview", order: 420 },
@@ -410,6 +412,7 @@ function cliCommandMeta(id) {
410
412
  "inspect-artifact": { group: "release-passport-trust", purpose: "Inspect artifact evidence." },
411
413
  "inspect-release": { group: "release-passport-trust", purpose: "Inspect release passport evidence." },
412
414
  kfd: { group: "kfd-trust", purpose: "Inspect KFD standards, schemas, and versioned KFD command families." },
415
+ "kfd-hub": { group: "kfd-trust", purpose: "Initialize, inspect, test, and explain one declarative KFD Agent Hub adapter adoption." },
413
416
  layout: { group: "kfd-trust", purpose: "Return the versioned repository-layout and KFD registry discovery contract for tools such as Shifu." },
414
417
  "kfd-schema": { group: "kfd-trust", purpose: "Inspect KFD schema command families." },
415
418
  "kfd-schema-list": { group: "kfd-trust", purpose: "List machine-readable schemas exposed by the KFD package standards metadata." },
@@ -504,6 +507,7 @@ function nodeApiMeta(exportName) {
504
507
  "./artifact-verification-envelope": { group: "release-passport-trust", summary: "Sealed exact-root, lifecycle, identity, and existing KFD assessment inputs for KFX admission." },
505
508
  "./anchored-version-material": { group: "reusable-build", summary: "Anchored/manual derived version material preflight, exact-tree binding, and digest evidence APIs." },
506
509
  "./release-passport": { group: "release-passport-trust", summary: "Release passport collection, verification, explanation, and evidence APIs." },
510
+ "./kfd-agent-hub": { group: "kfd-trust", summary: "Declarative Agent Hub adapter inspection, fixed-suite execution, exact KFD cut locking, and agent explanation APIs." },
507
511
  "./release-passport-contract": { group: "release-passport-trust", summary: "Standalone release passport JSON Schema, ownership/check manifest, and structural validation APIs." },
508
512
  "./release-candidate": { group: "reusable-build", summary: "PR-stage release-candidate artifact, passport, and promote-only resolver APIs." },
509
513
  "./stable-candidate-ledger": { group: "governance-versioning", summary: "Immutable alpha candidate ledger, qualification, revocation, selection, and exact stable source-lock APIs." },
@@ -975,6 +979,7 @@ function buildSiteBundle() {
975
979
  "buildchain.release.json",
976
980
  "release-passport-check-manifest.json",
977
981
  "schemas/release-passport-v1.schema.json",
982
+ "schemas/kfd-agent-hub-adoption.schema.json",
978
983
  "artifact-evidence.json",
979
984
  "product-mechanism.json",
980
985
  "impact.json",
@@ -1002,6 +1007,7 @@ function buildSiteBundle() {
1002
1007
  "artifact-schemas.json",
1003
1008
  "release-passport-check-manifest.json",
1004
1009
  "schemas/release-passport-v1.schema.json",
1010
+ "schemas/kfd-agent-hub-adoption.schema.json",
1005
1011
  "buildchain-contract.json",
1006
1012
  "kfd-claims.json",
1007
1013
  "product-mechanism.json",
@@ -1130,6 +1136,7 @@ function buildSiteBundle() {
1130
1136
  "artifact-schemas.json",
1131
1137
  "release-passport-check-manifest.json",
1132
1138
  "schemas/release-passport-v1.schema.json",
1139
+ "schemas/kfd-agent-hub-adoption.schema.json",
1133
1140
  "buildchain-contract.json",
1134
1141
  "kfd-upstream-aggregate.json",
1135
1142
  "kfd-claims.json",
@@ -1302,6 +1309,7 @@ function buildSiteBundle() {
1302
1309
  "artifact-schemas.json": artifactSchemas,
1303
1310
  "release-passport-check-manifest.json": createReleasePassportCheckManifest(),
1304
1311
  "schemas/release-passport-v1.schema.json": RELEASE_PASSPORT_SCHEMA,
1312
+ "schemas/kfd-agent-hub-adoption.schema.json": KFD_AGENT_HUB_ADOPTION_SCHEMA,
1305
1313
  "badge-endpoint-registry.json": badgeEndpointRegistry,
1306
1314
  "publication-registry.json": publicationRegistry,
1307
1315
  "buildchain-contract.json": createBuildchainContractWorld({ root, controllerRegistry }),