@kungfu-tech/buildchain 4.0.1-alpha.5 → 4.0.1-alpha.55

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 (159) hide show
  1. package/README.md +9 -6
  2. package/actions/release-tail/README.md +8 -0
  3. package/actions/v4-release-candidate-promote/README.md +3 -0
  4. package/architecture/agent-change-map.md +1015 -0
  5. package/architecture/ci-lane-change-budget.json +256 -0
  6. package/architecture/decisions/0004-v4-declarative-release-tail.md +47 -0
  7. package/architecture/internal-capabilities.json +220 -15
  8. package/architecture/maintainability-debt.json +3229 -0
  9. package/architecture/maintainability-policy.json +489 -132
  10. package/architecture/release-tail-contract-inventory.json +5 -2
  11. package/architecture/v3-core-mechanism-inventory.json +4 -3
  12. package/architecture/v3-v4-capability-closure.md +59 -0
  13. package/architecture/v3-v4-live-capability-inventory.json +102404 -0
  14. package/architecture/v4-adopter-delivery-parity.json +32 -5
  15. package/architecture/v4-cross-platform-adopter-qualification.json +52 -0
  16. package/architecture/v4-delivery-warrant-shadow-fixtures.json +3 -3
  17. package/architecture/v4-floating-consumer-policy.json +6 -0
  18. package/architecture/v4-publication-rehearsal-parity.json +84 -0
  19. package/architecture/v4-runtime-semantic-closure.json +710 -0
  20. package/bin/buildchain.mjs +7 -1
  21. package/bin/internal/adopter-delivery-cli.mjs +70 -0
  22. package/bin/internal/command-registry.mjs +1 -0
  23. package/bin/internal/trust-release-release-handlers.mjs +5 -0
  24. package/contracts/fixtures/v4-adopter-delivery-v1/archive-template.json +19 -0
  25. package/contracts/fixtures/v4-adopter-delivery-v1/bootstrap-positive.json +93 -0
  26. package/contracts/fixtures/v4-adopter-delivery-v1/gate-positive.json +29 -0
  27. package/contracts/fixtures/v4-adopter-delivery-v1/gate-unknown-selector.json +26 -0
  28. package/contracts/fixtures/v4-adopter-delivery-v1/offline-vectors.json +50 -0
  29. package/contracts/fixtures/v4-publication-rehearsal-v1/candidate/artifacts/product.bin +1 -0
  30. package/contracts/fixtures/v4-publication-rehearsal-v1/candidate/config/buildchain.toml +5 -0
  31. package/contracts/fixtures/v4-publication-rehearsal-v1/candidate/documents/release-activation.json +1 -0
  32. package/contracts/fixtures/v4-publication-rehearsal-v1/candidate/documents/signed-channel.json +1 -0
  33. package/contracts/fixtures/v4-publication-rehearsal-v1/candidate/evidence/qualification.json +1 -0
  34. package/contracts/fixtures/v4-publication-rehearsal-v1/candidate/manifests/candidate.json +5 -0
  35. package/contracts/fixtures/v4-publication-rehearsal-v1/candidate/manifests/release-passport.json +1 -0
  36. package/contracts/fixtures/v4-publication-rehearsal-v1/capsule.json +707 -0
  37. package/contracts/fixtures/v4-publication-rehearsal-v1/offline-vectors.json +27 -0
  38. package/contracts/fixtures/v4-tail-reseal-v1/valid.json +1 -1
  39. package/contracts/v4-adopter-delivery-v1.schema.json +81 -0
  40. package/contracts/v4-floating-consumer-policy-receipt-v1.schema.json +4 -2
  41. package/contracts/v4-publication-qualification-v1.schema.json +51 -0
  42. package/contracts/v4-publication-rehearsal-capsule-v1.schema.json +233 -0
  43. package/dist/site/agent-index.json +4 -0
  44. package/dist/site/artifact-schemas.json +8 -0
  45. package/dist/site/buildchain-contract.json +125 -34
  46. package/dist/site/buildchain-site.json +308 -33
  47. package/dist/site/capability-registry.json +13 -12
  48. package/dist/site/cli-registry.json +57 -2
  49. package/dist/site/controller-registry.json +41 -5
  50. package/dist/site/kfd-claims.json +438 -24
  51. package/dist/site/kfd-upstream-aggregate.json +1 -1
  52. package/dist/site/manual-registry.json +22 -7
  53. package/dist/site/node-api-registry.json +12843 -9314
  54. package/dist/site/page-registry.json +288 -21
  55. package/dist/site/public-surface-audit.json +281 -21
  56. package/dist/site/publication-authority-registry.json +66 -8
  57. package/dist/site/publication-registry.json +4 -4
  58. package/dist/site/release-provenance.json +20 -0
  59. package/dist/site/schemas/release-tail-capabilities-v1.schema.json +199 -0
  60. package/dist/site/schemas/v4-adopter-delivery-v1.schema.json +81 -0
  61. package/dist/site/schemas/v4-publication-qualification-v1.schema.json +51 -0
  62. package/dist/site/schemas/v4-publication-rehearsal-capsule-v1.schema.json +233 -0
  63. package/dist/site/site-manifest.json +19 -11
  64. package/dist/site/workflow-registry.json +195 -17
  65. package/docs/MAP.md +4 -2
  66. package/docs/cli-reference.md +70 -2
  67. package/docs/cli.md +8 -0
  68. package/docs/dev-delivery-warrant.md +34 -10
  69. package/docs/node-api-reference.md +524 -279
  70. package/docs/publish-transaction.md +11 -4
  71. package/docs/release-candidate.md +7 -0
  72. package/docs/release-tail-provider-plane.md +30 -0
  73. package/docs/v4-adopter-delivery.md +152 -0
  74. package/docs/v4-declarative-release-tail-migration.md +43 -0
  75. package/docs/v4-publication-rehearsal.md +130 -0
  76. package/package.json +24 -4
  77. package/packages/core/adopter-delivery-passport.js +295 -0
  78. package/packages/core/adopter-delivery-vectors.js +158 -0
  79. package/packages/core/adopter-delivery-vectors.json +77 -0
  80. package/packages/core/buildchain-agent-manuals.js +1 -0
  81. package/packages/core/buildchain-config.js +84 -0
  82. package/packages/core/buildchain-contract.js +31 -1
  83. package/packages/core/buildchain-delivery-bootstrap.js +240 -0
  84. package/packages/core/buildchain-delivery-infrastructure.js +164 -0
  85. package/packages/core/buildchain-delivery-self-dogfood.js +395 -0
  86. package/packages/core/buildchain-publication-authority.js +2 -0
  87. package/packages/core/ci-lane-change-budget.js +247 -0
  88. package/packages/core/dev-delivery-native-proof.js +43 -27
  89. package/packages/core/dev-delivery-warrant-settlement.js +239 -3
  90. package/packages/core/dev-delivery-warrant-state.js +46 -10
  91. package/packages/core/dev-delivery-warrant.js +29 -7
  92. package/packages/core/github-governance-authority.js +5 -4
  93. package/packages/core/index.js +6 -0
  94. package/packages/core/legacy-kfd-adopter-driver.js +167 -0
  95. package/packages/core/paper-scaffold-content.js +401 -0
  96. package/packages/core/paper.js +12 -378
  97. package/packages/core/publication-control-plane-audit.js +135 -111
  98. package/packages/core/publication-rehearsal-projection.js +104 -0
  99. package/packages/core/publication-rehearsal-runtime.js +190 -0
  100. package/packages/core/published-delivery-authority.js +266 -0
  101. package/packages/core/release-candidate-recovery.js +71 -15
  102. package/packages/core/release-candidate.js +2 -2
  103. package/packages/core/release-passport.js +95 -170
  104. package/packages/core/v4-adopter-delivery-parity.js +3 -3
  105. package/packages/core/v4-adopter-delivery.js +359 -0
  106. package/packages/core/v4-cross-platform-adopter-qualification.js +343 -0
  107. package/packages/core/v4-delivery-warrant-read-candidate.js +10 -3
  108. package/packages/core/v4-floating-consumer-evidence.js +18 -4
  109. package/packages/core/v4-floating-consumer-policy.js +139 -35
  110. package/packages/core/v4-floating-consumer-release-passport.js +154 -8
  111. package/packages/core/v4-publication-qualification.js +222 -0
  112. package/packages/core/v4-publication-rehearsal-capsule.js +468 -0
  113. package/packages/core/v4-publication-rehearsal-provider-bindings.js +212 -0
  114. package/packages/core/v4-publication-rehearsal.js +481 -0
  115. package/packages/core/workflow-yaml-contract.js +24 -2
  116. package/scripts/artifact-signing-controller-core.mjs +1 -1
  117. package/scripts/audit-publication-control-plane.mjs +17 -17
  118. package/scripts/buildchain-cli-help.mjs +13 -0
  119. package/scripts/check-ci-lane-change-budget.mjs +100 -0
  120. package/scripts/check-internal-architecture.mjs +23 -3
  121. package/scripts/check-inventory.mjs +24 -6
  122. package/scripts/check-maintainability.mjs +145 -4
  123. package/scripts/check-project-cut-merge-queue-admission.mjs +87 -0
  124. package/scripts/check-v3-v4-capability-inventory.mjs +574 -0
  125. package/scripts/check-v4-floating-consumer-policy-contract.mjs +30 -4
  126. package/scripts/check-v4-runtime-semantic-closure.mjs +266 -0
  127. package/scripts/dev-delivery-source-proof-replay.mjs +153 -0
  128. package/scripts/dev-delivery-source-proof-reuse.mjs +13 -97
  129. package/scripts/dev-delivery-warrant-options.mjs +27 -11
  130. package/scripts/dev-delivery-warrant-store.mjs +10 -6
  131. package/scripts/dev-delivery-warrant.mjs +50 -6
  132. package/scripts/dev-pr-auto-merge.mjs +25 -11
  133. package/scripts/dev-pr-delivery-warrant.mjs +45 -0
  134. package/scripts/dev-pr-prequeue-guard.mjs +0 -18
  135. package/scripts/dev-qualification-patrol.mjs +9 -9
  136. package/scripts/dispatch-artifact-signing-authority.mjs +1 -1
  137. package/scripts/generate-agent-change-map.mjs +118 -0
  138. package/scripts/generate-channel-promotion-workflow.mjs +2 -2
  139. package/scripts/generate-release-candidate-passport.mjs +177 -0
  140. package/scripts/generate-site-bundle.mjs +36 -0
  141. package/scripts/maintainability-domain-metrics.mjs +237 -0
  142. package/scripts/maintainability-governance.mjs +473 -0
  143. package/scripts/maintainability-metrics.mjs +28 -6
  144. package/scripts/project-cut-merge-queue-admission.mjs +394 -0
  145. package/scripts/promotion-channel-router.mjs +4 -4
  146. package/scripts/promotion-routing-evidence.mjs +35 -6
  147. package/scripts/release-candidate-anchor-provenance.mjs +99 -0
  148. package/scripts/release-candidate-resolver.mjs +44 -0
  149. package/scripts/release-line-policy.mjs +25 -15
  150. package/scripts/release-tail.mjs +68 -3
  151. package/scripts/resume-from-candidate-run.mjs +595 -65
  152. package/scripts/run-lifecycle-core.mjs +341 -376
  153. package/scripts/site-capability-metadata.mjs +21 -0
  154. package/scripts/stable-candidate-qualification.mjs +9 -10
  155. package/scripts/v3-v4-capability-catalog.mjs +439 -0
  156. package/scripts/v4-consumer-policy.mjs +4 -0
  157. package/scripts/v4-cross-platform-adopter-qualification.mjs +228 -0
  158. package/scripts/v4-declarative-promotion-admission.mjs +42 -0
  159. package/scripts/v4-publication-rehearsal-fixture.mjs +144 -0
@@ -47,16 +47,27 @@ export function parseVersionStateRef(ref) {
47
47
 
48
48
  export function parseReleaseLineRecoveryRef(ref) {
49
49
  const normalizedRef = normalizeRef(ref);
50
- const match = normalizedRef.match(/^fix\/release-line-v(\d+)-v(\d+\.\d+)-[0-9A-Za-z._-]+$/);
50
+ const match = normalizedRef.match(/^fix\/(alpha|release)-line-v(\d+)-v(\d+\.\d+)-[0-9A-Za-z._-]+$/);
51
51
  if (!match) return undefined;
52
52
  return {
53
- major: Number(match[1]),
54
- loose: Number(match[2]),
55
- normalizedRef: `release/v${match[1]}/v${match[2]}`,
56
- lineSuffix: `/v${match[1]}/v${match[2]}`,
53
+ channel: match[1],
54
+ major: Number(match[2]),
55
+ loose: Number(match[3]),
56
+ normalizedRef: `${match[1]}/v${match[2]}/v${match[3]}`,
57
57
  };
58
58
  }
59
59
 
60
+ function getRecoveryBumpKeyword({ target, baseRef, baseChannel, version, looseVersionNumber, headRef }) {
61
+ if (!target) return "";
62
+ if (baseChannel !== target.channel || target.normalizedRef !== normalizeRef(baseRef)) {
63
+ throw new Error(`Versions not match for head/base refs: ${headRef} -> ${baseRef}`);
64
+ }
65
+ if (target.major !== version.major || target.loose !== looseVersionNumber) {
66
+ throw new Error(`The version of head ref ${headRef} does not match current ${version.version}`);
67
+ }
68
+ return baseChannel === "release" ? "patch" : "prerelease";
69
+ }
70
+
60
71
  export function parsePublishGateChannelRef(ref) {
61
72
  const normalizedRef = normalizeRef(ref);
62
73
  const match = normalizedRef.match(/^publish-gate\/(alpha|release)\/(v(\d+)\/v(\d+\.\d+))\/[^/]+$/);
@@ -131,6 +142,14 @@ export function getBumpKeyword({ cwd = process.cwd(), headRef, baseRef, loose =
131
142
  const authorityTarget = parseAuthorityRef(baseRef);
132
143
  const headChannel = getChannel(headRef);
133
144
  const baseChannel = getChannel(baseRef);
145
+ const recoveryKeyword = getRecoveryBumpKeyword({
146
+ target: releaseLineRecoveryTarget,
147
+ baseRef,
148
+ baseChannel,
149
+ version,
150
+ looseVersionNumber,
151
+ headRef,
152
+ });
134
153
  const key = `${headChannel}->${baseChannel}`;
135
154
  const keywords = {
136
155
  "dev->alpha": "prerelease",
@@ -157,16 +176,7 @@ export function getBumpKeyword({ cwd = process.cwd(), headRef, baseRef, loose =
157
176
  return "none";
158
177
  }
159
178
 
160
- if (releaseLineRecoveryTarget) {
161
- if (baseChannel !== "release" || releaseLineRecoveryTarget.normalizedRef !== normalizeRef(baseRef)) {
162
- throw new Error(`Versions not match for head/base refs: ${headRef} -> ${baseRef}`);
163
- }
164
- const mismatchMsg = `The version of head ref ${headRef} does not match current ${version.version}`;
165
- if (releaseLineRecoveryTarget.major !== version.major || releaseLineRecoveryTarget.loose !== looseVersionNumber) {
166
- throw new Error(mismatchMsg);
167
- }
168
- return "patch";
169
- }
179
+ if (recoveryKeyword) return recoveryKeyword;
170
180
 
171
181
  if (publishGateTarget) {
172
182
  if (publishGateTarget.channel !== baseChannel || publishGateTarget.normalizedRef !== normalizeRef(baseRef)) {
@@ -11,6 +11,10 @@ import {
11
11
  writeReleaseTailTransaction,
12
12
  } from "../packages/core/release-tail-provider-plane.js";
13
13
  import { diagnoseLegacyReleaseTailHooks } from "../packages/core/release-tail-compatibility.js";
14
+ import {
15
+ V4_PUBLICATION_REHEARSAL_EVIDENCE_CONTRACT,
16
+ executeV4PublicationRehearsal,
17
+ } from "../packages/core/v4-publication-rehearsal.js";
14
18
 
15
19
  function flag(args, name, fallback = "") {
16
20
  const index = args.indexOf(`--${name}`);
@@ -34,8 +38,69 @@ function output(value, filePath = "") {
34
38
  process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
35
39
  }
36
40
 
37
- export function runReleaseTailCli(args = process.argv.slice(2)) {
41
+ export async function runReleaseTailCli(args = process.argv.slice(2)) {
38
42
  const [mode = "status", ...options] = args;
43
+ if (mode === "rehearse") {
44
+ const capsulePath = flag(options, "capsule");
45
+ const candidateRoot =
46
+ flag(options, "candidate-root") || flag(options, "capsule-root");
47
+ const statePath = flag(options, "state");
48
+ const evidencePath = flag(options, "evidence");
49
+ for (const [name, value] of Object.entries({
50
+ "--capsule": capsulePath,
51
+ "--candidate-root": candidateRoot,
52
+ "--state": statePath,
53
+ "--evidence": evidencePath,
54
+ }))
55
+ if (!value || !path.isAbsolute(value))
56
+ throw new Error(`${name} must be an explicit absolute path`);
57
+ const rehearsalMode = flag(options, "mode", "simulate");
58
+ if (!new Set(["simulate", "replay"]).has(rehearsalMode))
59
+ throw new Error(
60
+ "local rehearsal --mode must be simulate or replay; authorized provider rehearsal uses the reusable workflow",
61
+ );
62
+ try {
63
+ const environmentInput = flag(options, "environment-json");
64
+ const environment = environmentInput
65
+ ? readJson(environmentInput, "--environment-json")
66
+ : {};
67
+ if (
68
+ !environment ||
69
+ typeof environment !== "object" ||
70
+ Array.isArray(environment) ||
71
+ Object.keys(environment).length > 0
72
+ ) {
73
+ const error = new Error(
74
+ "--environment-json must be an empty object; v4 binds every semantic input into the source-bound capsule",
75
+ );
76
+ error.code = "ambient-environment-forbidden";
77
+ throw error;
78
+ }
79
+ const result = await executeV4PublicationRehearsal({
80
+ capsule: readJson(capsulePath, "--capsule"),
81
+ candidateRoot,
82
+ mode: rehearsalMode,
83
+ checkpoint: (transaction) =>
84
+ writeReleaseTailTransaction(statePath, transaction),
85
+ });
86
+ writeReleaseTailTransaction(statePath, result.transaction);
87
+ output(result.evidence, evidencePath);
88
+ return result;
89
+ } catch (error) {
90
+ output(
91
+ {
92
+ schema: V4_PUBLICATION_REHEARSAL_EVIDENCE_CONTRACT,
93
+ status: "rejected",
94
+ code: error.code || "publication-rehearsal-runtime-error",
95
+ message: error.message,
96
+ productionAuthority: false,
97
+ releasePassport: null,
98
+ },
99
+ evidencePath,
100
+ );
101
+ throw error;
102
+ }
103
+ }
39
104
  if (mode === "plan") {
40
105
  const plan = compileReleaseTailDeclaration(
41
106
  readJson(flag(options, "declaration"), "--declaration"),
@@ -95,7 +160,7 @@ export function runReleaseTailCli(args = process.argv.slice(2)) {
95
160
  return report;
96
161
  }
97
162
  throw new Error(
98
- "usage: buildchain release-tail <plan|init|status|verify|compat> [--declaration <json-or-path>] [--state <path>] [--hooks-json <json-or-path>] [--output <path>]",
163
+ "usage: buildchain release-tail <plan|init|status|verify|compat|rehearse> [--declaration <json-or-path>] [--capsule <absolute-path>] [--candidate-root <absolute-path>|--capsule-root <absolute-path>] [--environment-json <empty-json-or-path>] [--mode <simulate|replay>] [--state <absolute-path>] [--evidence <absolute-path>] [--hooks-json <json-or-path>] [--output <path>]",
99
164
  );
100
165
  }
101
166
 
@@ -105,7 +170,7 @@ if (
105
170
  import.meta.url === pathToFileURL(process.argv[1]).href
106
171
  ) {
107
172
  try {
108
- runReleaseTailCli();
173
+ await runReleaseTailCli();
109
174
  } catch (error) {
110
175
  console.error(`release-tail: ${error.message}`);
111
176
  process.exitCode = 1;