@kungfu-tech/buildchain 3.0.3-alpha.2 → 3.0.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.
@@ -4,7 +4,7 @@
4
4
  "product": {
5
5
  "name": "Buildchain",
6
6
  "package": "@kungfu-tech/buildchain",
7
- "version": "3.0.3-alpha.2",
7
+ "version": "3.0.3",
8
8
  "repository": "https://github.com/kungfu-systems/buildchain"
9
9
  },
10
10
  "majorLine": "v3",
@@ -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:4e45333ae4e971cc948e24d55ee046b859118aac9f338340a45353f0e7392957"
734
+ "auditDigest": "sha256:580c8766d5007b1655b341b8e6d0f417cbdd1324f59cac094bead261fa50c961"
735
735
  },
736
736
  {
737
737
  "contractVersion": 1,
@@ -3522,5 +3522,5 @@
3522
3522
  }
3523
3523
  ],
3524
3524
  "compatibilityDigest": "sha256:61af7d0871220bc0909008bdc571905ad500cccf853e7841bc5d462a34b2d436",
3525
- "contractDigest": "sha256:1de59de15caa16f233ec3b813944dc771ec530ae8d59bc797e6923bcc4b26c60"
3525
+ "contractDigest": "sha256:9dda48dbfc95d7d8195bb131940014d8461ad984830e23a3755bf0053eaf4063"
3526
3526
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "contract": "kungfu-buildchain-site-bundle",
4
- "generatedAt": "2026-07-31T15:25:20.771Z",
5
- "publishedAt": "2026-07-31T15:25:20.771Z",
4
+ "generatedAt": "2026-07-31T20:22:06.715Z",
5
+ "publishedAt": "2026-07-31T20:22:06.715Z",
6
6
  "reproducible": true,
7
7
  "timestampPolicy": "ci-injected",
8
8
  "deterministicInputs": [
@@ -19,7 +19,7 @@
19
19
  "declared Buildchain surface manifest contract"
20
20
  ],
21
21
  "sourceDateEpoch": "0",
22
- "sourceRevision": "00a07a9a2eb0e4839727cf455fa209066166abbf",
22
+ "sourceRevision": "be111671f1c89e2da2fb7114cec362271e067463",
23
23
  "timestampPolicyDetails": {
24
24
  "contract": "kungfu-buildchain-surface-timestamp-policy",
25
25
  "timestampFields": [
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "package": {
39
39
  "name": "@kungfu-tech/buildchain",
40
- "version": "3.0.3-alpha.2",
40
+ "version": "3.0.3",
41
41
  "versionSource": "package.json#version"
42
42
  },
43
43
  "source": {
@@ -4,7 +4,7 @@
4
4
  "product": {
5
5
  "id": "kungfu-tech-buildchain",
6
6
  "name": "@kungfu-tech/buildchain",
7
- "version": "3.0.3-alpha.2",
7
+ "version": "3.0.3",
8
8
  "repository": "https://github.com/kungfu-systems/buildchain"
9
9
  },
10
10
  "source": {
@@ -616,7 +616,7 @@
616
616
  "specifier": "@kungfu-tech/buildchain/paper",
617
617
  "export": "./paper",
618
618
  "target": "./packages/core/paper.js",
619
- "digest": "sha256:8c8484ae8eaec9065f32cd5cb8a90b85d7bfae00c066dfcf416971243591b61d",
619
+ "digest": "sha256:9e92cd56383d09ea020f7e9b80bc87ae61ab1e66f4cd771dcb5e918708b7bbc4",
620
620
  "summary": "Unified Paper work, fleet, scaffold, preflight, npm bootstrap, build, Alpha, status, and resume planning APIs.",
621
621
  "capabilityGroup": "reusable-build",
622
622
  "audience": [
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "contract": "kungfu-buildchain-publication-release-registry",
4
- "generatedAt": "2026-07-31T15:25:20.771Z",
5
- "publishedAt": "2026-07-31T15:25:20.771Z",
4
+ "generatedAt": "2026-07-31T20:22:06.715Z",
5
+ "publishedAt": "2026-07-31T20:22:06.715Z",
6
6
  "reproducible": true,
7
7
  "timestampPolicy": "ci-injected",
8
8
  "deterministicInputs": [
@@ -19,7 +19,7 @@
19
19
  "declared Buildchain surface manifest contract"
20
20
  ],
21
21
  "sourceDateEpoch": "0",
22
- "sourceRevision": "00a07a9a2eb0e4839727cf455fa209066166abbf",
22
+ "sourceRevision": "be111671f1c89e2da2fb7114cec362271e067463",
23
23
  "timestampPolicyDetails": {
24
24
  "contract": "kungfu-buildchain-surface-timestamp-policy",
25
25
  "timestampFields": [
@@ -32,7 +32,7 @@
32
32
  },
33
33
  "package": {
34
34
  "name": "@kungfu-tech/buildchain",
35
- "version": "3.0.3-alpha.2",
35
+ "version": "3.0.3",
36
36
  "versionSource": "package.json#version"
37
37
  },
38
38
  "sourceKind": "package-site-bundle",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "contract": "kungfu-buildchain-site-manifest",
4
- "generatedAt": "2026-07-31T15:25:20.771Z",
5
- "publishedAt": "2026-07-31T15:25:20.771Z",
4
+ "generatedAt": "2026-07-31T20:22:06.715Z",
5
+ "publishedAt": "2026-07-31T20:22:06.715Z",
6
6
  "reproducible": true,
7
7
  "timestampPolicy": "ci-injected",
8
8
  "deterministicInputs": [
@@ -19,7 +19,7 @@
19
19
  "declared Buildchain surface manifest contract"
20
20
  ],
21
21
  "sourceDateEpoch": "0",
22
- "sourceRevision": "00a07a9a2eb0e4839727cf455fa209066166abbf",
22
+ "sourceRevision": "be111671f1c89e2da2fb7114cec362271e067463",
23
23
  "timestampPolicyDetails": {
24
24
  "contract": "kungfu-buildchain-surface-timestamp-policy",
25
25
  "timestampFields": [
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "package": {
39
39
  "name": "@kungfu-tech/buildchain",
40
- "version": "3.0.3-alpha.2",
40
+ "version": "3.0.3",
41
41
  "versionSource": "package.json#version"
42
42
  },
43
43
  "entrypoint": "buildchain-site.json",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kungfu-tech/buildchain",
3
- "version": "3.0.3-alpha.2",
3
+ "version": "3.0.3",
4
4
  "private": false,
5
5
  "description": "Buildchain Release Passport, release governance, CLI toolkit, and site facts.",
6
6
  "repository": "https://github.com/kungfu-systems/buildchain",
@@ -46,6 +46,24 @@ function plannedManagedSurfaces(options) {
46
46
  }
47
47
  }
48
48
 
49
+ function legacyBuildchainWorkflowRefs(cwd) {
50
+ const workflowRoot = path.resolve(cwd, ".github", "workflows");
51
+ if (!fs.existsSync(workflowRoot)) return [];
52
+ return fs
53
+ .readdirSync(workflowRoot, { withFileTypes: true })
54
+ .filter(
55
+ (entry) =>
56
+ entry.isFile() && /\.ya?ml$/i.test(entry.name),
57
+ )
58
+ .filter((entry) =>
59
+ /uses:\s*kungfu-systems\/buildchain\/[^\s]+@v2(?:[-.][^\s]+)?/i.test(
60
+ fs.readFileSync(path.join(workflowRoot, entry.name), "utf8"),
61
+ ),
62
+ )
63
+ .map((entry) => `.github/workflows/${entry.name}`)
64
+ .sort();
65
+ }
66
+
49
67
  function paperFleetEntry({
50
68
  cwd,
51
69
  buildchainRoot,
@@ -78,6 +96,7 @@ function paperFleetEntry({
78
96
  const lockText = fs.existsSync(lockPath)
79
97
  ? fs.readFileSync(lockPath, "utf8")
80
98
  : "";
99
+ const legacyWorkflows = legacyBuildchainWorkflowRefs(cwd);
81
100
  const checks = [
82
101
  workCheck(
83
102
  "repository.canonical-origin",
@@ -112,6 +131,12 @@ function paperFleetEntry({
112
131
  "Every Buildchain-owned paper control surface matches v3.",
113
132
  "buildchain paper migrate --write --json",
114
133
  ),
134
+ workCheck(
135
+ "workflows.buildchain-v2-absent",
136
+ legacyWorkflows.length === 0,
137
+ "No workflow calls a Buildchain v2 reusable surface.",
138
+ "buildchain paper migrate --write --json",
139
+ ),
115
140
  ];
116
141
  return {
117
142
  name: path.basename(cwd),
@@ -124,6 +149,7 @@ function paperFleetEntry({
124
149
  buildchainDependency: dependency,
125
150
  expectedError: expected.error,
126
151
  managed,
152
+ legacyWorkflows,
127
153
  checks,
128
154
  ok: checks.every((entry) => entry.status === "pass"),
129
155
  };
@@ -9,6 +9,7 @@ export const PAPER_PATHS = Object.freeze({
9
9
  versionPin: ".buildchain-version",
10
10
  contractLock: ".buildchain/contract-lock.json",
11
11
  buildWorkflow: ".github/workflows/build.yml",
12
+ verifyWorkflow: ".github/workflows/verify.yml",
12
13
  releaseWorkflow: ".github/workflows/paper-release.yml",
13
14
  reproducibilityReceipt:
14
15
  ".buildchain/publication/reproducibility-receipt.json",
@@ -172,11 +172,30 @@ function runtimeGitSha(buildchainRoot, buildchainVersion = "") {
172
172
  return GIT_SHA_PATTERN.test(gitHead) ? gitHead : "";
173
173
  }
174
174
 
175
- function runtimeAcceptedAt(buildchainRoot, sha) {
175
+ function runtimeAcceptedAt(buildchainRoot, sha, buildchainVersion = "") {
176
176
  if (!sha) return "1970-01-01T00:00:00.000Z";
177
177
  const value = gitValue(buildchainRoot, ["show", "-s", "--format=%cI", sha]);
178
- if (!value) return "1970-01-01T00:00:00.000Z";
179
- const parsed = new Date(value);
178
+ let acceptedAt = value;
179
+ if (!acceptedAt && buildchainVersion) {
180
+ const identity = buildchainPackageIdentity(
181
+ buildchainRoot,
182
+ buildchainVersion,
183
+ );
184
+ const observed = commandResult(
185
+ "npm",
186
+ [
187
+ "view",
188
+ `${identity.name}@${identity.version}`,
189
+ "time",
190
+ "--json",
191
+ `--registry=${NPM_REGISTRY}`,
192
+ ],
193
+ { cwd: buildchainRoot },
194
+ );
195
+ const published = observed.ok ? safeParseJson(observed.stdout) : null;
196
+ acceptedAt = String(published?.[identity.version] || "");
197
+ }
198
+ const parsed = new Date(acceptedAt);
180
199
  return Number.isNaN(parsed.valueOf())
181
200
  ? "1970-01-01T00:00:00.000Z"
182
201
  : parsed.toISOString();
@@ -613,9 +632,9 @@ function scaffoldFiles({
613
632
  ).value;
614
633
  const acceptedAt =
615
634
  existingLock?.buildchain?.acceptedAt ||
616
- runtimeAcceptedAt(buildchainRoot, buildchainSha);
635
+ runtimeAcceptedAt(buildchainRoot, buildchainSha, buildchainVersion);
617
636
  const contractLock = createBuildchainContractLock({
618
- buildchainRef: buildchainSha,
637
+ buildchainRef,
619
638
  resolvedSha: buildchainSha,
620
639
  contractWorld,
621
640
  acceptedAt,
@@ -918,13 +937,17 @@ function migrationFiles({
918
937
  path.resolve(cwd, PAPER_PATHS.contractLock),
919
938
  ).value;
920
939
  const contractLock = createBuildchainContractLock({
921
- buildchainRef: runtimeSha,
940
+ buildchainRef: "v3",
922
941
  resolvedSha: runtimeSha,
923
942
  contractWorld: runtimeContractWorld(buildchainRoot),
924
943
  acceptedAt:
925
944
  existingLock?.buildchain?.resolvedSha === runtimeSha
926
945
  ? existingLock.buildchain.acceptedAt
927
- : runtimeAcceptedAt(buildchainRoot, runtimeSha),
946
+ : runtimeAcceptedAt(
947
+ buildchainRoot,
948
+ runtimeSha,
949
+ runtimeIdentity.version,
950
+ ),
928
951
  });
929
952
  const contractLockText = jsonText(contractLock);
930
953
  const buildWorkflow = scaffoldBuildWorkflow(runtimeSha, {
@@ -951,7 +974,7 @@ function migrationFiles({
951
974
  currentPackage.value,
952
975
  runtimeIdentity.version,
953
976
  );
954
- return new Map([
977
+ const files = new Map([
955
978
  [PAPER_PATHS.contractLock, contractLockText],
956
979
  [PAPER_PATHS.versionPin, `${runtimeIdentity.version}\n`],
957
980
  [PAPER_PATHS.buildWorkflow, buildWorkflow],
@@ -959,6 +982,18 @@ function migrationFiles({
959
982
  [PAPER_PATHS.provisioningAuthority, jsonText(provisioningAuthority)],
960
983
  ["package.json", jsonText(packageJson)],
961
984
  ]);
985
+ const verifyWorkflowPath = path.resolve(cwd, PAPER_PATHS.verifyWorkflow);
986
+ if (fs.existsSync(verifyWorkflowPath)) {
987
+ const currentVerifyWorkflow = fs.readFileSync(verifyWorkflowPath, "utf8");
988
+ const migratedVerifyWorkflow = currentVerifyWorkflow.replace(
989
+ /(uses:\s*kungfu-systems\/buildchain\/\.github\/workflows\/check\.yml@)[^\s]+/g,
990
+ `$1${runtimeSha}`,
991
+ );
992
+ if (migratedVerifyWorkflow !== currentVerifyWorkflow) {
993
+ files.set(PAPER_PATHS.verifyWorkflow, migratedVerifyWorkflow);
994
+ }
995
+ }
996
+ return files;
962
997
  }
963
998
 
964
999
  export function planPaperMigration({