@kungfu-tech/buildchain 4.1.2 → 4.1.3-alpha.1
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/CONTRIBUTING.md +7 -4
- package/architecture/action-taxonomy.json +4 -0
- package/architecture/agent-change-map.md +44 -0
- package/architecture/internal-capabilities.json +56 -0
- package/architecture/maintainability-debt.json +2 -1
- package/architecture/maintainability-policy.json +4 -4
- package/architecture/release-topology.json +14 -1
- package/architecture/universal-workflow-bootstrap.json +13 -2
- package/architecture/universal-workflow-capability-policy.json +14 -8
- package/contracts/promotion-invocation-v1.schema.json +6 -3
- package/contracts/promotion-request-v1.schema.json +6 -3
- package/contracts/release-discussion-v1.schema.json +143 -0
- package/dist/readers/release-discussion.cjs +207 -0
- package/dist/site/buildchain-contract.json +15 -11
- package/dist/site/buildchain-site.json +64 -8
- package/dist/site/capability-registry.json +3 -3
- package/dist/site/kfd-claims.json +95 -9
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/manual-registry.json +1 -1
- package/dist/site/node-api-registry.json +83 -1
- package/dist/site/page-registry.json +59 -3
- package/dist/site/public-surface-audit.json +53 -7
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/release-provenance.json +2 -1
- package/dist/site/site-manifest.json +5 -5
- package/dist/site/workflow-registry.json +79 -7
- package/docs/node-api-reference.md +9 -0
- package/docs/release-discussions.md +193 -0
- package/package.json +10 -6
- package/packages/core/providers/github/discussions/materials.js +157 -0
- package/packages/core/providers/github/discussions/transport.js +126 -0
- package/packages/core/publication/binary/action.js +21 -7
- package/packages/core/release/discussion/actions.js +65 -0
- package/packages/core/release/discussion/binary.js +103 -0
- package/packages/core/release/discussion/checkpoints.js +282 -0
- package/packages/core/release/discussion/envelope.js +142 -0
- package/packages/core/release/discussion/evidence.js +51 -0
- package/packages/core/release/discussion/presentation.js +92 -0
- package/packages/core/release/discussion/publication.js +123 -0
- package/packages/core/release/discussion/qualification.js +122 -0
- package/packages/core/release/discussion/reader-entry.js +11 -0
- package/packages/core/release/discussion/reader.js +177 -0
- package/packages/core/release/discussion/recovery.js +132 -0
- package/packages/core/release/discussion/session.js +115 -0
- package/packages/core/release/discussion/store.js +166 -0
- package/packages/core/release/discussion/threads.js +83 -0
- package/packages/core/release/github-release.js +3 -1
- package/packages/core/release/promote-candidate/action.js +86 -6
- package/packages/core/release/promote-candidate/preparation.js +106 -0
- package/packages/core/release/promote-candidate/product-provider.js +4 -1
- package/packages/core/release/promote-candidate/provider-settlement.js +36 -23
- package/packages/core/release/promote-candidate/transaction.js +55 -97
- package/packages/core/release/promotion/candidate.js +11 -2
- package/packages/core/release/promotion/qualification.js +5 -2
- package/packages/core/release/promotion-request.js +8 -4
- package/packages/core/workflow/engine/execution.js +5 -1
- package/packages/core/workflow/engine/provider-context.js +2 -0
- package/packages/core/workflow/engine/release-observation.js +1 -0
- package/packages/core/workflow/engine/release-promotion.js +38 -26
- package/packages/core/workflow/universal-workflow-bootstrap.js +1 -0
- package/scripts/build-release-discussion-reader.mjs +34 -0
- package/scripts/inventory/binary.mjs +1 -1
- package/scripts/maintainability-metrics.mjs +1 -0
- package/scripts/site-capability-metadata.mjs +1 -0
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"summary": {
|
|
6
6
|
"cliCommandCount": 117,
|
|
7
7
|
"workflowCount": 67,
|
|
8
|
-
"actionCount":
|
|
9
|
-
"sitePageCount":
|
|
8
|
+
"actionCount": 268,
|
|
9
|
+
"sitePageCount": 94,
|
|
10
10
|
"docCommandRefCount": 1036,
|
|
11
11
|
"failureCount": 0
|
|
12
12
|
},
|
|
@@ -864,6 +864,8 @@
|
|
|
864
864
|
"controller-receipt-digest",
|
|
865
865
|
"controller-receipt-json",
|
|
866
866
|
"controller-receipt-status",
|
|
867
|
+
"discussion-id",
|
|
868
|
+
"discussion-url",
|
|
867
869
|
"github-artifact-attestation-evidence-root",
|
|
868
870
|
"github-artifact-attestation-id",
|
|
869
871
|
"github-artifact-attestation-publication-receipt-digest",
|
|
@@ -888,7 +890,7 @@
|
|
|
888
890
|
"release-tail-transaction-state",
|
|
889
891
|
"release-transaction-root"
|
|
890
892
|
],
|
|
891
|
-
"outputCount":
|
|
893
|
+
"outputCount": 33
|
|
892
894
|
},
|
|
893
895
|
{
|
|
894
896
|
"id": "build",
|
|
@@ -1740,6 +1742,8 @@
|
|
|
1740
1742
|
"controller-receipt-digest",
|
|
1741
1743
|
"controller-receipt-json",
|
|
1742
1744
|
"controller-receipt-status",
|
|
1745
|
+
"discussion-id",
|
|
1746
|
+
"discussion-url",
|
|
1743
1747
|
"github-artifact-attestation-evidence-root",
|
|
1744
1748
|
"github-artifact-attestation-id",
|
|
1745
1749
|
"github-artifact-attestation-publication-receipt-digest",
|
|
@@ -1775,7 +1779,7 @@
|
|
|
1775
1779
|
"release-tail-transaction-state",
|
|
1776
1780
|
"release-transaction-root"
|
|
1777
1781
|
],
|
|
1778
|
-
"outputCount":
|
|
1782
|
+
"outputCount": 45
|
|
1779
1783
|
},
|
|
1780
1784
|
{
|
|
1781
1785
|
"id": "public-release-propagation",
|
|
@@ -4435,6 +4439,7 @@
|
|
|
4435
4439
|
"repository",
|
|
4436
4440
|
"required-artifacts-path",
|
|
4437
4441
|
"required-status-check",
|
|
4442
|
+
"resume-discussion-id",
|
|
4438
4443
|
"resume-transaction-id",
|
|
4439
4444
|
"runtime-commit",
|
|
4440
4445
|
"runtime-tree",
|
|
@@ -4442,12 +4447,13 @@
|
|
|
4442
4447
|
"sealed-bundle-root",
|
|
4443
4448
|
"source-sha",
|
|
4444
4449
|
"stage-capsules-path",
|
|
4450
|
+
"standalone-binary-distribution",
|
|
4445
4451
|
"state-path",
|
|
4446
4452
|
"target-ref",
|
|
4447
4453
|
"target-sha",
|
|
4448
4454
|
"token"
|
|
4449
4455
|
],
|
|
4450
|
-
"inputCount":
|
|
4456
|
+
"inputCount": 34
|
|
4451
4457
|
},
|
|
4452
4458
|
{
|
|
4453
4459
|
"id": "release/promotion/classify",
|
|
@@ -4837,6 +4843,42 @@
|
|
|
4837
4843
|
],
|
|
4838
4844
|
"inputCount": 11
|
|
4839
4845
|
},
|
|
4846
|
+
{
|
|
4847
|
+
"id": "release/transaction/inspect",
|
|
4848
|
+
"path": "actions/release/transaction/inspect/action.yml",
|
|
4849
|
+
"inputs": [
|
|
4850
|
+
"session-json",
|
|
4851
|
+
"token"
|
|
4852
|
+
],
|
|
4853
|
+
"inputCount": 2
|
|
4854
|
+
},
|
|
4855
|
+
{
|
|
4856
|
+
"id": "release/transaction/open",
|
|
4857
|
+
"path": "actions/release/transaction/open/action.yml",
|
|
4858
|
+
"inputs": [
|
|
4859
|
+
"discussion-id",
|
|
4860
|
+
"dry-run",
|
|
4861
|
+
"expected-nodes-json",
|
|
4862
|
+
"intent-key",
|
|
4863
|
+
"predecessor",
|
|
4864
|
+
"source-json",
|
|
4865
|
+
"token"
|
|
4866
|
+
],
|
|
4867
|
+
"inputCount": 7
|
|
4868
|
+
},
|
|
4869
|
+
{
|
|
4870
|
+
"id": "release/transaction/record",
|
|
4871
|
+
"path": "actions/release/transaction/record/action.yml",
|
|
4872
|
+
"inputs": [
|
|
4873
|
+
"node",
|
|
4874
|
+
"payload-json",
|
|
4875
|
+
"sequence",
|
|
4876
|
+
"session-json",
|
|
4877
|
+
"status",
|
|
4878
|
+
"token"
|
|
4879
|
+
],
|
|
4880
|
+
"inputCount": 6
|
|
4881
|
+
},
|
|
4840
4882
|
{
|
|
4841
4883
|
"id": "runtime/dependencies/install",
|
|
4842
4884
|
"path": "actions/runtime/dependencies/install/action.yml",
|
|
@@ -5518,6 +5560,10 @@
|
|
|
5518
5560
|
"id": "manual:release-candidate",
|
|
5519
5561
|
"category": "manual"
|
|
5520
5562
|
},
|
|
5563
|
+
{
|
|
5564
|
+
"id": "manual:release-discussions",
|
|
5565
|
+
"category": "manual"
|
|
5566
|
+
},
|
|
5521
5567
|
{
|
|
5522
5568
|
"id": "manual:release-flow",
|
|
5523
5569
|
"category": "manual"
|
|
@@ -10831,8 +10877,8 @@
|
|
|
10831
10877
|
"workflowRegistryPath": "dist/site/workflow-registry.json",
|
|
10832
10878
|
"pageRegistryPath": "dist/site/page-registry.json",
|
|
10833
10879
|
"cliRegistryDigest": "e43fdb0289df88871f3f0febbe04dcb9311a252a2b1df9b3a83a2d10c9d4a70f",
|
|
10834
|
-
"workflowRegistryDigest": "
|
|
10835
|
-
"pageRegistryDigest": "
|
|
10880
|
+
"workflowRegistryDigest": "3e137e0f54830a7be7976ac3a5d071fa05586d8011daab2eb149f40b4e535cf5",
|
|
10881
|
+
"pageRegistryDigest": "56222fb3665c9bcd626a301d809db80ac8f8cb42b2a15b98d32241708f26b398"
|
|
10836
10882
|
},
|
|
10837
10883
|
"comparison": {
|
|
10838
10884
|
"missingCliRegistry": [],
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"contract": "kungfu-buildchain-publication-release-registry",
|
|
4
|
-
"generatedAt": "2026-09-
|
|
5
|
-
"publishedAt": "2026-09-
|
|
4
|
+
"generatedAt": "2026-09-12T06:35:54.000Z",
|
|
5
|
+
"publishedAt": "2026-09-12T06:35:54.000Z",
|
|
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": "
|
|
22
|
+
"sourceRevision": "b06002db5210f70c8da3ad79357ac7d5ab3d6497",
|
|
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": "4.1.
|
|
35
|
+
"version": "4.1.3-alpha.1",
|
|
36
36
|
"versionSource": "package.json#version"
|
|
37
37
|
},
|
|
38
38
|
"sourceKind": "package-site-bundle",
|
|
@@ -119,7 +119,8 @@
|
|
|
119
119
|
"./publication-rehearsal": "./packages/core/publication/publication-rehearsal.js",
|
|
120
120
|
"./publication-qualification": "./packages/core/publication/publication-qualification.js",
|
|
121
121
|
"./adopter-delivery": "./packages/core/adoption/adopter-delivery.js",
|
|
122
|
-
"./cross-platform-adopter-qualification": "./packages/core/adoption/cross-platform-adopter-qualification.js"
|
|
122
|
+
"./cross-platform-adopter-qualification": "./packages/core/adoption/cross-platform-adopter-qualification.js",
|
|
123
|
+
"./release-discussion-reader": "./packages/core/release/discussion/reader.js"
|
|
123
124
|
}
|
|
124
125
|
},
|
|
125
126
|
"repository": "https://github.com/kungfu-systems/buildchain",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"contract": "kungfu-buildchain-site-manifest",
|
|
4
|
-
"generatedAt": "2026-09-
|
|
5
|
-
"publishedAt": "2026-09-
|
|
4
|
+
"generatedAt": "2026-09-12T06:35:54.000Z",
|
|
5
|
+
"publishedAt": "2026-09-12T06:35:54.000Z",
|
|
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": "
|
|
22
|
+
"sourceRevision": "b06002db5210f70c8da3ad79357ac7d5ab3d6497",
|
|
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": "4.1.
|
|
40
|
+
"version": "4.1.3-alpha.1",
|
|
41
41
|
"versionSource": "package.json#version"
|
|
42
42
|
},
|
|
43
43
|
"entrypoint": "buildchain-site.json",
|
|
@@ -253,7 +253,7 @@
|
|
|
253
253
|
"path": "docs/node-api-reference.md",
|
|
254
254
|
"plane": "use",
|
|
255
255
|
"exists": true,
|
|
256
|
-
"digest": "sha256:
|
|
256
|
+
"digest": "sha256:0fc24661217d58302858cca49a5f11d49c894fc720f6735e11da2dba50300c91"
|
|
257
257
|
},
|
|
258
258
|
{
|
|
259
259
|
"id": "build-facts",
|
|
@@ -382,6 +382,8 @@
|
|
|
382
382
|
"controller-receipt-digest",
|
|
383
383
|
"controller-receipt-json",
|
|
384
384
|
"controller-receipt-status",
|
|
385
|
+
"discussion-id",
|
|
386
|
+
"discussion-url",
|
|
385
387
|
"github-artifact-attestation-evidence-root",
|
|
386
388
|
"github-artifact-attestation-id",
|
|
387
389
|
"github-artifact-attestation-publication-receipt-digest",
|
|
@@ -406,7 +408,7 @@
|
|
|
406
408
|
"release-tail-transaction-state",
|
|
407
409
|
"release-transaction-root"
|
|
408
410
|
],
|
|
409
|
-
"outputCount":
|
|
411
|
+
"outputCount": 33,
|
|
410
412
|
"taxonomy": {
|
|
411
413
|
"id": ".release-candidate-promote",
|
|
412
414
|
"role": "component",
|
|
@@ -1044,7 +1046,7 @@
|
|
|
1044
1046
|
"status": "preview",
|
|
1045
1047
|
"owner": "buildchain-workflows",
|
|
1046
1048
|
"maturity": "preview",
|
|
1047
|
-
"introducedVersion": "4.1.
|
|
1049
|
+
"introducedVersion": "4.1.3-alpha.1",
|
|
1048
1050
|
"compatibilityPromise": "current-contract-only",
|
|
1049
1051
|
"deprecationReplacement": "",
|
|
1050
1052
|
"sunsetCondition": "explicit-contract-change-review",
|
|
@@ -1733,6 +1735,8 @@
|
|
|
1733
1735
|
"controller-receipt-digest",
|
|
1734
1736
|
"controller-receipt-json",
|
|
1735
1737
|
"controller-receipt-status",
|
|
1738
|
+
"discussion-id",
|
|
1739
|
+
"discussion-url",
|
|
1736
1740
|
"github-artifact-attestation-evidence-root",
|
|
1737
1741
|
"github-artifact-attestation-id",
|
|
1738
1742
|
"github-artifact-attestation-publication-receipt-digest",
|
|
@@ -1768,7 +1772,7 @@
|
|
|
1768
1772
|
"release-tail-transaction-state",
|
|
1769
1773
|
"release-transaction-root"
|
|
1770
1774
|
],
|
|
1771
|
-
"outputCount":
|
|
1775
|
+
"outputCount": 45,
|
|
1772
1776
|
"taxonomy": {
|
|
1773
1777
|
"id": "release-candidate-promote",
|
|
1774
1778
|
"role": "public",
|
|
@@ -2475,7 +2479,7 @@
|
|
|
2475
2479
|
"status": "preview",
|
|
2476
2480
|
"owner": "buildchain-workflows",
|
|
2477
2481
|
"maturity": "preview",
|
|
2478
|
-
"introducedVersion": "4.1.
|
|
2482
|
+
"introducedVersion": "4.1.3-alpha.1",
|
|
2479
2483
|
"compatibilityPromise": "current-contract-only",
|
|
2480
2484
|
"deprecationReplacement": "",
|
|
2481
2485
|
"sunsetCondition": "explicit-contract-change-review",
|
|
@@ -2505,7 +2509,7 @@
|
|
|
2505
2509
|
"status": "preview",
|
|
2506
2510
|
"owner": "buildchain-workflows",
|
|
2507
2511
|
"maturity": "preview",
|
|
2508
|
-
"introducedVersion": "4.1.
|
|
2512
|
+
"introducedVersion": "4.1.3-alpha.1",
|
|
2509
2513
|
"compatibilityPromise": "current-contract-only",
|
|
2510
2514
|
"deprecationReplacement": "",
|
|
2511
2515
|
"sunsetCondition": "explicit-contract-change-review",
|
|
@@ -2535,7 +2539,7 @@
|
|
|
2535
2539
|
"status": "preview",
|
|
2536
2540
|
"owner": "buildchain-workflows",
|
|
2537
2541
|
"maturity": "preview",
|
|
2538
|
-
"introducedVersion": "4.1.
|
|
2542
|
+
"introducedVersion": "4.1.3-alpha.1",
|
|
2539
2543
|
"compatibilityPromise": "current-contract-only",
|
|
2540
2544
|
"deprecationReplacement": "",
|
|
2541
2545
|
"sunsetCondition": "explicit-contract-change-review",
|
|
@@ -7044,6 +7048,7 @@
|
|
|
7044
7048
|
"repository",
|
|
7045
7049
|
"required-artifacts-path",
|
|
7046
7050
|
"required-status-check",
|
|
7051
|
+
"resume-discussion-id",
|
|
7047
7052
|
"resume-transaction-id",
|
|
7048
7053
|
"runtime-commit",
|
|
7049
7054
|
"runtime-tree",
|
|
@@ -7051,12 +7056,13 @@
|
|
|
7051
7056
|
"sealed-bundle-root",
|
|
7052
7057
|
"source-sha",
|
|
7053
7058
|
"stage-capsules-path",
|
|
7059
|
+
"standalone-binary-distribution",
|
|
7054
7060
|
"state-path",
|
|
7055
7061
|
"target-ref",
|
|
7056
7062
|
"target-sha",
|
|
7057
7063
|
"token"
|
|
7058
7064
|
],
|
|
7059
|
-
"inputCount":
|
|
7065
|
+
"inputCount": 34,
|
|
7060
7066
|
"capabilityGroup": "release-passport-trust",
|
|
7061
7067
|
"status": "active",
|
|
7062
7068
|
"owner": "buildchain-actions",
|
|
@@ -7735,6 +7741,72 @@
|
|
|
7735
7741
|
"sunsetCondition": "explicit-contract-change-review",
|
|
7736
7742
|
"nonDuplicationRationale": "One capability node owns the composite or JavaScript adapter boundary."
|
|
7737
7743
|
},
|
|
7744
|
+
{
|
|
7745
|
+
"apiRole": "implementation",
|
|
7746
|
+
"id": "release/transaction/inspect",
|
|
7747
|
+
"path": "actions/release/transaction/inspect/action.yml",
|
|
7748
|
+
"inputs": [
|
|
7749
|
+
"session-json",
|
|
7750
|
+
"token"
|
|
7751
|
+
],
|
|
7752
|
+
"inputCount": 2,
|
|
7753
|
+
"capabilityGroup": "release-passport-trust",
|
|
7754
|
+
"status": "active",
|
|
7755
|
+
"owner": "buildchain-actions",
|
|
7756
|
+
"maturity": "stable",
|
|
7757
|
+
"introducedVersion": "4.1.0-alpha.0",
|
|
7758
|
+
"compatibilityPromise": "current-contract-only",
|
|
7759
|
+
"deprecationReplacement": "",
|
|
7760
|
+
"sunsetCondition": "explicit-contract-change-review",
|
|
7761
|
+
"nonDuplicationRationale": "One capability node owns the composite or JavaScript adapter boundary."
|
|
7762
|
+
},
|
|
7763
|
+
{
|
|
7764
|
+
"apiRole": "implementation",
|
|
7765
|
+
"id": "release/transaction/open",
|
|
7766
|
+
"path": "actions/release/transaction/open/action.yml",
|
|
7767
|
+
"inputs": [
|
|
7768
|
+
"discussion-id",
|
|
7769
|
+
"dry-run",
|
|
7770
|
+
"expected-nodes-json",
|
|
7771
|
+
"intent-key",
|
|
7772
|
+
"predecessor",
|
|
7773
|
+
"source-json",
|
|
7774
|
+
"token"
|
|
7775
|
+
],
|
|
7776
|
+
"inputCount": 7,
|
|
7777
|
+
"capabilityGroup": "release-passport-trust",
|
|
7778
|
+
"status": "active",
|
|
7779
|
+
"owner": "buildchain-actions",
|
|
7780
|
+
"maturity": "stable",
|
|
7781
|
+
"introducedVersion": "4.1.0-alpha.0",
|
|
7782
|
+
"compatibilityPromise": "current-contract-only",
|
|
7783
|
+
"deprecationReplacement": "",
|
|
7784
|
+
"sunsetCondition": "explicit-contract-change-review",
|
|
7785
|
+
"nonDuplicationRationale": "One capability node owns the composite or JavaScript adapter boundary."
|
|
7786
|
+
},
|
|
7787
|
+
{
|
|
7788
|
+
"apiRole": "implementation",
|
|
7789
|
+
"id": "release/transaction/record",
|
|
7790
|
+
"path": "actions/release/transaction/record/action.yml",
|
|
7791
|
+
"inputs": [
|
|
7792
|
+
"node",
|
|
7793
|
+
"payload-json",
|
|
7794
|
+
"sequence",
|
|
7795
|
+
"session-json",
|
|
7796
|
+
"status",
|
|
7797
|
+
"token"
|
|
7798
|
+
],
|
|
7799
|
+
"inputCount": 6,
|
|
7800
|
+
"capabilityGroup": "release-passport-trust",
|
|
7801
|
+
"status": "active",
|
|
7802
|
+
"owner": "buildchain-actions",
|
|
7803
|
+
"maturity": "stable",
|
|
7804
|
+
"introducedVersion": "4.1.0-alpha.0",
|
|
7805
|
+
"compatibilityPromise": "current-contract-only",
|
|
7806
|
+
"deprecationReplacement": "",
|
|
7807
|
+
"sunsetCondition": "explicit-contract-change-review",
|
|
7808
|
+
"nonDuplicationRationale": "One capability node owns the composite or JavaScript adapter boundary."
|
|
7809
|
+
},
|
|
7738
7810
|
{
|
|
7739
7811
|
"apiRole": "implementation",
|
|
7740
7812
|
"id": "runtime/dependencies/install",
|
|
@@ -2707,3 +2707,12 @@ Target: `./packages/core/adoption/cross-platform-adopter-qualification.js`. Publ
|
|
|
2707
2707
|
| `CROSS_PLATFORM_NEUTRAL_DRIVER` | constant: const CROSS_PLATFORM_NEUTRAL_DRIVER | none | value | Import does not declare a throw contract. | none-on-import | `import { CROSS_PLATFORM_NEUTRAL_DRIVER } from "@kungfu-tech/buildchain/cross-platform-adopter-qualification";` | `packages/core/adoption/cross-platform-adopter-qualification.js:12` |
|
|
2708
2708
|
| `qualifyCrossPlatformAdopters` | function: function qualifyCrossPlatformAdopters({ reports, consumers }) | { reports, consumers } | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | may-write-or-invoke-external-actions | `import { qualifyCrossPlatformAdopters } from "@kungfu-tech/buildchain/cross-platform-adopter-qualification";` | `packages/core/adoption/cross-platform-adopter-qualification.js:143` |
|
|
2709
2709
|
| `validateCrossPlatformAdopterReport` | function: function validateCrossPlatformAdopterReport(report) | report | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { validateCrossPlatformAdopterReport } from "@kungfu-tech/buildchain/cross-platform-adopter-qualification";` | `packages/core/adoption/cross-platform-adopter-qualification.js:97` |
|
|
2710
|
+
|
|
2711
|
+
## `@kungfu-tech/buildchain/release-discussion-reader`
|
|
2712
|
+
|
|
2713
|
+
Target: `./packages/core/release/discussion/reader.js`. Public symbols: 2.
|
|
2714
|
+
|
|
2715
|
+
| Symbol | Kind and signature | Parameters | Return | Errors | Side effects | Example | Source |
|
|
2716
|
+
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
2717
|
+
| `discussionStatus` | function: function discussionStatus(state) | state | unknown | Errors from called operations may propagate; no narrower throw contract is declared in source. | none-detected-by-static-source-scan | `import { discussionStatus } from "@kungfu-tech/buildchain/release-discussion-reader";` | `packages/core/release/discussion/reader.js:155` |
|
|
2718
|
+
| `readReleaseDiscussion` | function: function readReleaseDiscussion({ body, records }) | { body, records } | unknown | May throw an Error on rejected input or failed operations; follow the linked source contract. | none-detected-by-static-source-scan | `import { readReleaseDiscussion } from "@kungfu-tech/buildchain/release-discussion-reader";` | `packages/core/release/discussion/reader.js:11` |
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: draft
|
|
3
|
+
period: ongoing
|
|
4
|
+
theme: release-discussion-transactions
|
|
5
|
+
doc_type: implementation-contract
|
|
6
|
+
source_level: user-consensus
|
|
7
|
+
confidence: medium
|
|
8
|
+
sensitivity: public
|
|
9
|
+
evidence_grade: B
|
|
10
|
+
review_state: unreviewed
|
|
11
|
+
last_reviewed: 2026-09-12
|
|
12
|
+
ai_provenance:
|
|
13
|
+
model_family: GPT-6
|
|
14
|
+
product: Codex
|
|
15
|
+
generated_at: 2026-09-12
|
|
16
|
+
visible_context: Release workflow implementation and agreed consumer Discussion transaction model.
|
|
17
|
+
invisible_context_boundary: Hosted token qualification and alpha publication are not claimed by this document.
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Release Discussion transactions
|
|
21
|
+
|
|
22
|
+
One release intent owns one Discussion in the consumer repository. Its immutable
|
|
23
|
+
body declares the intent and the complete expected semantic node list. The
|
|
24
|
+
Announcements category is resolved by the initialization service; subsequent
|
|
25
|
+
operations receive the exact Discussion ID. Categories have repository-specific
|
|
26
|
+
IDs. Enable Discussions and retain the Announcements category before executing a
|
|
27
|
+
release. A preview performs no Discussion reads or writes.
|
|
28
|
+
|
|
29
|
+
The caller grants `discussions: write` to the reusable workflow job alongside its
|
|
30
|
+
existing release permissions. The called workflow uses the consumer's automatic
|
|
31
|
+
`GITHUB_TOKEN`. Checking out Buildchain does not change that repository or token.
|
|
32
|
+
A reusable workflow cannot elevate the permissions granted by its caller.
|
|
33
|
+
|
|
34
|
+
```yaml
|
|
35
|
+
jobs:
|
|
36
|
+
release:
|
|
37
|
+
permissions:
|
|
38
|
+
contents: write
|
|
39
|
+
discussions: write
|
|
40
|
+
actions: write
|
|
41
|
+
id-token: write
|
|
42
|
+
uses: kungfu-systems/buildchain/.github/workflows/public-release-promote.yml@v4
|
|
43
|
+
with:
|
|
44
|
+
request-json: ${{ inputs.request-json }}
|
|
45
|
+
runtime-ref: ${{ inputs.runtime-ref || '' }}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
This fragment illustrates the additional Discussion permission; retain other
|
|
49
|
+
permissions required by the consumer's publication provider. The platform
|
|
50
|
+
contracts are documented in GitHub's [reusable workflow reference](https://docs.github.com/en/actions/reference/workflows-and-actions/reusing-workflow-configurations)
|
|
51
|
+
and [Discussions API guide](https://docs.github.com/en/graphql/guides/using-the-graphql-api-for-discussions).
|
|
52
|
+
|
|
53
|
+
## Records and concurrency
|
|
54
|
+
|
|
55
|
+
The body is not a mutable global status document. New intents declare `organization: attempt-threads/v1`. Each attempt owns exactly
|
|
56
|
+
one top-level root comment; node events, checkpoints and diagnostics are appended
|
|
57
|
+
as replies using that root comment ID. Workflows append bounded JSON envelopes
|
|
58
|
+
with readable context and evidence links. Each record contains an intent ID, workflow attempt,
|
|
59
|
+
predecessor, semantic node, sequence, status, payload schema, and the selected
|
|
60
|
+
runtime's exact repository and revision. These are provenance; downstream nodes
|
|
61
|
+
do not compare the runtime revision with the workflow entry revision.
|
|
62
|
+
|
|
63
|
+
Node owners serialize their own sequences. Different node owners append
|
|
64
|
+
independent replies under the same attempt root. Recovery explicitly selects the predecessor in the same
|
|
65
|
+
Discussion. A late result from an older attempt remains history; it cannot
|
|
66
|
+
complete or overwrite the recovering attempt. Success requires every declared
|
|
67
|
+
node, including nodes whose records have not appeared. Reusing completed work
|
|
68
|
+
requires explicit qualification by the recovering runtime.
|
|
69
|
+
|
|
70
|
+
The release controller must serialize initialization for one intent. GitHub does
|
|
71
|
+
not supply a unique constraint, compare-and-swap or exactly-once mutation API.
|
|
72
|
+
Initialization scans complete repository category pages, reuses the matching
|
|
73
|
+
intent, and refuses duplicate owners. A mutation whose response was lost is read
|
|
74
|
+
back before another write. If its outcome remains unknown, execution stops with
|
|
75
|
+
an explicit diagnosis. `clientMutationId` is not used as an idempotency guarantee.
|
|
76
|
+
The attempt owner creates the root before dispatching independent node writers.
|
|
77
|
+
Root creation is serialized and response-loss recovery reads it back. Different
|
|
78
|
+
roots for one attempt, nested roots and events attached to the wrong attempt are
|
|
79
|
+
rejected. Root and reply connections are both completely paginated; individual
|
|
80
|
+
page and total byte bounds fail closed. Community conversation is ignored.
|
|
81
|
+
|
|
82
|
+
Exact IDs carry the transaction through execution; search indexing is not an
|
|
83
|
+
execution dependency. Pagination limits fail closed instead of silently hiding
|
|
84
|
+
records. Only records from the original workflow writer are authoritative;
|
|
85
|
+
ordinary community replies are excluded and edited transaction records are
|
|
86
|
+
reported as integrity failures.
|
|
87
|
+
|
|
88
|
+
## Human-readable information hub
|
|
89
|
+
|
|
90
|
+
The Discussion body declares the release intent and expected nodes. Each root
|
|
91
|
+
links its workflow execution, selected runtime and predecessor attempt. Replies
|
|
92
|
+
name the semantic node, distinguish checkpoint sequence from execution status,
|
|
93
|
+
and expose bounded details. An independent binary workflow links its own run but
|
|
94
|
+
replies to the release attempt it observed before starting; a late completion
|
|
95
|
+
cannot migrate into a successor attempt.
|
|
96
|
+
|
|
97
|
+
Checkpoint replies include downloadable JSON attachments with file names, media
|
|
98
|
+
types, byte counts and SHA-256 digests. On node failures, the same thread receives
|
|
99
|
+
JSON diagnostics and a text `.log` containing the recorded event timeline and
|
|
100
|
+
bounded failure classification. Raw exceptions, environment variables and HTTP
|
|
101
|
+
credentials are not copied into diagnostics. Complete execution logs remain
|
|
102
|
+
linked through their Actions runs. Qualification also exercises JSON/log downloads.
|
|
103
|
+
|
|
104
|
+
Automation uploads these files through the documented GitHub Release asset API
|
|
105
|
+
and embeds the provider's download links in the owning comment. This does not
|
|
106
|
+
use GitHub's browser-only drag-and-drop upload implementation. The existing draft
|
|
107
|
+
material archive is private to users with the required repository access; a
|
|
108
|
+
public Discussion does not make draft attachments publicly downloadable. Download
|
|
109
|
+
links require that permission and files remain outside the source Git database.
|
|
110
|
+
|
|
111
|
+
Root comments and event replies are immutable execution facts. The latest state
|
|
112
|
+
is computed from records, not from an overwritten status summary. Historical flat
|
|
113
|
+
intents remain readable as historical data; all new writes use an attempt root
|
|
114
|
+
and replies, and new intents enforce that organization. No historical Discussion
|
|
115
|
+
body or comment is rewritten to change its layout.
|
|
116
|
+
|
|
117
|
+
## Recovery bytes and historical readers
|
|
118
|
+
|
|
119
|
+
Large sealed inputs and provider checkpoints are retained as immutable,
|
|
120
|
+
content-addressed assets in a draft material archive associated with the intent.
|
|
121
|
+
The archive is storage, not publication state. A Discussion checkpoint commits
|
|
122
|
+
the exact material manifest after upload and byte readback. Failed uploads can
|
|
123
|
+
leave unreferenced material but cannot commit an incomplete checkpoint. No
|
|
124
|
+
transaction-log history is added to the consumer's source Git object database.
|
|
125
|
+
Actual version-code commits and publication refs retain their existing roles.
|
|
126
|
+
|
|
127
|
+
Each runtime distributes the standalone `dist/readers/release-discussion.cjs`.
|
|
128
|
+
The same pure reader is available as the versioned Node API
|
|
129
|
+
`@kungfu-tech/buildchain/release-discussion-reader`. Records carry the standalone
|
|
130
|
+
reader byte digest. The recovery archive retains the exact reader bytes and the public
|
|
131
|
+
release includes the first retained reader asset. Recovery preserves those public
|
|
132
|
+
bytes while retaining each later writer's decoder in the archive. The standalone reader accepts captured JSON
|
|
133
|
+
on standard input and emits a projection and a small
|
|
134
|
+
`buildchain.release-handoff/v1` document. It performs no provider effects.
|
|
135
|
+
|
|
136
|
+
```sh
|
|
137
|
+
node --permission --allow-fs-read=/absolute/path/release-discussion.cjs \
|
|
138
|
+
/absolute/path/release-discussion.cjs < captured-discussion.json
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
A payload with a different schema belongs to its recorded historical reader.
|
|
142
|
+
The current runtime does not silently reinterpret it. Historical decoding and
|
|
143
|
+
new execution are separate: the recovering runtime consumes a supported handoff,
|
|
144
|
+
qualifies original source and material, and reads providers before issuing any
|
|
145
|
+
remaining effects. Switching runtime X to Y creates new attempt records in the
|
|
146
|
+
same Discussion. It neither rewrites X's records nor changes the release intent.
|
|
147
|
+
|
|
148
|
+
## Ownership
|
|
149
|
+
|
|
150
|
+
`actions/release/transaction/{open,record,inspect}` are reusable Node adapters.
|
|
151
|
+
`packages/core/release/discussion` owns envelopes, pure state projections, sessions, thread organization,
|
|
152
|
+
presentation, declared evidence and recovery contracts. `threads.js` checks
|
|
153
|
+
provider placement; `presentation.js` renders contextual Markdown; `evidence.js`
|
|
154
|
+
builds bounded attachment descriptors and diagnostic reports. `packages/core/providers/github/discussions` owns GitHub
|
|
155
|
+
transport and immutable material IO. The existing public promotion workflow
|
|
156
|
+
owns job boundaries; the Rust publication state machine still owns publication
|
|
157
|
+
decisions and provider-effect ordering.
|
|
158
|
+
|
|
159
|
+
The public Bootstrap API also exposes the `release-discussion` capability for
|
|
160
|
+
consumer transport qualification and read-only diagnosis. Buildchain's existing
|
|
161
|
+
Bootstrap dogfood caller accepts this request through its manual
|
|
162
|
+
`request-json` input, preserving the same public entry and central
|
|
163
|
+
runtime preparation as other consumers.
|
|
164
|
+
|
|
165
|
+
## First publication with a selected runtime
|
|
166
|
+
|
|
167
|
+
For Buildchain self-publication, dispatch `self-release-promote.yml` with the exact
|
|
168
|
+
protected alpha `sha`, its `target-ref`, `dry-run: "false"`, and the desired
|
|
169
|
+
`runtime-ref`. Leave recovery selectors empty for a first publication. The public
|
|
170
|
+
publisher still verifies the protected source and obtains fresh hosted admission.
|
|
171
|
+
`recover-durable-transaction` is reserved for an existing partial publication;
|
|
172
|
+
it is not required merely because the selected runtime differs from the entry.
|
|
173
|
+
|
|
174
|
+
## Resume by Discussion
|
|
175
|
+
|
|
176
|
+
Pass `resume-discussion-id` in the public promotion request and select the repaired
|
|
177
|
+
train through `runtime-ref`. Keep the protected target ref and source coordinates.
|
|
178
|
+
The qualifier restores content-addressed candidate material, verifies original
|
|
179
|
+
qualification, then re-observes providers before any remaining publication effect.
|
|
180
|
+
Do not combine this selector with candidate-run or transaction-id recovery.
|
|
181
|
+
|
|
182
|
+
When standalone binary distribution is requested, the intent also requires the
|
|
183
|
+
`binary-distribution` node. Its separate workflow resolves the immutable locator
|
|
184
|
+
from the public release, captures the active attempt, and appends provider readback
|
|
185
|
+
to that attempt. A result arriving after recovery stays on the older attempt.
|
|
186
|
+
The terminal publication receipt remains independently verifiable even while
|
|
187
|
+
next-development or binary distribution is incomplete.
|
|
188
|
+
|
|
189
|
+
The manual Bootstrap caller inherits the declared repository workflow permissions;
|
|
190
|
+
the typed capability request must declare its own subset. `verifyMaterials: true`
|
|
191
|
+
on a qualification request additionally tests draft Release asset retention using
|
|
192
|
+
`contents: write`. The initial injected failure is intentional and leaves durable
|
|
193
|
+
records for a subsequent runtime recovery probe.
|