@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
|
@@ -19,6 +19,8 @@ import {
|
|
|
19
19
|
evaluateTestBudgets,
|
|
20
20
|
evaluateWorkflowBudgets,
|
|
21
21
|
} from "./maintainability-governance.mjs";
|
|
22
|
+
import { governUniversalFacadeWorkflowMetrics } from "./universal-facade-maintainability.mjs";
|
|
23
|
+
import { evaluatePublicSurface } from "./maintainability-public-surface.mjs";
|
|
22
24
|
|
|
23
25
|
function collectHotspots(
|
|
24
26
|
root,
|
|
@@ -110,6 +112,13 @@ function ensureMaintainabilityRevisionsAvailable(
|
|
|
110
112
|
);
|
|
111
113
|
}
|
|
112
114
|
|
|
115
|
+
function implementationPathAtPresent(root, historicalPath) {
|
|
116
|
+
const policyPath = path.join(root, "architecture/implementation-naming.json");
|
|
117
|
+
if (!fs.existsSync(policyPath)) return historicalPath;
|
|
118
|
+
const policy = readJson(root, "architecture/implementation-naming.json");
|
|
119
|
+
return policy.pathMigrations[historicalPath] || historicalPath;
|
|
120
|
+
}
|
|
121
|
+
|
|
113
122
|
function sourceMetricsAtRevision(root, revision) {
|
|
114
123
|
const files = gitOutput(root, ["ls-tree", "-r", "--name-only", revision])
|
|
115
124
|
.split("\n")
|
|
@@ -117,7 +126,7 @@ function sourceMetricsAtRevision(root, revision) {
|
|
|
117
126
|
.sort();
|
|
118
127
|
return Object.fromEntries(
|
|
119
128
|
files.map((file) => [
|
|
120
|
-
file,
|
|
129
|
+
implementationPathAtPresent(root, file),
|
|
121
130
|
analyzeSource(file, gitOutput(root, ["show", `${revision}:${file}`])),
|
|
122
131
|
]),
|
|
123
132
|
);
|
|
@@ -132,7 +141,7 @@ function testMetricsAtRevision(root, revision) {
|
|
|
132
141
|
.sort();
|
|
133
142
|
return Object.fromEntries(
|
|
134
143
|
files.map((file) => [
|
|
135
|
-
file,
|
|
144
|
+
implementationPathAtPresent(root, file),
|
|
136
145
|
analyzeSource(file, gitOutput(root, ["show", `${revision}:${file}`])),
|
|
137
146
|
]),
|
|
138
147
|
);
|
|
@@ -162,116 +171,6 @@ function selectedFunction(metrics, file, name) {
|
|
|
162
171
|
return metrics.files[file]?.functions.find((entry) => entry.name === name);
|
|
163
172
|
}
|
|
164
173
|
|
|
165
|
-
function readJsonAtRevision(root, revision, file) {
|
|
166
|
-
return JSON.parse(gitOutput(root, ["show", `${revision}:${file}`]));
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
function publicSurfaceContract(entry, kind) {
|
|
170
|
-
if (kind === "cli") return { id: entry.id, usage: entry.usage };
|
|
171
|
-
if (kind === "node")
|
|
172
|
-
return {
|
|
173
|
-
export: entry.export,
|
|
174
|
-
specifier: entry.specifier,
|
|
175
|
-
target: entry.target,
|
|
176
|
-
};
|
|
177
|
-
return {
|
|
178
|
-
id: entry.id,
|
|
179
|
-
path: entry.path,
|
|
180
|
-
reusable: entry.reusable,
|
|
181
|
-
inputs: entry.inputs || [],
|
|
182
|
-
secrets: entry.secrets || [],
|
|
183
|
-
outputs: entry.outputs || [],
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
function evaluatePublicSurface({ root, revision, policy }) {
|
|
188
|
-
const issues = [];
|
|
189
|
-
const lifecycleFields = policy.publicSurfacePolicy.requiredLifecycleFields;
|
|
190
|
-
const capabilityGroups = new Set(
|
|
191
|
-
readJson(root, "dist/site/capability-registry.json").groups.map(
|
|
192
|
-
(entry) => entry.id,
|
|
193
|
-
),
|
|
194
|
-
);
|
|
195
|
-
const definitions = [
|
|
196
|
-
{
|
|
197
|
-
file: "dist/site/cli-registry.json",
|
|
198
|
-
collection: "commands",
|
|
199
|
-
kind: "cli",
|
|
200
|
-
key: "id",
|
|
201
|
-
},
|
|
202
|
-
{
|
|
203
|
-
file: "dist/site/node-api-registry.json",
|
|
204
|
-
collection: "exports",
|
|
205
|
-
kind: "node",
|
|
206
|
-
key: "export",
|
|
207
|
-
},
|
|
208
|
-
{
|
|
209
|
-
file: "dist/site/workflow-registry.json",
|
|
210
|
-
collection: "workflows",
|
|
211
|
-
kind: "workflow",
|
|
212
|
-
key: "id",
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
file: "dist/site/workflow-registry.json",
|
|
216
|
-
collection: "actions",
|
|
217
|
-
kind: "action",
|
|
218
|
-
key: "id",
|
|
219
|
-
},
|
|
220
|
-
];
|
|
221
|
-
for (const definition of definitions) {
|
|
222
|
-
const current =
|
|
223
|
-
readJson(root, definition.file)[definition.collection] || [];
|
|
224
|
-
const baseline =
|
|
225
|
-
readJsonAtRevision(root, revision, definition.file)[
|
|
226
|
-
definition.collection
|
|
227
|
-
] || [];
|
|
228
|
-
const baselineByKey = new Map(
|
|
229
|
-
baseline.map((entry) => [entry[definition.key], entry]),
|
|
230
|
-
);
|
|
231
|
-
for (const entry of current) {
|
|
232
|
-
const label = `${definition.kind}:${entry[definition.key]}`;
|
|
233
|
-
for (const field of lifecycleFields) {
|
|
234
|
-
if (
|
|
235
|
-
!Object.prototype.hasOwnProperty.call(entry, field) ||
|
|
236
|
-
typeof entry[field] !== "string"
|
|
237
|
-
) {
|
|
238
|
-
issues.push(`${label}: lifecycle field ${field} is missing`);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
if (!capabilityGroups.has(entry.capabilityGroup)) {
|
|
242
|
-
issues.push(
|
|
243
|
-
`${label}: capability group ${entry.capabilityGroup || "<empty>"} is not registered`,
|
|
244
|
-
);
|
|
245
|
-
}
|
|
246
|
-
const previous = baselineByKey.get(entry[definition.key]);
|
|
247
|
-
const currentContract = publicSurfaceContract(entry, definition.kind);
|
|
248
|
-
if (
|
|
249
|
-
previous &&
|
|
250
|
-
JSON.stringify(currentContract) !==
|
|
251
|
-
JSON.stringify(publicSurfaceContract(previous, definition.kind))
|
|
252
|
-
) {
|
|
253
|
-
const approval = policy.approvedPublicSurfaceTransitions?.[label];
|
|
254
|
-
const approved =
|
|
255
|
-
approval?.fromRevision === revision &&
|
|
256
|
-
String(approval?.rationale || "").trim() &&
|
|
257
|
-
JSON.stringify(approval?.contract) ===
|
|
258
|
-
JSON.stringify(currentContract);
|
|
259
|
-
if (!approved) {
|
|
260
|
-
issues.push(
|
|
261
|
-
`${label}: existing public contract drifted from ${revision}`,
|
|
262
|
-
);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
if (!previous && !entry.nonDuplicationRationale) {
|
|
266
|
-
issues.push(
|
|
267
|
-
`${label}: new public surface requires a non-duplication rationale`,
|
|
268
|
-
);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
return issues;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
174
|
function evaluateAddedFunctionBudgets({
|
|
276
175
|
file,
|
|
277
176
|
metrics,
|
|
@@ -497,12 +396,18 @@ function checkMaintainability({ root = process.cwd() } = {}) {
|
|
|
497
396
|
root,
|
|
498
397
|
extendedCoverageRevision,
|
|
499
398
|
);
|
|
399
|
+
const { governed: governedCurrent, migration: facadeMigration } =
|
|
400
|
+
governUniversalFacadeWorkflowMetrics({
|
|
401
|
+
root,
|
|
402
|
+
current,
|
|
403
|
+
workflowMetricsAtRevision,
|
|
404
|
+
});
|
|
500
405
|
const issues = evaluateExceptionGovernance({ policy });
|
|
501
406
|
issues.push(...evaluateExceptionBudget({ policy }));
|
|
502
407
|
const hotspots = collectHotspots(root, current, 20, debt.hotspots || []);
|
|
503
408
|
issues.push(
|
|
504
409
|
...evaluateDebtAuthority({
|
|
505
|
-
current,
|
|
410
|
+
current: governedCurrent,
|
|
506
411
|
policy,
|
|
507
412
|
debt,
|
|
508
413
|
capabilityIds: new Set(
|
|
@@ -518,14 +423,19 @@ function checkMaintainability({ root = process.cwd() } = {}) {
|
|
|
518
423
|
);
|
|
519
424
|
issues.push(
|
|
520
425
|
...evaluateWorkflowBudgets({
|
|
521
|
-
current,
|
|
426
|
+
current: governedCurrent,
|
|
522
427
|
baselineFiles: baselineWorkflows,
|
|
523
428
|
policy,
|
|
524
429
|
}),
|
|
525
430
|
);
|
|
526
431
|
issues.push(...evaluateRepositoryBudgets({ current, policy }));
|
|
527
432
|
issues.push(
|
|
528
|
-
...evaluatePublicSurface({
|
|
433
|
+
...evaluatePublicSurface({
|
|
434
|
+
root,
|
|
435
|
+
revision: enforcementRevision,
|
|
436
|
+
policy,
|
|
437
|
+
migration: facadeMigration,
|
|
438
|
+
}),
|
|
529
439
|
);
|
|
530
440
|
if (issues.length > 0) {
|
|
531
441
|
throw new Error(`maintainability check failed:\n- ${issues.join("\n- ")}`);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
import fs from "node:fs";
|
|
4
|
+
import { readWorkflowTaxonomy, workflowPath } from "./workflow-taxonomy.mjs";
|
|
4
5
|
import path from "node:path";
|
|
5
6
|
import { fileURLToPath } from "node:url";
|
|
6
7
|
|
|
@@ -8,13 +9,13 @@ const DEFAULT_ROOT = path.resolve(
|
|
|
8
9
|
path.dirname(fileURLToPath(import.meta.url)),
|
|
9
10
|
"..",
|
|
10
11
|
);
|
|
11
|
-
const CALLER_PATH = ".github/workflows/
|
|
12
|
-
const REUSABLE_PATH = ".github/workflows/
|
|
13
|
-
export const
|
|
12
|
+
const CALLER_PATH = ".github/workflows/self-build-public-consumer-dogfood.yml";
|
|
13
|
+
const REUSABLE_PATH = ".github/workflows/public-build-stage-capsule-canary.yml";
|
|
14
|
+
export const PUBLIC_DOGFOOD_ALPHA_REF = "v4-alpha";
|
|
14
15
|
const PRIVATE_CONSUMER = ["buildchain", "self", "dogfood"].join("-");
|
|
15
16
|
const PRIVATE_SHADOW = ["kungfu", "shadow"].join("-");
|
|
16
17
|
|
|
17
|
-
export function
|
|
18
|
+
export function expectedPublicDogfoodWorkflow(validationRef) {
|
|
18
19
|
return `name: V4 Public Consumer Dogfood
|
|
19
20
|
|
|
20
21
|
on:
|
|
@@ -26,7 +27,7 @@ permissions:
|
|
|
26
27
|
|
|
27
28
|
jobs:
|
|
28
29
|
dogfood:
|
|
29
|
-
uses: kungfu-systems/buildchain/.github/workflows/
|
|
30
|
+
uses: kungfu-systems/buildchain/.github/workflows/public-build-stage-capsule-canary.yml@${validationRef}
|
|
30
31
|
with:
|
|
31
32
|
consumer: buildchain
|
|
32
33
|
node-version: "24"
|
|
@@ -93,18 +94,27 @@ function assertReusableWorkflow(root) {
|
|
|
93
94
|
|
|
94
95
|
function assertWorkflowInventory(root) {
|
|
95
96
|
const workflowRoot = path.join(root, ".github/workflows");
|
|
97
|
+
const taxonomy = readWorkflowTaxonomy(root);
|
|
96
98
|
for (const entry of fs.readdirSync(workflowRoot, { withFileTypes: true })) {
|
|
97
99
|
if (!entry.isFile() || !/\.ya?ml$/u.test(entry.name)) continue;
|
|
98
|
-
|
|
100
|
+
let relative = `.github/workflows/${entry.name}`;
|
|
99
101
|
const text = read(root, relative);
|
|
102
|
+
const canonical = taxonomy?.entries.find(
|
|
103
|
+
(item) => workflowPath(item) === relative && item.compatibility,
|
|
104
|
+
);
|
|
105
|
+
if (canonical) {
|
|
106
|
+
if (read(root, canonical.compatibility.path) !== text)
|
|
107
|
+
fail(`${relative} differs from its public compatibility identity`);
|
|
108
|
+
relative = canonical.compatibility.path;
|
|
109
|
+
}
|
|
100
110
|
if (
|
|
101
111
|
relative !== REUSABLE_PATH &&
|
|
102
|
-
text.includes("scripts/
|
|
112
|
+
text.includes("scripts/stage-capsule-qualification.mjs")
|
|
103
113
|
)
|
|
104
114
|
fail(`${relative} invokes the private qualification script directly`);
|
|
105
115
|
if (
|
|
106
116
|
relative !== CALLER_PATH &&
|
|
107
|
-
text.includes(".github/workflows/
|
|
117
|
+
text.includes(".github/workflows/public-build-stage-capsule-canary.yml@")
|
|
108
118
|
)
|
|
109
119
|
fail(`${relative} creates a second v4 dogfood caller`);
|
|
110
120
|
if (relative !== REUSABLE_PATH && relative !== CALLER_PATH)
|
|
@@ -113,18 +123,20 @@ function assertWorkflowInventory(root) {
|
|
|
113
123
|
}
|
|
114
124
|
|
|
115
125
|
function assertProtectedVerify(root) {
|
|
116
|
-
const verify = read(root, ".github/workflows/verify.yml");
|
|
126
|
+
const verify = read(root, ".github/workflows/self-build-verify.yml");
|
|
117
127
|
for (const required of [
|
|
118
128
|
"needs: stage-capsule-checkpoints",
|
|
119
|
-
"name:
|
|
120
|
-
"
|
|
129
|
+
"name: Run declared verify lifecycle (full source tests and generated artifact checks)",
|
|
130
|
+
"node .buildchain/runtime/bin/buildchain.mjs lifecycle run verify",
|
|
131
|
+
"run: node scripts/source-verification-evidence.mjs plan",
|
|
132
|
+
"run: node scripts/source-verification-evidence.mjs seal",
|
|
121
133
|
])
|
|
122
134
|
if (!verify.includes(required))
|
|
123
135
|
fail(`Verify is missing protected gate ${required}`);
|
|
124
136
|
for (const forbidden of [
|
|
125
137
|
"stage-capsule-qualification:",
|
|
126
138
|
"stage-capsule-qualification-reconciliation:",
|
|
127
|
-
"scripts/
|
|
139
|
+
"scripts/stage-capsule-qualification.mjs",
|
|
128
140
|
])
|
|
129
141
|
if (verify.includes(forbidden))
|
|
130
142
|
fail(`Verify retains private dogfood path ${forbidden}`);
|
|
@@ -133,14 +145,14 @@ function assertProtectedVerify(root) {
|
|
|
133
145
|
function assertArchitecture(root) {
|
|
134
146
|
const architecture = exactJson(
|
|
135
147
|
root,
|
|
136
|
-
"architecture/
|
|
148
|
+
"architecture/stage-capsule-qualification.json",
|
|
137
149
|
);
|
|
138
150
|
const dogfood = architecture.publicConsumerDogfood;
|
|
139
151
|
const validationRef = dogfood?.validationRef;
|
|
140
|
-
if (validationRef !==
|
|
152
|
+
if (validationRef !== PUBLIC_DOGFOOD_ALPHA_REF)
|
|
141
153
|
fail("architecture validationRef must use the floating v4-alpha channel");
|
|
142
154
|
const caller = read(root, CALLER_PATH);
|
|
143
|
-
if (caller !==
|
|
155
|
+
if (caller !== expectedPublicDogfoodWorkflow(validationRef))
|
|
144
156
|
fail(`${CALLER_PATH} must remain the exact thin public consumer caller`);
|
|
145
157
|
if (JSON.stringify(architecture.campaign?.consumers) !== '["buildchain"]')
|
|
146
158
|
fail(
|
|
@@ -150,7 +162,7 @@ function assertArchitecture(root) {
|
|
|
150
162
|
!dogfood ||
|
|
151
163
|
dogfood.callerWorkflow !== CALLER_PATH ||
|
|
152
164
|
dogfood.reusableWorkflow !==
|
|
153
|
-
"kungfu-systems/buildchain/.github/workflows/
|
|
165
|
+
"kungfu-systems/buildchain/.github/workflows/public-build-stage-capsule-canary.yml" ||
|
|
154
166
|
dogfood.runtimeBinding !== "job.workflow_sha" ||
|
|
155
167
|
dogfood.consumerSourceBinding !== "github.sha" ||
|
|
156
168
|
JSON.stringify(dogfood.executableStages) !==
|
|
@@ -193,6 +205,7 @@ function assertConsumerLifecycle(root) {
|
|
|
193
205
|
'[lifecycle.install]\ncommand = "corepack enable pnpm && corepack pnpm@11.7.0 install --frozen-lockfile"',
|
|
194
206
|
'[lifecycle.build]\ncommand = "corepack pnpm@11.7.0 run build && corepack pnpm@11.7.0 run generate:site"',
|
|
195
207
|
"[lifecycle.verify]\ncommands = [",
|
|
208
|
+
'"corepack pnpm@11.7.0 run check",',
|
|
196
209
|
])
|
|
197
210
|
if (!lifecycle.includes(declaration))
|
|
198
211
|
fail(
|
|
@@ -205,10 +218,10 @@ function assertConsumerLifecycle(root) {
|
|
|
205
218
|
|
|
206
219
|
function assertPolicySources(root) {
|
|
207
220
|
for (const relative of [
|
|
208
|
-
"packages/core/
|
|
209
|
-
"packages/core/
|
|
210
|
-
"scripts/
|
|
211
|
-
"architecture/
|
|
221
|
+
"packages/core/stage-capsule-qualification.js",
|
|
222
|
+
"packages/core/stage-capsule-qualification-campaign.js",
|
|
223
|
+
"scripts/stage-capsule-qualification.mjs",
|
|
224
|
+
"architecture/stage-capsule-qualification.json",
|
|
212
225
|
"docs/v4-stage-capsule.md",
|
|
213
226
|
])
|
|
214
227
|
assertNoPrivateMarkers(relative, read(root, relative));
|
|
@@ -218,7 +231,7 @@ function assertPolicySources(root) {
|
|
|
218
231
|
"same public reusable-workflow contract as every other consumer",
|
|
219
232
|
"No agent may add or restore a relative/self reusable-workflow call",
|
|
220
233
|
"never solve recursion with an internal exception",
|
|
221
|
-
"scripts/check-
|
|
234
|
+
"scripts/check-public-dogfood-contract.mjs",
|
|
222
235
|
"source-persisted exact commit SHA",
|
|
223
236
|
"v4-alpha",
|
|
224
237
|
])
|
|
@@ -228,13 +241,13 @@ function assertPolicySources(root) {
|
|
|
228
241
|
const packageJson = exactJson(root, "package.json");
|
|
229
242
|
if (
|
|
230
243
|
!String(packageJson.scripts?.check || "").includes(
|
|
231
|
-
"node scripts/check-
|
|
244
|
+
"node scripts/check-public-dogfood-contract.mjs",
|
|
232
245
|
)
|
|
233
246
|
)
|
|
234
247
|
fail("pnpm run check does not include the public dogfood gate");
|
|
235
248
|
}
|
|
236
249
|
|
|
237
|
-
export function
|
|
250
|
+
export function checkPublicDogfoodContract(root = DEFAULT_ROOT) {
|
|
238
251
|
assertReusableWorkflow(root);
|
|
239
252
|
assertWorkflowInventory(root);
|
|
240
253
|
assertProtectedVerify(root);
|
|
@@ -257,7 +270,7 @@ if (
|
|
|
257
270
|
path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)
|
|
258
271
|
) {
|
|
259
272
|
try {
|
|
260
|
-
process.stdout.write(`${JSON.stringify(
|
|
273
|
+
process.stdout.write(`${JSON.stringify(checkPublicDogfoodContract())}\n`);
|
|
261
274
|
} catch (error) {
|
|
262
275
|
process.stderr.write(`${error.message}\n`);
|
|
263
276
|
process.exitCode = 1;
|