@kungfu-tech/buildchain 4.1.3 → 4.1.4

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 (199) hide show
  1. package/AGENTS.md +11 -13
  2. package/CONTRIBUTING.md +32 -9
  3. package/README.md +56 -140
  4. package/actions/release/promotion/ref/README.md +1 -1
  5. package/architecture/action-taxonomy.json +1 -1
  6. package/architecture/agent-change-map.md +32 -45
  7. package/architecture/build-orchestration.json +1 -1
  8. package/architecture/capability-state-machine-manifest.json +5 -5
  9. package/architecture/ci-lane-change-budget.json +92 -92
  10. package/architecture/code-layout.json +2 -12
  11. package/architecture/core-mechanisms.json +38 -39
  12. package/architecture/cross-platform-adopter-qualification.json +1 -1
  13. package/architecture/dev-delivery-orchestration.json +2 -2
  14. package/architecture/floating-consumer-policy.json +3 -3
  15. package/architecture/internal-capabilities.json +27 -28
  16. package/architecture/maintainability-debt.json +60 -94
  17. package/architecture/maintainability-policy.json +7 -13
  18. package/architecture/minimal-consumer-migration.json +43 -5014
  19. package/architecture/platform-stage-checkpoints.json +1 -1
  20. package/architecture/release-tail-contract.json +2 -2
  21. package/architecture/release-topology.json +31 -25
  22. package/architecture/stage-capsule-qualification.json +1 -1
  23. package/architecture/universal-workflow-bootstrap.json +60 -60
  24. package/architecture/universal-workflow-capability-policy.json +3 -3
  25. package/architecture/universal-workflow-fault-campaign.json +7 -7
  26. package/architecture/workflow-taxonomy.json +59 -60
  27. package/contracts/fixtures/v4-tail-reseal-v1/valid.json +1 -1
  28. package/dist/site/buildchain-contract.json +138 -66
  29. package/dist/site/buildchain-site.json +257 -331
  30. package/dist/site/capability-registry.json +4 -4
  31. package/dist/site/cli-registry.json +6 -142
  32. package/dist/site/controller-registry.json +19 -19
  33. package/dist/site/kfd-claims.json +481 -529
  34. package/dist/site/kfd-upstream-aggregate.json +1 -1
  35. package/dist/site/manual-registry.json +22 -22
  36. package/dist/site/node-api-registry.json +82 -339
  37. package/dist/site/page-registry.json +229 -304
  38. package/dist/site/public-surface-audit.json +544 -754
  39. package/dist/site/publication-authority-registry.json +316 -316
  40. package/dist/site/publication-registry.json +1 -1
  41. package/dist/site/site-manifest.json +23 -23
  42. package/dist/site/workflow-registry.json +1071 -1027
  43. package/docs/MAP.md +28 -20
  44. package/docs/auditable-demo.md +17 -49
  45. package/docs/bootstrap-recovery.md +46 -37
  46. package/docs/cli-reference.md +2 -46
  47. package/docs/cli.md +97 -186
  48. package/docs/code-organization.md +7 -5
  49. package/docs/dev-alpha-candidate-patrol.md +19 -42
  50. package/docs/dev-delivery-orchestration.md +15 -11
  51. package/docs/dev-delivery-qualification-landing-adr.md +10 -9
  52. package/docs/dev-delivery-warrant.md +17 -16
  53. package/docs/dev-qualification-patrol.md +25 -20
  54. package/docs/getting-started.md +80 -139
  55. package/docs/github-artifact-attestation.md +31 -81
  56. package/docs/install.md +66 -30
  57. package/docs/lifecycle-protocol.md +19 -57
  58. package/docs/migration-inventory.md +17 -45
  59. package/docs/next-development-transition.md +13 -13
  60. package/docs/node-api-reference.md +122 -138
  61. package/docs/oci-publication.md +13 -10
  62. package/docs/publication-artifacts.md +128 -486
  63. package/docs/publication-authority.md +15 -45
  64. package/docs/publish-transaction.md +13 -11
  65. package/docs/release-candidate.md +126 -355
  66. package/docs/release-discussions.md +36 -67
  67. package/docs/release-flow.md +80 -339
  68. package/docs/release-governance.md +114 -962
  69. package/docs/release-promotion-request.md +45 -43
  70. package/docs/release-propagation.md +13 -27
  71. package/docs/release-tail-provider-plane.md +38 -65
  72. package/docs/reusable-build-surface.md +78 -196
  73. package/docs/runtime-train-validation.md +8 -6
  74. package/docs/stable-candidate-patrol.md +13 -66
  75. package/docs/v4-adopter-delivery.md +15 -15
  76. package/docs/v4-declarative-release-tail-migration.md +19 -17
  77. package/docs/v4-production-release.md +11 -6
  78. package/docs/v4-publication-rehearsal.md +12 -27
  79. package/docs/v4-stage-capsule.md +14 -20
  80. package/docs/v4-tail-reseal.md +34 -20
  81. package/docs/web-surface-deployments.md +26 -264
  82. package/docs/workflow-catalog.md +31 -31
  83. package/docs/workflow-path-migration.md +10 -4
  84. package/package.json +5 -4
  85. package/packages/core/adoption/buildchain-kfd-claims.js +7 -7
  86. package/packages/core/adoption/cli/output.mjs +1 -9
  87. package/packages/core/adoption/cli/product-gate.mjs +1 -15
  88. package/packages/core/adoption/cli/project.mjs +9 -10
  89. package/packages/core/adoption/cli/standards.mjs +1 -14
  90. package/packages/core/adoption/cli/support.mjs +0 -2
  91. package/packages/core/adoption/cli/surface-register.mjs +0 -2
  92. package/packages/core/adoption/commands/init-repo.mjs +77 -485
  93. package/packages/core/adoption/consumer-init.js +279 -0
  94. package/packages/core/adoption/qualification/admission.js +1 -1
  95. package/packages/core/build/cli/cache.mjs +0 -2
  96. package/packages/core/build/cli/facts.mjs +0 -3
  97. package/packages/core/build/cli/homebrew.mjs +0 -4
  98. package/packages/core/build/cli/lifecycle.mjs +0 -3
  99. package/packages/core/build/github-artifact-attestation.js +2 -2
  100. package/packages/core/build/platform-stage-checkpoints.js +1 -1
  101. package/packages/core/build/signing/dispatch.js +1 -1
  102. package/packages/core/consumer/buildchain-config.js +9 -0
  103. package/packages/core/consumer/contract/inspection.js +351 -9
  104. package/packages/core/consumer/contract/javascript-syntax.js +439 -0
  105. package/packages/core/consumer/contract/javascript-values.js +61 -0
  106. package/packages/core/consumer/contract/javascript.js +555 -0
  107. package/packages/core/consumer/contract/local-validation.js +84 -0
  108. package/packages/core/contracts/buildchain-contract.js +39 -8
  109. package/packages/core/contracts/cli/introspection.mjs +1 -9
  110. package/packages/core/contracts/public-surface-cli.js +0 -1
  111. package/packages/core/dev-delivery/dev-delivery-contract-surface.js +2 -2
  112. package/packages/core/governance/buildchain-publication-authority.js +24 -24
  113. package/packages/core/governance/cli/doctor.mjs +58 -42
  114. package/packages/core/governance/commands/architecture.mjs +6 -1
  115. package/packages/core/governance/commands/audit-publication-control-plane.mjs +1 -1
  116. package/packages/core/governance/commands/workflow-friction-report.mjs +1 -1
  117. package/packages/core/governance/github-governance-authority.js +2 -2
  118. package/packages/core/governance/publication/collection.js +1 -1
  119. package/packages/core/index.js +1 -3
  120. package/packages/core/observability/cli/candidate.mjs +0 -2
  121. package/packages/core/observability/cli/context.mjs +0 -5
  122. package/packages/core/observability/cli/diagnostics.mjs +0 -7
  123. package/packages/core/observability/cli/events.mjs +2 -10
  124. package/packages/core/paper/commands/paper-work-fleet-cli.mjs +1 -1
  125. package/packages/core/paper/commands/paper.mjs +33 -422
  126. package/packages/core/paper/consumer-status.js +72 -0
  127. package/packages/core/paper/operations/identity.js +0 -3
  128. package/packages/core/paper/operations/migration.js +460 -0
  129. package/packages/core/paper/operations/preflight-checks.js +8 -68
  130. package/packages/core/paper/operations/scaffold.js +16 -326
  131. package/packages/core/paper/operations/status.js +27 -53
  132. package/packages/core/paper/paper-agent-entry.js +36 -147
  133. package/packages/core/paper/paper-fleet.js +24 -39
  134. package/packages/core/paper/paper-repository.js +16 -0
  135. package/packages/core/paper/paper-runtime-channels.js +1 -1
  136. package/packages/core/paper/paper-scaffold-content.js +153 -162
  137. package/packages/core/paper/paper-work.js +3 -10
  138. package/packages/core/paper/paper.js +43 -5
  139. package/packages/core/providers/github/artifact-attestation.js +1 -1
  140. package/packages/core/providers/github/pipeline-context-artifacts.js +172 -0
  141. package/packages/core/publication/authority/control-plane.js +2 -2
  142. package/packages/core/publication/authority/seal.js +1 -1
  143. package/packages/core/publication/cli/dispatch.mjs +1 -12
  144. package/packages/core/publication/pipeline/actions.js +16 -9
  145. package/packages/core/publication/pipeline/apply.js +17 -9
  146. package/packages/core/publication/pipeline/context.js +29 -0
  147. package/packages/core/publication/pipeline/prepare.js +15 -6
  148. package/packages/core/publication/pipeline/recovery-materials.js +63 -1
  149. package/packages/core/publication/pipeline/recovery-prepare.js +21 -9
  150. package/packages/core/publication/pipeline/stable-entry.js +12 -7
  151. package/packages/core/publication/pipeline/stable-products.js +21 -19
  152. package/packages/core/publication/pipeline/version-actions.js +15 -6
  153. package/packages/core/publication/publication-rehearsal-projection.js +0 -9
  154. package/packages/core/release/cli/dispatch.mjs +1 -4
  155. package/packages/core/release/cli/inspection-handlers.mjs +1 -33
  156. package/packages/core/release/cli/release-handlers.mjs +2 -19
  157. package/packages/core/release/cli/verification-handlers.mjs +4 -25
  158. package/packages/core/release/next-development-projection.js +13 -13
  159. package/packages/core/release/passport/locations.js +13 -8
  160. package/packages/core/release/release-passport.js +70 -5
  161. package/packages/core/web/cli/badges.mjs +0 -4
  162. package/packages/core/web/publication-admission.js +1 -1
  163. package/packages/core/web/publication-capability.js +1 -1
  164. package/packages/core/web/readme-badges.js +1 -1
  165. package/packages/core/workflow/cli/main.mjs +1 -4
  166. package/packages/core/workflow/cli/process.mjs +1 -1
  167. package/packages/core/workflow/commands/buildchain-cli-help.mjs +2 -8
  168. package/packages/core/workflow/engine/conformance.js +1 -1
  169. package/packages/core/workflow/pipeline/build.js +21 -1
  170. package/packages/core/workflow/pipeline/delivery-observation.js +6 -2
  171. package/packages/core/workflow/workflow-taxonomy.mjs +61 -17
  172. package/scripts/check-code-layout.mjs +2 -0
  173. package/scripts/check-core-mechanism-inventory.mjs +29 -13
  174. package/scripts/check-floating-consumer-policy-contract.mjs +3 -3
  175. package/scripts/check-inventory.mjs +27 -27
  176. package/scripts/check-maintainability.mjs +28 -5
  177. package/scripts/check-public-dogfood-contract.mjs +3 -3
  178. package/scripts/check-release-topology.mjs +1 -1
  179. package/scripts/check-self-consumer-contract.mjs +7 -7
  180. package/scripts/check-universal-workflow-bootstrap.mjs +1 -1
  181. package/scripts/generate-channel-promotion-workflow.mjs +1 -1
  182. package/scripts/generate-minimal-consumer-contract.mjs +21 -1
  183. package/scripts/generate-site-bundle.mjs +2 -1
  184. package/scripts/generate-tail-reseal-fixture.mjs +3 -3
  185. package/scripts/inventory/promotion.mjs +1 -1
  186. package/scripts/next-development-self-dogfood-harness.mjs +1 -1
  187. package/scripts/next-development-self-dogfood.mjs +4 -4
  188. package/scripts/site-capability-metadata.mjs +2 -6
  189. package/scripts/source-metric-lineage.mjs +62 -7
  190. package/scripts/verify-golden-path.mjs +31 -35
  191. package/templates/native-dev-delivery.yml +1 -1
  192. package/templates/universal-buildchain-bootstrap.yml +1 -1
  193. package/packages/core/paper/operations/bootstrap.js +0 -75
  194. package/packages/core/paper/operations/plans.js +0 -213
  195. package/packages/core/paper/operations/provisioning.js +0 -113
  196. package/packages/core/paper/operations/scaffold-config.js +0 -77
  197. package/packages/core/paper/operations/scaffold-workflows.js +0 -116
  198. package/packages/core/paper/operations/workspace.js +0 -60
  199. package/packages/core/paper/paper-npm-bootstrap.js +0 -492
@@ -164,7 +164,7 @@ export function validateSelfDogfoodRoute(route) {
164
164
  targetRepository !== "kungfu-systems/buildchain" ||
165
165
  route.runtimeRef !== "v4-alpha" ||
166
166
  route.publicWorkflow !==
167
- `${targetRepository}/.github/workflows/build.yml@v4-alpha` ||
167
+ `${targetRepository}/.github/workflows/.build-candidate.yml@v4-alpha` ||
168
168
  route.protectedDevBranch !== PROTECTED_DEV_BRANCH ||
169
169
  JSON.stringify(route.hostedReadbackPaths) !==
170
170
  JSON.stringify(HOSTED_READBACK_PATHS)
@@ -66,7 +66,7 @@ export function validateSelfDogfoodCheckpoint(checkpoint) {
66
66
  if (
67
67
  checkpoint.route.runtimeRef !== "v4-alpha" ||
68
68
  checkpoint.route.publicWorkflow !==
69
- `${targetRepository}/.github/workflows/build.yml@v4-alpha` ||
69
+ `${targetRepository}/.github/workflows/.build-candidate.yml@v4-alpha` ||
70
70
  targetRepository !== "kungfu-systems/buildchain"
71
71
  ) {
72
72
  throw new Error("checkpoint requires the public owner/repo v4-alpha route");
@@ -122,7 +122,7 @@ export async function createSelfDogfoodCheckpoint({
122
122
  const routeRepository = repository(targetRepository);
123
123
  const route = {
124
124
  repository: routeRepository,
125
- publicWorkflow: `${routeRepository}/.github/workflows/build.yml@v4-alpha`,
125
+ publicWorkflow: `${routeRepository}/.github/workflows/.build-candidate.yml@v4-alpha`,
126
126
  runtimeRef: required(runtimeRef, "runtimeRef"),
127
127
  runtimeSha: exactSha(runtimeSha, "runtimeSha"),
128
128
  contractRoot: exactRoot(contractRoot, "contractRoot"),
@@ -239,7 +239,7 @@ export function validateSelfDogfoodEvidence(evidence) {
239
239
  validateAdapterEvidence(evidence.adapter, semver, anchored);
240
240
  if (
241
241
  evidence.adoption?.coordinate !==
242
- "kungfu-systems/buildchain/.github/workflows/build.yml@v4" ||
242
+ "kungfu-systems/buildchain/.github/workflows/.build-candidate.yml@v4" ||
243
243
  evidence.adoption?.exactShaProductionPin !== false
244
244
  ) {
245
245
  throw new Error("Kungfu adoption must use the floating v4 coordinate");
@@ -367,7 +367,7 @@ export async function resumeSelfDogfoodCheckpoint(
367
367
  },
368
368
  },
369
369
  adoption: {
370
- coordinate: "kungfu-systems/buildchain/.github/workflows/build.yml@v4",
370
+ coordinate: "kungfu-systems/buildchain/.github/workflows/.build-candidate.yml@v4",
371
371
  runtimeRef: "v4",
372
372
  exactShaProductionPin: false,
373
373
  },
@@ -134,14 +134,10 @@ export function cliCommandMeta(id) {
134
134
  "npm-dry-run": { group: "release-passport-trust", purpose: "Verify npm publish shape before a release transaction." },
135
135
  paper: { group: "reusable-build", purpose: "Inspect the unified paper repository and publication command families." },
136
136
  "paper-agent": { group: "getting-started", purpose: "Verify the mandatory managed Paper agent entry contract on an existing work branch." },
137
- "paper-alpha": { group: "release-passport-trust", purpose: "Plan or open the protected dev-to-alpha paper publication PR without direct publication." },
138
- "paper-bootstrap-npm": { group: "release-passport-trust", purpose: "Dry-run or explicitly bootstrap the public npm package and bind GitHub Trusted Publishing." },
139
- "paper-build": { group: "reusable-build", purpose: "Plan or execute the existing two-clean-build reproducibility gate for a paper." },
140
- "paper-fleet-audit": { group: "governance-versioning", purpose: "Discover Paper repositories and emit one deterministic v3 dependency, control-surface, and governance audit." },
137
+ "paper-fleet-audit": { group: "governance-versioning", purpose: "Discover Paper repositories and audit current consumer configuration, dependencies, and governance." },
141
138
  "paper-fleet-update": { group: "governance-versioning", purpose: "Plan or write a bounded v3 migration across isolated Paper work branches." },
142
139
  "paper-migrate": { group: "getting-started", purpose: "Plan or write the bounded Buildchain-owned control-file migration for an existing paper repository." },
143
- "paper-preflight": { group: "reusable-build", purpose: "Report exact source, runtime, permission, npm trust, deterministic build, and release-state readiness." },
144
- "paper-resume": { group: "release-passport-trust", purpose: "Plan or dispatch recovery of the exact existing sealed paper release transaction." },
140
+ "paper-preflight": { group: "reusable-build", purpose: "Validate the schema-2 consumer configuration and inspect retained legacy evidence without inferring hosted publication." },
145
141
  "paper-scaffold": { group: "getting-started", purpose: "Plan or write an idempotent, no-overwrite, release-ready paper repository scaffold." },
146
142
  "paper-status": { group: "reusable-build", purpose: "Report explicit evidence for every paper lifecycle state without unsupported inference." },
147
143
  "paper-work-start": { group: "getting-started", purpose: "Create a safe Paper work branch from the exact canonical remote development SHA." },
@@ -1,17 +1,72 @@
1
- import { execFileSync } from 'node:child_process';
1
+ import { execFileSync } from "node:child_process";
2
2
 
3
3
  // Measurement identity follows Git's observed renames. This does not resolve a
4
4
  // runtime path or keep a removed entrypoint callable.
5
- export function projectRenamedMetrics({ root, revision, metrics, currentPaths }) {
6
- const records = execFileSync('git', ['diff', '--name-status', '-z', '--find-renames=50%', '--diff-filter=R', revision],
7
- { cwd: root, encoding: 'utf8', maxBuffer: 16 * 1024 * 1024 }).split('\0');
8
- const projected = { ...metrics }, renames = [];
5
+ export function projectRenamedMetrics({
6
+ root,
7
+ revision,
8
+ metrics,
9
+ currentPaths,
10
+ }) {
11
+ const records = execFileSync(
12
+ "git",
13
+ [
14
+ "diff",
15
+ "--name-status",
16
+ "-z",
17
+ "--find-renames=50%",
18
+ "--diff-filter=R",
19
+ revision,
20
+ ],
21
+ { cwd: root, encoding: "utf8", maxBuffer: 16 * 1024 * 1024 },
22
+ ).split("\0");
23
+ const projected = { ...metrics },
24
+ renames = [];
9
25
  for (let index = 0; index < records.length && records[index]; index += 3) {
10
26
  const [status, source, target] = records.slice(index, index + 3);
11
- if (!/^R\d+$/.test(status) || !source || !target) throw Error('Invalid Git metric lineage');
12
- if (!metrics[source] || metrics[target] || !currentPaths.has(target)) continue;
27
+ if (!/^R\d+$/.test(status) || !source || !target)
28
+ throw Error("Invalid Git metric lineage");
29
+ if (!metrics[source] || metrics[target] || !currentPaths.has(target))
30
+ continue;
13
31
  projected[target] = { ...metrics[source], file: target };
14
32
  renames.push({ source, target, similarity: Number(status.slice(1)) });
15
33
  }
16
34
  return { metrics: projected, renames };
17
35
  }
36
+
37
+ // Workflow taxonomy IDs survive role/path changes and are available at both
38
+ // exact cuts even in a shallow checkout. Preserve their original measured budget.
39
+ export function projectWorkflowMetrics({
40
+ metrics,
41
+ before,
42
+ after,
43
+ currentPaths,
44
+ }) {
45
+ for (const entries of [before, after])
46
+ for (const key of ["id", "path"])
47
+ if (
48
+ new Set(entries.map((entry) => entry[key])).size !== entries.length ||
49
+ entries.some((entry) => typeof entry[key] !== "string" || !entry[key])
50
+ )
51
+ throw Error(
52
+ "Workflow measurement identities must be unique and explicit",
53
+ );
54
+ const originals = new Map(before.map((entry) => [entry.id, entry.path]));
55
+ const projected = { ...metrics },
56
+ renames = [];
57
+ for (const { id, path: target } of after) {
58
+ const source = originals.get(id);
59
+ if (
60
+ !source ||
61
+ source === target ||
62
+ !metrics[source] ||
63
+ metrics[target] ||
64
+ !currentPaths.has(target) ||
65
+ currentPaths.has(source)
66
+ )
67
+ continue;
68
+ projected[target] = { ...metrics[source], file: target };
69
+ renames.push({ id, source, target });
70
+ }
71
+ return { metrics: projected, renames };
72
+ }
@@ -56,7 +56,12 @@ export function verifyGoldenPath() {
56
56
  name: "buildchain-golden-path-consumer",
57
57
  version: "0.1.0",
58
58
  private: true,
59
- scripts: { build: 'node -e ""', check: 'node -e ""' },
59
+ scripts: {
60
+ build:
61
+ "node -e \"require('fs').mkdirSync('dist',{recursive:true});require('fs').writeFileSync('dist/index.js','export const value = 1;')\"",
62
+ check:
63
+ "node -e \"require('assert').ok(require('fs').statSync('dist/index.js').size > 0)\"",
64
+ },
60
65
  },
61
66
  null,
62
67
  2,
@@ -88,34 +93,19 @@ export function verifyGoldenPath() {
88
93
  { cwd: consumer, json: true },
89
94
  );
90
95
  const workflow = fs.readFileSync(
91
- path.join(consumer, ".github", "workflows", "build.yml"),
96
+ path.join(consumer, ".github", "workflows", "buildchain.yml"),
92
97
  "utf8",
93
98
  );
94
- const releaseDryRun = run(
95
- buildchain,
96
- ["release", "--dry-run", "--target-ref", "alpha/v4/v4.0", "--json"],
97
- { cwd: consumer, json: true },
98
- );
99
- const passportPath = path.join(
100
- consumer,
101
- ".buildchain",
102
- "golden-path",
103
- "buildchain.release.json",
104
- );
105
- fs.mkdirSync(path.dirname(passportPath), { recursive: true });
106
- run(
107
- process.execPath,
108
- [
109
- "--input-type=module",
110
- "--eval",
111
- `import fs from "node:fs"; import { createReleasePassport } from "@kungfu-tech/buildchain"; const value=createReleasePassport({repository:"example/consumer",tag:"v0.1.0-alpha.0",sourceSha:"a".repeat(40),assets:[{name:"consumer.tgz",sha256:"b".repeat(64)}]}); fs.writeFileSync(${JSON.stringify(passportPath)}, JSON.stringify(value,null,2)+"\\n");`,
112
- ],
113
- { cwd: consumer },
114
- );
115
- const inspection = run(
116
- buildchain,
117
- ["inspect", "release", "--passport", passportPath, "--json"],
118
- { cwd: consumer, json: true },
99
+ run("git", ["init", "-q"], { cwd: consumer });
100
+ const doctor = run(buildchain, ["doctor", "--json"], {
101
+ cwd: consumer,
102
+ json: true,
103
+ });
104
+ run("npm", ["run", "build"], { cwd: consumer });
105
+ run("npm", ["run", "check"], { cwd: consumer });
106
+ const recovery = fs.readFileSync(
107
+ path.join(consumer, ".github/workflows/buildchain-recover.yml"),
108
+ "utf8",
119
109
  );
120
110
 
121
111
  assert(
@@ -133,7 +123,7 @@ export function verifyGoldenPath() {
133
123
  "Golden Path validation did not retain the required lifecycle stages",
134
124
  );
135
125
  assert(
136
- /uses:\s+kungfu-systems\/buildchain\/\.github\/workflows\/build\.yml@v4/.test(
126
+ /uses:\s+kungfu-systems\/buildchain\/\.github\/workflows\/public-ops-pipeline\.yml@v4/.test(
137
127
  workflow,
138
128
  ),
139
129
  "Golden Path workflow is not a thin v4 reusable-workflow caller",
@@ -142,13 +132,18 @@ export function verifyGoldenPath() {
142
132
  !/\n\s+(?:inputs|with|steps):/.test(workflow),
143
133
  "Golden Path ordinary caller must have zero inputs and delegate its steps",
144
134
  );
135
+ assert(doctor.ok, "Golden Path doctor rejected the initialized consumer");
136
+ assert(
137
+ validation.config.schema === 2 && validation.products[0].type === "npm",
138
+ "Golden Path did not validate the schema-2 product",
139
+ );
145
140
  assert(
146
- releaseDryRun && typeof releaseDryRun === "object",
147
- "Golden Path release dry-run did not return JSON",
141
+ /public-ops-recover\.yml@v4/.test(recovery),
142
+ "Golden Path recovery entry is not the shared caller",
148
143
  );
149
144
  assert(
150
- inspection && typeof inspection === "object",
151
- "Golden Path Release Passport inspection did not return JSON",
145
+ Object.keys(validation.consumer || {}).length > 0,
146
+ "Golden Path validation did not inspect caller wiring",
152
147
  );
153
148
  return {
154
149
  contract: "kungfu-buildchain-golden-path-verification/v1",
@@ -156,9 +151,10 @@ export function verifyGoldenPath() {
156
151
  version,
157
152
  projectType: initialized.type,
158
153
  validationPath: validation.config?.path,
159
- reusableWorkflow: ".github/workflows/build.yml",
160
- releaseDryRun: true,
161
- releasePassportInspection: true,
154
+ reusableWorkflows: validation.consumer.workflows,
155
+ productBuildAndVerification: true,
156
+ doctor: doctor.ok,
157
+ providerEffects: false,
162
158
  };
163
159
  } finally {
164
160
  fs.rmSync(temporary, { recursive: true, force: true });
@@ -93,7 +93,7 @@ permissions:
93
93
  statuses: write
94
94
  jobs:
95
95
  deliver:
96
- uses: kungfu-systems/buildchain/.github/workflows/public-ops-dev-auto-merge.yml@v4-alpha
96
+ uses: kungfu-systems/buildchain/.github/workflows/.ops-dev-auto-merge.yml@v4-alpha
97
97
  with:
98
98
  runtime-ref: ${{ inputs.runtime-ref || '' }}
99
99
  target-branch: ${{ github.event.client_payload.candidate.targetBranch || inputs.target-branch }}
@@ -30,7 +30,7 @@ permissions:
30
30
 
31
31
  jobs:
32
32
  bootstrap:
33
- uses: kungfu-systems/buildchain/.github/workflows/public-ops-bootstrap.yml@v4
33
+ uses: kungfu-systems/buildchain/.github/workflows/.ops-bootstrap.yml@v4
34
34
  with:
35
35
  request-json: ${{ inputs.request-json }}
36
36
  runtime-ref: ${{ inputs.runtime-ref }}
@@ -1,75 +0,0 @@
1
- import { readNpmPackResult } from "../../publication/npm/pack-result.js";
2
- import path from "node:path";
3
- import fs from "node:fs";
4
- import { jsonText, extractUrls, safeParseJson, toPosix } from "./files.js";
5
- import {
6
- NPM_REGISTRY,
7
- DEFAULT_BOOTSTRAP_VERSION,
8
- PAPER_NPM_BOOTSTRAP_CONTRACT,
9
- } from "./identity.js";
10
- import { executePaperNpmBootstrap as executePaperNpmBootstrapOperation } from "../paper-npm-bootstrap.js";
11
- import {
12
- PAPER_PATHS,
13
- commandResult,
14
- normalizeRepository,
15
- paperConfig,
16
- resolvePaperRepository,
17
- } from "../paper-repository.js";
18
- import os from "node:os";
19
- import {
20
- expectedPaperTrustedPublisher,
21
- validatePaperProvisioningAuthority,
22
- } from "./provisioning-validation.js";
23
- import {
24
- liveNpmAuthObservation,
25
- liveNpmPackageObservation,
26
- liveNpmTrustObservation,
27
- } from "./npm-observation.js";
28
- import { normalizePackageName } from "./runtime.js";
29
- export function writePaperReceipt(cwd, relativePath, value) {
30
- const target = path.resolve(cwd, relativePath);
31
- fs.mkdirSync(path.dirname(target), { recursive: true });
32
- fs.writeFileSync(target, jsonText(value));
33
- return relativePath;
34
- }
35
- export function bootstrapPackageShape({ packageName, version }) {
36
- return {
37
- name: packageName,
38
- version,
39
- private: false,
40
- license: "Apache-2.0",
41
- description: "Bootstrap package for npm Trusted Publishing setup.",
42
- publishConfig: {
43
- access: "public",
44
- registry: NPM_REGISTRY,
45
- },
46
- };
47
- }
48
- export function executePaperNpmBootstrap(options = {}) {
49
- return executePaperNpmBootstrapOperation(options, {
50
- DEFAULT_BOOTSTRAP_VERSION,
51
- NPM_REGISTRY,
52
- PAPER_NPM_BOOTSTRAP_CONTRACT,
53
- PAPER_PATHS,
54
- bootstrapPackageShape,
55
- commandResult,
56
- expectedPaperTrustedPublisher,
57
- extractUrls,
58
- fs,
59
- jsonText,
60
- liveNpmAuthObservation,
61
- liveNpmPackageObservation,
62
- liveNpmTrustObservation,
63
- normalizePackageName,
64
- normalizeRepository,
65
- os,
66
- paperConfig,
67
- path,
68
- resolvePaperRepository,
69
- safeParseJson,
70
- readNpmPackResult,
71
- toPosix,
72
- validatePaperProvisioningAuthority,
73
- writePaperReceipt,
74
- });
75
- }
@@ -1,213 +0,0 @@
1
- import path from "node:path";
2
- import {
3
- paperConfig,
4
- gitValue,
5
- PAPER_PATHS,
6
- parsePaperVersion,
7
- resolvePaperRepository,
8
- } from "../paper-repository.js";
9
- import {
10
- PAPER_BUILD_PLAN_CONTRACT,
11
- GIT_SHA_PATTERN,
12
- PAPER_ALPHA_PLAN_CONTRACT,
13
- PAPER_RESUME_PLAN_CONTRACT,
14
- } from "./identity.js";
15
- import { collectPaperStatus } from "./status.js";
16
- export function createPaperBuildPlan({
17
- cwd = process.cwd(),
18
- sourceSha = "",
19
- pullToolchain = true,
20
- } = {}) {
21
- const resolvedCwd = path.resolve(cwd);
22
- const configResult = paperConfig(resolvedCwd);
23
- if (configResult.error) throw new Error(configResult.error);
24
- const resolvedSha = sourceSha || gitValue(resolvedCwd, ["rev-parse", "HEAD"]);
25
- return {
26
- schemaVersion: 1,
27
- contract: PAPER_BUILD_PLAN_CONTRACT,
28
- ok: GIT_SHA_PATTERN.test(resolvedSha),
29
- cwd: resolvedCwd,
30
- dryRun: true,
31
- sourceSha: resolvedSha,
32
- toolchain: configResult.loaded.config.publication.toolchain,
33
- pullToolchain,
34
- output: PAPER_PATHS.reproducibilityReceipt,
35
- promotion: "first-byte-identical-clean-build",
36
- delegatesTo: "buildchain publication-artifact reproducibility --promote",
37
- nextActions: [
38
- {
39
- id: "execute-build",
40
- command: "buildchain paper build --execute --json",
41
- description:
42
- "Run two independent clean builds and promote only byte-identical qualifying outputs.",
43
- },
44
- ],
45
- };
46
- }
47
- export function resolvePaperChannelRef(cwd, ref) {
48
- const candidates = [
49
- {
50
- observedRef: `refs/remotes/origin/${ref}`,
51
- observation: "origin-tracking-ref",
52
- },
53
- {
54
- observedRef: `refs/heads/${ref}`,
55
- observation: "local-branch-ref",
56
- },
57
- ];
58
- for (const candidate of candidates) {
59
- const sha = gitValue(cwd, [
60
- "rev-parse",
61
- "--verify",
62
- `${candidate.observedRef}^{commit}`,
63
- ]);
64
- if (GIT_SHA_PATTERN.test(sha)) {
65
- return {
66
- sha,
67
- ...candidate,
68
- };
69
- }
70
- }
71
- return {
72
- sha: "",
73
- observedRef: "",
74
- observation: "unresolved",
75
- };
76
- }
77
- export function createPaperAlphaPlan({
78
- cwd = process.cwd(),
79
- sourceRef = "",
80
- targetRef = "",
81
- } = {}) {
82
- const resolvedCwd = path.resolve(cwd);
83
- const configResult = paperConfig(resolvedCwd);
84
- if (configResult.error) throw new Error(configResult.error);
85
- const publication = configResult.loaded.config.publication;
86
- const parsed = parsePaperVersion(publication.version);
87
- const line = `v${parsed.major}.${parsed.minor}`;
88
- const source = sourceRef || `dev/v${parsed.major}/${line}`;
89
- const target = targetRef || `alpha/v${parsed.major}/${line}`;
90
- const repository = resolvePaperRepository(resolvedCwd);
91
- const sourceObservation = resolvePaperChannelRef(resolvedCwd, source);
92
- const targetObservation = resolvePaperChannelRef(resolvedCwd, target);
93
- const currentBranch = gitValue(resolvedCwd, ["branch", "--show-current"]);
94
- return {
95
- schemaVersion: 1,
96
- contract: PAPER_ALPHA_PLAN_CONTRACT,
97
- ok: Boolean(repository && source && target && source !== target),
98
- cwd: resolvedCwd,
99
- dryRun: true,
100
- repository,
101
- package: configResult.loaded.config.publish?.package || "",
102
- publicationVersion: parsed.version,
103
- channel: "alpha",
104
- source: {
105
- ref: source,
106
- ...sourceObservation,
107
- },
108
- target: {
109
- ref: target,
110
- ...targetObservation,
111
- },
112
- currentBranch,
113
- mutation: {
114
- kind: "github-protected-channel-pr",
115
- directPublish: false,
116
- directMerge: false,
117
- command: `gh pr create --repo ${repository || "<owner/repo>"} --base ${target} --head ${source}`,
118
- },
119
- gates: [
120
- "source is the protected dev channel for the configured semver line",
121
- "target is the protected alpha channel",
122
- "the paper release workflow seals exact bytes and uses npm OIDC",
123
- "this command opens a PR but never merges it or publishes directly",
124
- ],
125
- nextActions: [
126
- {
127
- id: "open-alpha-pr",
128
- command: "buildchain paper alpha --execute --json",
129
- description: "Open or reuse the protected dev-to-alpha publication PR.",
130
- },
131
- ],
132
- };
133
- }
134
- export function createPaperResumePlan({
135
- cwd = process.cwd(),
136
- runtimeRef = "",
137
- } = {}) {
138
- const resolvedCwd = path.resolve(cwd);
139
- const status = collectPaperStatus({ cwd: resolvedCwd });
140
- const transaction = status.transaction;
141
- if (!transaction) {
142
- return {
143
- schemaVersion: 1,
144
- contract: PAPER_RESUME_PLAN_CONTRACT,
145
- ok: false,
146
- cwd: resolvedCwd,
147
- dryRun: true,
148
- resumable: false,
149
- reason: "no-release-transaction",
150
- transaction: null,
151
- nextActions: [
152
- {
153
- id: "start-alpha",
154
- command: "buildchain paper alpha --json",
155
- description:
156
- "No transaction exists; plan the protected Alpha publication first.",
157
- },
158
- ],
159
- };
160
- }
161
- if (
162
- ["alpha-complete", "release-complete"].includes(
163
- transaction.publicationState,
164
- )
165
- ) {
166
- return {
167
- schemaVersion: 1,
168
- contract: PAPER_RESUME_PLAN_CONTRACT,
169
- ok: true,
170
- cwd: resolvedCwd,
171
- dryRun: true,
172
- resumable: false,
173
- reason: "transaction-complete",
174
- transaction,
175
- nextActions: [],
176
- };
177
- }
178
- const targetRef = transaction.targetRef;
179
- const command = [
180
- "gh workflow run .github/workflows/public-release-paper.yml",
181
- targetRef ? `--ref ${targetRef}` : "",
182
- runtimeRef ? `-f runtime-ref=${runtimeRef}` : "",
183
- ]
184
- .filter(Boolean)
185
- .join(" ");
186
- return {
187
- schemaVersion: 1,
188
- contract: PAPER_RESUME_PLAN_CONTRACT,
189
- ok: Boolean(targetRef),
190
- cwd: resolvedCwd,
191
- dryRun: true,
192
- resumable: Boolean(targetRef),
193
- reason: targetRef
194
- ? "rerun-sealed-paper-release"
195
- : "transaction-target-ref-missing",
196
- transaction,
197
- mutation: {
198
- kind: "github-workflow-dispatch",
199
- directPublish: false,
200
- command,
201
- },
202
- nextActions: targetRef
203
- ? [
204
- {
205
- id: "dispatch-resume",
206
- command: "buildchain paper resume --execute --json",
207
- description:
208
- "Dispatch the thin repository workflow against the exact transaction target ref.",
209
- },
210
- ]
211
- : [],
212
- };
213
- }
@@ -1,113 +0,0 @@
1
- import { PAPER_PATHS, sha256Text, stableJson } from "../paper-repository.js";
2
- import { PAPER_AGENT_ENTRY_CONTRACT } from "../paper-agent-entry.js";
3
- import path from "node:path";
4
- import {
5
- PAPER_PROVISIONING_CONTRACT,
6
- NPM_REGISTRY,
7
- DEFAULT_BOOTSTRAP_VERSION,
8
- } from "./identity.js";
9
- export function paperProvisioningPolicy() {
10
- return {
11
- repositoryActions: {
12
- defaultWorkflowPermissions: "read",
13
- canApprovePullRequestReviews: false,
14
- },
15
- generatedWrites: {
16
- preferredAuthority: "github-app",
17
- compatibilityAuthority: "narrow-token",
18
- githubTokenFallback: false,
19
- permissions: ["checks:write", "contents:write", "pull-requests:write"],
20
- tokenPersistence: "runtime-only",
21
- },
22
- release: {
23
- protectedReviewRequired: true,
24
- versionState: "not-required",
25
- identityOnlyPullRequests: false,
26
- manualVersionStateRepairPullRequests: false,
27
- },
28
- roles: {
29
- actor: "repository-development-role",
30
- pusher: "repository-development-role",
31
- reviewer: "independent-review-role",
32
- generatedWriteAuthority: "github-app-or-narrow-token",
33
- },
34
- };
35
- }
36
- export function createPaperProvisioningAuthority({
37
- repository,
38
- packageName,
39
- buildchainVersion,
40
- buildchainSha,
41
- contractLock,
42
- buildWorkflow,
43
- verifyWorkflow,
44
- releaseWorkflow,
45
- agentEntry,
46
- agentInstructions,
47
- environment = "",
48
- }) {
49
- const policy = paperProvisioningPolicy();
50
- const payload = {
51
- schemaVersion: 1,
52
- contract: PAPER_PROVISIONING_CONTRACT,
53
- repository,
54
- package: {
55
- name: packageName,
56
- registry: NPM_REGISTRY,
57
- bootstrapVersion: DEFAULT_BOOTSTRAP_VERSION,
58
- },
59
- runtime: {
60
- repository: "kungfu-systems/buildchain",
61
- version: buildchainVersion,
62
- ref: buildchainSha,
63
- resolvedSha: buildchainSha,
64
- },
65
- workflows: {
66
- build: {
67
- path: PAPER_PATHS.buildWorkflow,
68
- sourceDigest: sha256Text(buildWorkflow),
69
- reusablePath: ".github/workflows/public-build-publication.yml",
70
- reusableRef: buildchainSha,
71
- },
72
- verify: {
73
- path: PAPER_PATHS.verifyWorkflow,
74
- sourceDigest: sha256Text(verifyWorkflow),
75
- reusablePath: ".github/workflows/public-build-check.yml",
76
- reusableRef: buildchainSha,
77
- },
78
- release: {
79
- path: PAPER_PATHS.releaseWorkflow,
80
- sourceDigest: sha256Text(releaseWorkflow),
81
- reusablePath: ".github/workflows/public-release-paper.yml",
82
- reusableRef: buildchainSha,
83
- },
84
- },
85
- agentEntry: {
86
- contract: PAPER_AGENT_ENTRY_CONTRACT,
87
- policyPath: PAPER_PATHS.agentEntry,
88
- policyDigest: sha256Text(agentEntry),
89
- instructionsPath: PAPER_PATHS.agentInstructions,
90
- instructionsDigest: sha256Text(agentInstructions),
91
- },
92
- admission: {
93
- contractLockPath: PAPER_PATHS.contractLock,
94
- contractLockDigest: sha256Text(contractLock),
95
- acceptedRef: buildchainSha,
96
- acceptedSha: buildchainSha,
97
- },
98
- trustedPublisher: {
99
- type: "github",
100
- repository,
101
- workflow: path.posix.basename(PAPER_PATHS.releaseWorkflow),
102
- environment,
103
- },
104
- policy: {
105
- ...policy,
106
- policyDigest: sha256Text(stableJson(policy)),
107
- },
108
- };
109
- return {
110
- ...payload,
111
- authorityDigest: sha256Text(stableJson(payload)),
112
- };
113
- }