@kungfu-tech/buildchain 4.0.2-alpha.9 → 4.0.3-alpha.0
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/AGENTS.md +14 -5
- package/CONTRIBUTING.md +58 -0
- package/README.md +3 -3
- package/actions/promote-buildchain-ref/README.md +1 -1
- package/actions/release-candidate-promote/README.md +31 -0
- package/architecture/agent-change-map.md +190 -126
- package/architecture/{v4-architecture-constitution.md → architecture-constitution.md} +33 -30
- package/architecture/{v3-core-mechanism-inventory.md → baseline-core-mechanism-inventory.md} +1 -1
- package/architecture/{v4-bootstrap-authority.json → bootstrap-authority.json} +3 -3
- package/architecture/{v3-v4-capability-closure.md → capability-parity-closure.md} +3 -3
- package/architecture/{v3-v4-live-capability-inventory.json → capability-parity-live-capability-inventory.json} +4 -4
- package/architecture/{v4-capability-state-machine-manifest.json → capability-state-machine-manifest.json} +2 -2
- package/architecture/{v4-capability-state-machine-manifest.schema.json → capability-state-machine-manifest.schema.json} +2 -2
- package/architecture/ci-lane-change-budget.json +384 -0
- package/architecture/{v4-cross-platform-adopter-qualification.json → cross-platform-adopter-qualification.json} +4 -4
- package/architecture/{v4-delivery-authority-parity.json → delivery-authority-parity.json} +17 -17
- package/architecture/{v4-delivery-warrant-shadow-bootstrap-plan.json → delivery-warrant-shadow-bootstrap-plan.json} +4 -4
- package/architecture/{v4-delivery-warrant-shadow-bootstrap-plan.md → delivery-warrant-shadow-bootstrap-plan.md} +7 -7
- package/architecture/{v4-floating-consumer-policy.json → floating-consumer-policy.json} +2 -2
- package/architecture/{v4-floating-consumer-policy.md → floating-consumer-policy.md} +1 -1
- package/architecture/implementation-naming.json +1273 -0
- package/architecture/internal-capabilities.json +201 -154
- package/architecture/maintainability-debt.json +205 -146
- package/architecture/maintainability-policy.json +37 -33
- package/architecture/{v4-next-development-parity.json → next-development-parity.json} +12 -12
- package/architecture/{v4-partial-mutation-recovery-qualification.json → partial-mutation-recovery-qualification.json} +8 -5
- package/architecture/{v4-platform-stage-checkpoints.json → platform-stage-checkpoints.json} +3 -3
- package/architecture/{v4-provider-operation-journal-contract.json → provider-operation-journal-contract.json} +10 -7
- package/architecture/publication-facade-patches.json +64 -0
- package/architecture/{v4-publication-rehearsal-parity.json → publication-rehearsal-parity.json} +4 -4
- package/architecture/{v4-release-activation-shadow-domain.json → release-activation-shadow-domain.json} +9 -6
- package/architecture/release-tail-contract-inventory.json +6 -6
- package/architecture/{v4-release-topology.json → release-topology.json} +163 -72
- package/architecture/{v4-release-train-parity.json → release-train-parity.json} +2 -2
- package/architecture/{v4-runtime-ref-resume-authority.json → runtime-ref-resume-authority.json} +1 -1
- package/architecture/{v4-runtime-semantic-closure.json → runtime-semantic-closure.json} +2 -2
- package/architecture/{v4-rust-libnode-bridge-evaluation.json → rust-libnode-bridge-evaluation.json} +3 -3
- package/architecture/{v4-rust-libnode-bridge-spike.md → rust-libnode-bridge-spike.md} +6 -6
- package/architecture/rust-wasm-production-authority.json +58 -0
- package/architecture/{v4-stable-publication-fence.json → stable-publication-fence.json} +7 -4
- package/architecture/{v4-stage-capsule-contract.json → stage-capsule-contract.json} +1 -1
- package/architecture/{v4-stage-capsule-qualification.json → stage-capsule-qualification.json} +8 -8
- package/architecture/{v4-stage-capsule-resume-planner.json → stage-capsule-resume-planner.json} +2 -2
- package/architecture/{v4-stage-capsule-store-contract.json → stage-capsule-store-contract.json} +4 -4
- package/architecture/{v4-tail-reseal-parity.json → tail-reseal-parity.json} +35 -33
- package/architecture/universal-workflow-bootstrap.json +176 -0
- package/architecture/universal-workflow-fault-campaign.json +72 -0
- package/architecture/universal-workflow-train-admission.json +40 -0
- package/architecture/workflow-taxonomy.json +1462 -0
- package/bin/buildchain.mjs +10 -10
- package/bin/internal/adopter-delivery-cli.mjs +9 -9
- package/contracts/buildchain-v2-residuals-v1.json +57 -48
- package/contracts/dev-delivery-authority-v2.schema.json +16 -2
- package/contracts/fixtures/v4-tail-reseal-v1/valid.json +1 -1
- package/contracts/v4-canonical-contracts-v1.schema.json +1 -0
- package/crates/{buildchain-v4-bridge → buildchain-host-bridge}/Cargo.lock +1 -1
- package/crates/{buildchain-v4-bridge → buildchain-host-bridge}/Cargo.toml +1 -1
- package/crates/{buildchain-v4-bridge → buildchain-host-bridge}/src/main.rs +3 -3
- package/dist/site/buildchain-contract.json +98 -53
- package/dist/site/buildchain-site.json +351 -102
- package/dist/site/capability-registry.json +7 -7
- package/dist/site/controller-registry.json +50 -13
- package/dist/site/kfd-claims.json +2773 -1052
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/manual-registry.json +14 -14
- package/dist/site/node-api-registry.json +13176 -10733
- package/dist/site/page-registry.json +332 -83
- package/dist/site/public-surface-audit.json +3227 -1222
- package/dist/site/publication-authority-registry.json +1135 -363
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/release-provenance.json +18 -9
- package/dist/site/schemas/dev-delivery-authority-v2.schema.json +16 -2
- package/dist/site/site-manifest.json +18 -18
- package/dist/site/workflow-registry.json +5367 -1931
- package/docs/MAP.md +5 -3
- package/docs/auditable-demo.md +1 -1
- package/docs/cli.md +21 -8
- package/docs/dev-delivery-warrant.md +1 -1
- package/docs/engineering-housekeeper.md +3 -3
- package/docs/kfd-support.md +26 -2
- package/docs/next-development-transition.md +26 -3
- package/docs/node-api-reference.md +618 -358
- package/docs/oci-publication.md +173 -0
- package/docs/publication-authority.md +2 -2
- package/docs/publish-transaction.md +36 -3
- package/docs/release-candidate.md +3 -3
- package/docs/release-flow.md +67 -19
- package/docs/release-governance.md +8 -8
- package/docs/release-passport.md +27 -2
- package/docs/reusable-build-surface.md +17 -1
- package/docs/v4-adopter-delivery.md +4 -4
- package/docs/v4-canonical-contracts.md +7 -7
- package/docs/v4-delivery-warrant-read-candidate.md +3 -3
- package/docs/v4-delivery-warrant-semantic-diff.md +3 -3
- package/docs/v4-production-release.md +77 -8
- package/docs/v4-publication-rehearsal.md +3 -3
- package/docs/v4-runtime-ref-resume-authority.md +2 -2
- package/docs/v4-rust-wasm-production-authority.md +58 -0
- package/docs/v4-stage-capsule.md +9 -9
- package/docs/v4-tail-reseal.md +2 -2
- package/docs/workflow-catalog.md +155 -0
- package/docs/workflow-path-migration.md +109 -0
- package/package.json +39 -24
- package/packages/compatibility/adopter-delivery.js +16 -0
- package/packages/compatibility/cross-platform-adopter-qualification.js +12 -0
- package/packages/compatibility/floating-consumer-policy.js +14 -0
- package/packages/compatibility/publication-qualification.js +11 -0
- package/packages/compatibility/publication-rehearsal.js +18 -0
- package/packages/compatibility/runtime-ref-resume-authority.js +13 -0
- package/packages/compatibility/tail-reseal-receipt.js +7 -0
- package/packages/compatibility/tail-reseal.js +11 -0
- package/packages/core/{v4-adopter-delivery-parity.js → adopter-delivery-parity.js} +12 -12
- package/packages/core/{v4-adopter-delivery.js → adopter-delivery.js} +24 -24
- package/packages/core/artifact-verification-envelope.js +5 -5
- package/packages/core/buildchain-contract.js +6 -6
- package/packages/core/buildchain-domain.wasm +0 -0
- package/packages/core/buildchain-kfd-claims.js +2 -2
- package/packages/core/buildchain-publication-authority.js +43 -26
- package/packages/core/{v4-canonical-contracts.js → canonical-contracts.js} +39 -103
- package/packages/core/ci-lane-change-budget.js +14 -1
- package/packages/core/controller-evidence.js +4 -1
- package/packages/core/{v4-cross-platform-adopter-qualification.js → cross-platform-adopter-qualification.js} +19 -19
- package/packages/core/{v4-delivery-warrant-fixture-runner.js → delivery-warrant-fixture-runner.js} +36 -32
- package/packages/core/{v4-delivery-warrant-read-candidate.js → delivery-warrant-read-candidate.js} +40 -40
- package/packages/core/{v4-delivery-warrant-semantic-diff-gate.js → delivery-warrant-semantic-diff-gate.js} +58 -59
- package/packages/core/{v4-delivery-warrant-shadow-adapter.js → delivery-warrant-shadow-adapter.js} +15 -15
- package/packages/core/dev-delivery-candidate-identity.js +40 -6
- package/packages/core/dev-delivery-execution-transfer.js +6 -6
- package/packages/core/dev-delivery-native-proof.js +12 -8
- package/packages/core/dev-delivery-warrant-legacy-recovery.js +1 -1
- package/packages/core/dev-delivery-warrant-native-compatibility.js +4 -4
- package/packages/core/dev-delivery-warrant-state.js +14 -15
- package/packages/core/dev-delivery-warrant.js +15 -5
- package/packages/core/domain-wasm-artifact.js +7 -0
- package/packages/core/domain-wasm.js +216 -0
- package/packages/core/{v4-floating-consumer-evidence.js → floating-consumer-evidence.js} +14 -14
- package/packages/core/{v4-floating-consumer-policy.js → floating-consumer-policy.js} +28 -30
- package/packages/core/{v4-floating-consumer-release-passport.js → floating-consumer-release-passport.js} +25 -25
- package/packages/core/github-governance-authority.js +4 -4
- package/packages/core/index.js +4 -8
- package/packages/core/kfd-adopter-manifest.js +46 -47
- package/packages/core/next-development-projection.js +26 -3
- package/packages/core/next-development-transition.js +5 -6
- package/packages/core/oci-compose-qualification.js +143 -0
- package/packages/core/oci-publication-bundle.js +281 -0
- package/packages/core/oci-publication-graph.js +206 -0
- package/packages/core/paper-agent-entry.js +30 -4
- package/packages/core/paper-fleet.js +1 -1
- package/packages/core/paper-runtime-channels.js +348 -0
- package/packages/core/paper-scaffold-content.js +10 -0
- package/packages/core/paper.js +37 -71
- package/packages/core/partial-mutation-recovery-qualification.js +18 -0
- package/packages/core/{v4-platform-stage-checkpoints.js → platform-stage-checkpoints.js} +37 -37
- package/packages/core/product-publication.js +59 -0
- package/packages/core/{v4-protected-publication-source.js → protected-publication-source.js} +22 -24
- package/packages/core/provider-operation-journal.js +62 -0
- package/packages/core/{v4-provider-readback-idempotency.js → provider-readback-idempotency.js} +40 -125
- package/packages/core/public-export-compatibility.js +33 -0
- package/packages/core/publication-development.js +72 -0
- package/packages/core/{v4-publication-qualification.js → publication-qualification.js} +17 -17
- package/packages/core/{v4-publication-rehearsal-capsule.js → publication-rehearsal-capsule.js} +23 -23
- package/packages/core/publication-rehearsal-projection.js +2 -2
- package/packages/core/{v4-publication-rehearsal-provider-bindings.js → publication-rehearsal-provider-bindings.js} +4 -4
- package/packages/core/publication-rehearsal-runtime.js +21 -21
- package/packages/core/{v4-publication-rehearsal.js → publication-rehearsal.js} +33 -33
- package/packages/core/publication-sealed-bundle.js +78 -13
- package/packages/core/release-activation-shadow.js +32 -0
- package/packages/core/release-candidate.js +6 -6
- package/packages/core/release-invocation.js +64 -0
- package/packages/core/release-line-dry-run.js +1 -1
- package/packages/core/release-passport-contract.js +5 -5
- package/packages/core/release-passport.js +41 -40
- package/packages/core/release-tail-product-capabilities.js +9 -0
- package/packages/core/release-tail-provider-plane.js +68 -1048
- package/packages/core/{v4-runtime-ref-resume-authority.js → runtime-ref-resume-authority.js} +36 -40
- package/packages/core/{v4-runtime-selector-persistence.js → runtime-selector-persistence.js} +7 -7
- package/packages/core/stable-publication-fence.js +28 -0
- package/packages/core/{v4-stage-capsule-local-store.js → stage-capsule-local-store.js} +56 -54
- package/packages/core/{v4-stage-capsule-qualification-campaign.js → stage-capsule-qualification-campaign.js} +37 -38
- package/packages/core/{v4-stage-capsule-qualification.js → stage-capsule-qualification.js} +28 -29
- package/packages/core/{v4-stage-capsule-resume-planner.js → stage-capsule-resume-planner.js} +29 -29
- package/packages/core/{v4-stage-capsule-store.js → stage-capsule-store.js} +59 -56
- package/packages/core/{v4-stage-capsule.js → stage-capsule.js} +45 -45
- package/packages/core/{v4-tail-reseal-contract.js → tail-reseal-contract.js} +6 -6
- package/packages/core/{v4-tail-reseal-github.js → tail-reseal-github.js} +12 -12
- package/packages/core/{v4-tail-reseal-receipt.js → tail-reseal-receipt.js} +22 -22
- package/packages/core/{v4-tail-reseal.js → tail-reseal.js} +29 -29
- package/packages/core/universal-workflow-bootstrap.js +586 -0
- package/scripts/{v4-architecture.mjs → architecture.mjs} +6 -6
- package/scripts/binary-publication-evidence.mjs +135 -0
- package/scripts/{v4-bridge-bootstrap.mjs → bridge-bootstrap.mjs} +14 -18
- package/scripts/{v4-bridge-evidence.mjs → bridge-evidence.mjs} +8 -8
- package/scripts/build-contract-core.mjs +1 -14
- package/scripts/build-domain-wasm.mjs +177 -0
- package/scripts/{v3-v4-capability-catalog.mjs → capability-parity-catalog.mjs} +19 -19
- package/scripts/check-action-bundles.mjs +12 -2
- package/scripts/{check-v3-v4-capability-inventory.mjs → check-capability-parity-inventory.mjs} +42 -42
- package/scripts/check-ci-lane-change-budget.mjs +4 -1
- package/scripts/check-core-mechanism-inventory.mjs +8 -4
- package/scripts/{check-v4-floating-consumer-policy-contract.mjs → check-floating-consumer-policy-contract.mjs} +10 -10
- package/scripts/check-implementation-naming.mjs +135 -0
- package/scripts/check-inventory.mjs +39 -47
- package/scripts/check-maintainability.mjs +25 -115
- package/scripts/{check-v4-public-dogfood-contract.mjs → check-public-dogfood-contract.mjs} +37 -24
- package/scripts/{check-v4-release-topology.mjs → check-release-topology.mjs} +131 -52
- package/scripts/{check-v4-runtime-semantic-closure.mjs → check-runtime-semantic-closure.mjs} +23 -17
- package/scripts/check-universal-workflow-bootstrap.mjs +266 -0
- package/scripts/check-workflow-taxonomy.mjs +6 -0
- package/scripts/{v4-consumer-policy.mjs → consumer-policy.mjs} +15 -15
- package/scripts/copy-domain-wasm.mjs +14 -0
- package/scripts/{v4-cross-platform-adopter-qualification.mjs → cross-platform-adopter-qualification.mjs} +9 -9
- package/scripts/{v4-declarative-promotion-admission.mjs → declarative-promotion-admission.mjs} +4 -4
- package/scripts/dev-delivery-authority-command-adapters.mjs +1 -1
- package/scripts/dev-delivery-authority.mjs +8 -8
- package/scripts/dev-delivery-source-proof-reuse.mjs +2 -1
- package/scripts/dev-delivery-warrant-options.mjs +15 -10
- package/scripts/dev-delivery-warrant-store.mjs +98 -13
- package/scripts/dev-delivery-warrant-transition.mjs +109 -0
- package/scripts/dev-delivery-warrant.mjs +80 -103
- package/scripts/dev-pr-auto-merge.mjs +15 -15
- package/scripts/dev-pr-delivery-warrant.mjs +1 -1
- package/scripts/generate-channel-build-workflow.mjs +7 -2
- package/scripts/generate-channel-promotion-workflow.mjs +19 -34
- package/scripts/generate-release-candidate-passport.mjs +23 -23
- package/scripts/generate-site-bundle.mjs +28 -28
- package/scripts/generate-universal-workflow-facades.mjs +498 -0
- package/scripts/generate-workflow-taxonomy.mjs +25 -0
- package/scripts/github-output.mjs +31 -0
- package/scripts/{v4-host-adapter.mjs → host-adapter.mjs} +1 -1
- package/scripts/implementation-references.mjs +25 -0
- package/scripts/init-repo.mjs +1 -1
- package/scripts/maintainability-metrics.mjs +16 -5
- package/scripts/maintainability-public-surface.mjs +115 -0
- package/scripts/next-development-review.mjs +313 -0
- package/scripts/oci-compose-preview.mjs +261 -0
- package/scripts/paper-work-fleet-cli.mjs +2 -0
- package/scripts/{v4-platform-stage-checkpoint-rehearsal.mjs → platform-stage-checkpoint-rehearsal.mjs} +17 -17
- package/scripts/{v4-product-publication-intent.mjs → product-publication-intent.mjs} +28 -13
- package/scripts/publication-candidate-kind.mjs +93 -0
- package/scripts/publication-candidate-sealer.mjs +16 -1
- package/scripts/{v4-publication-rehearsal-fixture.mjs → publication-rehearsal-fixture.mjs} +5 -5
- package/scripts/publication-settlement.mjs +211 -0
- package/scripts/release-asset-client.mjs +91 -0
- package/scripts/{v4-release-candidate-adapter.mjs → release-candidate-adapter.mjs} +4 -4
- package/scripts/release-candidate-resolver.mjs +24 -35
- package/scripts/release-tail.mjs +5 -5
- package/scripts/resume-from-candidate-run.mjs +35 -42
- package/scripts/site-capability-metadata.mjs +9 -0
- package/scripts/source-verification-evidence.mjs +344 -0
- package/scripts/stable-candidate-qualification.mjs +1 -1
- package/scripts/{v4-stage-capsule-qualification.mjs → stage-capsule-qualification.mjs} +62 -62
- package/scripts/{v4-stage-capsule-resume-rehearsal.mjs → stage-capsule-resume-rehearsal.mjs} +6 -6
- package/scripts/{v4-tail-reseal-macos-rehearsal.mjs → tail-reseal-macos-rehearsal.mjs} +9 -9
- package/scripts/{v4-tail-reseal.mjs → tail-reseal.mjs} +19 -19
- package/scripts/universal-facade-maintainability.mjs +91 -0
- package/scripts/universal-workflow-backflow.mjs +212 -0
- package/scripts/universal-workflow-engine.mjs +620 -0
- package/scripts/universal-workflow-self-dogfood.mjs +205 -0
- package/scripts/verify-version-state-delta.mjs +175 -0
- package/scripts/{v4-warrant-shadow-plan.mjs → warrant-shadow-plan.mjs} +6 -6
- package/scripts/workflow-taxonomy.mjs +507 -0
- package/templates/native-dev-delivery.yml +4 -7
- package/templates/universal-buildchain-bootstrap-recovery.yml +282 -0
- package/templates/universal-buildchain-bootstrap.yml +28 -0
- package/actions/v4-release-candidate-promote/README.md +0 -3
- package/packages/core/v4-partial-mutation-recovery-qualification.js +0 -395
- package/packages/core/v4-product-publication.js +0 -387
- package/packages/core/v4-provider-operation-journal.js +0 -531
- package/packages/core/v4-release-activation-shadow.js +0 -519
- package/packages/core/v4-release-invocation.js +0 -425
- package/packages/core/v4-stable-publication-fence.js +0 -357
- /package/architecture/{v4-adopter-delivery-parity.json → adopter-delivery-parity.json} +0 -0
- /package/architecture/{v3-core-mechanism-inventory.json → baseline-core-mechanism-inventory.json} +0 -0
- /package/architecture/{v4-canonical-contract-fixtures.json → canonical-contract-fixtures.json} +0 -0
- /package/architecture/{v4-compatibility-facts-parity.json → compatibility-facts-parity.json} +0 -0
- /package/architecture/{v4-delivery-warrant-shadow-bootstrap-plan.schema.json → delivery-warrant-shadow-bootstrap-plan.schema.json} +0 -0
- /package/architecture/{v4-delivery-warrant-shadow-fixtures.json → delivery-warrant-shadow-fixtures.json} +0 -0
- /package/architecture/{v4-delivery-warrant-shadow-fixtures.schema.json → delivery-warrant-shadow-fixtures.schema.json} +0 -0
- /package/architecture/{v4-exception-ledger.json → exception-ledger.json} +0 -0
- /package/architecture/{v4-exception-ledger.schema.json → exception-ledger.schema.json} +0 -0
- /package/architecture/{v4-release-invocation-fixtures.json → release-invocation-fixtures.json} +0 -0
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
import assert from "node:assert/strict";
|
|
4
4
|
import crypto from "node:crypto";
|
|
5
5
|
import fs from "node:fs";
|
|
6
|
+
import ts from "typescript";
|
|
7
|
+
import { workflowCompatibilityIdentity } from "./workflow-taxonomy.mjs";
|
|
6
8
|
import path from "node:path";
|
|
7
9
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
8
10
|
|
|
@@ -12,7 +14,7 @@ import {
|
|
|
12
14
|
} from "../packages/core/workflow-yaml-contract.js";
|
|
13
15
|
|
|
14
16
|
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
15
|
-
const ledgerPath = path.join(root, "architecture/
|
|
17
|
+
const ledgerPath = path.join(root, "architecture/release-topology.json");
|
|
16
18
|
|
|
17
19
|
function read(relative) {
|
|
18
20
|
return fs.readFileSync(path.join(root, relative), "utf8");
|
|
@@ -20,14 +22,37 @@ function read(relative) {
|
|
|
20
22
|
|
|
21
23
|
const LOCAL_MODULE_EXTENSIONS = ["", ".js", ".mjs", ".cjs"];
|
|
22
24
|
const PRIVILEGED_ENTRYPOINTS = [
|
|
23
|
-
"actions/
|
|
25
|
+
"actions/release-candidate-promote/index.js",
|
|
26
|
+
"scripts/binary-publication-evidence.mjs",
|
|
27
|
+
"scripts/next-development-review.mjs",
|
|
28
|
+
"scripts/oci-compose-preview.mjs",
|
|
29
|
+
"scripts/publication-settlement.mjs",
|
|
24
30
|
];
|
|
25
31
|
|
|
26
|
-
function localModuleSpecifiers(source) {
|
|
32
|
+
export function localModuleSpecifiers(source) {
|
|
27
33
|
const specifiers = [];
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
34
|
+
const visit = (node) => {
|
|
35
|
+
let value;
|
|
36
|
+
if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node))
|
|
37
|
+
value = node.moduleSpecifier;
|
|
38
|
+
else if (
|
|
39
|
+
ts.isCallExpression(node) &&
|
|
40
|
+
node.expression.kind === ts.SyntaxKind.ImportKeyword
|
|
41
|
+
)
|
|
42
|
+
value = node.arguments[0];
|
|
43
|
+
if (value && ts.isStringLiteral(value) && value.text.startsWith("."))
|
|
44
|
+
specifiers.push(value.text);
|
|
45
|
+
ts.forEachChild(node, visit);
|
|
46
|
+
};
|
|
47
|
+
visit(
|
|
48
|
+
ts.createSourceFile(
|
|
49
|
+
"module.mjs",
|
|
50
|
+
source,
|
|
51
|
+
ts.ScriptTarget.Latest,
|
|
52
|
+
true,
|
|
53
|
+
ts.ScriptKind.JS,
|
|
54
|
+
),
|
|
55
|
+
);
|
|
31
56
|
return [...new Set(specifiers)].sort();
|
|
32
57
|
}
|
|
33
58
|
|
|
@@ -83,6 +108,13 @@ function rootedPathSet(paths) {
|
|
|
83
108
|
.digest("hex")}`;
|
|
84
109
|
}
|
|
85
110
|
|
|
111
|
+
function fileSha256(relative) {
|
|
112
|
+
return `sha256:${crypto
|
|
113
|
+
.createHash("sha256")
|
|
114
|
+
.update(fs.readFileSync(path.join(root, relative)))
|
|
115
|
+
.digest("hex")}`;
|
|
116
|
+
}
|
|
117
|
+
|
|
86
118
|
function productionFiles(relative, extensions) {
|
|
87
119
|
const absolute = path.join(root, relative);
|
|
88
120
|
if (!fs.existsSync(absolute)) return [];
|
|
@@ -106,12 +138,12 @@ function productionFiles(relative, extensions) {
|
|
|
106
138
|
function matchingProductionFiles(roots, extensions, pattern) {
|
|
107
139
|
return roots
|
|
108
140
|
.flatMap((relative) => productionFiles(relative, extensions))
|
|
109
|
-
.filter((relative) => relative !== "scripts/check-
|
|
141
|
+
.filter((relative) => relative !== "scripts/check-release-topology.mjs")
|
|
110
142
|
.filter((relative) => pattern.test(read(relative)))
|
|
111
143
|
.sort();
|
|
112
144
|
}
|
|
113
145
|
|
|
114
|
-
export function
|
|
146
|
+
export function discoverReleaseAuthorityClosure() {
|
|
115
147
|
const providerPlane = matchingProductionFiles(
|
|
116
148
|
["actions", "packages/core"],
|
|
117
149
|
[".js", ".mjs", ".cjs"],
|
|
@@ -120,14 +152,20 @@ export function discoverV4ReleaseAuthorityClosure() {
|
|
|
120
152
|
const runtimeSelectors = matchingProductionFiles(
|
|
121
153
|
[".github/workflows", "scripts", "packages/core"],
|
|
122
154
|
[".yml", ".yaml", ".js", ".mjs", ".cjs"],
|
|
123
|
-
/(?:promotion-runtime-sha|resume-buildchain-runtime-sha|BUILDCHAIN_(?:CURRENT_RUNTIME_SHA|RUNTIME_REF|RESUME_CANDIDATE_RUN_ID)|
|
|
155
|
+
/(?:promotion-runtime-sha|resume-buildchain-runtime-sha|BUILDCHAIN_(?:CURRENT_RUNTIME_SHA|RUNTIME_REF|RESUME_CANDIDATE_RUN_ID)|authorizeRuntimeSelection|scanRuntimeSelectorPersistence|release-candidate-adapter)/u,
|
|
124
156
|
);
|
|
125
157
|
const terminalProjections = matchingProductionFiles(
|
|
126
158
|
[".github/workflows", "actions", "packages/core", "scripts"],
|
|
127
159
|
[".yml", ".yaml", ".js", ".mjs", ".cjs"],
|
|
128
|
-
/(?:
|
|
160
|
+
/(?:createReleaseReceipt|release-receipt\.json|RELEASE_RECEIPT_CONTRACT)/u,
|
|
129
161
|
);
|
|
130
162
|
const privilegedModules = discoverStaticModuleClosure(PRIVILEGED_ENTRYPOINTS);
|
|
163
|
+
const rustWasmArtifact = "packages/core/buildchain-domain.wasm";
|
|
164
|
+
const rustWasmDistributions = [
|
|
165
|
+
"actions/promote-buildchain-ref/dist/buildchain-domain.wasm",
|
|
166
|
+
"actions/release-tail/dist/buildchain-domain.wasm",
|
|
167
|
+
"actions/release-candidate-promote/dist/buildchain-domain.wasm",
|
|
168
|
+
];
|
|
131
169
|
const legacyEngineModules = productionFiles(
|
|
132
170
|
"actions/promote-buildchain-ref",
|
|
133
171
|
[".js", ".mjs", ".cjs"],
|
|
@@ -146,13 +184,24 @@ export function discoverV4ReleaseAuthorityClosure() {
|
|
|
146
184
|
]),
|
|
147
185
|
].sort(),
|
|
148
186
|
runtimeSelectors,
|
|
149
|
-
runtimeEngines: ["actions/
|
|
187
|
+
runtimeEngines: ["actions/release-candidate-promote/index.js"],
|
|
150
188
|
terminalProjections,
|
|
151
189
|
privilegedExecutableClosure: {
|
|
152
190
|
entrypoints: PRIVILEGED_ENTRYPOINTS,
|
|
153
191
|
modules: privilegedModules,
|
|
154
192
|
root: rootedPathSet(privilegedModules),
|
|
155
193
|
},
|
|
194
|
+
rustWasmAuthority: {
|
|
195
|
+
loader: "packages/core/domain-wasm.js",
|
|
196
|
+
metadata: "packages/core/domain-wasm-artifact.js",
|
|
197
|
+
artifact: rustWasmArtifact,
|
|
198
|
+
artifactRoot: fileSha256(rustWasmArtifact),
|
|
199
|
+
distributedArtifacts: rustWasmDistributions,
|
|
200
|
+
byteIdenticalDistributions: rustWasmDistributions.every(
|
|
201
|
+
(relative) => fileSha256(relative) === fileSha256(rustWasmArtifact),
|
|
202
|
+
),
|
|
203
|
+
fallbackWriterCount: 0,
|
|
204
|
+
},
|
|
156
205
|
legacyEngineModules,
|
|
157
206
|
};
|
|
158
207
|
}
|
|
@@ -180,33 +229,46 @@ function permission(block, name) {
|
|
|
180
229
|
function workflowSnapshot(relative) {
|
|
181
230
|
const source = read(relative);
|
|
182
231
|
const document = parseWorkflowDocument(source);
|
|
183
|
-
const jobs = document.jobs
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
232
|
+
const jobs = document.jobs
|
|
233
|
+
.filter((job) => job.id !== "universal-bootstrap")
|
|
234
|
+
.map((job) => {
|
|
235
|
+
const block = jobBlock(source, job.id);
|
|
236
|
+
const uses = job.uses || null;
|
|
237
|
+
// A built-in publisher still requires mutation authority when the caller supplies its envelope.
|
|
238
|
+
const inheritedPublisher =
|
|
239
|
+
!/^ permissions:/mu.test(block) &&
|
|
240
|
+
/uses:.*actions\/release-candidate-promote/u.test(block);
|
|
241
|
+
return {
|
|
242
|
+
id: job.id,
|
|
243
|
+
kind: uses ? "reusable-call" : "runner",
|
|
244
|
+
uses,
|
|
245
|
+
permissions: {
|
|
246
|
+
contents:
|
|
247
|
+
permission(block, "contents") ||
|
|
248
|
+
(inheritedPublisher ? "inherited" : null),
|
|
249
|
+
idToken:
|
|
250
|
+
permission(block, "id-token") ||
|
|
251
|
+
(inheritedPublisher ? "inherited" : null),
|
|
252
|
+
},
|
|
253
|
+
carriers: {
|
|
254
|
+
artifactDownload: /uses:\s+actions\/download-artifact@/u.test(block),
|
|
255
|
+
artifactUpload: /uses:\s+actions\/upload-artifact@/u.test(block),
|
|
256
|
+
jobOutput: /GITHUB_OUTPUT/u.test(block),
|
|
257
|
+
},
|
|
258
|
+
mutationSignals: [
|
|
259
|
+
(/contents:\s*write/u.test(block) || inheritedPublisher) &&
|
|
260
|
+
"contents-write",
|
|
261
|
+
(/id-token:\s*write/u.test(block) || inheritedPublisher) &&
|
|
262
|
+
"oidc-write",
|
|
263
|
+
/(?:promote-buildchain-ref|actions\/release-candidate-promote)/u.test(
|
|
264
|
+
block,
|
|
265
|
+
) && "promotion-runtime",
|
|
266
|
+
/(?:git push|npm publish|gh release (?:create|upload))/u.test(
|
|
267
|
+
block,
|
|
268
|
+
) && "direct-publication-command",
|
|
269
|
+
].filter(Boolean),
|
|
270
|
+
};
|
|
271
|
+
});
|
|
210
272
|
return {
|
|
211
273
|
path: relative,
|
|
212
274
|
triggers: document.triggers,
|
|
@@ -214,11 +276,12 @@ function workflowSnapshot(relative) {
|
|
|
214
276
|
reusableEdges: parseYamlUses(source)
|
|
215
277
|
.map(({ value }) => value)
|
|
216
278
|
.filter((value) => /\.github\/workflows\//u.test(value))
|
|
279
|
+
.filter((value) => !/\/bootstrap\.yml(?:@v4)?$/u.test(value))
|
|
217
280
|
.sort(),
|
|
218
281
|
};
|
|
219
282
|
}
|
|
220
283
|
|
|
221
|
-
export function
|
|
284
|
+
export function discoverReleaseTopology(
|
|
222
285
|
workflowPaths,
|
|
223
286
|
semanticWorkflowPaths = workflowPaths,
|
|
224
287
|
) {
|
|
@@ -303,7 +366,7 @@ export function discoverV4ReleaseTopology(
|
|
|
303
366
|
};
|
|
304
367
|
}
|
|
305
368
|
|
|
306
|
-
export function
|
|
369
|
+
export function findUnknownReleaseTopology(
|
|
307
370
|
workflowPaths,
|
|
308
371
|
allWorkflowPaths = fs
|
|
309
372
|
.readdirSync(path.join(root, ".github/workflows"))
|
|
@@ -313,11 +376,16 @@ export function findUnknownV4ReleaseTopology(
|
|
|
313
376
|
) {
|
|
314
377
|
const declared = new Set(workflowPaths);
|
|
315
378
|
return allWorkflowPaths
|
|
316
|
-
.filter(
|
|
379
|
+
.filter(
|
|
380
|
+
(relative) =>
|
|
381
|
+
!declared.has(
|
|
382
|
+
workflowCompatibilityIdentity(root, relative, readWorkflow(relative)),
|
|
383
|
+
),
|
|
384
|
+
)
|
|
317
385
|
.filter((relative) => {
|
|
318
386
|
const source = readWorkflow(relative);
|
|
319
387
|
const usesReleaseAuthority = parseYamlUses(source).some(({ value }) =>
|
|
320
|
-
/(?:release-candidate-promote|promote-buildchain-ref|
|
|
388
|
+
/(?:release-candidate-promote|promote-buildchain-ref|release-tail)/u.test(
|
|
321
389
|
value,
|
|
322
390
|
),
|
|
323
391
|
);
|
|
@@ -338,7 +406,7 @@ export function findUnknownV4ReleaseTopology(
|
|
|
338
406
|
}
|
|
339
407
|
|
|
340
408
|
function assertClosedWorld(workflowPaths) {
|
|
341
|
-
const unknown =
|
|
409
|
+
const unknown = findUnknownReleaseTopology(workflowPaths);
|
|
342
410
|
assert.deepEqual(
|
|
343
411
|
unknown,
|
|
344
412
|
[],
|
|
@@ -369,7 +437,7 @@ function assertAuthorityClosure(ledger) {
|
|
|
369
437
|
`authority closure path is not a file: ${relative}`,
|
|
370
438
|
);
|
|
371
439
|
}
|
|
372
|
-
const discovered =
|
|
440
|
+
const discovered = discoverReleaseAuthorityClosure();
|
|
373
441
|
for (const className of Object.keys(discovered))
|
|
374
442
|
assert.deepEqual(
|
|
375
443
|
closure[className],
|
|
@@ -395,7 +463,7 @@ function assertAuthorityClosure(ledger) {
|
|
|
395
463
|
`legacy release engines remain reachable from APPLY: ${reachableLegacyEngines.join(", ")}`,
|
|
396
464
|
);
|
|
397
465
|
assert.deepEqual(closure.runtimeEngines, [
|
|
398
|
-
"actions/
|
|
466
|
+
"actions/release-candidate-promote/index.js",
|
|
399
467
|
]);
|
|
400
468
|
assert.equal(
|
|
401
469
|
closure.freshEntry,
|
|
@@ -403,7 +471,7 @@ function assertAuthorityClosure(ledger) {
|
|
|
403
471
|
);
|
|
404
472
|
assert.equal(
|
|
405
473
|
closure.recoveryEntry,
|
|
406
|
-
".github/workflows/
|
|
474
|
+
".github/workflows/self-ops-promotion-recovery.yml",
|
|
407
475
|
);
|
|
408
476
|
const engineSurface = [
|
|
409
477
|
".github/workflows/.release-candidate-promote.yml",
|
|
@@ -422,7 +490,7 @@ function assertAuthorityClosure(ledger) {
|
|
|
422
490
|
);
|
|
423
491
|
assert.match(
|
|
424
492
|
canonicalWorkflow,
|
|
425
|
-
/scripts\/
|
|
493
|
+
/scripts\/release-candidate-adapter\.mjs/u,
|
|
426
494
|
);
|
|
427
495
|
assert.match(
|
|
428
496
|
canonicalWorkflow,
|
|
@@ -430,12 +498,23 @@ function assertAuthorityClosure(ledger) {
|
|
|
430
498
|
);
|
|
431
499
|
}
|
|
432
500
|
|
|
433
|
-
export function
|
|
501
|
+
export function checkReleaseTopology() {
|
|
434
502
|
const ledger = JSON.parse(fs.readFileSync(ledgerPath, "utf8"));
|
|
435
503
|
assert.equal(ledger.contract, "kungfu-buildchain-v4-release-topology/v1");
|
|
436
504
|
assertClosedWorld(ledger.closedWorld.workflowPaths);
|
|
437
505
|
assertAuthorityClosure(ledger);
|
|
438
|
-
const
|
|
506
|
+
const preview = ledger.postPublicationScope;
|
|
507
|
+
assert.deepEqual(preview.workflowPaths, [
|
|
508
|
+
".github/workflows/public-release-oci-compose-preview.yml",
|
|
509
|
+
]);
|
|
510
|
+
const previewTopology = discoverReleaseTopology(
|
|
511
|
+
preview.workflowPaths,
|
|
512
|
+
preview.workflowPaths,
|
|
513
|
+
);
|
|
514
|
+
assert.equal(previewTopology.semanticMetrics.contentsWriteJobCount, 1);
|
|
515
|
+
assert.equal(previewTopology.semanticMetrics.oidcWriteJobCount, 0);
|
|
516
|
+
assert.deepEqual(preview.observedTopology, previewTopology);
|
|
517
|
+
const actual = discoverReleaseTopology(
|
|
439
518
|
ledger.closedWorld.workflowPaths,
|
|
440
519
|
ledger.semanticScope.workflowPaths,
|
|
441
520
|
);
|
|
@@ -469,13 +548,13 @@ if (
|
|
|
469
548
|
) {
|
|
470
549
|
if (process.argv.includes("--print-closure")) {
|
|
471
550
|
process.stdout.write(
|
|
472
|
-
`${JSON.stringify(
|
|
551
|
+
`${JSON.stringify(discoverReleaseAuthorityClosure(), null, 2)}\n`,
|
|
473
552
|
);
|
|
474
553
|
} else if (process.argv.includes("--print")) {
|
|
475
554
|
const ledger = JSON.parse(fs.readFileSync(ledgerPath, "utf8"));
|
|
476
555
|
process.stdout.write(
|
|
477
556
|
`${JSON.stringify(
|
|
478
|
-
|
|
557
|
+
discoverReleaseTopology(
|
|
479
558
|
ledger.closedWorld.workflowPaths,
|
|
480
559
|
ledger.semanticScope.workflowPaths,
|
|
481
560
|
),
|
|
@@ -484,7 +563,7 @@ if (
|
|
|
484
563
|
)}\n`,
|
|
485
564
|
);
|
|
486
565
|
} else {
|
|
487
|
-
|
|
566
|
+
checkReleaseTopology();
|
|
488
567
|
process.stdout.write("v4 release topology: ok\n");
|
|
489
568
|
}
|
|
490
569
|
}
|
package/scripts/{check-v4-runtime-semantic-closure.mjs → check-runtime-semantic-closure.mjs}
RENAMED
|
@@ -4,10 +4,10 @@ import fs from "node:fs";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { pathToFileURL } from "node:url";
|
|
6
6
|
|
|
7
|
-
export const
|
|
7
|
+
export const RUNTIME_SEMANTIC_CLOSURE_CONTRACT =
|
|
8
8
|
"kungfu-buildchain-v4-runtime-semantic-closure";
|
|
9
|
-
export const
|
|
10
|
-
"architecture/
|
|
9
|
+
export const RUNTIME_SEMANTIC_CLOSURE_PATH =
|
|
10
|
+
"architecture/runtime-semantic-closure.json";
|
|
11
11
|
export const REQUIRED_RUNTIME_EVIDENCE = Object.freeze([
|
|
12
12
|
"positive",
|
|
13
13
|
"negative",
|
|
@@ -35,7 +35,10 @@ function publicSurfaceIds(root) {
|
|
|
35
35
|
return new Set([
|
|
36
36
|
...Object.keys(packageJson.exports || {}).map((id) => `export:${id}`),
|
|
37
37
|
...(cli.commands || []).map((entry) => `cli:${entry.id}`),
|
|
38
|
-
...(workflows.workflows || []).
|
|
38
|
+
...(workflows.workflows || []).flatMap((entry) => [
|
|
39
|
+
`workflow:${entry.id}`,
|
|
40
|
+
...(entry.taxonomy ? [`workflow:${entry.taxonomy.id}`] : []),
|
|
41
|
+
]),
|
|
39
42
|
...(workflows.actions || []).map((entry) => `action:${entry.id}`),
|
|
40
43
|
]);
|
|
41
44
|
}
|
|
@@ -156,17 +159,20 @@ function validateAuthority(capability, stateMachine, issues) {
|
|
|
156
159
|
|
|
157
160
|
export function validateRuntimeSemanticClosure({
|
|
158
161
|
root = process.cwd(),
|
|
159
|
-
manifest = loadJson(root,
|
|
160
|
-
v3Inventory = loadJson(
|
|
161
|
-
v4Manifest = loadJson(
|
|
162
|
+
manifest = loadJson(root, RUNTIME_SEMANTIC_CLOSURE_PATH),
|
|
163
|
+
v3Inventory: baselineInventory = loadJson(
|
|
162
164
|
root,
|
|
163
|
-
"architecture/
|
|
165
|
+
"architecture/baseline-core-mechanism-inventory.json",
|
|
166
|
+
),
|
|
167
|
+
v4Manifest: domainManifest = loadJson(
|
|
168
|
+
root,
|
|
169
|
+
"architecture/capability-state-machine-manifest.json",
|
|
164
170
|
),
|
|
165
171
|
} = {}) {
|
|
166
172
|
const issues = [];
|
|
167
173
|
if (
|
|
168
174
|
manifest?.schemaVersion !== 1 ||
|
|
169
|
-
manifest?.contract !==
|
|
175
|
+
manifest?.contract !== RUNTIME_SEMANTIC_CLOSURE_CONTRACT
|
|
170
176
|
)
|
|
171
177
|
issues.push(
|
|
172
178
|
"runtime semantic closure contract or schemaVersion is invalid",
|
|
@@ -175,13 +181,13 @@ export function validateRuntimeSemanticClosure({
|
|
|
175
181
|
issues.push("runtime semantic closure evidence dimensions drifted");
|
|
176
182
|
|
|
177
183
|
const mechanisms = new Map(
|
|
178
|
-
(
|
|
184
|
+
(baselineInventory.mechanisms || []).map((entry) => [entry.id, entry]),
|
|
179
185
|
);
|
|
180
|
-
const
|
|
181
|
-
(
|
|
186
|
+
const domainCapabilities = new Map(
|
|
187
|
+
(domainManifest.capabilities || []).map((entry) => [entry.id, entry]),
|
|
182
188
|
);
|
|
183
189
|
const stateMachines = new Map(
|
|
184
|
-
(
|
|
190
|
+
(domainManifest.stateMachines || []).map((entry) => [entry.id, entry]),
|
|
185
191
|
);
|
|
186
192
|
const capabilities = Array.isArray(manifest?.capabilities)
|
|
187
193
|
? manifest.capabilities
|
|
@@ -198,7 +204,7 @@ export function validateRuntimeSemanticClosure({
|
|
|
198
204
|
if (
|
|
199
205
|
!sameMembers(
|
|
200
206
|
capabilities.map((entry) => entry.id),
|
|
201
|
-
|
|
207
|
+
domainCapabilities.keys(),
|
|
202
208
|
)
|
|
203
209
|
)
|
|
204
210
|
issues.push(
|
|
@@ -216,15 +222,15 @@ export function validateRuntimeSemanticClosure({
|
|
|
216
222
|
}
|
|
217
223
|
ids.add(capability.id);
|
|
218
224
|
const mechanism = mechanisms.get(capability.id);
|
|
219
|
-
const
|
|
220
|
-
if (!mechanism || !
|
|
225
|
+
const domainCapability = domainCapabilities.get(capability.id);
|
|
226
|
+
if (!mechanism || !domainCapability) continue;
|
|
221
227
|
if (capability.sourceMechanismId !== capability.id)
|
|
222
228
|
issues.push(`${capability.id}: source mechanism identity drifted`);
|
|
223
229
|
validateImplementation(root, mechanism, capability, issues);
|
|
224
230
|
validateResidualClosure(mechanism, capability, issues);
|
|
225
231
|
validateEvidence(root, mechanism, capability, issues);
|
|
226
232
|
validateAuthority(capability, stateMachines.get(capability.id), issues);
|
|
227
|
-
for (const surface of
|
|
233
|
+
for (const surface of domainCapability.surfaces || []) {
|
|
228
234
|
if (!surfaces.has(surface))
|
|
229
235
|
issues.push(
|
|
230
236
|
`${capability.id}: executable v4 surface is absent: ${surface}`,
|